FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
hevc.c
Go to the documentation of this file.
1 /*
2  * HEVC video Decoder
3  *
4  * Copyright (C) 2012 - 2013 Guillaume Martres
5  * Copyright (C) 2012 - 2013 Mickael Raulet
6  * Copyright (C) 2012 - 2013 Gildas Cocherel
7  * Copyright (C) 2012 - 2013 Wassim Hamidouche
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/atomic.h"
27 #include "libavutil/attributes.h"
28 #include "libavutil/common.h"
29 #include "libavutil/display.h"
30 #include "libavutil/internal.h"
31 #include "libavutil/md5.h"
32 #include "libavutil/opt.h"
33 #include "libavutil/pixdesc.h"
34 #include "libavutil/stereo3d.h"
35 
36 #include "bswapdsp.h"
37 #include "bytestream.h"
38 #include "cabac_functions.h"
39 #include "golomb.h"
40 #include "hevc.h"
41 
42 const uint8_t ff_hevc_pel_weight[65] = { [2] = 0, [4] = 1, [6] = 2, [8] = 3, [12] = 4, [16] = 5, [24] = 6, [32] = 7, [48] = 8, [64] = 9 };
43 
44 /**
45  * NOTE: Each function hls_foo correspond to the function foo in the
46  * specification (HLS stands for High Level Syntax).
47  */
48 
49 /**
50  * Section 5.7
51  */
52 
53 /* free everything allocated by pic_arrays_init() */
55 {
56  av_freep(&s->sao);
57  av_freep(&s->deblock);
58 
59  av_freep(&s->skip_flag);
61 
62  av_freep(&s->tab_ipm);
63  av_freep(&s->cbf_luma);
64  av_freep(&s->is_pcm);
65 
66  av_freep(&s->qp_y_tab);
69 
71  av_freep(&s->vertical_bs);
72 
74  av_freep(&s->sh.size);
75  av_freep(&s->sh.offset);
76 
79 }
80 
81 /* allocate arrays that depend on frame dimensions */
82 static int pic_arrays_init(HEVCContext *s, const HEVCSPS *sps)
83 {
84  int log2_min_cb_size = sps->log2_min_cb_size;
85  int width = sps->width;
86  int height = sps->height;
87  int pic_size_in_ctb = ((width >> log2_min_cb_size) + 1) *
88  ((height >> log2_min_cb_size) + 1);
89  int ctb_count = sps->ctb_width * sps->ctb_height;
90  int min_pu_size = sps->min_pu_width * sps->min_pu_height;
91 
92  s->bs_width = (width >> 2) + 1;
93  s->bs_height = (height >> 2) + 1;
94 
95  s->sao = av_mallocz_array(ctb_count, sizeof(*s->sao));
96  s->deblock = av_mallocz_array(ctb_count, sizeof(*s->deblock));
97  if (!s->sao || !s->deblock)
98  goto fail;
99 
102  if (!s->skip_flag || !s->tab_ct_depth)
103  goto fail;
104 
106  s->tab_ipm = av_mallocz(min_pu_size);
107  s->is_pcm = av_malloc_array(sps->min_pu_width + 1, sps->min_pu_height + 1);
108  if (!s->tab_ipm || !s->cbf_luma || !s->is_pcm)
109  goto fail;
110 
111  s->filter_slice_edges = av_mallocz(ctb_count);
112  s->tab_slice_address = av_malloc_array(pic_size_in_ctb,
113  sizeof(*s->tab_slice_address));
114  s->qp_y_tab = av_malloc_array(pic_size_in_ctb,
115  sizeof(*s->qp_y_tab));
116  if (!s->qp_y_tab || !s->filter_slice_edges || !s->tab_slice_address)
117  goto fail;
118 
121  if (!s->horizontal_bs || !s->vertical_bs)
122  goto fail;
123 
124  s->tab_mvf_pool = av_buffer_pool_init(min_pu_size * sizeof(MvField),
126  s->rpl_tab_pool = av_buffer_pool_init(ctb_count * sizeof(RefPicListTab),
128  if (!s->tab_mvf_pool || !s->rpl_tab_pool)
129  goto fail;
130 
131  return 0;
132 
133 fail:
134  pic_arrays_free(s);
135  return AVERROR(ENOMEM);
136 }
137 
139 {
140  int i = 0;
141  int j = 0;
142  uint8_t luma_weight_l0_flag[16];
143  uint8_t chroma_weight_l0_flag[16];
144  uint8_t luma_weight_l1_flag[16];
145  uint8_t chroma_weight_l1_flag[16];
146  int luma_log2_weight_denom;
147 
148  luma_log2_weight_denom = get_ue_golomb_long(gb);
149  if (luma_log2_weight_denom < 0 || luma_log2_weight_denom > 7)
150  av_log(s->avctx, AV_LOG_ERROR, "luma_log2_weight_denom %d is invalid\n", luma_log2_weight_denom);
151  s->sh.luma_log2_weight_denom = av_clip_uintp2(luma_log2_weight_denom, 3);
152  if (s->sps->chroma_format_idc != 0) {
153  int delta = get_se_golomb(gb);
154  s->sh.chroma_log2_weight_denom = av_clip_uintp2(s->sh.luma_log2_weight_denom + delta, 3);
155  }
156 
157  for (i = 0; i < s->sh.nb_refs[L0]; i++) {
158  luma_weight_l0_flag[i] = get_bits1(gb);
159  if (!luma_weight_l0_flag[i]) {
160  s->sh.luma_weight_l0[i] = 1 << s->sh.luma_log2_weight_denom;
161  s->sh.luma_offset_l0[i] = 0;
162  }
163  }
164  if (s->sps->chroma_format_idc != 0) {
165  for (i = 0; i < s->sh.nb_refs[L0]; i++)
166  chroma_weight_l0_flag[i] = get_bits1(gb);
167  } else {
168  for (i = 0; i < s->sh.nb_refs[L0]; i++)
169  chroma_weight_l0_flag[i] = 0;
170  }
171  for (i = 0; i < s->sh.nb_refs[L0]; i++) {
172  if (luma_weight_l0_flag[i]) {
173  int delta_luma_weight_l0 = get_se_golomb(gb);
174  s->sh.luma_weight_l0[i] = (1 << s->sh.luma_log2_weight_denom) + delta_luma_weight_l0;
175  s->sh.luma_offset_l0[i] = get_se_golomb(gb);
176  }
177  if (chroma_weight_l0_flag[i]) {
178  for (j = 0; j < 2; j++) {
179  int delta_chroma_weight_l0 = get_se_golomb(gb);
180  int delta_chroma_offset_l0 = get_se_golomb(gb);
181  s->sh.chroma_weight_l0[i][j] = (1 << s->sh.chroma_log2_weight_denom) + delta_chroma_weight_l0;
182  s->sh.chroma_offset_l0[i][j] = av_clip((delta_chroma_offset_l0 - ((128 * s->sh.chroma_weight_l0[i][j])
183  >> s->sh.chroma_log2_weight_denom) + 128), -128, 127);
184  }
185  } else {
186  s->sh.chroma_weight_l0[i][0] = 1 << s->sh.chroma_log2_weight_denom;
187  s->sh.chroma_offset_l0[i][0] = 0;
188  s->sh.chroma_weight_l0[i][1] = 1 << s->sh.chroma_log2_weight_denom;
189  s->sh.chroma_offset_l0[i][1] = 0;
190  }
191  }
192  if (s->sh.slice_type == B_SLICE) {
193  for (i = 0; i < s->sh.nb_refs[L1]; i++) {
194  luma_weight_l1_flag[i] = get_bits1(gb);
195  if (!luma_weight_l1_flag[i]) {
196  s->sh.luma_weight_l1[i] = 1 << s->sh.luma_log2_weight_denom;
197  s->sh.luma_offset_l1[i] = 0;
198  }
199  }
200  if (s->sps->chroma_format_idc != 0) {
201  for (i = 0; i < s->sh.nb_refs[L1]; i++)
202  chroma_weight_l1_flag[i] = get_bits1(gb);
203  } else {
204  for (i = 0; i < s->sh.nb_refs[L1]; i++)
205  chroma_weight_l1_flag[i] = 0;
206  }
207  for (i = 0; i < s->sh.nb_refs[L1]; i++) {
208  if (luma_weight_l1_flag[i]) {
209  int delta_luma_weight_l1 = get_se_golomb(gb);
210  s->sh.luma_weight_l1[i] = (1 << s->sh.luma_log2_weight_denom) + delta_luma_weight_l1;
211  s->sh.luma_offset_l1[i] = get_se_golomb(gb);
212  }
213  if (chroma_weight_l1_flag[i]) {
214  for (j = 0; j < 2; j++) {
215  int delta_chroma_weight_l1 = get_se_golomb(gb);
216  int delta_chroma_offset_l1 = get_se_golomb(gb);
217  s->sh.chroma_weight_l1[i][j] = (1 << s->sh.chroma_log2_weight_denom) + delta_chroma_weight_l1;
218  s->sh.chroma_offset_l1[i][j] = av_clip((delta_chroma_offset_l1 - ((128 * s->sh.chroma_weight_l1[i][j])
219  >> s->sh.chroma_log2_weight_denom) + 128), -128, 127);
220  }
221  } else {
222  s->sh.chroma_weight_l1[i][0] = 1 << s->sh.chroma_log2_weight_denom;
223  s->sh.chroma_offset_l1[i][0] = 0;
224  s->sh.chroma_weight_l1[i][1] = 1 << s->sh.chroma_log2_weight_denom;
225  s->sh.chroma_offset_l1[i][1] = 0;
226  }
227  }
228  }
229 }
230 
232 {
233  const HEVCSPS *sps = s->sps;
234  int max_poc_lsb = 1 << sps->log2_max_poc_lsb;
235  int prev_delta_msb = 0;
236  unsigned int nb_sps = 0, nb_sh;
237  int i;
238 
239  rps->nb_refs = 0;
241  return 0;
242 
243  if (sps->num_long_term_ref_pics_sps > 0)
244  nb_sps = get_ue_golomb_long(gb);
245  nb_sh = get_ue_golomb_long(gb);
246 
247  if (nb_sh + (uint64_t)nb_sps > FF_ARRAY_ELEMS(rps->poc))
248  return AVERROR_INVALIDDATA;
249 
250  rps->nb_refs = nb_sh + nb_sps;
251 
252  for (i = 0; i < rps->nb_refs; i++) {
253  uint8_t delta_poc_msb_present;
254 
255  if (i < nb_sps) {
256  uint8_t lt_idx_sps = 0;
257 
258  if (sps->num_long_term_ref_pics_sps > 1)
259  lt_idx_sps = get_bits(gb, av_ceil_log2(sps->num_long_term_ref_pics_sps));
260 
261  rps->poc[i] = sps->lt_ref_pic_poc_lsb_sps[lt_idx_sps];
262  rps->used[i] = sps->used_by_curr_pic_lt_sps_flag[lt_idx_sps];
263  } else {
264  rps->poc[i] = get_bits(gb, sps->log2_max_poc_lsb);
265  rps->used[i] = get_bits1(gb);
266  }
267 
268  delta_poc_msb_present = get_bits1(gb);
269  if (delta_poc_msb_present) {
270  int delta = get_ue_golomb_long(gb);
271 
272  if (i && i != nb_sps)
273  delta += prev_delta_msb;
274 
275  rps->poc[i] += s->poc - delta * max_poc_lsb - s->sh.pic_order_cnt_lsb;
276  prev_delta_msb = delta;
277  }
278  }
279 
280  return 0;
281 }
282 
283 static int set_sps(HEVCContext *s, const HEVCSPS *sps)
284 {
285  #define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL)
286  enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmt = pix_fmts;
287  int ret, i;
288  unsigned int num = 0, den = 0;
289 
290  pic_arrays_free(s);
291  ret = pic_arrays_init(s, sps);
292  if (ret < 0)
293  goto fail;
294 
295  s->avctx->coded_width = sps->width;
296  s->avctx->coded_height = sps->height;
297  s->avctx->width = sps->output_width;
298  s->avctx->height = sps->output_height;
300 
301  if (sps->pix_fmt == AV_PIX_FMT_YUV420P || sps->pix_fmt == AV_PIX_FMT_YUVJ420P) {
302 #if CONFIG_HEVC_DXVA2_HWACCEL
303  *fmt++ = AV_PIX_FMT_DXVA2_VLD;
304 #endif
305  }
306 
307  *fmt++ = sps->pix_fmt;
308  *fmt = AV_PIX_FMT_NONE;
309 
310  ret = ff_thread_get_format(s->avctx, pix_fmts);
311  if (ret < 0)
312  goto fail;
313  s->avctx->pix_fmt = ret;
314 
315  ff_set_sar(s->avctx, sps->vui.sar);
316 
320  else
322 
326  s->avctx->colorspace = sps->vui.matrix_coeffs;
327  } else {
331  }
332 
333  ff_hevc_pred_init(&s->hpc, sps->bit_depth);
334  ff_hevc_dsp_init (&s->hevcdsp, sps->bit_depth);
335  ff_videodsp_init (&s->vdsp, sps->bit_depth);
336 
337  for (i = 0; i < 3; i++) {
340  }
341 
342  if (sps->sao_enabled && !s->avctx->hwaccel) {
343  int c_count = (sps->chroma_format_idc != 0) ? 3 : 1;
344  int c_idx;
345 
346  for(c_idx = 0; c_idx < c_count; c_idx++) {
347  int w = sps->width >> sps->hshift[c_idx];
348  int h = sps->height >> sps->vshift[c_idx];
349  s->sao_pixel_buffer_h[c_idx] =
350  av_malloc((w * 2 * sps->ctb_height) <<
351  sps->pixel_shift);
352  s->sao_pixel_buffer_v[c_idx] =
353  av_malloc((h * 2 * sps->ctb_width) <<
354  sps->pixel_shift);
355  }
356  }
357 
358  s->sps = sps;
359  s->vps = (HEVCVPS*) s->vps_list[s->sps->vps_id]->data;
360 
362  num = s->vps->vps_num_units_in_tick;
363  den = s->vps->vps_time_scale;
364  } else if (sps->vui.vui_timing_info_present_flag) {
365  num = sps->vui.vui_num_units_in_tick;
366  den = sps->vui.vui_time_scale;
367  }
368 
369  if (num != 0 && den != 0)
371  num, den, 1 << 30);
372 
373  return 0;
374 
375 fail:
376  pic_arrays_free(s);
377  s->sps = NULL;
378  return ret;
379 }
380 
382 {
383  GetBitContext *gb = &s->HEVClc->gb;
384  SliceHeader *sh = &s->sh;
385  int i, j, ret;
386 
387  // Coded parameters
389  if ((IS_IDR(s) || IS_BLA(s)) && sh->first_slice_in_pic_flag) {
390  s->seq_decode = (s->seq_decode + 1) & 0xff;
391  s->max_ra = INT_MAX;
392  if (IS_IDR(s))
394  }
396  if (IS_IRAP(s))
398 
399  sh->pps_id = get_ue_golomb_long(gb);
400  if (sh->pps_id >= MAX_PPS_COUNT || !s->pps_list[sh->pps_id]) {
401  av_log(s->avctx, AV_LOG_ERROR, "PPS id out of range: %d\n", sh->pps_id);
402  return AVERROR_INVALIDDATA;
403  }
404  if (!sh->first_slice_in_pic_flag &&
405  s->pps != (HEVCPPS*)s->pps_list[sh->pps_id]->data) {
406  av_log(s->avctx, AV_LOG_ERROR, "PPS changed between slices.\n");
407  return AVERROR_INVALIDDATA;
408  }
409  s->pps = (HEVCPPS*)s->pps_list[sh->pps_id]->data;
410  if (s->nal_unit_type == NAL_CRA_NUT && s->last_eos == 1)
412 
413  if (s->sps != (HEVCSPS*)s->sps_list[s->pps->sps_id]->data) {
414  const HEVCSPS* last_sps = s->sps;
415  s->sps = (HEVCSPS*)s->sps_list[s->pps->sps_id]->data;
416  if (last_sps && IS_IRAP(s) && s->nal_unit_type != NAL_CRA_NUT) {
417  if (s->sps->width != last_sps->width || s->sps->height != last_sps->height ||
419  last_sps->temporal_layer[last_sps->max_sub_layers - 1].max_dec_pic_buffering)
421  }
423  ret = set_sps(s, s->sps);
424  if (ret < 0)
425  return ret;
426 
427  s->seq_decode = (s->seq_decode + 1) & 0xff;
428  s->max_ra = INT_MAX;
429  }
430 
433 
435  if (!sh->first_slice_in_pic_flag) {
436  int slice_address_length;
437 
440 
441  slice_address_length = av_ceil_log2(s->sps->ctb_width *
442  s->sps->ctb_height);
443  sh->slice_segment_addr = get_bits(gb, slice_address_length);
444  if (sh->slice_segment_addr >= s->sps->ctb_width * s->sps->ctb_height) {
446  "Invalid slice segment address: %u.\n",
447  sh->slice_segment_addr);
448  return AVERROR_INVALIDDATA;
449  }
450 
451  if (!sh->dependent_slice_segment_flag) {
452  sh->slice_addr = sh->slice_segment_addr;
453  s->slice_idx++;
454  }
455  } else {
456  sh->slice_segment_addr = sh->slice_addr = 0;
457  s->slice_idx = 0;
458  s->slice_initialized = 0;
459  }
460 
461  if (!sh->dependent_slice_segment_flag) {
462  s->slice_initialized = 0;
463 
464  for (i = 0; i < s->pps->num_extra_slice_header_bits; i++)
465  skip_bits(gb, 1); // slice_reserved_undetermined_flag[]
466 
467  sh->slice_type = get_ue_golomb_long(gb);
468  if (!(sh->slice_type == I_SLICE ||
469  sh->slice_type == P_SLICE ||
470  sh->slice_type == B_SLICE)) {
471  av_log(s->avctx, AV_LOG_ERROR, "Unknown slice type: %d.\n",
472  sh->slice_type);
473  return AVERROR_INVALIDDATA;
474  }
475  if (IS_IRAP(s) && sh->slice_type != I_SLICE) {
476  av_log(s->avctx, AV_LOG_ERROR, "Inter slices in an IRAP frame.\n");
477  return AVERROR_INVALIDDATA;
478  }
479 
480  // when flag is not present, picture is inferred to be output
481  sh->pic_output_flag = 1;
483  sh->pic_output_flag = get_bits1(gb);
484 
486  sh->colour_plane_id = get_bits(gb, 2);
487 
488  if (!IS_IDR(s)) {
489  int poc;
490 
493  if (!sh->first_slice_in_pic_flag && poc != s->poc) {
495  "Ignoring POC change between slices: %d -> %d\n", s->poc, poc);
497  return AVERROR_INVALIDDATA;
498  poc = s->poc;
499  }
500  s->poc = poc;
501 
504  int pos = get_bits_left(gb);
505  ret = ff_hevc_decode_short_term_rps(s, &sh->slice_rps, s->sps, 1);
506  if (ret < 0)
507  return ret;
508 
510  sh->short_term_rps = &sh->slice_rps;
511  } else {
512  int numbits, rps_idx;
513 
514  if (!s->sps->nb_st_rps) {
515  av_log(s->avctx, AV_LOG_ERROR, "No ref lists in the SPS.\n");
516  return AVERROR_INVALIDDATA;
517  }
518 
519  numbits = av_ceil_log2(s->sps->nb_st_rps);
520  rps_idx = numbits > 0 ? get_bits(gb, numbits) : 0;
521  sh->short_term_rps = &s->sps->st_rps[rps_idx];
522  }
523 
524  ret = decode_lt_rps(s, &sh->long_term_rps, gb);
525  if (ret < 0) {
526  av_log(s->avctx, AV_LOG_WARNING, "Invalid long term RPS.\n");
528  return AVERROR_INVALIDDATA;
529  }
530 
533  else
535  } else {
536  s->sh.short_term_rps = NULL;
537  s->poc = 0;
538  }
539 
540  /* 8.3.1 */
541  if (s->temporal_id == 0 &&
542  s->nal_unit_type != NAL_TRAIL_N &&
543  s->nal_unit_type != NAL_TSA_N &&
544  s->nal_unit_type != NAL_STSA_N &&
545  s->nal_unit_type != NAL_RADL_N &&
546  s->nal_unit_type != NAL_RADL_R &&
547  s->nal_unit_type != NAL_RASL_N &&
549  s->pocTid0 = s->poc;
550 
551  if (s->sps->sao_enabled) {
553  if (s->sps->chroma_format_idc) {
556  }
557  } else {
561  }
562 
563  sh->nb_refs[L0] = sh->nb_refs[L1] = 0;
564  if (sh->slice_type == P_SLICE || sh->slice_type == B_SLICE) {
565  int nb_refs;
566 
568  if (sh->slice_type == B_SLICE)
570 
571  if (get_bits1(gb)) { // num_ref_idx_active_override_flag
572  sh->nb_refs[L0] = get_ue_golomb_long(gb) + 1;
573  if (sh->slice_type == B_SLICE)
574  sh->nb_refs[L1] = get_ue_golomb_long(gb) + 1;
575  }
576  if (sh->nb_refs[L0] > MAX_REFS || sh->nb_refs[L1] > MAX_REFS) {
577  av_log(s->avctx, AV_LOG_ERROR, "Too many refs: %d/%d.\n",
578  sh->nb_refs[L0], sh->nb_refs[L1]);
579  return AVERROR_INVALIDDATA;
580  }
581 
582  sh->rpl_modification_flag[0] = 0;
583  sh->rpl_modification_flag[1] = 0;
584  nb_refs = ff_hevc_frame_nb_refs(s);
585  if (!nb_refs) {
586  av_log(s->avctx, AV_LOG_ERROR, "Zero refs for a frame with P or B slices.\n");
587  return AVERROR_INVALIDDATA;
588  }
589 
590  if (s->pps->lists_modification_present_flag && nb_refs > 1) {
591  sh->rpl_modification_flag[0] = get_bits1(gb);
592  if (sh->rpl_modification_flag[0]) {
593  for (i = 0; i < sh->nb_refs[L0]; i++)
594  sh->list_entry_lx[0][i] = get_bits(gb, av_ceil_log2(nb_refs));
595  }
596 
597  if (sh->slice_type == B_SLICE) {
598  sh->rpl_modification_flag[1] = get_bits1(gb);
599  if (sh->rpl_modification_flag[1] == 1)
600  for (i = 0; i < sh->nb_refs[L1]; i++)
601  sh->list_entry_lx[1][i] = get_bits(gb, av_ceil_log2(nb_refs));
602  }
603  }
604 
605  if (sh->slice_type == B_SLICE)
606  sh->mvd_l1_zero_flag = get_bits1(gb);
607 
609  sh->cabac_init_flag = get_bits1(gb);
610  else
611  sh->cabac_init_flag = 0;
612 
613  sh->collocated_ref_idx = 0;
615  sh->collocated_list = L0;
616  if (sh->slice_type == B_SLICE)
617  sh->collocated_list = !get_bits1(gb);
618 
619  if (sh->nb_refs[sh->collocated_list] > 1) {
621  if (sh->collocated_ref_idx >= sh->nb_refs[sh->collocated_list]) {
623  "Invalid collocated_ref_idx: %d.\n",
624  sh->collocated_ref_idx);
625  return AVERROR_INVALIDDATA;
626  }
627  }
628  }
629 
630  if ((s->pps->weighted_pred_flag && sh->slice_type == P_SLICE) ||
631  (s->pps->weighted_bipred_flag && sh->slice_type == B_SLICE)) {
632  pred_weight_table(s, gb);
633  }
634 
636  if (sh->max_num_merge_cand < 1 || sh->max_num_merge_cand > 5) {
638  "Invalid number of merging MVP candidates: %d.\n",
639  sh->max_num_merge_cand);
640  return AVERROR_INVALIDDATA;
641  }
642  }
643 
644  sh->slice_qp_delta = get_se_golomb(gb);
645 
649  } else {
650  sh->slice_cb_qp_offset = 0;
651  sh->slice_cr_qp_offset = 0;
652  }
653 
656  else
658 
660  int deblocking_filter_override_flag = 0;
661 
663  deblocking_filter_override_flag = get_bits1(gb);
664 
665  if (deblocking_filter_override_flag) {
668  sh->beta_offset = get_se_golomb(gb) * 2;
669  sh->tc_offset = get_se_golomb(gb) * 2;
670  }
671  } else {
673  sh->beta_offset = s->pps->beta_offset;
674  sh->tc_offset = s->pps->tc_offset;
675  }
676  } else {
678  sh->beta_offset = 0;
679  sh->tc_offset = 0;
680  }
681 
687  } else {
689  }
690  } else if (!s->slice_initialized) {
691  av_log(s->avctx, AV_LOG_ERROR, "Independent slice segment missing.\n");
692  return AVERROR_INVALIDDATA;
693  }
694 
695  sh->num_entry_point_offsets = 0;
698  if (sh->num_entry_point_offsets > 0) {
699  int offset_len = get_ue_golomb_long(gb) + 1;
700  int segments = offset_len >> 4;
701  int rest = (offset_len & 15);
703  av_freep(&sh->offset);
704  av_freep(&sh->size);
706  sh->offset = av_malloc_array(sh->num_entry_point_offsets, sizeof(int));
707  sh->size = av_malloc_array(sh->num_entry_point_offsets, sizeof(int));
708  if (!sh->entry_point_offset || !sh->offset || !sh->size) {
709  sh->num_entry_point_offsets = 0;
710  av_log(s->avctx, AV_LOG_ERROR, "Failed to allocate memory\n");
711  return AVERROR(ENOMEM);
712  }
713  for (i = 0; i < sh->num_entry_point_offsets; i++) {
714  int val = 0;
715  for (j = 0; j < segments; j++) {
716  val <<= 16;
717  val += get_bits(gb, 16);
718  }
719  if (rest) {
720  val <<= rest;
721  val += get_bits(gb, rest);
722  }
723  sh->entry_point_offset[i] = val + 1; // +1; // +1 to get the size
724  }
725  if (s->threads_number > 1 && (s->pps->num_tile_rows > 1 || s->pps->num_tile_columns > 1)) {
726  s->enable_parallel_tiles = 0; // TODO: you can enable tiles in parallel here
727  s->threads_number = 1;
728  } else
729  s->enable_parallel_tiles = 0;
730  } else
731  s->enable_parallel_tiles = 0;
732  }
733 
735  unsigned int length = get_ue_golomb_long(gb);
736  if (length*8LL > get_bits_left(gb)) {
737  av_log(s->avctx, AV_LOG_ERROR, "too many slice_header_extension_data_bytes\n");
738  return AVERROR_INVALIDDATA;
739  }
740  for (i = 0; i < length; i++)
741  skip_bits(gb, 8); // slice_header_extension_data_byte
742  }
743 
744  // Inferred parameters
745  sh->slice_qp = 26U + s->pps->pic_init_qp_minus26 + sh->slice_qp_delta;
746  if (sh->slice_qp > 51 ||
747  sh->slice_qp < -s->sps->qp_bd_offset) {
749  "The slice_qp %d is outside the valid range "
750  "[%d, 51].\n",
751  sh->slice_qp,
752  -s->sps->qp_bd_offset);
753  return AVERROR_INVALIDDATA;
754  }
755 
757 
759  av_log(s->avctx, AV_LOG_ERROR, "Impossible slice segment.\n");
760  return AVERROR_INVALIDDATA;
761  }
762 
763  if (get_bits_left(gb) < 0) {
765  "Overread slice header by %d bits\n", -get_bits_left(gb));
766  return AVERROR_INVALIDDATA;
767  }
768 
770 
771  if (!s->pps->cu_qp_delta_enabled_flag)
772  s->HEVClc->qp_y = s->sh.slice_qp;
773 
774  s->slice_initialized = 1;
775  s->HEVClc->tu.cu_qp_offset_cb = 0;
776  s->HEVClc->tu.cu_qp_offset_cr = 0;
777 
778  return 0;
779 }
780 
781 #define CTB(tab, x, y) ((tab)[(y) * s->sps->ctb_width + (x)])
782 
783 #define SET_SAO(elem, value) \
784 do { \
785  if (!sao_merge_up_flag && !sao_merge_left_flag) \
786  sao->elem = value; \
787  else if (sao_merge_left_flag) \
788  sao->elem = CTB(s->sao, rx-1, ry).elem; \
789  else if (sao_merge_up_flag) \
790  sao->elem = CTB(s->sao, rx, ry-1).elem; \
791  else \
792  sao->elem = 0; \
793 } while (0)
794 
795 static void hls_sao_param(HEVCContext *s, int rx, int ry)
796 {
797  HEVCLocalContext *lc = s->HEVClc;
798  int sao_merge_left_flag = 0;
799  int sao_merge_up_flag = 0;
800  SAOParams *sao = &CTB(s->sao, rx, ry);
801  int c_idx, i;
802 
805  if (rx > 0) {
806  if (lc->ctb_left_flag)
807  sao_merge_left_flag = ff_hevc_sao_merge_flag_decode(s);
808  }
809  if (ry > 0 && !sao_merge_left_flag) {
810  if (lc->ctb_up_flag)
811  sao_merge_up_flag = ff_hevc_sao_merge_flag_decode(s);
812  }
813  }
814 
815  for (c_idx = 0; c_idx < (s->sps->chroma_format_idc ? 3 : 1); c_idx++) {
816  int log2_sao_offset_scale = c_idx == 0 ? s->pps->log2_sao_offset_scale_luma :
818 
819  if (!s->sh.slice_sample_adaptive_offset_flag[c_idx]) {
820  sao->type_idx[c_idx] = SAO_NOT_APPLIED;
821  continue;
822  }
823 
824  if (c_idx == 2) {
825  sao->type_idx[2] = sao->type_idx[1];
826  sao->eo_class[2] = sao->eo_class[1];
827  } else {
828  SET_SAO(type_idx[c_idx], ff_hevc_sao_type_idx_decode(s));
829  }
830 
831  if (sao->type_idx[c_idx] == SAO_NOT_APPLIED)
832  continue;
833 
834  for (i = 0; i < 4; i++)
835  SET_SAO(offset_abs[c_idx][i], ff_hevc_sao_offset_abs_decode(s));
836 
837  if (sao->type_idx[c_idx] == SAO_BAND) {
838  for (i = 0; i < 4; i++) {
839  if (sao->offset_abs[c_idx][i]) {
840  SET_SAO(offset_sign[c_idx][i],
842  } else {
843  sao->offset_sign[c_idx][i] = 0;
844  }
845  }
846  SET_SAO(band_position[c_idx], ff_hevc_sao_band_position_decode(s));
847  } else if (c_idx != 2) {
848  SET_SAO(eo_class[c_idx], ff_hevc_sao_eo_class_decode(s));
849  }
850 
851  // Inferred parameters
852  sao->offset_val[c_idx][0] = 0;
853  for (i = 0; i < 4; i++) {
854  sao->offset_val[c_idx][i + 1] = sao->offset_abs[c_idx][i];
855  if (sao->type_idx[c_idx] == SAO_EDGE) {
856  if (i > 1)
857  sao->offset_val[c_idx][i + 1] = -sao->offset_val[c_idx][i + 1];
858  } else if (sao->offset_sign[c_idx][i]) {
859  sao->offset_val[c_idx][i + 1] = -sao->offset_val[c_idx][i + 1];
860  }
861  sao->offset_val[c_idx][i + 1] <<= log2_sao_offset_scale;
862  }
863  }
864 }
865 
866 #undef SET_SAO
867 #undef CTB
868 
869 static int hls_cross_component_pred(HEVCContext *s, int idx) {
870  HEVCLocalContext *lc = s->HEVClc;
871  int log2_res_scale_abs_plus1 = ff_hevc_log2_res_scale_abs(s, idx);
872 
873  if (log2_res_scale_abs_plus1 != 0) {
874  int res_scale_sign_flag = ff_hevc_res_scale_sign_flag(s, idx);
875  lc->tu.res_scale_val = (1 << (log2_res_scale_abs_plus1 - 1)) *
876  (1 - 2 * res_scale_sign_flag);
877  } else {
878  lc->tu.res_scale_val = 0;
879  }
880 
881 
882  return 0;
883 }
884 
885 static int hls_transform_unit(HEVCContext *s, int x0, int y0,
886  int xBase, int yBase, int cb_xBase, int cb_yBase,
887  int log2_cb_size, int log2_trafo_size,
888  int blk_idx, int cbf_luma, int *cbf_cb, int *cbf_cr)
889 {
890  HEVCLocalContext *lc = s->HEVClc;
891  const int log2_trafo_size_c = log2_trafo_size - s->sps->hshift[1];
892  int i;
893 
894  if (lc->cu.pred_mode == MODE_INTRA) {
895  int trafo_size = 1 << log2_trafo_size;
896  ff_hevc_set_neighbour_available(s, x0, y0, trafo_size, trafo_size);
897 
898  s->hpc.intra_pred[log2_trafo_size - 2](s, x0, y0, 0);
899  }
900 
901  if (cbf_luma || cbf_cb[0] || cbf_cr[0] ||
902  (s->sps->chroma_format_idc == 2 && (cbf_cb[1] || cbf_cr[1]))) {
903  int scan_idx = SCAN_DIAG;
904  int scan_idx_c = SCAN_DIAG;
905  int cbf_chroma = cbf_cb[0] || cbf_cr[0] ||
906  (s->sps->chroma_format_idc == 2 &&
907  (cbf_cb[1] || cbf_cr[1]));
908 
911  if (lc->tu.cu_qp_delta != 0)
912  if (ff_hevc_cu_qp_delta_sign_flag(s) == 1)
913  lc->tu.cu_qp_delta = -lc->tu.cu_qp_delta;
914  lc->tu.is_cu_qp_delta_coded = 1;
915 
916  if (lc->tu.cu_qp_delta < -(26 + s->sps->qp_bd_offset / 2) ||
917  lc->tu.cu_qp_delta > (25 + s->sps->qp_bd_offset / 2)) {
919  "The cu_qp_delta %d is outside the valid range "
920  "[%d, %d].\n",
921  lc->tu.cu_qp_delta,
922  -(26 + s->sps->qp_bd_offset / 2),
923  (25 + s->sps->qp_bd_offset / 2));
924  return AVERROR_INVALIDDATA;
925  }
926 
927  ff_hevc_set_qPy(s, cb_xBase, cb_yBase, log2_cb_size);
928  }
929 
930  if (s->sh.cu_chroma_qp_offset_enabled_flag && cbf_chroma &&
932  int cu_chroma_qp_offset_flag = ff_hevc_cu_chroma_qp_offset_flag(s);
933  if (cu_chroma_qp_offset_flag) {
934  int cu_chroma_qp_offset_idx = 0;
936  cu_chroma_qp_offset_idx = ff_hevc_cu_chroma_qp_offset_idx(s);
938  "cu_chroma_qp_offset_idx not yet tested.\n");
939  }
940  lc->tu.cu_qp_offset_cb = s->pps->cb_qp_offset_list[cu_chroma_qp_offset_idx];
941  lc->tu.cu_qp_offset_cr = s->pps->cr_qp_offset_list[cu_chroma_qp_offset_idx];
942  } else {
943  lc->tu.cu_qp_offset_cb = 0;
944  lc->tu.cu_qp_offset_cr = 0;
945  }
947  }
948 
949  if (lc->cu.pred_mode == MODE_INTRA && log2_trafo_size < 4) {
950  if (lc->tu.intra_pred_mode >= 6 &&
951  lc->tu.intra_pred_mode <= 14) {
952  scan_idx = SCAN_VERT;
953  } else if (lc->tu.intra_pred_mode >= 22 &&
954  lc->tu.intra_pred_mode <= 30) {
955  scan_idx = SCAN_HORIZ;
956  }
957 
958  if (lc->tu.intra_pred_mode_c >= 6 &&
959  lc->tu.intra_pred_mode_c <= 14) {
960  scan_idx_c = SCAN_VERT;
961  } else if (lc->tu.intra_pred_mode_c >= 22 &&
962  lc->tu.intra_pred_mode_c <= 30) {
963  scan_idx_c = SCAN_HORIZ;
964  }
965  }
966 
967  lc->tu.cross_pf = 0;
968 
969  if (cbf_luma)
970  ff_hevc_hls_residual_coding(s, x0, y0, log2_trafo_size, scan_idx, 0);
971  if (s->sps->chroma_format_idc && (log2_trafo_size > 2 || s->sps->chroma_format_idc == 3)) {
972  int trafo_size_h = 1 << (log2_trafo_size_c + s->sps->hshift[1]);
973  int trafo_size_v = 1 << (log2_trafo_size_c + s->sps->vshift[1]);
974  lc->tu.cross_pf = (s->pps->cross_component_prediction_enabled_flag && cbf_luma &&
975  (lc->cu.pred_mode == MODE_INTER ||
976  (lc->tu.chroma_mode_c == 4)));
977 
978  if (lc->tu.cross_pf) {
980  }
981  for (i = 0; i < (s->sps->chroma_format_idc == 2 ? 2 : 1); i++) {
982  if (lc->cu.pred_mode == MODE_INTRA) {
983  ff_hevc_set_neighbour_available(s, x0, y0 + (i << log2_trafo_size_c), trafo_size_h, trafo_size_v);
984  s->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0 + (i << log2_trafo_size_c), 1);
985  }
986  if (cbf_cb[i])
987  ff_hevc_hls_residual_coding(s, x0, y0 + (i << log2_trafo_size_c),
988  log2_trafo_size_c, scan_idx_c, 1);
989  else
990  if (lc->tu.cross_pf) {
991  ptrdiff_t stride = s->frame->linesize[1];
992  int hshift = s->sps->hshift[1];
993  int vshift = s->sps->vshift[1];
994  int16_t *coeffs_y = (int16_t*)lc->edge_emu_buffer;
995  int16_t *coeffs = (int16_t*)lc->edge_emu_buffer2;
996  int size = 1 << log2_trafo_size_c;
997 
998  uint8_t *dst = &s->frame->data[1][(y0 >> vshift) * stride +
999  ((x0 >> hshift) << s->sps->pixel_shift)];
1000  for (i = 0; i < (size * size); i++) {
1001  coeffs[i] = ((lc->tu.res_scale_val * coeffs_y[i]) >> 3);
1002  }
1003  s->hevcdsp.transform_add[log2_trafo_size_c-2](dst, coeffs, stride);
1004  }
1005  }
1006 
1007  if (lc->tu.cross_pf) {
1009  }
1010  for (i = 0; i < (s->sps->chroma_format_idc == 2 ? 2 : 1); i++) {
1011  if (lc->cu.pred_mode == MODE_INTRA) {
1012  ff_hevc_set_neighbour_available(s, x0, y0 + (i << log2_trafo_size_c), trafo_size_h, trafo_size_v);
1013  s->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0 + (i << log2_trafo_size_c), 2);
1014  }
1015  if (cbf_cr[i])
1016  ff_hevc_hls_residual_coding(s, x0, y0 + (i << log2_trafo_size_c),
1017  log2_trafo_size_c, scan_idx_c, 2);
1018  else
1019  if (lc->tu.cross_pf) {
1020  ptrdiff_t stride = s->frame->linesize[2];
1021  int hshift = s->sps->hshift[2];
1022  int vshift = s->sps->vshift[2];
1023  int16_t *coeffs_y = (int16_t*)lc->edge_emu_buffer;
1024  int16_t *coeffs = (int16_t*)lc->edge_emu_buffer2;
1025  int size = 1 << log2_trafo_size_c;
1026 
1027  uint8_t *dst = &s->frame->data[2][(y0 >> vshift) * stride +
1028  ((x0 >> hshift) << s->sps->pixel_shift)];
1029  for (i = 0; i < (size * size); i++) {
1030  coeffs[i] = ((lc->tu.res_scale_val * coeffs_y[i]) >> 3);
1031  }
1032  s->hevcdsp.transform_add[log2_trafo_size_c-2](dst, coeffs, stride);
1033  }
1034  }
1035  } else if (s->sps->chroma_format_idc && blk_idx == 3) {
1036  int trafo_size_h = 1 << (log2_trafo_size + 1);
1037  int trafo_size_v = 1 << (log2_trafo_size + s->sps->vshift[1]);
1038  for (i = 0; i < (s->sps->chroma_format_idc == 2 ? 2 : 1); i++) {
1039  if (lc->cu.pred_mode == MODE_INTRA) {
1040  ff_hevc_set_neighbour_available(s, xBase, yBase + (i << log2_trafo_size),
1041  trafo_size_h, trafo_size_v);
1042  s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase + (i << log2_trafo_size), 1);
1043  }
1044  if (cbf_cb[i])
1045  ff_hevc_hls_residual_coding(s, xBase, yBase + (i << log2_trafo_size),
1046  log2_trafo_size, scan_idx_c, 1);
1047  }
1048  for (i = 0; i < (s->sps->chroma_format_idc == 2 ? 2 : 1); i++) {
1049  if (lc->cu.pred_mode == MODE_INTRA) {
1050  ff_hevc_set_neighbour_available(s, xBase, yBase + (i << log2_trafo_size),
1051  trafo_size_h, trafo_size_v);
1052  s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase + (i << log2_trafo_size), 2);
1053  }
1054  if (cbf_cr[i])
1055  ff_hevc_hls_residual_coding(s, xBase, yBase + (i << log2_trafo_size),
1056  log2_trafo_size, scan_idx_c, 2);
1057  }
1058  }
1059  } else if (s->sps->chroma_format_idc && lc->cu.pred_mode == MODE_INTRA) {
1060  if (log2_trafo_size > 2 || s->sps->chroma_format_idc == 3) {
1061  int trafo_size_h = 1 << (log2_trafo_size_c + s->sps->hshift[1]);
1062  int trafo_size_v = 1 << (log2_trafo_size_c + s->sps->vshift[1]);
1063  ff_hevc_set_neighbour_available(s, x0, y0, trafo_size_h, trafo_size_v);
1064  s->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0, 1);
1065  s->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0, 2);
1066  if (s->sps->chroma_format_idc == 2) {
1067  ff_hevc_set_neighbour_available(s, x0, y0 + (1 << log2_trafo_size_c),
1068  trafo_size_h, trafo_size_v);
1069  s->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0 + (1 << log2_trafo_size_c), 1);
1070  s->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0 + (1 << log2_trafo_size_c), 2);
1071  }
1072  } else if (blk_idx == 3) {
1073  int trafo_size_h = 1 << (log2_trafo_size + 1);
1074  int trafo_size_v = 1 << (log2_trafo_size + s->sps->vshift[1]);
1075  ff_hevc_set_neighbour_available(s, xBase, yBase,
1076  trafo_size_h, trafo_size_v);
1077  s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase, 1);
1078  s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase, 2);
1079  if (s->sps->chroma_format_idc == 2) {
1080  ff_hevc_set_neighbour_available(s, xBase, yBase + (1 << (log2_trafo_size)),
1081  trafo_size_h, trafo_size_v);
1082  s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase + (1 << (log2_trafo_size)), 1);
1083  s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase + (1 << (log2_trafo_size)), 2);
1084  }
1085  }
1086  }
1087 
1088  return 0;
1089 }
1090 
1091 static void set_deblocking_bypass(HEVCContext *s, int x0, int y0, int log2_cb_size)
1092 {
1093  int cb_size = 1 << log2_cb_size;
1094  int log2_min_pu_size = s->sps->log2_min_pu_size;
1095 
1096  int min_pu_width = s->sps->min_pu_width;
1097  int x_end = FFMIN(x0 + cb_size, s->sps->width);
1098  int y_end = FFMIN(y0 + cb_size, s->sps->height);
1099  int i, j;
1100 
1101  for (j = (y0 >> log2_min_pu_size); j < (y_end >> log2_min_pu_size); j++)
1102  for (i = (x0 >> log2_min_pu_size); i < (x_end >> log2_min_pu_size); i++)
1103  s->is_pcm[i + j * min_pu_width] = 2;
1104 }
1105 
1106 static int hls_transform_tree(HEVCContext *s, int x0, int y0,
1107  int xBase, int yBase, int cb_xBase, int cb_yBase,
1108  int log2_cb_size, int log2_trafo_size,
1109  int trafo_depth, int blk_idx,
1110  const int *base_cbf_cb, const int *base_cbf_cr)
1111 {
1112  HEVCLocalContext *lc = s->HEVClc;
1113  uint8_t split_transform_flag;
1114  int cbf_cb[2];
1115  int cbf_cr[2];
1116  int ret;
1117 
1118  cbf_cb[0] = base_cbf_cb[0];
1119  cbf_cb[1] = base_cbf_cb[1];
1120  cbf_cr[0] = base_cbf_cr[0];
1121  cbf_cr[1] = base_cbf_cr[1];
1122 
1123  if (lc->cu.intra_split_flag) {
1124  if (trafo_depth == 1) {
1125  lc->tu.intra_pred_mode = lc->pu.intra_pred_mode[blk_idx];
1126  if (s->sps->chroma_format_idc == 3) {
1127  lc->tu.intra_pred_mode_c = lc->pu.intra_pred_mode_c[blk_idx];
1128  lc->tu.chroma_mode_c = lc->pu.chroma_mode_c[blk_idx];
1129  } else {
1131  lc->tu.chroma_mode_c = lc->pu.chroma_mode_c[0];
1132  }
1133  }
1134  } else {
1135  lc->tu.intra_pred_mode = lc->pu.intra_pred_mode[0];
1137  lc->tu.chroma_mode_c = lc->pu.chroma_mode_c[0];
1138  }
1139 
1140  if (log2_trafo_size <= s->sps->log2_max_trafo_size &&
1141  log2_trafo_size > s->sps->log2_min_tb_size &&
1142  trafo_depth < lc->cu.max_trafo_depth &&
1143  !(lc->cu.intra_split_flag && trafo_depth == 0)) {
1144  split_transform_flag = ff_hevc_split_transform_flag_decode(s, log2_trafo_size);
1145  } else {
1146  int inter_split = s->sps->max_transform_hierarchy_depth_inter == 0 &&
1147  lc->cu.pred_mode == MODE_INTER &&
1148  lc->cu.part_mode != PART_2Nx2N &&
1149  trafo_depth == 0;
1150 
1151  split_transform_flag = log2_trafo_size > s->sps->log2_max_trafo_size ||
1152  (lc->cu.intra_split_flag && trafo_depth == 0) ||
1153  inter_split;
1154  }
1155 
1156  if (s->sps->chroma_format_idc && (log2_trafo_size > 2 || s->sps->chroma_format_idc == 3)) {
1157  if (trafo_depth == 0 || cbf_cb[0]) {
1158  cbf_cb[0] = ff_hevc_cbf_cb_cr_decode(s, trafo_depth);
1159  if (s->sps->chroma_format_idc == 2 && (!split_transform_flag || log2_trafo_size == 3)) {
1160  cbf_cb[1] = ff_hevc_cbf_cb_cr_decode(s, trafo_depth);
1161  }
1162  }
1163 
1164  if (trafo_depth == 0 || cbf_cr[0]) {
1165  cbf_cr[0] = ff_hevc_cbf_cb_cr_decode(s, trafo_depth);
1166  if (s->sps->chroma_format_idc == 2 && (!split_transform_flag || log2_trafo_size == 3)) {
1167  cbf_cr[1] = ff_hevc_cbf_cb_cr_decode(s, trafo_depth);
1168  }
1169  }
1170  }
1171 
1172  if (split_transform_flag) {
1173  const int trafo_size_split = 1 << (log2_trafo_size - 1);
1174  const int x1 = x0 + trafo_size_split;
1175  const int y1 = y0 + trafo_size_split;
1176 
1177 #define SUBDIVIDE(x, y, idx) \
1178 do { \
1179  ret = hls_transform_tree(s, x, y, x0, y0, cb_xBase, cb_yBase, log2_cb_size, \
1180  log2_trafo_size - 1, trafo_depth + 1, idx, \
1181  cbf_cb, cbf_cr); \
1182  if (ret < 0) \
1183  return ret; \
1184 } while (0)
1185 
1186  SUBDIVIDE(x0, y0, 0);
1187  SUBDIVIDE(x1, y0, 1);
1188  SUBDIVIDE(x0, y1, 2);
1189  SUBDIVIDE(x1, y1, 3);
1190 
1191 #undef SUBDIVIDE
1192  } else {
1193  int min_tu_size = 1 << s->sps->log2_min_tb_size;
1194  int log2_min_tu_size = s->sps->log2_min_tb_size;
1195  int min_tu_width = s->sps->min_tb_width;
1196  int cbf_luma = 1;
1197 
1198  if (lc->cu.pred_mode == MODE_INTRA || trafo_depth != 0 ||
1199  cbf_cb[0] || cbf_cr[0] ||
1200  (s->sps->chroma_format_idc == 2 && (cbf_cb[1] || cbf_cr[1]))) {
1201  cbf_luma = ff_hevc_cbf_luma_decode(s, trafo_depth);
1202  }
1203 
1204  ret = hls_transform_unit(s, x0, y0, xBase, yBase, cb_xBase, cb_yBase,
1205  log2_cb_size, log2_trafo_size,
1206  blk_idx, cbf_luma, cbf_cb, cbf_cr);
1207  if (ret < 0)
1208  return ret;
1209  // TODO: store cbf_luma somewhere else
1210  if (cbf_luma) {
1211  int i, j;
1212  for (i = 0; i < (1 << log2_trafo_size); i += min_tu_size)
1213  for (j = 0; j < (1 << log2_trafo_size); j += min_tu_size) {
1214  int x_tu = (x0 + j) >> log2_min_tu_size;
1215  int y_tu = (y0 + i) >> log2_min_tu_size;
1216  s->cbf_luma[y_tu * min_tu_width + x_tu] = 1;
1217  }
1218  }
1220  ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_trafo_size);
1223  set_deblocking_bypass(s, x0, y0, log2_trafo_size);
1224  }
1225  }
1226  return 0;
1227 }
1228 
1229 static int hls_pcm_sample(HEVCContext *s, int x0, int y0, int log2_cb_size)
1230 {
1231  HEVCLocalContext *lc = s->HEVClc;
1232  GetBitContext gb;
1233  int cb_size = 1 << log2_cb_size;
1234  int stride0 = s->frame->linesize[0];
1235  uint8_t *dst0 = &s->frame->data[0][y0 * stride0 + (x0 << s->sps->pixel_shift)];
1236  int stride1 = s->frame->linesize[1];
1237  uint8_t *dst1 = &s->frame->data[1][(y0 >> s->sps->vshift[1]) * stride1 + ((x0 >> s->sps->hshift[1]) << s->sps->pixel_shift)];
1238  int stride2 = s->frame->linesize[2];
1239  uint8_t *dst2 = &s->frame->data[2][(y0 >> s->sps->vshift[2]) * stride2 + ((x0 >> s->sps->hshift[2]) << s->sps->pixel_shift)];
1240 
1241  int length = cb_size * cb_size * s->sps->pcm.bit_depth +
1242  (((cb_size >> s->sps->hshift[1]) * (cb_size >> s->sps->vshift[1])) +
1243  ((cb_size >> s->sps->hshift[2]) * (cb_size >> s->sps->vshift[2]))) *
1244  s->sps->pcm.bit_depth_chroma;
1245  const uint8_t *pcm = skip_bytes(&lc->cc, (length + 7) >> 3);
1246  int ret;
1247 
1249  ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_cb_size);
1250 
1251  ret = init_get_bits(&gb, pcm, length);
1252  if (ret < 0)
1253  return ret;
1254 
1255  s->hevcdsp.put_pcm(dst0, stride0, cb_size, cb_size, &gb, s->sps->pcm.bit_depth);
1256  if (s->sps->chroma_format_idc) {
1257  s->hevcdsp.put_pcm(dst1, stride1,
1258  cb_size >> s->sps->hshift[1],
1259  cb_size >> s->sps->vshift[1],
1260  &gb, s->sps->pcm.bit_depth_chroma);
1261  s->hevcdsp.put_pcm(dst2, stride2,
1262  cb_size >> s->sps->hshift[2],
1263  cb_size >> s->sps->vshift[2],
1264  &gb, s->sps->pcm.bit_depth_chroma);
1265  }
1266 
1267  return 0;
1268 }
1269 
1270 /**
1271  * 8.5.3.2.2.1 Luma sample unidirectional interpolation process
1272  *
1273  * @param s HEVC decoding context
1274  * @param dst target buffer for block data at block position
1275  * @param dststride stride of the dst buffer
1276  * @param ref reference picture buffer at origin (0, 0)
1277  * @param mv motion vector (relative to block position) to get pixel data from
1278  * @param x_off horizontal position of block from origin (0, 0)
1279  * @param y_off vertical position of block from origin (0, 0)
1280  * @param block_w width of block
1281  * @param block_h height of block
1282  * @param luma_weight weighting factor applied to the luma prediction
1283  * @param luma_offset additive offset applied to the luma prediction value
1284  */
1285 
1286 static void luma_mc_uni(HEVCContext *s, uint8_t *dst, ptrdiff_t dststride,
1287  AVFrame *ref, const Mv *mv, int x_off, int y_off,
1288  int block_w, int block_h, int luma_weight, int luma_offset)
1289 {
1290  HEVCLocalContext *lc = s->HEVClc;
1291  uint8_t *src = ref->data[0];
1292  ptrdiff_t srcstride = ref->linesize[0];
1293  int pic_width = s->sps->width;
1294  int pic_height = s->sps->height;
1295  int mx = mv->x & 3;
1296  int my = mv->y & 3;
1297  int weight_flag = (s->sh.slice_type == P_SLICE && s->pps->weighted_pred_flag) ||
1298  (s->sh.slice_type == B_SLICE && s->pps->weighted_bipred_flag);
1299  int idx = ff_hevc_pel_weight[block_w];
1300 
1301  x_off += mv->x >> 2;
1302  y_off += mv->y >> 2;
1303  src += y_off * srcstride + (x_off << s->sps->pixel_shift);
1304 
1305  if (x_off < QPEL_EXTRA_BEFORE || y_off < QPEL_EXTRA_AFTER ||
1306  x_off >= pic_width - block_w - QPEL_EXTRA_AFTER ||
1307  y_off >= pic_height - block_h - QPEL_EXTRA_AFTER) {
1308  const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->sps->pixel_shift;
1309  int offset = QPEL_EXTRA_BEFORE * srcstride + (QPEL_EXTRA_BEFORE << s->sps->pixel_shift);
1310  int buf_offset = QPEL_EXTRA_BEFORE * edge_emu_stride + (QPEL_EXTRA_BEFORE << s->sps->pixel_shift);
1311 
1312  s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src - offset,
1313  edge_emu_stride, srcstride,
1314  block_w + QPEL_EXTRA,
1315  block_h + QPEL_EXTRA,
1316  x_off - QPEL_EXTRA_BEFORE, y_off - QPEL_EXTRA_BEFORE,
1317  pic_width, pic_height);
1318  src = lc->edge_emu_buffer + buf_offset;
1319  srcstride = edge_emu_stride;
1320  }
1321 
1322  if (!weight_flag)
1323  s->hevcdsp.put_hevc_qpel_uni[idx][!!my][!!mx](dst, dststride, src, srcstride,
1324  block_h, mx, my, block_w);
1325  else
1326  s->hevcdsp.put_hevc_qpel_uni_w[idx][!!my][!!mx](dst, dststride, src, srcstride,
1327  block_h, s->sh.luma_log2_weight_denom,
1328  luma_weight, luma_offset, mx, my, block_w);
1329 }
1330 
1331 /**
1332  * 8.5.3.2.2.1 Luma sample bidirectional interpolation process
1333  *
1334  * @param s HEVC decoding context
1335  * @param dst target buffer for block data at block position
1336  * @param dststride stride of the dst buffer
1337  * @param ref0 reference picture0 buffer at origin (0, 0)
1338  * @param mv0 motion vector0 (relative to block position) to get pixel data from
1339  * @param x_off horizontal position of block from origin (0, 0)
1340  * @param y_off vertical position of block from origin (0, 0)
1341  * @param block_w width of block
1342  * @param block_h height of block
1343  * @param ref1 reference picture1 buffer at origin (0, 0)
1344  * @param mv1 motion vector1 (relative to block position) to get pixel data from
1345  * @param current_mv current motion vector structure
1346  */
1347  static void luma_mc_bi(HEVCContext *s, uint8_t *dst, ptrdiff_t dststride,
1348  AVFrame *ref0, const Mv *mv0, int x_off, int y_off,
1349  int block_w, int block_h, AVFrame *ref1, const Mv *mv1, struct MvField *current_mv)
1350 {
1351  HEVCLocalContext *lc = s->HEVClc;
1352  ptrdiff_t src0stride = ref0->linesize[0];
1353  ptrdiff_t src1stride = ref1->linesize[0];
1354  int pic_width = s->sps->width;
1355  int pic_height = s->sps->height;
1356  int mx0 = mv0->x & 3;
1357  int my0 = mv0->y & 3;
1358  int mx1 = mv1->x & 3;
1359  int my1 = mv1->y & 3;
1360  int weight_flag = (s->sh.slice_type == P_SLICE && s->pps->weighted_pred_flag) ||
1361  (s->sh.slice_type == B_SLICE && s->pps->weighted_bipred_flag);
1362  int x_off0 = x_off + (mv0->x >> 2);
1363  int y_off0 = y_off + (mv0->y >> 2);
1364  int x_off1 = x_off + (mv1->x >> 2);
1365  int y_off1 = y_off + (mv1->y >> 2);
1366  int idx = ff_hevc_pel_weight[block_w];
1367 
1368  uint8_t *src0 = ref0->data[0] + y_off0 * src0stride + (int)((unsigned)x_off0 << s->sps->pixel_shift);
1369  uint8_t *src1 = ref1->data[0] + y_off1 * src1stride + (int)((unsigned)x_off1 << s->sps->pixel_shift);
1370 
1371  if (x_off0 < QPEL_EXTRA_BEFORE || y_off0 < QPEL_EXTRA_AFTER ||
1372  x_off0 >= pic_width - block_w - QPEL_EXTRA_AFTER ||
1373  y_off0 >= pic_height - block_h - QPEL_EXTRA_AFTER) {
1374  const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->sps->pixel_shift;
1375  int offset = QPEL_EXTRA_BEFORE * src0stride + (QPEL_EXTRA_BEFORE << s->sps->pixel_shift);
1376  int buf_offset = QPEL_EXTRA_BEFORE * edge_emu_stride + (QPEL_EXTRA_BEFORE << s->sps->pixel_shift);
1377 
1378  s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src0 - offset,
1379  edge_emu_stride, src0stride,
1380  block_w + QPEL_EXTRA,
1381  block_h + QPEL_EXTRA,
1382  x_off0 - QPEL_EXTRA_BEFORE, y_off0 - QPEL_EXTRA_BEFORE,
1383  pic_width, pic_height);
1384  src0 = lc->edge_emu_buffer + buf_offset;
1385  src0stride = edge_emu_stride;
1386  }
1387 
1388  if (x_off1 < QPEL_EXTRA_BEFORE || y_off1 < QPEL_EXTRA_AFTER ||
1389  x_off1 >= pic_width - block_w - QPEL_EXTRA_AFTER ||
1390  y_off1 >= pic_height - block_h - QPEL_EXTRA_AFTER) {
1391  const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->sps->pixel_shift;
1392  int offset = QPEL_EXTRA_BEFORE * src1stride + (QPEL_EXTRA_BEFORE << s->sps->pixel_shift);
1393  int buf_offset = QPEL_EXTRA_BEFORE * edge_emu_stride + (QPEL_EXTRA_BEFORE << s->sps->pixel_shift);
1394 
1395  s->vdsp.emulated_edge_mc(lc->edge_emu_buffer2, src1 - offset,
1396  edge_emu_stride, src1stride,
1397  block_w + QPEL_EXTRA,
1398  block_h + QPEL_EXTRA,
1399  x_off1 - QPEL_EXTRA_BEFORE, y_off1 - QPEL_EXTRA_BEFORE,
1400  pic_width, pic_height);
1401  src1 = lc->edge_emu_buffer2 + buf_offset;
1402  src1stride = edge_emu_stride;
1403  }
1404 
1405  s->hevcdsp.put_hevc_qpel[idx][!!my0][!!mx0](lc->tmp, src0, src0stride,
1406  block_h, mx0, my0, block_w);
1407  if (!weight_flag)
1408  s->hevcdsp.put_hevc_qpel_bi[idx][!!my1][!!mx1](dst, dststride, src1, src1stride, lc->tmp,
1409  block_h, mx1, my1, block_w);
1410  else
1411  s->hevcdsp.put_hevc_qpel_bi_w[idx][!!my1][!!mx1](dst, dststride, src1, src1stride, lc->tmp,
1412  block_h, s->sh.luma_log2_weight_denom,
1413  s->sh.luma_weight_l0[current_mv->ref_idx[0]],
1414  s->sh.luma_weight_l1[current_mv->ref_idx[1]],
1415  s->sh.luma_offset_l0[current_mv->ref_idx[0]],
1416  s->sh.luma_offset_l1[current_mv->ref_idx[1]],
1417  mx1, my1, block_w);
1418 
1419 }
1420 
1421 /**
1422  * 8.5.3.2.2.2 Chroma sample uniprediction interpolation process
1423  *
1424  * @param s HEVC decoding context
1425  * @param dst1 target buffer for block data at block position (U plane)
1426  * @param dst2 target buffer for block data at block position (V plane)
1427  * @param dststride stride of the dst1 and dst2 buffers
1428  * @param ref reference picture buffer at origin (0, 0)
1429  * @param mv motion vector (relative to block position) to get pixel data from
1430  * @param x_off horizontal position of block from origin (0, 0)
1431  * @param y_off vertical position of block from origin (0, 0)
1432  * @param block_w width of block
1433  * @param block_h height of block
1434  * @param chroma_weight weighting factor applied to the chroma prediction
1435  * @param chroma_offset additive offset applied to the chroma prediction value
1436  */
1437 
1438 static void chroma_mc_uni(HEVCContext *s, uint8_t *dst0,
1439  ptrdiff_t dststride, uint8_t *src0, ptrdiff_t srcstride, int reflist,
1440  int x_off, int y_off, int block_w, int block_h, struct MvField *current_mv, int chroma_weight, int chroma_offset)
1441 {
1442  HEVCLocalContext *lc = s->HEVClc;
1443  int pic_width = s->sps->width >> s->sps->hshift[1];
1444  int pic_height = s->sps->height >> s->sps->vshift[1];
1445  const Mv *mv = &current_mv->mv[reflist];
1446  int weight_flag = (s->sh.slice_type == P_SLICE && s->pps->weighted_pred_flag) ||
1447  (s->sh.slice_type == B_SLICE && s->pps->weighted_bipred_flag);
1448  int idx = ff_hevc_pel_weight[block_w];
1449  int hshift = s->sps->hshift[1];
1450  int vshift = s->sps->vshift[1];
1451  intptr_t mx = mv->x & ((1 << (2 + hshift)) - 1);
1452  intptr_t my = mv->y & ((1 << (2 + vshift)) - 1);
1453  intptr_t _mx = mx << (1 - hshift);
1454  intptr_t _my = my << (1 - vshift);
1455 
1456  x_off += mv->x >> (2 + hshift);
1457  y_off += mv->y >> (2 + vshift);
1458  src0 += y_off * srcstride + (x_off << s->sps->pixel_shift);
1459 
1460  if (x_off < EPEL_EXTRA_BEFORE || y_off < EPEL_EXTRA_AFTER ||
1461  x_off >= pic_width - block_w - EPEL_EXTRA_AFTER ||
1462  y_off >= pic_height - block_h - EPEL_EXTRA_AFTER) {
1463  const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->sps->pixel_shift;
1464  int offset0 = EPEL_EXTRA_BEFORE * (srcstride + (1 << s->sps->pixel_shift));
1465  int buf_offset0 = EPEL_EXTRA_BEFORE *
1466  (edge_emu_stride + (1 << s->sps->pixel_shift));
1467  s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src0 - offset0,
1468  edge_emu_stride, srcstride,
1469  block_w + EPEL_EXTRA, block_h + EPEL_EXTRA,
1470  x_off - EPEL_EXTRA_BEFORE,
1471  y_off - EPEL_EXTRA_BEFORE,
1472  pic_width, pic_height);
1473 
1474  src0 = lc->edge_emu_buffer + buf_offset0;
1475  srcstride = edge_emu_stride;
1476  }
1477  if (!weight_flag)
1478  s->hevcdsp.put_hevc_epel_uni[idx][!!my][!!mx](dst0, dststride, src0, srcstride,
1479  block_h, _mx, _my, block_w);
1480  else
1481  s->hevcdsp.put_hevc_epel_uni_w[idx][!!my][!!mx](dst0, dststride, src0, srcstride,
1482  block_h, s->sh.chroma_log2_weight_denom,
1483  chroma_weight, chroma_offset, _mx, _my, block_w);
1484 }
1485 
1486 /**
1487  * 8.5.3.2.2.2 Chroma sample bidirectional interpolation process
1488  *
1489  * @param s HEVC decoding context
1490  * @param dst target buffer for block data at block position
1491  * @param dststride stride of the dst buffer
1492  * @param ref0 reference picture0 buffer at origin (0, 0)
1493  * @param mv0 motion vector0 (relative to block position) to get pixel data from
1494  * @param x_off horizontal position of block from origin (0, 0)
1495  * @param y_off vertical position of block from origin (0, 0)
1496  * @param block_w width of block
1497  * @param block_h height of block
1498  * @param ref1 reference picture1 buffer at origin (0, 0)
1499  * @param mv1 motion vector1 (relative to block position) to get pixel data from
1500  * @param current_mv current motion vector structure
1501  * @param cidx chroma component(cb, cr)
1502  */
1503 static void chroma_mc_bi(HEVCContext *s, uint8_t *dst0, ptrdiff_t dststride, AVFrame *ref0, AVFrame *ref1,
1504  int x_off, int y_off, int block_w, int block_h, struct MvField *current_mv, int cidx)
1505 {
1506  HEVCLocalContext *lc = s->HEVClc;
1507  uint8_t *src1 = ref0->data[cidx+1];
1508  uint8_t *src2 = ref1->data[cidx+1];
1509  ptrdiff_t src1stride = ref0->linesize[cidx+1];
1510  ptrdiff_t src2stride = ref1->linesize[cidx+1];
1511  int weight_flag = (s->sh.slice_type == P_SLICE && s->pps->weighted_pred_flag) ||
1512  (s->sh.slice_type == B_SLICE && s->pps->weighted_bipred_flag);
1513  int pic_width = s->sps->width >> s->sps->hshift[1];
1514  int pic_height = s->sps->height >> s->sps->vshift[1];
1515  Mv *mv0 = &current_mv->mv[0];
1516  Mv *mv1 = &current_mv->mv[1];
1517  int hshift = s->sps->hshift[1];
1518  int vshift = s->sps->vshift[1];
1519 
1520  intptr_t mx0 = mv0->x & ((1 << (2 + hshift)) - 1);
1521  intptr_t my0 = mv0->y & ((1 << (2 + vshift)) - 1);
1522  intptr_t mx1 = mv1->x & ((1 << (2 + hshift)) - 1);
1523  intptr_t my1 = mv1->y & ((1 << (2 + vshift)) - 1);
1524  intptr_t _mx0 = mx0 << (1 - hshift);
1525  intptr_t _my0 = my0 << (1 - vshift);
1526  intptr_t _mx1 = mx1 << (1 - hshift);
1527  intptr_t _my1 = my1 << (1 - vshift);
1528 
1529  int x_off0 = x_off + (mv0->x >> (2 + hshift));
1530  int y_off0 = y_off + (mv0->y >> (2 + vshift));
1531  int x_off1 = x_off + (mv1->x >> (2 + hshift));
1532  int y_off1 = y_off + (mv1->y >> (2 + vshift));
1533  int idx = ff_hevc_pel_weight[block_w];
1534  src1 += y_off0 * src1stride + (int)((unsigned)x_off0 << s->sps->pixel_shift);
1535  src2 += y_off1 * src2stride + (int)((unsigned)x_off1 << s->sps->pixel_shift);
1536 
1537  if (x_off0 < EPEL_EXTRA_BEFORE || y_off0 < EPEL_EXTRA_AFTER ||
1538  x_off0 >= pic_width - block_w - EPEL_EXTRA_AFTER ||
1539  y_off0 >= pic_height - block_h - EPEL_EXTRA_AFTER) {
1540  const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->sps->pixel_shift;
1541  int offset1 = EPEL_EXTRA_BEFORE * (src1stride + (1 << s->sps->pixel_shift));
1542  int buf_offset1 = EPEL_EXTRA_BEFORE *
1543  (edge_emu_stride + (1 << s->sps->pixel_shift));
1544 
1545  s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src1 - offset1,
1546  edge_emu_stride, src1stride,
1547  block_w + EPEL_EXTRA, block_h + EPEL_EXTRA,
1548  x_off0 - EPEL_EXTRA_BEFORE,
1549  y_off0 - EPEL_EXTRA_BEFORE,
1550  pic_width, pic_height);
1551 
1552  src1 = lc->edge_emu_buffer + buf_offset1;
1553  src1stride = edge_emu_stride;
1554  }
1555 
1556  if (x_off1 < EPEL_EXTRA_BEFORE || y_off1 < EPEL_EXTRA_AFTER ||
1557  x_off1 >= pic_width - block_w - EPEL_EXTRA_AFTER ||
1558  y_off1 >= pic_height - block_h - EPEL_EXTRA_AFTER) {
1559  const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->sps->pixel_shift;
1560  int offset1 = EPEL_EXTRA_BEFORE * (src2stride + (1 << s->sps->pixel_shift));
1561  int buf_offset1 = EPEL_EXTRA_BEFORE *
1562  (edge_emu_stride + (1 << s->sps->pixel_shift));
1563 
1564  s->vdsp.emulated_edge_mc(lc->edge_emu_buffer2, src2 - offset1,
1565  edge_emu_stride, src2stride,
1566  block_w + EPEL_EXTRA, block_h + EPEL_EXTRA,
1567  x_off1 - EPEL_EXTRA_BEFORE,
1568  y_off1 - EPEL_EXTRA_BEFORE,
1569  pic_width, pic_height);
1570 
1571  src2 = lc->edge_emu_buffer2 + buf_offset1;
1572  src2stride = edge_emu_stride;
1573  }
1574 
1575  s->hevcdsp.put_hevc_epel[idx][!!my0][!!mx0](lc->tmp, src1, src1stride,
1576  block_h, _mx0, _my0, block_w);
1577  if (!weight_flag)
1578  s->hevcdsp.put_hevc_epel_bi[idx][!!my1][!!mx1](dst0, s->frame->linesize[cidx+1],
1579  src2, src2stride, lc->tmp,
1580  block_h, _mx1, _my1, block_w);
1581  else
1582  s->hevcdsp.put_hevc_epel_bi_w[idx][!!my1][!!mx1](dst0, s->frame->linesize[cidx+1],
1583  src2, src2stride, lc->tmp,
1584  block_h,
1586  s->sh.chroma_weight_l0[current_mv->ref_idx[0]][cidx],
1587  s->sh.chroma_weight_l1[current_mv->ref_idx[1]][cidx],
1588  s->sh.chroma_offset_l0[current_mv->ref_idx[0]][cidx],
1589  s->sh.chroma_offset_l1[current_mv->ref_idx[1]][cidx],
1590  _mx1, _my1, block_w);
1591 }
1592 
1594  const Mv *mv, int y0, int height)
1595 {
1596  int y = FFMAX(0, (mv->y >> 2) + y0 + height + 9);
1597 
1598  if (s->threads_type == FF_THREAD_FRAME )
1599  ff_thread_await_progress(&ref->tf, y, 0);
1600 }
1601 
1602 static void hevc_luma_mv_mpv_mode(HEVCContext *s, int x0, int y0, int nPbW,
1603  int nPbH, int log2_cb_size, int part_idx,
1604  int merge_idx, MvField *mv)
1605 {
1606  HEVCLocalContext *lc = s->HEVClc;
1607  enum InterPredIdc inter_pred_idc = PRED_L0;
1608  int mvp_flag;
1609 
1610  ff_hevc_set_neighbour_available(s, x0, y0, nPbW, nPbH);
1611  mv->pred_flag = 0;
1612  if (s->sh.slice_type == B_SLICE)
1613  inter_pred_idc = ff_hevc_inter_pred_idc_decode(s, nPbW, nPbH);
1614 
1615  if (inter_pred_idc != PRED_L1) {
1616  if (s->sh.nb_refs[L0])
1617  mv->ref_idx[0]= ff_hevc_ref_idx_lx_decode(s, s->sh.nb_refs[L0]);
1618 
1619  mv->pred_flag = PF_L0;
1620  ff_hevc_hls_mvd_coding(s, x0, y0, 0);
1621  mvp_flag = ff_hevc_mvp_lx_flag_decode(s);
1622  ff_hevc_luma_mv_mvp_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
1623  part_idx, merge_idx, mv, mvp_flag, 0);
1624  mv->mv[0].x += lc->pu.mvd.x;
1625  mv->mv[0].y += lc->pu.mvd.y;
1626  }
1627 
1628  if (inter_pred_idc != PRED_L0) {
1629  if (s->sh.nb_refs[L1])
1630  mv->ref_idx[1]= ff_hevc_ref_idx_lx_decode(s, s->sh.nb_refs[L1]);
1631 
1632  if (s->sh.mvd_l1_zero_flag == 1 && inter_pred_idc == PRED_BI) {
1633  AV_ZERO32(&lc->pu.mvd);
1634  } else {
1635  ff_hevc_hls_mvd_coding(s, x0, y0, 1);
1636  }
1637 
1638  mv->pred_flag += PF_L1;
1639  mvp_flag = ff_hevc_mvp_lx_flag_decode(s);
1640  ff_hevc_luma_mv_mvp_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
1641  part_idx, merge_idx, mv, mvp_flag, 1);
1642  mv->mv[1].x += lc->pu.mvd.x;
1643  mv->mv[1].y += lc->pu.mvd.y;
1644  }
1645 }
1646 
1647 static void hls_prediction_unit(HEVCContext *s, int x0, int y0,
1648  int nPbW, int nPbH,
1649  int log2_cb_size, int partIdx, int idx)
1650 {
1651 #define POS(c_idx, x, y) \
1652  &s->frame->data[c_idx][((y) >> s->sps->vshift[c_idx]) * s->frame->linesize[c_idx] + \
1653  (((x) >> s->sps->hshift[c_idx]) << s->sps->pixel_shift)]
1654  HEVCLocalContext *lc = s->HEVClc;
1655  int merge_idx = 0;
1656  struct MvField current_mv = {{{ 0 }}};
1657 
1658  int min_pu_width = s->sps->min_pu_width;
1659 
1660  MvField *tab_mvf = s->ref->tab_mvf;
1661  RefPicList *refPicList = s->ref->refPicList;
1662  HEVCFrame *ref0 = NULL, *ref1 = NULL;
1663  uint8_t *dst0 = POS(0, x0, y0);
1664  uint8_t *dst1 = POS(1, x0, y0);
1665  uint8_t *dst2 = POS(2, x0, y0);
1666  int log2_min_cb_size = s->sps->log2_min_cb_size;
1667  int min_cb_width = s->sps->min_cb_width;
1668  int x_cb = x0 >> log2_min_cb_size;
1669  int y_cb = y0 >> log2_min_cb_size;
1670  int x_pu, y_pu;
1671  int i, j;
1672 
1673  int skip_flag = SAMPLE_CTB(s->skip_flag, x_cb, y_cb);
1674 
1675  if (!skip_flag)
1677 
1678  if (skip_flag || lc->pu.merge_flag) {
1679  if (s->sh.max_num_merge_cand > 1)
1680  merge_idx = ff_hevc_merge_idx_decode(s);
1681  else
1682  merge_idx = 0;
1683 
1684  ff_hevc_luma_mv_merge_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
1685  partIdx, merge_idx, &current_mv);
1686  } else {
1687  hevc_luma_mv_mpv_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
1688  partIdx, merge_idx, &current_mv);
1689  }
1690 
1691  x_pu = x0 >> s->sps->log2_min_pu_size;
1692  y_pu = y0 >> s->sps->log2_min_pu_size;
1693 
1694  for (j = 0; j < nPbH >> s->sps->log2_min_pu_size; j++)
1695  for (i = 0; i < nPbW >> s->sps->log2_min_pu_size; i++)
1696  tab_mvf[(y_pu + j) * min_pu_width + x_pu + i] = current_mv;
1697 
1698  if (current_mv.pred_flag & PF_L0) {
1699  ref0 = refPicList[0].ref[current_mv.ref_idx[0]];
1700  if (!ref0)
1701  return;
1702  hevc_await_progress(s, ref0, &current_mv.mv[0], y0, nPbH);
1703  }
1704  if (current_mv.pred_flag & PF_L1) {
1705  ref1 = refPicList[1].ref[current_mv.ref_idx[1]];
1706  if (!ref1)
1707  return;
1708  hevc_await_progress(s, ref1, &current_mv.mv[1], y0, nPbH);
1709  }
1710 
1711  if (current_mv.pred_flag == PF_L0) {
1712  int x0_c = x0 >> s->sps->hshift[1];
1713  int y0_c = y0 >> s->sps->vshift[1];
1714  int nPbW_c = nPbW >> s->sps->hshift[1];
1715  int nPbH_c = nPbH >> s->sps->vshift[1];
1716 
1717  luma_mc_uni(s, dst0, s->frame->linesize[0], ref0->frame,
1718  &current_mv.mv[0], x0, y0, nPbW, nPbH,
1719  s->sh.luma_weight_l0[current_mv.ref_idx[0]],
1720  s->sh.luma_offset_l0[current_mv.ref_idx[0]]);
1721 
1722  if (s->sps->chroma_format_idc) {
1723  chroma_mc_uni(s, dst1, s->frame->linesize[1], ref0->frame->data[1], ref0->frame->linesize[1],
1724  0, x0_c, y0_c, nPbW_c, nPbH_c, &current_mv,
1725  s->sh.chroma_weight_l0[current_mv.ref_idx[0]][0], s->sh.chroma_offset_l0[current_mv.ref_idx[0]][0]);
1726  chroma_mc_uni(s, dst2, s->frame->linesize[2], ref0->frame->data[2], ref0->frame->linesize[2],
1727  0, x0_c, y0_c, nPbW_c, nPbH_c, &current_mv,
1728  s->sh.chroma_weight_l0[current_mv.ref_idx[0]][1], s->sh.chroma_offset_l0[current_mv.ref_idx[0]][1]);
1729  }
1730  } else if (current_mv.pred_flag == PF_L1) {
1731  int x0_c = x0 >> s->sps->hshift[1];
1732  int y0_c = y0 >> s->sps->vshift[1];
1733  int nPbW_c = nPbW >> s->sps->hshift[1];
1734  int nPbH_c = nPbH >> s->sps->vshift[1];
1735 
1736  luma_mc_uni(s, dst0, s->frame->linesize[0], ref1->frame,
1737  &current_mv.mv[1], x0, y0, nPbW, nPbH,
1738  s->sh.luma_weight_l1[current_mv.ref_idx[1]],
1739  s->sh.luma_offset_l1[current_mv.ref_idx[1]]);
1740 
1741  if (s->sps->chroma_format_idc) {
1742  chroma_mc_uni(s, dst1, s->frame->linesize[1], ref1->frame->data[1], ref1->frame->linesize[1],
1743  1, x0_c, y0_c, nPbW_c, nPbH_c, &current_mv,
1744  s->sh.chroma_weight_l1[current_mv.ref_idx[1]][0], s->sh.chroma_offset_l1[current_mv.ref_idx[1]][0]);
1745 
1746  chroma_mc_uni(s, dst2, s->frame->linesize[2], ref1->frame->data[2], ref1->frame->linesize[2],
1747  1, x0_c, y0_c, nPbW_c, nPbH_c, &current_mv,
1748  s->sh.chroma_weight_l1[current_mv.ref_idx[1]][1], s->sh.chroma_offset_l1[current_mv.ref_idx[1]][1]);
1749  }
1750  } else if (current_mv.pred_flag == PF_BI) {
1751  int x0_c = x0 >> s->sps->hshift[1];
1752  int y0_c = y0 >> s->sps->vshift[1];
1753  int nPbW_c = nPbW >> s->sps->hshift[1];
1754  int nPbH_c = nPbH >> s->sps->vshift[1];
1755 
1756  luma_mc_bi(s, dst0, s->frame->linesize[0], ref0->frame,
1757  &current_mv.mv[0], x0, y0, nPbW, nPbH,
1758  ref1->frame, &current_mv.mv[1], &current_mv);
1759 
1760  if (s->sps->chroma_format_idc) {
1761  chroma_mc_bi(s, dst1, s->frame->linesize[1], ref0->frame, ref1->frame,
1762  x0_c, y0_c, nPbW_c, nPbH_c, &current_mv, 0);
1763 
1764  chroma_mc_bi(s, dst2, s->frame->linesize[2], ref0->frame, ref1->frame,
1765  x0_c, y0_c, nPbW_c, nPbH_c, &current_mv, 1);
1766  }
1767  }
1768 }
1769 
1770 /**
1771  * 8.4.1
1772  */
1773 static int luma_intra_pred_mode(HEVCContext *s, int x0, int y0, int pu_size,
1774  int prev_intra_luma_pred_flag)
1775 {
1776  HEVCLocalContext *lc = s->HEVClc;
1777  int x_pu = x0 >> s->sps->log2_min_pu_size;
1778  int y_pu = y0 >> s->sps->log2_min_pu_size;
1779  int min_pu_width = s->sps->min_pu_width;
1780  int size_in_pus = pu_size >> s->sps->log2_min_pu_size;
1781  int x0b = x0 & ((1 << s->sps->log2_ctb_size) - 1);
1782  int y0b = y0 & ((1 << s->sps->log2_ctb_size) - 1);
1783 
1784  int cand_up = (lc->ctb_up_flag || y0b) ?
1785  s->tab_ipm[(y_pu - 1) * min_pu_width + x_pu] : INTRA_DC;
1786  int cand_left = (lc->ctb_left_flag || x0b) ?
1787  s->tab_ipm[y_pu * min_pu_width + x_pu - 1] : INTRA_DC;
1788 
1789  int y_ctb = (y0 >> (s->sps->log2_ctb_size)) << (s->sps->log2_ctb_size);
1790 
1791  MvField *tab_mvf = s->ref->tab_mvf;
1792  int intra_pred_mode;
1793  int candidate[3];
1794  int i, j;
1795 
1796  // intra_pred_mode prediction does not cross vertical CTB boundaries
1797  if ((y0 - 1) < y_ctb)
1798  cand_up = INTRA_DC;
1799 
1800  if (cand_left == cand_up) {
1801  if (cand_left < 2) {
1802  candidate[0] = INTRA_PLANAR;
1803  candidate[1] = INTRA_DC;
1804  candidate[2] = INTRA_ANGULAR_26;
1805  } else {
1806  candidate[0] = cand_left;
1807  candidate[1] = 2 + ((cand_left - 2 - 1 + 32) & 31);
1808  candidate[2] = 2 + ((cand_left - 2 + 1) & 31);
1809  }
1810  } else {
1811  candidate[0] = cand_left;
1812  candidate[1] = cand_up;
1813  if (candidate[0] != INTRA_PLANAR && candidate[1] != INTRA_PLANAR) {
1814  candidate[2] = INTRA_PLANAR;
1815  } else if (candidate[0] != INTRA_DC && candidate[1] != INTRA_DC) {
1816  candidate[2] = INTRA_DC;
1817  } else {
1818  candidate[2] = INTRA_ANGULAR_26;
1819  }
1820  }
1821 
1822  if (prev_intra_luma_pred_flag) {
1823  intra_pred_mode = candidate[lc->pu.mpm_idx];
1824  } else {
1825  if (candidate[0] > candidate[1])
1826  FFSWAP(uint8_t, candidate[0], candidate[1]);
1827  if (candidate[0] > candidate[2])
1828  FFSWAP(uint8_t, candidate[0], candidate[2]);
1829  if (candidate[1] > candidate[2])
1830  FFSWAP(uint8_t, candidate[1], candidate[2]);
1831 
1832  intra_pred_mode = lc->pu.rem_intra_luma_pred_mode;
1833  for (i = 0; i < 3; i++)
1834  if (intra_pred_mode >= candidate[i])
1835  intra_pred_mode++;
1836  }
1837 
1838  /* write the intra prediction units into the mv array */
1839  if (!size_in_pus)
1840  size_in_pus = 1;
1841  for (i = 0; i < size_in_pus; i++) {
1842  memset(&s->tab_ipm[(y_pu + i) * min_pu_width + x_pu],
1843  intra_pred_mode, size_in_pus);
1844 
1845  for (j = 0; j < size_in_pus; j++) {
1846  tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].pred_flag = PF_INTRA;
1847  }
1848  }
1849 
1850  return intra_pred_mode;
1851 }
1852 
1853 static av_always_inline void set_ct_depth(HEVCContext *s, int x0, int y0,
1854  int log2_cb_size, int ct_depth)
1855 {
1856  int length = (1 << log2_cb_size) >> s->sps->log2_min_cb_size;
1857  int x_cb = x0 >> s->sps->log2_min_cb_size;
1858  int y_cb = y0 >> s->sps->log2_min_cb_size;
1859  int y;
1860 
1861  for (y = 0; y < length; y++)
1862  memset(&s->tab_ct_depth[(y_cb + y) * s->sps->min_cb_width + x_cb],
1863  ct_depth, length);
1864 }
1865 
1866 static const uint8_t tab_mode_idx[] = {
1867  0, 1, 2, 2, 2, 2, 3, 5, 7, 8, 10, 12, 13, 15, 17, 18, 19, 20,
1868  21, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 29, 29, 30, 31};
1869 
1870 static void intra_prediction_unit(HEVCContext *s, int x0, int y0,
1871  int log2_cb_size)
1872 {
1873  HEVCLocalContext *lc = s->HEVClc;
1874  static const uint8_t intra_chroma_table[4] = { 0, 26, 10, 1 };
1875  uint8_t prev_intra_luma_pred_flag[4];
1876  int split = lc->cu.part_mode == PART_NxN;
1877  int pb_size = (1 << log2_cb_size) >> split;
1878  int side = split + 1;
1879  int chroma_mode;
1880  int i, j;
1881 
1882  for (i = 0; i < side; i++)
1883  for (j = 0; j < side; j++)
1884  prev_intra_luma_pred_flag[2 * i + j] = ff_hevc_prev_intra_luma_pred_flag_decode(s);
1885 
1886  for (i = 0; i < side; i++) {
1887  for (j = 0; j < side; j++) {
1888  if (prev_intra_luma_pred_flag[2 * i + j])
1890  else
1892 
1893  lc->pu.intra_pred_mode[2 * i + j] =
1894  luma_intra_pred_mode(s, x0 + pb_size * j, y0 + pb_size * i, pb_size,
1895  prev_intra_luma_pred_flag[2 * i + j]);
1896  }
1897  }
1898 
1899  if (s->sps->chroma_format_idc == 3) {
1900  for (i = 0; i < side; i++) {
1901  for (j = 0; j < side; j++) {
1902  lc->pu.chroma_mode_c[2 * i + j] = chroma_mode = ff_hevc_intra_chroma_pred_mode_decode(s);
1903  if (chroma_mode != 4) {
1904  if (lc->pu.intra_pred_mode[2 * i + j] == intra_chroma_table[chroma_mode])
1905  lc->pu.intra_pred_mode_c[2 * i + j] = 34;
1906  else
1907  lc->pu.intra_pred_mode_c[2 * i + j] = intra_chroma_table[chroma_mode];
1908  } else {
1909  lc->pu.intra_pred_mode_c[2 * i + j] = lc->pu.intra_pred_mode[2 * i + j];
1910  }
1911  }
1912  }
1913  } else if (s->sps->chroma_format_idc == 2) {
1914  int mode_idx;
1915  lc->pu.chroma_mode_c[0] = chroma_mode = ff_hevc_intra_chroma_pred_mode_decode(s);
1916  if (chroma_mode != 4) {
1917  if (lc->pu.intra_pred_mode[0] == intra_chroma_table[chroma_mode])
1918  mode_idx = 34;
1919  else
1920  mode_idx = intra_chroma_table[chroma_mode];
1921  } else {
1922  mode_idx = lc->pu.intra_pred_mode[0];
1923  }
1924  lc->pu.intra_pred_mode_c[0] = tab_mode_idx[mode_idx];
1925  } else if (s->sps->chroma_format_idc != 0) {
1926  chroma_mode = ff_hevc_intra_chroma_pred_mode_decode(s);
1927  if (chroma_mode != 4) {
1928  if (lc->pu.intra_pred_mode[0] == intra_chroma_table[chroma_mode])
1929  lc->pu.intra_pred_mode_c[0] = 34;
1930  else
1931  lc->pu.intra_pred_mode_c[0] = intra_chroma_table[chroma_mode];
1932  } else {
1933  lc->pu.intra_pred_mode_c[0] = lc->pu.intra_pred_mode[0];
1934  }
1935  }
1936 }
1937 
1939  int x0, int y0,
1940  int log2_cb_size)
1941 {
1942  HEVCLocalContext *lc = s->HEVClc;
1943  int pb_size = 1 << log2_cb_size;
1944  int size_in_pus = pb_size >> s->sps->log2_min_pu_size;
1945  int min_pu_width = s->sps->min_pu_width;
1946  MvField *tab_mvf = s->ref->tab_mvf;
1947  int x_pu = x0 >> s->sps->log2_min_pu_size;
1948  int y_pu = y0 >> s->sps->log2_min_pu_size;
1949  int j, k;
1950 
1951  if (size_in_pus == 0)
1952  size_in_pus = 1;
1953  for (j = 0; j < size_in_pus; j++)
1954  memset(&s->tab_ipm[(y_pu + j) * min_pu_width + x_pu], INTRA_DC, size_in_pus);
1955  if (lc->cu.pred_mode == MODE_INTRA)
1956  for (j = 0; j < size_in_pus; j++)
1957  for (k = 0; k < size_in_pus; k++)
1958  tab_mvf[(y_pu + j) * min_pu_width + x_pu + k].pred_flag = PF_INTRA;
1959 }
1960 
1961 static int hls_coding_unit(HEVCContext *s, int x0, int y0, int log2_cb_size)
1962 {
1963  int cb_size = 1 << log2_cb_size;
1964  HEVCLocalContext *lc = s->HEVClc;
1965  int log2_min_cb_size = s->sps->log2_min_cb_size;
1966  int length = cb_size >> log2_min_cb_size;
1967  int min_cb_width = s->sps->min_cb_width;
1968  int x_cb = x0 >> log2_min_cb_size;
1969  int y_cb = y0 >> log2_min_cb_size;
1970  int idx = log2_cb_size - 2;
1971  int qp_block_mask = (1<<(s->sps->log2_ctb_size - s->pps->diff_cu_qp_delta_depth)) - 1;
1972  int x, y, ret;
1973 
1974  lc->cu.x = x0;
1975  lc->cu.y = y0;
1976  lc->cu.pred_mode = MODE_INTRA;
1977  lc->cu.part_mode = PART_2Nx2N;
1978  lc->cu.intra_split_flag = 0;
1979 
1980  SAMPLE_CTB(s->skip_flag, x_cb, y_cb) = 0;
1981  for (x = 0; x < 4; x++)
1982  lc->pu.intra_pred_mode[x] = 1;
1985  if (lc->cu.cu_transquant_bypass_flag)
1986  set_deblocking_bypass(s, x0, y0, log2_cb_size);
1987  } else
1988  lc->cu.cu_transquant_bypass_flag = 0;
1989 
1990  if (s->sh.slice_type != I_SLICE) {
1991  uint8_t skip_flag = ff_hevc_skip_flag_decode(s, x0, y0, x_cb, y_cb);
1992 
1993  x = y_cb * min_cb_width + x_cb;
1994  for (y = 0; y < length; y++) {
1995  memset(&s->skip_flag[x], skip_flag, length);
1996  x += min_cb_width;
1997  }
1998  lc->cu.pred_mode = skip_flag ? MODE_SKIP : MODE_INTER;
1999  } else {
2000  x = y_cb * min_cb_width + x_cb;
2001  for (y = 0; y < length; y++) {
2002  memset(&s->skip_flag[x], 0, length);
2003  x += min_cb_width;
2004  }
2005  }
2006 
2007  if (SAMPLE_CTB(s->skip_flag, x_cb, y_cb)) {
2008  hls_prediction_unit(s, x0, y0, cb_size, cb_size, log2_cb_size, 0, idx);
2009  intra_prediction_unit_default_value(s, x0, y0, log2_cb_size);
2010 
2012  ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_cb_size);
2013  } else {
2014  int pcm_flag = 0;
2015 
2016  if (s->sh.slice_type != I_SLICE)
2018  if (lc->cu.pred_mode != MODE_INTRA ||
2019  log2_cb_size == s->sps->log2_min_cb_size) {
2020  lc->cu.part_mode = ff_hevc_part_mode_decode(s, log2_cb_size);
2021  lc->cu.intra_split_flag = lc->cu.part_mode == PART_NxN &&
2022  lc->cu.pred_mode == MODE_INTRA;
2023  }
2024 
2025  if (lc->cu.pred_mode == MODE_INTRA) {
2026  if (lc->cu.part_mode == PART_2Nx2N && s->sps->pcm_enabled_flag &&
2027  log2_cb_size >= s->sps->pcm.log2_min_pcm_cb_size &&
2028  log2_cb_size <= s->sps->pcm.log2_max_pcm_cb_size) {
2029  pcm_flag = ff_hevc_pcm_flag_decode(s);
2030  }
2031  if (pcm_flag) {
2032  intra_prediction_unit_default_value(s, x0, y0, log2_cb_size);
2033  ret = hls_pcm_sample(s, x0, y0, log2_cb_size);
2035  set_deblocking_bypass(s, x0, y0, log2_cb_size);
2036 
2037  if (ret < 0)
2038  return ret;
2039  } else {
2040  intra_prediction_unit(s, x0, y0, log2_cb_size);
2041  }
2042  } else {
2043  intra_prediction_unit_default_value(s, x0, y0, log2_cb_size);
2044  switch (lc->cu.part_mode) {
2045  case PART_2Nx2N:
2046  hls_prediction_unit(s, x0, y0, cb_size, cb_size, log2_cb_size, 0, idx);
2047  break;
2048  case PART_2NxN:
2049  hls_prediction_unit(s, x0, y0, cb_size, cb_size / 2, log2_cb_size, 0, idx);
2050  hls_prediction_unit(s, x0, y0 + cb_size / 2, cb_size, cb_size / 2, log2_cb_size, 1, idx);
2051  break;
2052  case PART_Nx2N:
2053  hls_prediction_unit(s, x0, y0, cb_size / 2, cb_size, log2_cb_size, 0, idx - 1);
2054  hls_prediction_unit(s, x0 + cb_size / 2, y0, cb_size / 2, cb_size, log2_cb_size, 1, idx - 1);
2055  break;
2056  case PART_2NxnU:
2057  hls_prediction_unit(s, x0, y0, cb_size, cb_size / 4, log2_cb_size, 0, idx);
2058  hls_prediction_unit(s, x0, y0 + cb_size / 4, cb_size, cb_size * 3 / 4, log2_cb_size, 1, idx);
2059  break;
2060  case PART_2NxnD:
2061  hls_prediction_unit(s, x0, y0, cb_size, cb_size * 3 / 4, log2_cb_size, 0, idx);
2062  hls_prediction_unit(s, x0, y0 + cb_size * 3 / 4, cb_size, cb_size / 4, log2_cb_size, 1, idx);
2063  break;
2064  case PART_nLx2N:
2065  hls_prediction_unit(s, x0, y0, cb_size / 4, cb_size, log2_cb_size, 0, idx - 2);
2066  hls_prediction_unit(s, x0 + cb_size / 4, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 1, idx - 2);
2067  break;
2068  case PART_nRx2N:
2069  hls_prediction_unit(s, x0, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 0, idx - 2);
2070  hls_prediction_unit(s, x0 + cb_size * 3 / 4, y0, cb_size / 4, cb_size, log2_cb_size, 1, idx - 2);
2071  break;
2072  case PART_NxN:
2073  hls_prediction_unit(s, x0, y0, cb_size / 2, cb_size / 2, log2_cb_size, 0, idx - 1);
2074  hls_prediction_unit(s, x0 + cb_size / 2, y0, cb_size / 2, cb_size / 2, log2_cb_size, 1, idx - 1);
2075  hls_prediction_unit(s, x0, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 2, idx - 1);
2076  hls_prediction_unit(s, x0 + cb_size / 2, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 3, idx - 1);
2077  break;
2078  }
2079  }
2080 
2081  if (!pcm_flag) {
2082  int rqt_root_cbf = 1;
2083 
2084  if (lc->cu.pred_mode != MODE_INTRA &&
2085  !(lc->cu.part_mode == PART_2Nx2N && lc->pu.merge_flag)) {
2086  rqt_root_cbf = ff_hevc_no_residual_syntax_flag_decode(s);
2087  }
2088  if (rqt_root_cbf) {
2089  const static int cbf[2] = { 0 };
2090  lc->cu.max_trafo_depth = lc->cu.pred_mode == MODE_INTRA ?
2093  ret = hls_transform_tree(s, x0, y0, x0, y0, x0, y0,
2094  log2_cb_size,
2095  log2_cb_size, 0, 0, cbf, cbf);
2096  if (ret < 0)
2097  return ret;
2098  } else {
2100  ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_cb_size);
2101  }
2102  }
2103  }
2104 
2106  ff_hevc_set_qPy(s, x0, y0, log2_cb_size);
2107 
2108  x = y_cb * min_cb_width + x_cb;
2109  for (y = 0; y < length; y++) {
2110  memset(&s->qp_y_tab[x], lc->qp_y, length);
2111  x += min_cb_width;
2112  }
2113 
2114  if(((x0 + (1<<log2_cb_size)) & qp_block_mask) == 0 &&
2115  ((y0 + (1<<log2_cb_size)) & qp_block_mask) == 0) {
2116  lc->qPy_pred = lc->qp_y;
2117  }
2118 
2119  set_ct_depth(s, x0, y0, log2_cb_size, lc->ct_depth);
2120 
2121  return 0;
2122 }
2123 
2124 static int hls_coding_quadtree(HEVCContext *s, int x0, int y0,
2125  int log2_cb_size, int cb_depth)
2126 {
2127  HEVCLocalContext *lc = s->HEVClc;
2128  const int cb_size = 1 << log2_cb_size;
2129  int ret;
2130  int split_cu;
2131 
2132  lc->ct_depth = cb_depth;
2133  if (x0 + cb_size <= s->sps->width &&
2134  y0 + cb_size <= s->sps->height &&
2135  log2_cb_size > s->sps->log2_min_cb_size) {
2136  split_cu = ff_hevc_split_coding_unit_flag_decode(s, cb_depth, x0, y0);
2137  } else {
2138  split_cu = (log2_cb_size > s->sps->log2_min_cb_size);
2139  }
2140  if (s->pps->cu_qp_delta_enabled_flag &&
2141  log2_cb_size >= s->sps->log2_ctb_size - s->pps->diff_cu_qp_delta_depth) {
2142  lc->tu.is_cu_qp_delta_coded = 0;
2143  lc->tu.cu_qp_delta = 0;
2144  }
2145 
2147  log2_cb_size >= s->sps->log2_ctb_size - s->pps->diff_cu_chroma_qp_offset_depth) {
2149  }
2150 
2151  if (split_cu) {
2152  int qp_block_mask = (1<<(s->sps->log2_ctb_size - s->pps->diff_cu_qp_delta_depth)) - 1;
2153  const int cb_size_split = cb_size >> 1;
2154  const int x1 = x0 + cb_size_split;
2155  const int y1 = y0 + cb_size_split;
2156 
2157  int more_data = 0;
2158 
2159  more_data = hls_coding_quadtree(s, x0, y0, log2_cb_size - 1, cb_depth + 1);
2160  if (more_data < 0)
2161  return more_data;
2162 
2163  if (more_data && x1 < s->sps->width) {
2164  more_data = hls_coding_quadtree(s, x1, y0, log2_cb_size - 1, cb_depth + 1);
2165  if (more_data < 0)
2166  return more_data;
2167  }
2168  if (more_data && y1 < s->sps->height) {
2169  more_data = hls_coding_quadtree(s, x0, y1, log2_cb_size - 1, cb_depth + 1);
2170  if (more_data < 0)
2171  return more_data;
2172  }
2173  if (more_data && x1 < s->sps->width &&
2174  y1 < s->sps->height) {
2175  more_data = hls_coding_quadtree(s, x1, y1, log2_cb_size - 1, cb_depth + 1);
2176  if (more_data < 0)
2177  return more_data;
2178  }
2179 
2180  if(((x0 + (1<<log2_cb_size)) & qp_block_mask) == 0 &&
2181  ((y0 + (1<<log2_cb_size)) & qp_block_mask) == 0)
2182  lc->qPy_pred = lc->qp_y;
2183 
2184  if (more_data)
2185  return ((x1 + cb_size_split) < s->sps->width ||
2186  (y1 + cb_size_split) < s->sps->height);
2187  else
2188  return 0;
2189  } else {
2190  ret = hls_coding_unit(s, x0, y0, log2_cb_size);
2191  if (ret < 0)
2192  return ret;
2193  if ((!((x0 + cb_size) %
2194  (1 << (s->sps->log2_ctb_size))) ||
2195  (x0 + cb_size >= s->sps->width)) &&
2196  (!((y0 + cb_size) %
2197  (1 << (s->sps->log2_ctb_size))) ||
2198  (y0 + cb_size >= s->sps->height))) {
2199  int end_of_slice_flag = ff_hevc_end_of_slice_flag_decode(s);
2200  return !end_of_slice_flag;
2201  } else {
2202  return 1;
2203  }
2204  }
2205 
2206  return 0;
2207 }
2208 
2209 static void hls_decode_neighbour(HEVCContext *s, int x_ctb, int y_ctb,
2210  int ctb_addr_ts)
2211 {
2212  HEVCLocalContext *lc = s->HEVClc;
2213  int ctb_size = 1 << s->sps->log2_ctb_size;
2214  int ctb_addr_rs = s->pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2215  int ctb_addr_in_slice = ctb_addr_rs - s->sh.slice_addr;
2216 
2217  s->tab_slice_address[ctb_addr_rs] = s->sh.slice_addr;
2218 
2220  if (x_ctb == 0 && (y_ctb & (ctb_size - 1)) == 0)
2221  lc->first_qp_group = 1;
2222  lc->end_of_tiles_x = s->sps->width;
2223  } else if (s->pps->tiles_enabled_flag) {
2224  if (ctb_addr_ts && s->pps->tile_id[ctb_addr_ts] != s->pps->tile_id[ctb_addr_ts - 1]) {
2225  int idxX = s->pps->col_idxX[x_ctb >> s->sps->log2_ctb_size];
2226  lc->end_of_tiles_x = x_ctb + (s->pps->column_width[idxX] << s->sps->log2_ctb_size);
2227  lc->first_qp_group = 1;
2228  }
2229  } else {
2230  lc->end_of_tiles_x = s->sps->width;
2231  }
2232 
2233  lc->end_of_tiles_y = FFMIN(y_ctb + ctb_size, s->sps->height);
2234 
2235  lc->boundary_flags = 0;
2236  if (s->pps->tiles_enabled_flag) {
2237  if (x_ctb > 0 && s->pps->tile_id[ctb_addr_ts] != s->pps->tile_id[s->pps->ctb_addr_rs_to_ts[ctb_addr_rs - 1]])
2239  if (x_ctb > 0 && s->tab_slice_address[ctb_addr_rs] != s->tab_slice_address[ctb_addr_rs - 1])
2241  if (y_ctb > 0 && s->pps->tile_id[ctb_addr_ts] != s->pps->tile_id[s->pps->ctb_addr_rs_to_ts[ctb_addr_rs - s->sps->ctb_width]])
2243  if (y_ctb > 0 && s->tab_slice_address[ctb_addr_rs] != s->tab_slice_address[ctb_addr_rs - s->sps->ctb_width])
2245  } else {
2246  if (!ctb_addr_in_slice > 0)
2248  if (ctb_addr_in_slice < s->sps->ctb_width)
2250  }
2251 
2252  lc->ctb_left_flag = ((x_ctb > 0) && (ctb_addr_in_slice > 0) && !(lc->boundary_flags & BOUNDARY_LEFT_TILE));
2253  lc->ctb_up_flag = ((y_ctb > 0) && (ctb_addr_in_slice >= s->sps->ctb_width) && !(lc->boundary_flags & BOUNDARY_UPPER_TILE));
2254  lc->ctb_up_right_flag = ((y_ctb > 0) && (ctb_addr_in_slice+1 >= s->sps->ctb_width) && (s->pps->tile_id[ctb_addr_ts] == s->pps->tile_id[s->pps->ctb_addr_rs_to_ts[ctb_addr_rs+1 - s->sps->ctb_width]]));
2255  lc->ctb_up_left_flag = ((x_ctb > 0) && (y_ctb > 0) && (ctb_addr_in_slice-1 >= s->sps->ctb_width) && (s->pps->tile_id[ctb_addr_ts] == s->pps->tile_id[s->pps->ctb_addr_rs_to_ts[ctb_addr_rs-1 - s->sps->ctb_width]]));
2256 }
2257 
2258 static int hls_decode_entry(AVCodecContext *avctxt, void *isFilterThread)
2259 {
2260  HEVCContext *s = avctxt->priv_data;
2261  int ctb_size = 1 << s->sps->log2_ctb_size;
2262  int more_data = 1;
2263  int x_ctb = 0;
2264  int y_ctb = 0;
2265  int ctb_addr_ts = s->pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs];
2266 
2267  if (!ctb_addr_ts && s->sh.dependent_slice_segment_flag) {
2268  av_log(s->avctx, AV_LOG_ERROR, "Impossible initial tile.\n");
2269  return AVERROR_INVALIDDATA;
2270  }
2271 
2273  int prev_rs = s->pps->ctb_addr_ts_to_rs[ctb_addr_ts - 1];
2274  if (s->tab_slice_address[prev_rs] != s->sh.slice_addr) {
2275  av_log(s->avctx, AV_LOG_ERROR, "Previous slice segment missing\n");
2276  return AVERROR_INVALIDDATA;
2277  }
2278  }
2279 
2280  while (more_data && ctb_addr_ts < s->sps->ctb_size) {
2281  int ctb_addr_rs = s->pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2282 
2283  x_ctb = (ctb_addr_rs % ((s->sps->width + ctb_size - 1) >> s->sps->log2_ctb_size)) << s->sps->log2_ctb_size;
2284  y_ctb = (ctb_addr_rs / ((s->sps->width + ctb_size - 1) >> s->sps->log2_ctb_size)) << s->sps->log2_ctb_size;
2285  hls_decode_neighbour(s, x_ctb, y_ctb, ctb_addr_ts);
2286 
2287  ff_hevc_cabac_init(s, ctb_addr_ts);
2288 
2289  hls_sao_param(s, x_ctb >> s->sps->log2_ctb_size, y_ctb >> s->sps->log2_ctb_size);
2290 
2291  s->deblock[ctb_addr_rs].beta_offset = s->sh.beta_offset;
2292  s->deblock[ctb_addr_rs].tc_offset = s->sh.tc_offset;
2294 
2295  more_data = hls_coding_quadtree(s, x_ctb, y_ctb, s->sps->log2_ctb_size, 0);
2296  if (more_data < 0) {
2297  s->tab_slice_address[ctb_addr_rs] = -1;
2298  return more_data;
2299  }
2300 
2301 
2302  ctb_addr_ts++;
2303  ff_hevc_save_states(s, ctb_addr_ts);
2304  ff_hevc_hls_filters(s, x_ctb, y_ctb, ctb_size);
2305  }
2306 
2307  if (x_ctb + ctb_size >= s->sps->width &&
2308  y_ctb + ctb_size >= s->sps->height)
2309  ff_hevc_hls_filter(s, x_ctb, y_ctb, ctb_size);
2310 
2311  return ctb_addr_ts;
2312 }
2313 
2315 {
2316  int arg[2];
2317  int ret[2];
2318 
2319  arg[0] = 0;
2320  arg[1] = 1;
2321 
2322  s->avctx->execute(s->avctx, hls_decode_entry, arg, ret , 1, sizeof(int));
2323  return ret[0];
2324 }
2325 static int hls_decode_entry_wpp(AVCodecContext *avctxt, void *input_ctb_row, int job, int self_id)
2326 {
2327  HEVCContext *s1 = avctxt->priv_data, *s;
2328  HEVCLocalContext *lc;
2329  int ctb_size = 1<< s1->sps->log2_ctb_size;
2330  int more_data = 1;
2331  int *ctb_row_p = input_ctb_row;
2332  int ctb_row = ctb_row_p[job];
2333  int ctb_addr_rs = s1->sh.slice_ctb_addr_rs + ctb_row * ((s1->sps->width + ctb_size - 1) >> s1->sps->log2_ctb_size);
2334  int ctb_addr_ts = s1->pps->ctb_addr_rs_to_ts[ctb_addr_rs];
2335  int thread = ctb_row % s1->threads_number;
2336  int ret;
2337 
2338  s = s1->sList[self_id];
2339  lc = s->HEVClc;
2340 
2341  if(ctb_row) {
2342  ret = init_get_bits8(&lc->gb, s->data + s->sh.offset[ctb_row - 1], s->sh.size[ctb_row - 1]);
2343 
2344  if (ret < 0)
2345  return ret;
2346  ff_init_cabac_decoder(&lc->cc, s->data + s->sh.offset[(ctb_row)-1], s->sh.size[ctb_row - 1]);
2347  }
2348 
2349  while(more_data && ctb_addr_ts < s->sps->ctb_size) {
2350  int x_ctb = (ctb_addr_rs % s->sps->ctb_width) << s->sps->log2_ctb_size;
2351  int y_ctb = (ctb_addr_rs / s->sps->ctb_width) << s->sps->log2_ctb_size;
2352 
2353  hls_decode_neighbour(s, x_ctb, y_ctb, ctb_addr_ts);
2354 
2355  ff_thread_await_progress2(s->avctx, ctb_row, thread, SHIFT_CTB_WPP);
2356 
2357  if (avpriv_atomic_int_get(&s1->wpp_err)){
2358  ff_thread_report_progress2(s->avctx, ctb_row , thread, SHIFT_CTB_WPP);
2359  return 0;
2360  }
2361 
2362  ff_hevc_cabac_init(s, ctb_addr_ts);
2363  hls_sao_param(s, x_ctb >> s->sps->log2_ctb_size, y_ctb >> s->sps->log2_ctb_size);
2364  more_data = hls_coding_quadtree(s, x_ctb, y_ctb, s->sps->log2_ctb_size, 0);
2365 
2366  if (more_data < 0) {
2367  s->tab_slice_address[ctb_addr_rs] = -1;
2368  return more_data;
2369  }
2370 
2371  ctb_addr_ts++;
2372 
2373  ff_hevc_save_states(s, ctb_addr_ts);
2374  ff_thread_report_progress2(s->avctx, ctb_row, thread, 1);
2375  ff_hevc_hls_filters(s, x_ctb, y_ctb, ctb_size);
2376 
2377  if (!more_data && (x_ctb+ctb_size) < s->sps->width && ctb_row != s->sh.num_entry_point_offsets) {
2378  avpriv_atomic_int_set(&s1->wpp_err, 1);
2379  ff_thread_report_progress2(s->avctx, ctb_row ,thread, SHIFT_CTB_WPP);
2380  return 0;
2381  }
2382 
2383  if ((x_ctb+ctb_size) >= s->sps->width && (y_ctb+ctb_size) >= s->sps->height ) {
2384  ff_hevc_hls_filter(s, x_ctb, y_ctb, ctb_size);
2385  ff_thread_report_progress2(s->avctx, ctb_row , thread, SHIFT_CTB_WPP);
2386  return ctb_addr_ts;
2387  }
2388  ctb_addr_rs = s->pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2389  x_ctb+=ctb_size;
2390 
2391  if(x_ctb >= s->sps->width) {
2392  break;
2393  }
2394  }
2395  ff_thread_report_progress2(s->avctx, ctb_row ,thread, SHIFT_CTB_WPP);
2396 
2397  return 0;
2398 }
2399 
2400 static int hls_slice_data_wpp(HEVCContext *s, const uint8_t *nal, int length)
2401 {
2402  HEVCLocalContext *lc = s->HEVClc;
2403  int *ret = av_malloc_array(s->sh.num_entry_point_offsets + 1, sizeof(int));
2404  int *arg = av_malloc_array(s->sh.num_entry_point_offsets + 1, sizeof(int));
2405  int offset;
2406  int startheader, cmpt = 0;
2407  int i, j, res = 0;
2408 
2409  if (!ret || !arg) {
2410  av_free(ret);
2411  av_free(arg);
2412  return AVERROR(ENOMEM);
2413  }
2414 
2415 
2416  if (!s->sList[1]) {
2418 
2419 
2420  for (i = 1; i < s->threads_number; i++) {
2421  s->sList[i] = av_malloc(sizeof(HEVCContext));
2422  memcpy(s->sList[i], s, sizeof(HEVCContext));
2423  s->HEVClcList[i] = av_mallocz(sizeof(HEVCLocalContext));
2424  s->sList[i]->HEVClc = s->HEVClcList[i];
2425  }
2426  }
2427 
2428  offset = (lc->gb.index >> 3);
2429 
2430  for (j = 0, cmpt = 0, startheader = offset + s->sh.entry_point_offset[0]; j < s->skipped_bytes; j++) {
2431  if (s->skipped_bytes_pos[j] >= offset && s->skipped_bytes_pos[j] < startheader) {
2432  startheader--;
2433  cmpt++;
2434  }
2435  }
2436 
2437  for (i = 1; i < s->sh.num_entry_point_offsets; i++) {
2438  offset += (s->sh.entry_point_offset[i - 1] - cmpt);
2439  for (j = 0, cmpt = 0, startheader = offset
2440  + s->sh.entry_point_offset[i]; j < s->skipped_bytes; j++) {
2441  if (s->skipped_bytes_pos[j] >= offset && s->skipped_bytes_pos[j] < startheader) {
2442  startheader--;
2443  cmpt++;
2444  }
2445  }
2446  s->sh.size[i - 1] = s->sh.entry_point_offset[i] - cmpt;
2447  s->sh.offset[i - 1] = offset;
2448 
2449  }
2450  if (s->sh.num_entry_point_offsets != 0) {
2451  offset += s->sh.entry_point_offset[s->sh.num_entry_point_offsets - 1] - cmpt;
2452  s->sh.size[s->sh.num_entry_point_offsets - 1] = length - offset;
2453  s->sh.offset[s->sh.num_entry_point_offsets - 1] = offset;
2454 
2455  }
2456  s->data = nal;
2457 
2458  for (i = 1; i < s->threads_number; i++) {
2459  s->sList[i]->HEVClc->first_qp_group = 1;
2460  s->sList[i]->HEVClc->qp_y = s->sList[0]->HEVClc->qp_y;
2461  memcpy(s->sList[i], s, sizeof(HEVCContext));
2462  s->sList[i]->HEVClc = s->HEVClcList[i];
2463  }
2464 
2466  ff_reset_entries(s->avctx);
2467 
2468  for (i = 0; i <= s->sh.num_entry_point_offsets; i++) {
2469  arg[i] = i;
2470  ret[i] = 0;
2471  }
2472 
2474  s->avctx->execute2(s->avctx, (void *) hls_decode_entry_wpp, arg, ret, s->sh.num_entry_point_offsets + 1);
2475 
2476  for (i = 0; i <= s->sh.num_entry_point_offsets; i++)
2477  res += ret[i];
2478  av_free(ret);
2479  av_free(arg);
2480  return res;
2481 }
2482 
2483 /**
2484  * @return AVERROR_INVALIDDATA if the packet is not a valid NAL unit,
2485  * 0 if the unit should be skipped, 1 otherwise
2486  */
2488 {
2489  GetBitContext *gb = &s->HEVClc->gb;
2490  int nuh_layer_id;
2491 
2492  if (get_bits1(gb) != 0)
2493  return AVERROR_INVALIDDATA;
2494 
2495  s->nal_unit_type = get_bits(gb, 6);
2496 
2497  nuh_layer_id = get_bits(gb, 6);
2498  s->temporal_id = get_bits(gb, 3) - 1;
2499  if (s->temporal_id < 0)
2500  return AVERROR_INVALIDDATA;
2501 
2503  "nal_unit_type: %d, nuh_layer_id: %d, temporal_id: %d\n",
2504  s->nal_unit_type, nuh_layer_id, s->temporal_id);
2505 
2506  return nuh_layer_id == 0;
2507 }
2508 
2510 {
2511  AVFrame *out = s->ref->frame;
2512 
2513  if (s->sei_frame_packing_present &&
2516  s->content_interpretation_type > 0 &&
2517  s->content_interpretation_type < 3) {
2519  if (!stereo)
2520  return AVERROR(ENOMEM);
2521 
2522  switch (s->frame_packing_arrangement_type) {
2523  case 3:
2524  if (s->quincunx_subsampling)
2526  else
2527  stereo->type = AV_STEREO3D_SIDEBYSIDE;
2528  break;
2529  case 4:
2530  stereo->type = AV_STEREO3D_TOPBOTTOM;
2531  break;
2532  case 5:
2533  stereo->type = AV_STEREO3D_FRAMESEQUENCE;
2534  break;
2535  }
2536 
2537  if (s->content_interpretation_type == 2)
2538  stereo->flags = AV_STEREO3D_FLAG_INVERT;
2539  }
2540 
2542  (s->sei_anticlockwise_rotation || s->sei_hflip || s->sei_vflip)) {
2543  double angle = s->sei_anticlockwise_rotation * 360 / (double) (1 << 16);
2544  AVFrameSideData *rotation = av_frame_new_side_data(out,
2546  sizeof(int32_t) * 9);
2547  if (!rotation)
2548  return AVERROR(ENOMEM);
2549 
2550  av_display_rotation_set((int32_t *)rotation->data, angle);
2551  av_display_matrix_flip((int32_t *)rotation->data,
2552  s->sei_hflip, s->sei_vflip);
2553  }
2554 
2555  return 0;
2556 }
2557 
2559 {
2560  HEVCLocalContext *lc = s->HEVClc;
2561  int pic_size_in_ctb = ((s->sps->width >> s->sps->log2_min_cb_size) + 1) *
2562  ((s->sps->height >> s->sps->log2_min_cb_size) + 1);
2563  int ret;
2564 
2565  memset(s->horizontal_bs, 0, s->bs_width * s->bs_height);
2566  memset(s->vertical_bs, 0, s->bs_width * s->bs_height);
2567  memset(s->cbf_luma, 0, s->sps->min_tb_width * s->sps->min_tb_height);
2568  memset(s->is_pcm, 0, (s->sps->min_pu_width + 1) * (s->sps->min_pu_height + 1));
2569  memset(s->tab_slice_address, -1, pic_size_in_ctb * sizeof(*s->tab_slice_address));
2570 
2571  s->is_decoded = 0;
2572  s->first_nal_type = s->nal_unit_type;
2573 
2574  if (s->pps->tiles_enabled_flag)
2575  lc->end_of_tiles_x = s->pps->column_width[0] << s->sps->log2_ctb_size;
2576 
2577  ret = ff_hevc_set_new_ref(s, &s->frame, s->poc);
2578  if (ret < 0)
2579  goto fail;
2580 
2581  ret = ff_hevc_frame_rps(s);
2582  if (ret < 0) {
2583  av_log(s->avctx, AV_LOG_ERROR, "Error constructing the frame RPS.\n");
2584  goto fail;
2585  }
2586 
2587  s->ref->frame->key_frame = IS_IRAP(s);
2588 
2589  ret = set_side_data(s);
2590  if (ret < 0)
2591  goto fail;
2592 
2593  s->frame->pict_type = 3 - s->sh.slice_type;
2594 
2595  if (!IS_IRAP(s))
2596  ff_hevc_bump_frame(s);
2597 
2599  ret = ff_hevc_output_frame(s, s->output_frame, 0);
2600  if (ret < 0)
2601  goto fail;
2602 
2604 
2605  return 0;
2606 
2607 fail:
2608  if (s->ref)
2609  ff_hevc_unref_frame(s, s->ref, ~0);
2610  s->ref = NULL;
2611  return ret;
2612 }
2613 
2614 static int decode_nal_unit(HEVCContext *s, const HEVCNAL *nal)
2615 {
2616  HEVCLocalContext *lc = s->HEVClc;
2617  GetBitContext *gb = &lc->gb;
2618  int ctb_addr_ts, ret;
2619 
2620  ret = init_get_bits8(gb, nal->data, nal->size);
2621  if (ret < 0)
2622  return ret;
2623 
2624  ret = hls_nal_unit(s);
2625  if (ret < 0) {
2626  av_log(s->avctx, AV_LOG_ERROR, "Invalid NAL unit %d, skipping.\n",
2627  s->nal_unit_type);
2628  goto fail;
2629  } else if (!ret)
2630  return 0;
2631 
2632  switch (s->nal_unit_type) {
2633  case NAL_VPS:
2634  ret = ff_hevc_decode_nal_vps(s);
2635  if (ret < 0)
2636  goto fail;
2637  break;
2638  case NAL_SPS:
2639  ret = ff_hevc_decode_nal_sps(s);
2640  if (ret < 0)
2641  goto fail;
2642  break;
2643  case NAL_PPS:
2644  ret = ff_hevc_decode_nal_pps(s);
2645  if (ret < 0)
2646  goto fail;
2647  break;
2648  case NAL_SEI_PREFIX:
2649  case NAL_SEI_SUFFIX:
2650  ret = ff_hevc_decode_nal_sei(s);
2651  if (ret < 0)
2652  goto fail;
2653  break;
2654  case NAL_TRAIL_R:
2655  case NAL_TRAIL_N:
2656  case NAL_TSA_N:
2657  case NAL_TSA_R:
2658  case NAL_STSA_N:
2659  case NAL_STSA_R:
2660  case NAL_BLA_W_LP:
2661  case NAL_BLA_W_RADL:
2662  case NAL_BLA_N_LP:
2663  case NAL_IDR_W_RADL:
2664  case NAL_IDR_N_LP:
2665  case NAL_CRA_NUT:
2666  case NAL_RADL_N:
2667  case NAL_RADL_R:
2668  case NAL_RASL_N:
2669  case NAL_RASL_R:
2670  ret = hls_slice_header(s);
2671  if (ret < 0)
2672  return ret;
2673 
2674  if (s->max_ra == INT_MAX) {
2675  if (s->nal_unit_type == NAL_CRA_NUT || IS_BLA(s)) {
2676  s->max_ra = s->poc;
2677  } else {
2678  if (IS_IDR(s))
2679  s->max_ra = INT_MIN;
2680  }
2681  }
2682 
2683  if ((s->nal_unit_type == NAL_RASL_R || s->nal_unit_type == NAL_RASL_N) &&
2684  s->poc <= s->max_ra) {
2685  s->is_decoded = 0;
2686  break;
2687  } else {
2688  if (s->nal_unit_type == NAL_RASL_R && s->poc > s->max_ra)
2689  s->max_ra = INT_MIN;
2690  }
2691 
2692  if (s->sh.first_slice_in_pic_flag) {
2693  ret = hevc_frame_start(s);
2694  if (ret < 0)
2695  return ret;
2696  } else if (!s->ref) {
2697  av_log(s->avctx, AV_LOG_ERROR, "First slice in a frame missing.\n");
2698  goto fail;
2699  }
2700 
2701  if (s->nal_unit_type != s->first_nal_type) {
2703  "Non-matching NAL types of the VCL NALUs: %d %d\n",
2704  s->first_nal_type, s->nal_unit_type);
2705  return AVERROR_INVALIDDATA;
2706  }
2707 
2708  if (!s->sh.dependent_slice_segment_flag &&
2709  s->sh.slice_type != I_SLICE) {
2710  ret = ff_hevc_slice_rpl(s);
2711  if (ret < 0) {
2713  "Error constructing the reference lists for the current slice.\n");
2714  goto fail;
2715  }
2716  }
2717 
2718  if (s->sh.first_slice_in_pic_flag && s->avctx->hwaccel) {
2719  ret = s->avctx->hwaccel->start_frame(s->avctx, NULL, 0);
2720  if (ret < 0)
2721  goto fail;
2722  }
2723 
2724  if (s->avctx->hwaccel) {
2725  ret = s->avctx->hwaccel->decode_slice(s->avctx, nal->raw_data, nal->raw_size);
2726  if (ret < 0)
2727  goto fail;
2728  } else {
2729  if (s->threads_number > 1 && s->sh.num_entry_point_offsets > 0)
2730  ctb_addr_ts = hls_slice_data_wpp(s, nal->data, nal->size);
2731  else
2732  ctb_addr_ts = hls_slice_data(s);
2733  if (ctb_addr_ts >= (s->sps->ctb_width * s->sps->ctb_height)) {
2734  s->is_decoded = 1;
2735  }
2736 
2737  if (ctb_addr_ts < 0) {
2738  ret = ctb_addr_ts;
2739  goto fail;
2740  }
2741  }
2742  break;
2743  case NAL_EOS_NUT:
2744  case NAL_EOB_NUT:
2745  s->seq_decode = (s->seq_decode + 1) & 0xff;
2746  s->max_ra = INT_MAX;
2747  break;
2748  case NAL_AUD:
2749  case NAL_FD_NUT:
2750  break;
2751  default:
2752  av_log(s->avctx, AV_LOG_INFO,
2753  "Skipping NAL unit %d\n", s->nal_unit_type);
2754  }
2755 
2756  return 0;
2757 fail:
2759  return ret;
2760  return 0;
2761 }
2762 
2763 /* FIXME: This is adapted from ff_h264_decode_nal, avoiding duplication
2764  * between these functions would be nice. */
2766  HEVCNAL *nal)
2767 {
2768  int i, si, di;
2769  uint8_t *dst;
2770 
2771  s->skipped_bytes = 0;
2772 #define STARTCODE_TEST \
2773  if (i + 2 < length && src[i + 1] == 0 && src[i + 2] <= 3) { \
2774  if (src[i + 2] != 3) { \
2775  /* startcode, so we must be past the end */ \
2776  length = i; \
2777  } \
2778  break; \
2779  }
2780 #if HAVE_FAST_UNALIGNED
2781 #define FIND_FIRST_ZERO \
2782  if (i > 0 && !src[i]) \
2783  i--; \
2784  while (src[i]) \
2785  i++
2786 #if HAVE_FAST_64BIT
2787  for (i = 0; i + 1 < length; i += 9) {
2788  if (!((~AV_RN64A(src + i) &
2789  (AV_RN64A(src + i) - 0x0100010001000101ULL)) &
2790  0x8000800080008080ULL))
2791  continue;
2792  FIND_FIRST_ZERO;
2794  i -= 7;
2795  }
2796 #else
2797  for (i = 0; i + 1 < length; i += 5) {
2798  if (!((~AV_RN32A(src + i) &
2799  (AV_RN32A(src + i) - 0x01000101U)) &
2800  0x80008080U))
2801  continue;
2802  FIND_FIRST_ZERO;
2804  i -= 3;
2805  }
2806 #endif /* HAVE_FAST_64BIT */
2807 #else
2808  for (i = 0; i + 1 < length; i += 2) {
2809  if (src[i])
2810  continue;
2811  if (i > 0 && src[i - 1] == 0)
2812  i--;
2814  }
2815 #endif /* HAVE_FAST_UNALIGNED */
2816 
2817  if (i >= length - 1) { // no escaped 0
2818  nal->data =
2819  nal->raw_data = src;
2820  nal->size =
2821  nal->raw_size = length;
2822  return length;
2823  }
2824 
2826  length + FF_INPUT_BUFFER_PADDING_SIZE);
2827  if (!nal->rbsp_buffer)
2828  return AVERROR(ENOMEM);
2829 
2830  dst = nal->rbsp_buffer;
2831 
2832  memcpy(dst, src, i);
2833  si = di = i;
2834  while (si + 2 < length) {
2835  // remove escapes (very rare 1:2^22)
2836  if (src[si + 2] > 3) {
2837  dst[di++] = src[si++];
2838  dst[di++] = src[si++];
2839  } else if (src[si] == 0 && src[si + 1] == 0) {
2840  if (src[si + 2] == 3) { // escape
2841  dst[di++] = 0;
2842  dst[di++] = 0;
2843  si += 3;
2844 
2845  s->skipped_bytes++;
2846  if (s->skipped_bytes_pos_size < s->skipped_bytes) {
2847  s->skipped_bytes_pos_size *= 2;
2850  sizeof(*s->skipped_bytes_pos));
2851  if (!s->skipped_bytes_pos)
2852  return AVERROR(ENOMEM);
2853  }
2854  if (s->skipped_bytes_pos)
2855  s->skipped_bytes_pos[s->skipped_bytes-1] = di - 1;
2856  continue;
2857  } else // next start code
2858  goto nsc;
2859  }
2860 
2861  dst[di++] = src[si++];
2862  }
2863  while (si < length)
2864  dst[di++] = src[si++];
2865 
2866 nsc:
2867  memset(dst + di, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2868 
2869  nal->data = dst;
2870  nal->size = di;
2871  nal->raw_data = src;
2872  nal->raw_size = si;
2873  return si;
2874 }
2875 
2876 static int decode_nal_units(HEVCContext *s, const uint8_t *buf, int length)
2877 {
2878  int i, consumed, ret = 0;
2879 
2880  s->ref = NULL;
2881  s->last_eos = s->eos;
2882  s->eos = 0;
2883 
2884  /* split the input packet into NAL units, so we know the upper bound on the
2885  * number of slices in the frame */
2886  s->nb_nals = 0;
2887  while (length >= 4) {
2888  HEVCNAL *nal;
2889  int extract_length = 0;
2890 
2891  if (s->is_nalff) {
2892  int i;
2893  for (i = 0; i < s->nal_length_size; i++)
2894  extract_length = (extract_length << 8) | buf[i];
2895  buf += s->nal_length_size;
2896  length -= s->nal_length_size;
2897 
2898  if (extract_length > length) {
2899  av_log(s->avctx, AV_LOG_ERROR, "Invalid NAL unit size.\n");
2900  ret = AVERROR_INVALIDDATA;
2901  goto fail;
2902  }
2903  } else {
2904  /* search start code */
2905  while (buf[0] != 0 || buf[1] != 0 || buf[2] != 1) {
2906  ++buf;
2907  --length;
2908  if (length < 4) {
2909  av_log(s->avctx, AV_LOG_ERROR, "No start code is found.\n");
2910  ret = AVERROR_INVALIDDATA;
2911  goto fail;
2912  }
2913  }
2914 
2915  buf += 3;
2916  length -= 3;
2917  }
2918 
2919  if (!s->is_nalff)
2920  extract_length = length;
2921 
2922  if (s->nals_allocated < s->nb_nals + 1) {
2923  int new_size = s->nals_allocated + 1;
2924  void *tmp = av_realloc_array(s->nals, new_size, sizeof(*s->nals));
2925  ret = AVERROR(ENOMEM);
2926  if (!tmp) {
2927  goto fail;
2928  }
2929  s->nals = tmp;
2930  memset(s->nals + s->nals_allocated, 0,
2931  (new_size - s->nals_allocated) * sizeof(*s->nals));
2932 
2933  tmp = av_realloc_array(s->skipped_bytes_nal, new_size, sizeof(*s->skipped_bytes_nal));
2934  if (!tmp)
2935  goto fail;
2936  s->skipped_bytes_nal = tmp;
2937 
2939  if (!tmp)
2940  goto fail;
2941  s->skipped_bytes_pos_size_nal = tmp;
2942 
2943  tmp = av_realloc_array(s->skipped_bytes_pos_nal, new_size, sizeof(*s->skipped_bytes_pos_nal));
2944  if (!tmp)
2945  goto fail;
2946  s->skipped_bytes_pos_nal = tmp;
2947 
2948  s->skipped_bytes_pos_size_nal[s->nals_allocated] = 1024; // initial buffer size
2951  goto fail;
2952  s->nals_allocated = new_size;
2953  }
2956  nal = &s->nals[s->nb_nals];
2957 
2958  consumed = ff_hevc_extract_rbsp(s, buf, extract_length, nal);
2959 
2963 
2964 
2965  if (consumed < 0) {
2966  ret = consumed;
2967  goto fail;
2968  }
2969 
2970  ret = init_get_bits8(&s->HEVClc->gb, nal->data, nal->size);
2971  if (ret < 0)
2972  goto fail;
2973  hls_nal_unit(s);
2974 
2975  if (s->nal_unit_type == NAL_EOB_NUT ||
2976  s->nal_unit_type == NAL_EOS_NUT)
2977  s->eos = 1;
2978 
2979  buf += consumed;
2980  length -= consumed;
2981  }
2982 
2983  /* parse the NAL units */
2984  for (i = 0; i < s->nb_nals; i++) {
2985  int ret;
2986  s->skipped_bytes = s->skipped_bytes_nal[i];
2988 
2989  ret = decode_nal_unit(s, &s->nals[i]);
2990  if (ret < 0) {
2992  "Error parsing NAL unit #%d.\n", i);
2993  goto fail;
2994  }
2995  }
2996 
2997 fail:
2998  if (s->ref && s->threads_type == FF_THREAD_FRAME)
2999  ff_thread_report_progress(&s->ref->tf, INT_MAX, 0);
3000 
3001  return ret;
3002 }
3003 
3004 static void print_md5(void *log_ctx, int level, uint8_t md5[16])
3005 {
3006  int i;
3007  for (i = 0; i < 16; i++)
3008  av_log(log_ctx, level, "%02"PRIx8, md5[i]);
3009 }
3010 
3012 {
3013  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format);
3014  int pixel_shift;
3015  int i, j;
3016 
3017  if (!desc)
3018  return AVERROR(EINVAL);
3019 
3020  pixel_shift = desc->comp[0].depth_minus1 > 7;
3021 
3022  av_log(s->avctx, AV_LOG_DEBUG, "Verifying checksum for frame with POC %d: ",
3023  s->poc);
3024 
3025  /* the checksums are LE, so we have to byteswap for >8bpp formats
3026  * on BE arches */
3027 #if HAVE_BIGENDIAN
3028  if (pixel_shift && !s->checksum_buf) {
3030  FFMAX3(frame->linesize[0], frame->linesize[1],
3031  frame->linesize[2]));
3032  if (!s->checksum_buf)
3033  return AVERROR(ENOMEM);
3034  }
3035 #endif
3036 
3037  for (i = 0; frame->data[i]; i++) {
3038  int width = s->avctx->coded_width;
3039  int height = s->avctx->coded_height;
3040  int w = (i == 1 || i == 2) ? (width >> desc->log2_chroma_w) : width;
3041  int h = (i == 1 || i == 2) ? (height >> desc->log2_chroma_h) : height;
3042  uint8_t md5[16];
3043 
3044  av_md5_init(s->md5_ctx);
3045  for (j = 0; j < h; j++) {
3046  const uint8_t *src = frame->data[i] + j * frame->linesize[i];
3047 #if HAVE_BIGENDIAN
3048  if (pixel_shift) {
3049  s->bdsp.bswap16_buf((uint16_t *) s->checksum_buf,
3050  (const uint16_t *) src, w);
3051  src = s->checksum_buf;
3052  }
3053 #endif
3054  av_md5_update(s->md5_ctx, src, w << pixel_shift);
3055  }
3056  av_md5_final(s->md5_ctx, md5);
3057 
3058  if (!memcmp(md5, s->md5[i], 16)) {
3059  av_log (s->avctx, AV_LOG_DEBUG, "plane %d - correct ", i);
3060  print_md5(s->avctx, AV_LOG_DEBUG, md5);
3061  av_log (s->avctx, AV_LOG_DEBUG, "; ");
3062  } else {
3063  av_log (s->avctx, AV_LOG_ERROR, "mismatching checksum of plane %d - ", i);
3064  print_md5(s->avctx, AV_LOG_ERROR, md5);
3065  av_log (s->avctx, AV_LOG_ERROR, " != ");
3066  print_md5(s->avctx, AV_LOG_ERROR, s->md5[i]);
3067  av_log (s->avctx, AV_LOG_ERROR, "\n");
3068  return AVERROR_INVALIDDATA;
3069  }
3070  }
3071 
3072  av_log(s->avctx, AV_LOG_DEBUG, "\n");
3073 
3074  return 0;
3075 }
3076 
3077 static int hevc_decode_frame(AVCodecContext *avctx, void *data, int *got_output,
3078  AVPacket *avpkt)
3079 {
3080  int ret;
3081  HEVCContext *s = avctx->priv_data;
3082 
3083  if (!avpkt->size) {
3084  ret = ff_hevc_output_frame(s, data, 1);
3085  if (ret < 0)
3086  return ret;
3087 
3088  *got_output = ret;
3089  return 0;
3090  }
3091 
3092  s->ref = NULL;
3093  ret = decode_nal_units(s, avpkt->data, avpkt->size);
3094  if (ret < 0)
3095  return ret;
3096 
3097  if (avctx->hwaccel) {
3098  if (s->ref && avctx->hwaccel->end_frame(avctx) < 0)
3099  av_log(avctx, AV_LOG_ERROR,
3100  "hardware accelerator failed to decode picture\n");
3101  } else {
3102  /* verify the SEI checksum */
3103  if (avctx->err_recognition & AV_EF_CRCCHECK && s->is_decoded &&
3104  s->is_md5) {
3105  ret = verify_md5(s, s->ref->frame);
3106  if (ret < 0 && avctx->err_recognition & AV_EF_EXPLODE) {
3107  ff_hevc_unref_frame(s, s->ref, ~0);
3108  return ret;
3109  }
3110  }
3111  }
3112  s->is_md5 = 0;
3113 
3114  if (s->is_decoded) {
3115  av_log(avctx, AV_LOG_DEBUG, "Decoded frame with POC %d.\n", s->poc);
3116  s->is_decoded = 0;
3117  }
3118 
3119  if (s->output_frame->buf[0]) {
3120  av_frame_move_ref(data, s->output_frame);
3121  *got_output = 1;
3122  }
3123 
3124  return avpkt->size;
3125 }
3126 
3128 {
3129  int ret;
3130 
3131  ret = ff_thread_ref_frame(&dst->tf, &src->tf);
3132  if (ret < 0)
3133  return ret;
3134 
3135  dst->tab_mvf_buf = av_buffer_ref(src->tab_mvf_buf);
3136  if (!dst->tab_mvf_buf)
3137  goto fail;
3138  dst->tab_mvf = src->tab_mvf;
3139 
3140  dst->rpl_tab_buf = av_buffer_ref(src->rpl_tab_buf);
3141  if (!dst->rpl_tab_buf)
3142  goto fail;
3143  dst->rpl_tab = src->rpl_tab;
3144 
3145  dst->rpl_buf = av_buffer_ref(src->rpl_buf);
3146  if (!dst->rpl_buf)
3147  goto fail;
3148 
3149  dst->poc = src->poc;
3150  dst->ctb_count = src->ctb_count;
3151  dst->window = src->window;
3152  dst->flags = src->flags;
3153  dst->sequence = src->sequence;
3154 
3155  if (src->hwaccel_picture_private) {
3157  if (!dst->hwaccel_priv_buf)
3158  goto fail;
3160  }
3161 
3162  return 0;
3163 fail:
3164  ff_hevc_unref_frame(s, dst, ~0);
3165  return AVERROR(ENOMEM);
3166 }
3167 
3169 {
3170  HEVCContext *s = avctx->priv_data;
3171  int i;
3172 
3173  pic_arrays_free(s);
3174 
3175  av_freep(&s->md5_ctx);
3176 
3177  for(i=0; i < s->nals_allocated; i++) {
3179  }
3183 
3184  av_freep(&s->cabac_state);
3185 
3186  for (i = 0; i < 3; i++) {
3187  av_freep(&s->sao_pixel_buffer_h[i]);
3188  av_freep(&s->sao_pixel_buffer_v[i]);
3189  }
3191 
3192  for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
3193  ff_hevc_unref_frame(s, &s->DPB[i], ~0);
3194  av_frame_free(&s->DPB[i].frame);
3195  }
3196 
3197  for (i = 0; i < FF_ARRAY_ELEMS(s->vps_list); i++)
3198  av_buffer_unref(&s->vps_list[i]);
3199  for (i = 0; i < FF_ARRAY_ELEMS(s->sps_list); i++)
3200  av_buffer_unref(&s->sps_list[i]);
3201  for (i = 0; i < FF_ARRAY_ELEMS(s->pps_list); i++)
3202  av_buffer_unref(&s->pps_list[i]);
3203  s->sps = NULL;
3204  s->pps = NULL;
3205  s->vps = NULL;
3206 
3208 
3210  av_freep(&s->sh.offset);
3211  av_freep(&s->sh.size);
3212 
3213  for (i = 1; i < s->threads_number; i++) {
3214  HEVCLocalContext *lc = s->HEVClcList[i];
3215  if (lc) {
3216  av_freep(&s->HEVClcList[i]);
3217  av_freep(&s->sList[i]);
3218  }
3219  }
3220  if (s->HEVClc == s->HEVClcList[0])
3221  s->HEVClc = NULL;
3222  av_freep(&s->HEVClcList[0]);
3223 
3224  for (i = 0; i < s->nals_allocated; i++)
3225  av_freep(&s->nals[i].rbsp_buffer);
3226  av_freep(&s->nals);
3227  s->nals_allocated = 0;
3228 
3229  return 0;
3230 }
3231 
3233 {
3234  HEVCContext *s = avctx->priv_data;
3235  int i;
3236 
3237  s->avctx = avctx;
3238 
3239  s->HEVClc = av_mallocz(sizeof(HEVCLocalContext));
3240  if (!s->HEVClc)
3241  goto fail;
3242  s->HEVClcList[0] = s->HEVClc;
3243  s->sList[0] = s;
3244 
3246  if (!s->cabac_state)
3247  goto fail;
3248 
3250  if (!s->output_frame)
3251  goto fail;
3252 
3253  for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
3254  s->DPB[i].frame = av_frame_alloc();
3255  if (!s->DPB[i].frame)
3256  goto fail;
3257  s->DPB[i].tf.f = s->DPB[i].frame;
3258  }
3259 
3260  s->max_ra = INT_MAX;
3261 
3262  s->md5_ctx = av_md5_alloc();
3263  if (!s->md5_ctx)
3264  goto fail;
3265 
3266  ff_bswapdsp_init(&s->bdsp);
3267 
3268  s->context_initialized = 1;
3269  s->eos = 0;
3270 
3271  return 0;
3272 
3273 fail:
3274  hevc_decode_free(avctx);
3275  return AVERROR(ENOMEM);
3276 }
3277 
3279  const AVCodecContext *src)
3280 {
3281  HEVCContext *s = dst->priv_data;
3282  HEVCContext *s0 = src->priv_data;
3283  int i, ret;
3284 
3285  if (!s->context_initialized) {
3286  ret = hevc_init_context(dst);
3287  if (ret < 0)
3288  return ret;
3289  }
3290 
3291  for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
3292  ff_hevc_unref_frame(s, &s->DPB[i], ~0);
3293  if (s0->DPB[i].frame->buf[0]) {
3294  ret = hevc_ref_frame(s, &s->DPB[i], &s0->DPB[i]);
3295  if (ret < 0)
3296  return ret;
3297  }
3298  }
3299 
3300  if (s->sps != s0->sps)
3301  s->sps = NULL;
3302  for (i = 0; i < FF_ARRAY_ELEMS(s->vps_list); i++) {
3303  av_buffer_unref(&s->vps_list[i]);
3304  if (s0->vps_list[i]) {
3305  s->vps_list[i] = av_buffer_ref(s0->vps_list[i]);
3306  if (!s->vps_list[i])
3307  return AVERROR(ENOMEM);
3308  }
3309  }
3310 
3311  for (i = 0; i < FF_ARRAY_ELEMS(s->sps_list); i++) {
3312  av_buffer_unref(&s->sps_list[i]);
3313  if (s0->sps_list[i]) {
3314  s->sps_list[i] = av_buffer_ref(s0->sps_list[i]);
3315  if (!s->sps_list[i])
3316  return AVERROR(ENOMEM);
3317  }
3318  }
3319 
3320  for (i = 0; i < FF_ARRAY_ELEMS(s->pps_list); i++) {
3321  av_buffer_unref(&s->pps_list[i]);
3322  if (s0->pps_list[i]) {
3323  s->pps_list[i] = av_buffer_ref(s0->pps_list[i]);
3324  if (!s->pps_list[i])
3325  return AVERROR(ENOMEM);
3326  }
3327  }
3328 
3330  if (s0->current_sps) {
3332  if (!s->current_sps)
3333  return AVERROR(ENOMEM);
3334  }
3335 
3336  if (s->sps != s0->sps)
3337  if ((ret = set_sps(s, s0->sps)) < 0)
3338  return ret;
3339 
3340  s->seq_decode = s0->seq_decode;
3341  s->seq_output = s0->seq_output;
3342  s->pocTid0 = s0->pocTid0;
3343  s->max_ra = s0->max_ra;
3344  s->eos = s0->eos;
3345 
3346  s->is_nalff = s0->is_nalff;
3348 
3349  s->threads_number = s0->threads_number;
3350  s->threads_type = s0->threads_type;
3351 
3352  if (s0->eos) {
3353  s->seq_decode = (s->seq_decode + 1) & 0xff;
3354  s->max_ra = INT_MAX;
3355  }
3356 
3357  return 0;
3358 }
3359 
3361 {
3362  AVCodecContext *avctx = s->avctx;
3363  GetByteContext gb;
3364  int ret;
3365 
3366  bytestream2_init(&gb, avctx->extradata, avctx->extradata_size);
3367 
3368  if (avctx->extradata_size > 3 &&
3369  (avctx->extradata[0] || avctx->extradata[1] ||
3370  avctx->extradata[2] > 1)) {
3371  /* It seems the extradata is encoded as hvcC format.
3372  * Temporarily, we support configurationVersion==0 until 14496-15 3rd
3373  * is finalized. When finalized, configurationVersion will be 1 and we
3374  * can recognize hvcC by checking if avctx->extradata[0]==1 or not. */
3375  int i, j, num_arrays, nal_len_size;
3376 
3377  s->is_nalff = 1;
3378 
3379  bytestream2_skip(&gb, 21);
3380  nal_len_size = (bytestream2_get_byte(&gb) & 3) + 1;
3381  num_arrays = bytestream2_get_byte(&gb);
3382 
3383  /* nal units in the hvcC always have length coded with 2 bytes,
3384  * so put a fake nal_length_size = 2 while parsing them */
3385  s->nal_length_size = 2;
3386 
3387  /* Decode nal units from hvcC. */
3388  for (i = 0; i < num_arrays; i++) {
3389  int type = bytestream2_get_byte(&gb) & 0x3f;
3390  int cnt = bytestream2_get_be16(&gb);
3391 
3392  for (j = 0; j < cnt; j++) {
3393  // +2 for the nal size field
3394  int nalsize = bytestream2_peek_be16(&gb) + 2;
3395  if (bytestream2_get_bytes_left(&gb) < nalsize) {
3397  "Invalid NAL unit size in extradata.\n");
3398  return AVERROR_INVALIDDATA;
3399  }
3400 
3401  ret = decode_nal_units(s, gb.buffer, nalsize);
3402  if (ret < 0) {
3403  av_log(avctx, AV_LOG_ERROR,
3404  "Decoding nal unit %d %d from hvcC failed\n",
3405  type, i);
3406  return ret;
3407  }
3408  bytestream2_skip(&gb, nalsize);
3409  }
3410  }
3411 
3412  /* Now store right nal length size, that will be used to parse
3413  * all other nals */
3414  s->nal_length_size = nal_len_size;
3415  } else {
3416  s->is_nalff = 0;
3417  ret = decode_nal_units(s, avctx->extradata, avctx->extradata_size);
3418  if (ret < 0)
3419  return ret;
3420  }
3421  return 0;
3422 }
3423 
3425 {
3426  HEVCContext *s = avctx->priv_data;
3427  int ret;
3428 
3430 
3431  avctx->internal->allocate_progress = 1;
3432 
3433  ret = hevc_init_context(avctx);
3434  if (ret < 0)
3435  return ret;
3436 
3437  s->enable_parallel_tiles = 0;
3438  s->picture_struct = 0;
3439 
3440  if(avctx->active_thread_type & FF_THREAD_SLICE)
3441  s->threads_number = avctx->thread_count;
3442  else
3443  s->threads_number = 1;
3444 
3445  if (avctx->extradata_size > 0 && avctx->extradata) {
3446  ret = hevc_decode_extradata(s);
3447  if (ret < 0) {
3448  hevc_decode_free(avctx);
3449  return ret;
3450  }
3451  }
3452 
3453  if((avctx->active_thread_type & FF_THREAD_FRAME) && avctx->thread_count > 1)
3455  else
3457 
3458  return 0;
3459 }
3460 
3462 {
3463  HEVCContext *s = avctx->priv_data;
3464  int ret;
3465 
3466  memset(s, 0, sizeof(*s));
3467 
3468  ret = hevc_init_context(avctx);
3469  if (ret < 0)
3470  return ret;
3471 
3472  return 0;
3473 }
3474 
3476 {
3477  HEVCContext *s = avctx->priv_data;
3478  ff_hevc_flush_dpb(s);
3479  s->max_ra = INT_MAX;
3480 }
3481 
3482 #define OFFSET(x) offsetof(HEVCContext, x)
3483 #define PAR (AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
3484 
3485 static const AVProfile profiles[] = {
3486  { FF_PROFILE_HEVC_MAIN, "Main" },
3487  { FF_PROFILE_HEVC_MAIN_10, "Main 10" },
3488  { FF_PROFILE_HEVC_MAIN_STILL_PICTURE, "Main Still Picture" },
3489  { FF_PROFILE_HEVC_REXT, "Rext" },
3490  { FF_PROFILE_UNKNOWN },
3491 };
3492 
3493 static const AVOption options[] = {
3494  { "apply_defdispwin", "Apply default display window from VUI", OFFSET(apply_defdispwin),
3495  AV_OPT_TYPE_INT, {.i64 = 0}, 0, 1, PAR },
3496  { "strict-displaywin", "stricly apply default display window size", OFFSET(apply_defdispwin),
3497  AV_OPT_TYPE_INT, {.i64 = 0}, 0, 1, PAR },
3498  { NULL },
3499 };
3500 
3501 static const AVClass hevc_decoder_class = {
3502  .class_name = "HEVC decoder",
3503  .item_name = av_default_item_name,
3504  .option = options,
3505  .version = LIBAVUTIL_VERSION_INT,
3506 };
3507 
3509  .name = "hevc",
3510  .long_name = NULL_IF_CONFIG_SMALL("HEVC (High Efficiency Video Coding)"),
3511  .type = AVMEDIA_TYPE_VIDEO,
3512  .id = AV_CODEC_ID_HEVC,
3513  .priv_data_size = sizeof(HEVCContext),
3514  .priv_class = &hevc_decoder_class,
3516  .close = hevc_decode_free,
3521  .capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY |
3523  .profiles = NULL_IF_CONFIG_SMALL(profiles),
3524 };