FFmpeg  3.4.9
hevcdec.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/attributes.h"
27 #include "libavutil/common.h"
28 #include "libavutil/display.h"
29 #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 #include "hevc_data.h"
42 #include "hevc_parse.h"
43 #include "hevcdec.h"
44 #include "profiles.h"
45 
46 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 };
47 
48 /**
49  * NOTE: Each function hls_foo correspond to the function foo in the
50  * specification (HLS stands for High Level Syntax).
51  */
52 
53 /**
54  * Section 5.7
55  */
56 
57 /* free everything allocated by pic_arrays_init() */
59 {
60  av_freep(&s->sao);
61  av_freep(&s->deblock);
62 
63  av_freep(&s->skip_flag);
65 
66  av_freep(&s->tab_ipm);
67  av_freep(&s->cbf_luma);
68  av_freep(&s->is_pcm);
69 
70  av_freep(&s->qp_y_tab);
73 
75  av_freep(&s->vertical_bs);
76 
78  av_freep(&s->sh.size);
79  av_freep(&s->sh.offset);
80 
83 }
84 
85 /* allocate arrays that depend on frame dimensions */
86 static int pic_arrays_init(HEVCContext *s, const HEVCSPS *sps)
87 {
88  int log2_min_cb_size = sps->log2_min_cb_size;
89  int width = sps->width;
90  int height = sps->height;
91  int pic_size_in_ctb = ((width >> log2_min_cb_size) + 1) *
92  ((height >> log2_min_cb_size) + 1);
93  int ctb_count = sps->ctb_width * sps->ctb_height;
94  int min_pu_size = sps->min_pu_width * sps->min_pu_height;
95 
96  s->bs_width = (width >> 2) + 1;
97  s->bs_height = (height >> 2) + 1;
98 
99  s->sao = av_mallocz_array(ctb_count, sizeof(*s->sao));
100  s->deblock = av_mallocz_array(ctb_count, sizeof(*s->deblock));
101  if (!s->sao || !s->deblock)
102  goto fail;
103 
106  if (!s->skip_flag || !s->tab_ct_depth)
107  goto fail;
108 
110  s->tab_ipm = av_mallocz(min_pu_size);
111  s->is_pcm = av_malloc_array(sps->min_pu_width + 1, sps->min_pu_height + 1);
112  if (!s->tab_ipm || !s->cbf_luma || !s->is_pcm)
113  goto fail;
114 
115  s->filter_slice_edges = av_mallocz(ctb_count);
116  s->tab_slice_address = av_malloc_array(pic_size_in_ctb,
117  sizeof(*s->tab_slice_address));
118  s->qp_y_tab = av_malloc_array(pic_size_in_ctb,
119  sizeof(*s->qp_y_tab));
120  if (!s->qp_y_tab || !s->filter_slice_edges || !s->tab_slice_address)
121  goto fail;
122 
125  if (!s->horizontal_bs || !s->vertical_bs)
126  goto fail;
127 
128  s->tab_mvf_pool = av_buffer_pool_init(min_pu_size * sizeof(MvField),
130  s->rpl_tab_pool = av_buffer_pool_init(ctb_count * sizeof(RefPicListTab),
132  if (!s->tab_mvf_pool || !s->rpl_tab_pool)
133  goto fail;
134 
135  return 0;
136 
137 fail:
138  pic_arrays_free(s);
139  return AVERROR(ENOMEM);
140 }
141 
143 {
144  int i = 0;
145  int j = 0;
146  uint8_t luma_weight_l0_flag[16];
147  uint8_t chroma_weight_l0_flag[16];
148  uint8_t luma_weight_l1_flag[16];
149  uint8_t chroma_weight_l1_flag[16];
150  int luma_log2_weight_denom;
151 
152  luma_log2_weight_denom = get_ue_golomb_long(gb);
153  if (luma_log2_weight_denom < 0 || luma_log2_weight_denom > 7) {
154  av_log(s->avctx, AV_LOG_ERROR, "luma_log2_weight_denom %d is invalid\n", luma_log2_weight_denom);
155  return AVERROR_INVALIDDATA;
156  }
157  s->sh.luma_log2_weight_denom = av_clip_uintp2(luma_log2_weight_denom, 3);
158  if (s->ps.sps->chroma_format_idc != 0) {
159  int64_t chroma_log2_weight_denom = luma_log2_weight_denom + (int64_t)get_se_golomb(gb);
160  if (chroma_log2_weight_denom < 0 || chroma_log2_weight_denom > 7) {
161  av_log(s->avctx, AV_LOG_ERROR, "chroma_log2_weight_denom %"PRId64" is invalid\n", chroma_log2_weight_denom);
162  return AVERROR_INVALIDDATA;
163  }
164  s->sh.chroma_log2_weight_denom = chroma_log2_weight_denom;
165  }
166 
167  for (i = 0; i < s->sh.nb_refs[L0]; i++) {
168  luma_weight_l0_flag[i] = get_bits1(gb);
169  if (!luma_weight_l0_flag[i]) {
170  s->sh.luma_weight_l0[i] = 1 << s->sh.luma_log2_weight_denom;
171  s->sh.luma_offset_l0[i] = 0;
172  }
173  }
174  if (s->ps.sps->chroma_format_idc != 0) {
175  for (i = 0; i < s->sh.nb_refs[L0]; i++)
176  chroma_weight_l0_flag[i] = get_bits1(gb);
177  } else {
178  for (i = 0; i < s->sh.nb_refs[L0]; i++)
179  chroma_weight_l0_flag[i] = 0;
180  }
181  for (i = 0; i < s->sh.nb_refs[L0]; i++) {
182  if (luma_weight_l0_flag[i]) {
183  int delta_luma_weight_l0 = get_se_golomb(gb);
184  if ((int8_t)delta_luma_weight_l0 != delta_luma_weight_l0)
185  return AVERROR_INVALIDDATA;
186  s->sh.luma_weight_l0[i] = (1 << s->sh.luma_log2_weight_denom) + delta_luma_weight_l0;
187  s->sh.luma_offset_l0[i] = get_se_golomb(gb);
188  }
189  if (chroma_weight_l0_flag[i]) {
190  for (j = 0; j < 2; j++) {
191  int delta_chroma_weight_l0 = get_se_golomb(gb);
192  int delta_chroma_offset_l0 = get_se_golomb(gb);
193 
194  if ( (int8_t)delta_chroma_weight_l0 != delta_chroma_weight_l0
195  || delta_chroma_offset_l0 < -(1<<17) || delta_chroma_offset_l0 > (1<<17)) {
196  return AVERROR_INVALIDDATA;
197  }
198 
199  s->sh.chroma_weight_l0[i][j] = (1 << s->sh.chroma_log2_weight_denom) + delta_chroma_weight_l0;
200  s->sh.chroma_offset_l0[i][j] = av_clip((delta_chroma_offset_l0 - ((128 * s->sh.chroma_weight_l0[i][j])
201  >> s->sh.chroma_log2_weight_denom) + 128), -128, 127);
202  }
203  } else {
204  s->sh.chroma_weight_l0[i][0] = 1 << s->sh.chroma_log2_weight_denom;
205  s->sh.chroma_offset_l0[i][0] = 0;
206  s->sh.chroma_weight_l0[i][1] = 1 << s->sh.chroma_log2_weight_denom;
207  s->sh.chroma_offset_l0[i][1] = 0;
208  }
209  }
210  if (s->sh.slice_type == HEVC_SLICE_B) {
211  for (i = 0; i < s->sh.nb_refs[L1]; i++) {
212  luma_weight_l1_flag[i] = get_bits1(gb);
213  if (!luma_weight_l1_flag[i]) {
214  s->sh.luma_weight_l1[i] = 1 << s->sh.luma_log2_weight_denom;
215  s->sh.luma_offset_l1[i] = 0;
216  }
217  }
218  if (s->ps.sps->chroma_format_idc != 0) {
219  for (i = 0; i < s->sh.nb_refs[L1]; i++)
220  chroma_weight_l1_flag[i] = get_bits1(gb);
221  } else {
222  for (i = 0; i < s->sh.nb_refs[L1]; i++)
223  chroma_weight_l1_flag[i] = 0;
224  }
225  for (i = 0; i < s->sh.nb_refs[L1]; i++) {
226  if (luma_weight_l1_flag[i]) {
227  int delta_luma_weight_l1 = get_se_golomb(gb);
228  if ((int8_t)delta_luma_weight_l1 != delta_luma_weight_l1)
229  return AVERROR_INVALIDDATA;
230  s->sh.luma_weight_l1[i] = (1 << s->sh.luma_log2_weight_denom) + delta_luma_weight_l1;
231  s->sh.luma_offset_l1[i] = get_se_golomb(gb);
232  }
233  if (chroma_weight_l1_flag[i]) {
234  for (j = 0; j < 2; j++) {
235  int delta_chroma_weight_l1 = get_se_golomb(gb);
236  int delta_chroma_offset_l1 = get_se_golomb(gb);
237 
238  if ( (int8_t)delta_chroma_weight_l1 != delta_chroma_weight_l1
239  || delta_chroma_offset_l1 < -(1<<17) || delta_chroma_offset_l1 > (1<<17)) {
240  return AVERROR_INVALIDDATA;
241  }
242 
243  s->sh.chroma_weight_l1[i][j] = (1 << s->sh.chroma_log2_weight_denom) + delta_chroma_weight_l1;
244  s->sh.chroma_offset_l1[i][j] = av_clip((delta_chroma_offset_l1 - ((128 * s->sh.chroma_weight_l1[i][j])
245  >> s->sh.chroma_log2_weight_denom) + 128), -128, 127);
246  }
247  } else {
248  s->sh.chroma_weight_l1[i][0] = 1 << s->sh.chroma_log2_weight_denom;
249  s->sh.chroma_offset_l1[i][0] = 0;
250  s->sh.chroma_weight_l1[i][1] = 1 << s->sh.chroma_log2_weight_denom;
251  s->sh.chroma_offset_l1[i][1] = 0;
252  }
253  }
254  }
255  return 0;
256 }
257 
259 {
260  const HEVCSPS *sps = s->ps.sps;
261  int max_poc_lsb = 1 << sps->log2_max_poc_lsb;
262  int prev_delta_msb = 0;
263  unsigned int nb_sps = 0, nb_sh;
264  int i;
265 
266  rps->nb_refs = 0;
268  return 0;
269 
270  if (sps->num_long_term_ref_pics_sps > 0)
271  nb_sps = get_ue_golomb_long(gb);
272  nb_sh = get_ue_golomb_long(gb);
273 
274  if (nb_sps > sps->num_long_term_ref_pics_sps)
275  return AVERROR_INVALIDDATA;
276  if (nb_sh + (uint64_t)nb_sps > FF_ARRAY_ELEMS(rps->poc))
277  return AVERROR_INVALIDDATA;
278 
279  rps->nb_refs = nb_sh + nb_sps;
280 
281  for (i = 0; i < rps->nb_refs; i++) {
282  uint8_t delta_poc_msb_present;
283 
284  if (i < nb_sps) {
285  uint8_t lt_idx_sps = 0;
286 
287  if (sps->num_long_term_ref_pics_sps > 1)
288  lt_idx_sps = get_bits(gb, av_ceil_log2(sps->num_long_term_ref_pics_sps));
289 
290  rps->poc[i] = sps->lt_ref_pic_poc_lsb_sps[lt_idx_sps];
291  rps->used[i] = sps->used_by_curr_pic_lt_sps_flag[lt_idx_sps];
292  } else {
293  rps->poc[i] = get_bits(gb, sps->log2_max_poc_lsb);
294  rps->used[i] = get_bits1(gb);
295  }
296 
297  delta_poc_msb_present = get_bits1(gb);
298  if (delta_poc_msb_present) {
299  int64_t delta = get_ue_golomb_long(gb);
300  int64_t poc;
301 
302  if (i && i != nb_sps)
303  delta += prev_delta_msb;
304 
305  poc = rps->poc[i] + s->poc - delta * max_poc_lsb - s->sh.pic_order_cnt_lsb;
306  if (poc != (int32_t)poc)
307  return AVERROR_INVALIDDATA;
308  rps->poc[i] = poc;
309  prev_delta_msb = delta;
310  }
311  }
312 
313  return 0;
314 }
315 
316 static void export_stream_params(AVCodecContext *avctx, const HEVCParamSets *ps,
317  const HEVCSPS *sps)
318 {
319  const HEVCVPS *vps = (const HEVCVPS*)ps->vps_list[sps->vps_id]->data;
320  const HEVCWindow *ow = &sps->output_window;
321  unsigned int num = 0, den = 0;
322 
323  avctx->pix_fmt = sps->pix_fmt;
324  avctx->coded_width = sps->width;
325  avctx->coded_height = sps->height;
326  avctx->width = sps->width - ow->left_offset - ow->right_offset;
327  avctx->height = sps->height - ow->top_offset - ow->bottom_offset;
329  avctx->profile = sps->ptl.general_ptl.profile_idc;
330  avctx->level = sps->ptl.general_ptl.level_idc;
331 
332  ff_set_sar(avctx, sps->vui.sar);
333 
337  else
338  avctx->color_range = AVCOL_RANGE_MPEG;
339 
341  avctx->color_primaries = sps->vui.colour_primaries;
342  avctx->color_trc = sps->vui.transfer_characteristic;
343  avctx->colorspace = sps->vui.matrix_coeffs;
344  } else {
348  }
349 
350  if (vps->vps_timing_info_present_flag) {
351  num = vps->vps_num_units_in_tick;
352  den = vps->vps_time_scale;
353  } else if (sps->vui.vui_timing_info_present_flag) {
354  num = sps->vui.vui_num_units_in_tick;
355  den = sps->vui.vui_time_scale;
356  }
357 
358  if (num != 0 && den != 0)
359  av_reduce(&avctx->framerate.den, &avctx->framerate.num,
360  num, den, 1 << 30);
361 }
362 
364 {
365 #define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \
366  CONFIG_HEVC_D3D11VA_HWACCEL * 2 + \
367  CONFIG_HEVC_VAAPI_HWACCEL + \
368  CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \
369  CONFIG_HEVC_VDPAU_HWACCEL)
371 
372  switch (sps->pix_fmt) {
373  case AV_PIX_FMT_YUV420P:
374  case AV_PIX_FMT_YUVJ420P:
375 #if CONFIG_HEVC_DXVA2_HWACCEL
376  *fmt++ = AV_PIX_FMT_DXVA2_VLD;
377 #endif
378 #if CONFIG_HEVC_D3D11VA_HWACCEL
379  *fmt++ = AV_PIX_FMT_D3D11VA_VLD;
380  *fmt++ = AV_PIX_FMT_D3D11;
381 #endif
382 #if CONFIG_HEVC_VAAPI_HWACCEL
383  *fmt++ = AV_PIX_FMT_VAAPI;
384 #endif
385 #if CONFIG_HEVC_VDPAU_HWACCEL
386  *fmt++ = AV_PIX_FMT_VDPAU;
387 #endif
388 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
389  *fmt++ = AV_PIX_FMT_VIDEOTOOLBOX;
390 #endif
391  break;
393 #if CONFIG_HEVC_DXVA2_HWACCEL
394  *fmt++ = AV_PIX_FMT_DXVA2_VLD;
395 #endif
396 #if CONFIG_HEVC_D3D11VA_HWACCEL
397  *fmt++ = AV_PIX_FMT_D3D11VA_VLD;
398  *fmt++ = AV_PIX_FMT_D3D11;
399 #endif
400 #if CONFIG_HEVC_VAAPI_HWACCEL
401  *fmt++ = AV_PIX_FMT_VAAPI;
402 #endif
403 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
404  *fmt++ = AV_PIX_FMT_VIDEOTOOLBOX;
405 #endif
406  break;
407  }
408 
409  *fmt++ = sps->pix_fmt;
410  *fmt = AV_PIX_FMT_NONE;
411 
412  return ff_thread_get_format(s->avctx, pix_fmts);
413 }
414 
415 static int set_sps(HEVCContext *s, const HEVCSPS *sps,
416  enum AVPixelFormat pix_fmt)
417 {
418  int ret, i;
419 
420  pic_arrays_free(s);
421  s->ps.sps = NULL;
422  s->ps.vps = NULL;
423 
424  if (!sps)
425  return 0;
426 
427  ret = pic_arrays_init(s, sps);
428  if (ret < 0)
429  goto fail;
430 
431  export_stream_params(s->avctx, &s->ps, sps);
432 
433  s->avctx->pix_fmt = pix_fmt;
434 
435  ff_hevc_pred_init(&s->hpc, sps->bit_depth);
436  ff_hevc_dsp_init (&s->hevcdsp, sps->bit_depth);
437  ff_videodsp_init (&s->vdsp, sps->bit_depth);
438 
439  for (i = 0; i < 3; i++) {
442  }
443 
444  if (sps->sao_enabled && !s->avctx->hwaccel) {
445  int c_count = (sps->chroma_format_idc != 0) ? 3 : 1;
446  int c_idx;
447 
448  for(c_idx = 0; c_idx < c_count; c_idx++) {
449  int w = sps->width >> sps->hshift[c_idx];
450  int h = sps->height >> sps->vshift[c_idx];
451  s->sao_pixel_buffer_h[c_idx] =
452  av_malloc((w * 2 * sps->ctb_height) <<
453  sps->pixel_shift);
454  s->sao_pixel_buffer_v[c_idx] =
455  av_malloc((h * 2 * sps->ctb_width) <<
456  sps->pixel_shift);
457  }
458  }
459 
460  s->ps.sps = sps;
461  s->ps.vps = (HEVCVPS*) s->ps.vps_list[s->ps.sps->vps_id]->data;
462 
463  return 0;
464 
465 fail:
466  pic_arrays_free(s);
467  s->ps.sps = NULL;
468  return ret;
469 }
470 
472 {
473  GetBitContext *gb = &s->HEVClc->gb;
474  SliceHeader *sh = &s->sh;
475  int i, ret;
476 
477  // Coded parameters
479  if (s->ref && sh->first_slice_in_pic_flag) {
480  av_log(s->avctx, AV_LOG_ERROR, "Two slices reporting being the first in the same frame.\n");
481  return 1; // This slice will be skipped later, do not corrupt state
482  }
483 
484  if ((IS_IDR(s) || IS_BLA(s)) && sh->first_slice_in_pic_flag) {
485  s->seq_decode = (s->seq_decode + 1) & 0xff;
486  s->max_ra = INT_MAX;
487  if (IS_IDR(s))
489  }
491  if (IS_IRAP(s))
493 
494  sh->pps_id = get_ue_golomb_long(gb);
495  if (sh->pps_id >= HEVC_MAX_PPS_COUNT || !s->ps.pps_list[sh->pps_id]) {
496  av_log(s->avctx, AV_LOG_ERROR, "PPS id out of range: %d\n", sh->pps_id);
497  return AVERROR_INVALIDDATA;
498  }
499  if (!sh->first_slice_in_pic_flag &&
500  s->ps.pps != (HEVCPPS*)s->ps.pps_list[sh->pps_id]->data) {
501  av_log(s->avctx, AV_LOG_ERROR, "PPS changed between slices.\n");
502  return AVERROR_INVALIDDATA;
503  }
504  s->ps.pps = (HEVCPPS*)s->ps.pps_list[sh->pps_id]->data;
505  if (s->nal_unit_type == HEVC_NAL_CRA_NUT && s->last_eos == 1)
507 
508  if (s->ps.sps != (HEVCSPS*)s->ps.sps_list[s->ps.pps->sps_id]->data) {
509  const HEVCSPS *sps = (HEVCSPS*)s->ps.sps_list[s->ps.pps->sps_id]->data;
510  const HEVCSPS *last_sps = s->ps.sps;
511  enum AVPixelFormat pix_fmt;
512 
513  if (last_sps && IS_IRAP(s) && s->nal_unit_type != HEVC_NAL_CRA_NUT) {
514  if (sps->width != last_sps->width || sps->height != last_sps->height ||
516  last_sps->temporal_layer[last_sps->max_sub_layers - 1].max_dec_pic_buffering)
518  }
520 
521  pix_fmt = get_format(s, sps);
522  if (pix_fmt < 0)
523  return pix_fmt;
524 
525  ret = set_sps(s, sps, pix_fmt);
526  if (ret < 0)
527  return ret;
528 
529  s->seq_decode = (s->seq_decode + 1) & 0xff;
530  s->max_ra = INT_MAX;
531  }
532 
534  if (!sh->first_slice_in_pic_flag) {
535  int slice_address_length;
536 
539 
540  slice_address_length = av_ceil_log2(s->ps.sps->ctb_width *
541  s->ps.sps->ctb_height);
542  sh->slice_segment_addr = get_bitsz(gb, slice_address_length);
543  if (sh->slice_segment_addr >= s->ps.sps->ctb_width * s->ps.sps->ctb_height) {
545  "Invalid slice segment address: %u.\n",
546  sh->slice_segment_addr);
547  return AVERROR_INVALIDDATA;
548  }
549 
550  if (!sh->dependent_slice_segment_flag) {
551  sh->slice_addr = sh->slice_segment_addr;
552  s->slice_idx++;
553  }
554  } else {
555  sh->slice_segment_addr = sh->slice_addr = 0;
556  s->slice_idx = 0;
557  s->slice_initialized = 0;
558  }
559 
560  if (!sh->dependent_slice_segment_flag) {
561  s->slice_initialized = 0;
562 
563  for (i = 0; i < s->ps.pps->num_extra_slice_header_bits; i++)
564  skip_bits(gb, 1); // slice_reserved_undetermined_flag[]
565 
566  sh->slice_type = get_ue_golomb_long(gb);
567  if (!(sh->slice_type == HEVC_SLICE_I ||
568  sh->slice_type == HEVC_SLICE_P ||
569  sh->slice_type == HEVC_SLICE_B)) {
570  av_log(s->avctx, AV_LOG_ERROR, "Unknown slice type: %d.\n",
571  sh->slice_type);
572  return AVERROR_INVALIDDATA;
573  }
574  if (IS_IRAP(s) && sh->slice_type != HEVC_SLICE_I) {
575  av_log(s->avctx, AV_LOG_ERROR, "Inter slices in an IRAP frame.\n");
576  return AVERROR_INVALIDDATA;
577  }
578 
579  // when flag is not present, picture is inferred to be output
580  sh->pic_output_flag = 1;
582  sh->pic_output_flag = get_bits1(gb);
583 
585  sh->colour_plane_id = get_bits(gb, 2);
586 
587  if (!IS_IDR(s)) {
588  int poc, pos;
589 
592  if (!sh->first_slice_in_pic_flag && poc != s->poc) {
594  "Ignoring POC change between slices: %d -> %d\n", s->poc, poc);
596  return AVERROR_INVALIDDATA;
597  poc = s->poc;
598  }
599  s->poc = poc;
600 
602  pos = get_bits_left(gb);
604  ret = ff_hevc_decode_short_term_rps(gb, s->avctx, &sh->slice_rps, s->ps.sps, 1);
605  if (ret < 0)
606  return ret;
607 
608  sh->short_term_rps = &sh->slice_rps;
609  } else {
610  int numbits, rps_idx;
611 
612  if (!s->ps.sps->nb_st_rps) {
613  av_log(s->avctx, AV_LOG_ERROR, "No ref lists in the SPS.\n");
614  return AVERROR_INVALIDDATA;
615  }
616 
617  numbits = av_ceil_log2(s->ps.sps->nb_st_rps);
618  rps_idx = numbits > 0 ? get_bits(gb, numbits) : 0;
619  sh->short_term_rps = &s->ps.sps->st_rps[rps_idx];
620  }
622 
623  pos = get_bits_left(gb);
624  ret = decode_lt_rps(s, &sh->long_term_rps, gb);
625  if (ret < 0) {
626  av_log(s->avctx, AV_LOG_WARNING, "Invalid long term RPS.\n");
628  return AVERROR_INVALIDDATA;
629  }
631 
634  else
636  } else {
637  s->sh.short_term_rps = NULL;
638  s->poc = 0;
639  }
640 
641  /* 8.3.1 */
642  if (sh->first_slice_in_pic_flag && s->temporal_id == 0 &&
650  s->pocTid0 = s->poc;
651 
652  if (s->ps.sps->sao_enabled) {
654  if (s->ps.sps->chroma_format_idc) {
657  }
658  } else {
662  }
663 
664  sh->nb_refs[L0] = sh->nb_refs[L1] = 0;
665  if (sh->slice_type == HEVC_SLICE_P || sh->slice_type == HEVC_SLICE_B) {
666  int nb_refs;
667 
669  if (sh->slice_type == HEVC_SLICE_B)
671 
672  if (get_bits1(gb)) { // num_ref_idx_active_override_flag
673  sh->nb_refs[L0] = get_ue_golomb_long(gb) + 1;
674  if (sh->slice_type == HEVC_SLICE_B)
675  sh->nb_refs[L1] = get_ue_golomb_long(gb) + 1;
676  }
677  if (sh->nb_refs[L0] > HEVC_MAX_REFS || sh->nb_refs[L1] > HEVC_MAX_REFS) {
678  av_log(s->avctx, AV_LOG_ERROR, "Too many refs: %d/%d.\n",
679  sh->nb_refs[L0], sh->nb_refs[L1]);
680  return AVERROR_INVALIDDATA;
681  }
682 
683  sh->rpl_modification_flag[0] = 0;
684  sh->rpl_modification_flag[1] = 0;
685  nb_refs = ff_hevc_frame_nb_refs(s);
686  if (!nb_refs) {
687  av_log(s->avctx, AV_LOG_ERROR, "Zero refs for a frame with P or B slices.\n");
688  return AVERROR_INVALIDDATA;
689  }
690 
691  if (s->ps.pps->lists_modification_present_flag && nb_refs > 1) {
692  sh->rpl_modification_flag[0] = get_bits1(gb);
693  if (sh->rpl_modification_flag[0]) {
694  for (i = 0; i < sh->nb_refs[L0]; i++)
695  sh->list_entry_lx[0][i] = get_bits(gb, av_ceil_log2(nb_refs));
696  }
697 
698  if (sh->slice_type == HEVC_SLICE_B) {
699  sh->rpl_modification_flag[1] = get_bits1(gb);
700  if (sh->rpl_modification_flag[1] == 1)
701  for (i = 0; i < sh->nb_refs[L1]; i++)
702  sh->list_entry_lx[1][i] = get_bits(gb, av_ceil_log2(nb_refs));
703  }
704  }
705 
706  if (sh->slice_type == HEVC_SLICE_B)
707  sh->mvd_l1_zero_flag = get_bits1(gb);
708 
710  sh->cabac_init_flag = get_bits1(gb);
711  else
712  sh->cabac_init_flag = 0;
713 
714  sh->collocated_ref_idx = 0;
716  sh->collocated_list = L0;
717  if (sh->slice_type == HEVC_SLICE_B)
718  sh->collocated_list = !get_bits1(gb);
719 
720  if (sh->nb_refs[sh->collocated_list] > 1) {
722  if (sh->collocated_ref_idx >= sh->nb_refs[sh->collocated_list]) {
724  "Invalid collocated_ref_idx: %d.\n",
725  sh->collocated_ref_idx);
726  return AVERROR_INVALIDDATA;
727  }
728  }
729  }
730 
731  if ((s->ps.pps->weighted_pred_flag && sh->slice_type == HEVC_SLICE_P) ||
733  int ret = pred_weight_table(s, gb);
734  if (ret < 0)
735  return ret;
736  }
737 
739  if (sh->max_num_merge_cand < 1 || sh->max_num_merge_cand > 5) {
741  "Invalid number of merging MVP candidates: %d.\n",
742  sh->max_num_merge_cand);
743  return AVERROR_INVALIDDATA;
744  }
745  }
746 
747  sh->slice_qp_delta = get_se_golomb(gb);
748 
752  if (sh->slice_cb_qp_offset < -12 || sh->slice_cb_qp_offset > 12 ||
753  sh->slice_cr_qp_offset < -12 || sh->slice_cr_qp_offset > 12) {
754  av_log(s->avctx, AV_LOG_ERROR, "Invalid slice cx qp offset.\n");
755  return AVERROR_INVALIDDATA;
756  }
757  } else {
758  sh->slice_cb_qp_offset = 0;
759  sh->slice_cr_qp_offset = 0;
760  }
761 
764  else
766 
768  int deblocking_filter_override_flag = 0;
769 
771  deblocking_filter_override_flag = get_bits1(gb);
772 
773  if (deblocking_filter_override_flag) {
776  int beta_offset_div2 = get_se_golomb(gb);
777  int tc_offset_div2 = get_se_golomb(gb) ;
778  if (beta_offset_div2 < -6 || beta_offset_div2 > 6 ||
779  tc_offset_div2 < -6 || tc_offset_div2 > 6) {
781  "Invalid deblock filter offsets: %d, %d\n",
782  beta_offset_div2, tc_offset_div2);
783  return AVERROR_INVALIDDATA;
784  }
785  sh->beta_offset = beta_offset_div2 * 2;
786  sh->tc_offset = tc_offset_div2 * 2;
787  }
788  } else {
790  sh->beta_offset = s->ps.pps->beta_offset;
791  sh->tc_offset = s->ps.pps->tc_offset;
792  }
793  } else {
795  sh->beta_offset = 0;
796  sh->tc_offset = 0;
797  }
798 
804  } else {
806  }
807  } else if (!s->slice_initialized) {
808  av_log(s->avctx, AV_LOG_ERROR, "Independent slice segment missing.\n");
809  return AVERROR_INVALIDDATA;
810  }
811 
812  sh->num_entry_point_offsets = 0;
814  unsigned num_entry_point_offsets = get_ue_golomb_long(gb);
815  // It would be possible to bound this tighter but this here is simpler
816  if (num_entry_point_offsets > get_bits_left(gb)) {
817  av_log(s->avctx, AV_LOG_ERROR, "num_entry_point_offsets %d is invalid\n", num_entry_point_offsets);
818  return AVERROR_INVALIDDATA;
819  }
820 
821  sh->num_entry_point_offsets = num_entry_point_offsets;
822  if (sh->num_entry_point_offsets > 0) {
823  int offset_len = get_ue_golomb_long(gb) + 1;
824 
825  if (offset_len < 1 || offset_len > 32) {
826  sh->num_entry_point_offsets = 0;
827  av_log(s->avctx, AV_LOG_ERROR, "offset_len %d is invalid\n", offset_len);
828  return AVERROR_INVALIDDATA;
829  }
830 
832  av_freep(&sh->offset);
833  av_freep(&sh->size);
834  sh->entry_point_offset = av_malloc_array(sh->num_entry_point_offsets, sizeof(unsigned));
835  sh->offset = av_malloc_array(sh->num_entry_point_offsets, sizeof(int));
836  sh->size = av_malloc_array(sh->num_entry_point_offsets, sizeof(int));
837  if (!sh->entry_point_offset || !sh->offset || !sh->size) {
838  sh->num_entry_point_offsets = 0;
839  av_log(s->avctx, AV_LOG_ERROR, "Failed to allocate memory\n");
840  return AVERROR(ENOMEM);
841  }
842  for (i = 0; i < sh->num_entry_point_offsets; i++) {
843  unsigned val = get_bits_long(gb, offset_len);
844  sh->entry_point_offset[i] = val + 1; // +1; // +1 to get the size
845  }
846  if (s->threads_number > 1 && (s->ps.pps->num_tile_rows > 1 || s->ps.pps->num_tile_columns > 1)) {
847  s->enable_parallel_tiles = 0; // TODO: you can enable tiles in parallel here
848  s->threads_number = 1;
849  } else
850  s->enable_parallel_tiles = 0;
851  } else
852  s->enable_parallel_tiles = 0;
853  }
854 
856  unsigned int length = get_ue_golomb_long(gb);
857  if (length*8LL > get_bits_left(gb)) {
858  av_log(s->avctx, AV_LOG_ERROR, "too many slice_header_extension_data_bytes\n");
859  return AVERROR_INVALIDDATA;
860  }
861  for (i = 0; i < length; i++)
862  skip_bits(gb, 8); // slice_header_extension_data_byte
863  }
864 
865  // Inferred parameters
866  sh->slice_qp = 26U + s->ps.pps->pic_init_qp_minus26 + sh->slice_qp_delta;
867  if (sh->slice_qp > 51 ||
868  sh->slice_qp < -s->ps.sps->qp_bd_offset) {
870  "The slice_qp %d is outside the valid range "
871  "[%d, 51].\n",
872  sh->slice_qp,
873  -s->ps.sps->qp_bd_offset);
874  return AVERROR_INVALIDDATA;
875  }
876 
878 
880  av_log(s->avctx, AV_LOG_ERROR, "Impossible slice segment.\n");
881  return AVERROR_INVALIDDATA;
882  }
883 
884  if (get_bits_left(gb) < 0) {
886  "Overread slice header by %d bits\n", -get_bits_left(gb));
887  return AVERROR_INVALIDDATA;
888  }
889 
891 
893  s->HEVClc->qp_y = s->sh.slice_qp;
894 
895  s->slice_initialized = 1;
896  s->HEVClc->tu.cu_qp_offset_cb = 0;
897  s->HEVClc->tu.cu_qp_offset_cr = 0;
898 
899  return 0;
900 }
901 
902 #define CTB(tab, x, y) ((tab)[(y) * s->ps.sps->ctb_width + (x)])
903 
904 #define SET_SAO(elem, value) \
905 do { \
906  if (!sao_merge_up_flag && !sao_merge_left_flag) \
907  sao->elem = value; \
908  else if (sao_merge_left_flag) \
909  sao->elem = CTB(s->sao, rx-1, ry).elem; \
910  else if (sao_merge_up_flag) \
911  sao->elem = CTB(s->sao, rx, ry-1).elem; \
912  else \
913  sao->elem = 0; \
914 } while (0)
915 
916 static void hls_sao_param(HEVCContext *s, int rx, int ry)
917 {
918  HEVCLocalContext *lc = s->HEVClc;
919  int sao_merge_left_flag = 0;
920  int sao_merge_up_flag = 0;
921  SAOParams *sao = &CTB(s->sao, rx, ry);
922  int c_idx, i;
923 
926  if (rx > 0) {
927  if (lc->ctb_left_flag)
928  sao_merge_left_flag = ff_hevc_sao_merge_flag_decode(s);
929  }
930  if (ry > 0 && !sao_merge_left_flag) {
931  if (lc->ctb_up_flag)
932  sao_merge_up_flag = ff_hevc_sao_merge_flag_decode(s);
933  }
934  }
935 
936  for (c_idx = 0; c_idx < (s->ps.sps->chroma_format_idc ? 3 : 1); c_idx++) {
937  int log2_sao_offset_scale = c_idx == 0 ? s->ps.pps->log2_sao_offset_scale_luma :
939 
940  if (!s->sh.slice_sample_adaptive_offset_flag[c_idx]) {
941  sao->type_idx[c_idx] = SAO_NOT_APPLIED;
942  continue;
943  }
944 
945  if (c_idx == 2) {
946  sao->type_idx[2] = sao->type_idx[1];
947  sao->eo_class[2] = sao->eo_class[1];
948  } else {
949  SET_SAO(type_idx[c_idx], ff_hevc_sao_type_idx_decode(s));
950  }
951 
952  if (sao->type_idx[c_idx] == SAO_NOT_APPLIED)
953  continue;
954 
955  for (i = 0; i < 4; i++)
956  SET_SAO(offset_abs[c_idx][i], ff_hevc_sao_offset_abs_decode(s));
957 
958  if (sao->type_idx[c_idx] == SAO_BAND) {
959  for (i = 0; i < 4; i++) {
960  if (sao->offset_abs[c_idx][i]) {
961  SET_SAO(offset_sign[c_idx][i],
963  } else {
964  sao->offset_sign[c_idx][i] = 0;
965  }
966  }
967  SET_SAO(band_position[c_idx], ff_hevc_sao_band_position_decode(s));
968  } else if (c_idx != 2) {
969  SET_SAO(eo_class[c_idx], ff_hevc_sao_eo_class_decode(s));
970  }
971 
972  // Inferred parameters
973  sao->offset_val[c_idx][0] = 0;
974  for (i = 0; i < 4; i++) {
975  sao->offset_val[c_idx][i + 1] = sao->offset_abs[c_idx][i];
976  if (sao->type_idx[c_idx] == SAO_EDGE) {
977  if (i > 1)
978  sao->offset_val[c_idx][i + 1] = -sao->offset_val[c_idx][i + 1];
979  } else if (sao->offset_sign[c_idx][i]) {
980  sao->offset_val[c_idx][i + 1] = -sao->offset_val[c_idx][i + 1];
981  }
982  sao->offset_val[c_idx][i + 1] *= 1 << log2_sao_offset_scale;
983  }
984  }
985 }
986 
987 #undef SET_SAO
988 #undef CTB
989 
990 static int hls_cross_component_pred(HEVCContext *s, int idx) {
991  HEVCLocalContext *lc = s->HEVClc;
992  int log2_res_scale_abs_plus1 = ff_hevc_log2_res_scale_abs(s, idx);
993 
994  if (log2_res_scale_abs_plus1 != 0) {
995  int res_scale_sign_flag = ff_hevc_res_scale_sign_flag(s, idx);
996  lc->tu.res_scale_val = (1 << (log2_res_scale_abs_plus1 - 1)) *
997  (1 - 2 * res_scale_sign_flag);
998  } else {
999  lc->tu.res_scale_val = 0;
1000  }
1001 
1002 
1003  return 0;
1004 }
1005 
1006 static int hls_transform_unit(HEVCContext *s, int x0, int y0,
1007  int xBase, int yBase, int cb_xBase, int cb_yBase,
1008  int log2_cb_size, int log2_trafo_size,
1009  int blk_idx, int cbf_luma, int *cbf_cb, int *cbf_cr)
1010 {
1011  HEVCLocalContext *lc = s->HEVClc;
1012  const int log2_trafo_size_c = log2_trafo_size - s->ps.sps->hshift[1];
1013  int i;
1014 
1015  if (lc->cu.pred_mode == MODE_INTRA) {
1016  int trafo_size = 1 << log2_trafo_size;
1017  ff_hevc_set_neighbour_available(s, x0, y0, trafo_size, trafo_size);
1018 
1019  s->hpc.intra_pred[log2_trafo_size - 2](s, x0, y0, 0);
1020  }
1021 
1022  if (cbf_luma || cbf_cb[0] || cbf_cr[0] ||
1023  (s->ps.sps->chroma_format_idc == 2 && (cbf_cb[1] || cbf_cr[1]))) {
1024  int scan_idx = SCAN_DIAG;
1025  int scan_idx_c = SCAN_DIAG;
1026  int cbf_chroma = cbf_cb[0] || cbf_cr[0] ||
1027  (s->ps.sps->chroma_format_idc == 2 &&
1028  (cbf_cb[1] || cbf_cr[1]));
1029 
1032  if (lc->tu.cu_qp_delta != 0)
1033  if (ff_hevc_cu_qp_delta_sign_flag(s) == 1)
1034  lc->tu.cu_qp_delta = -lc->tu.cu_qp_delta;
1035  lc->tu.is_cu_qp_delta_coded = 1;
1036 
1037  if (lc->tu.cu_qp_delta < -(26 + s->ps.sps->qp_bd_offset / 2) ||
1038  lc->tu.cu_qp_delta > (25 + s->ps.sps->qp_bd_offset / 2)) {
1040  "The cu_qp_delta %d is outside the valid range "
1041  "[%d, %d].\n",
1042  lc->tu.cu_qp_delta,
1043  -(26 + s->ps.sps->qp_bd_offset / 2),
1044  (25 + s->ps.sps->qp_bd_offset / 2));
1045  return AVERROR_INVALIDDATA;
1046  }
1047 
1048  ff_hevc_set_qPy(s, cb_xBase, cb_yBase, log2_cb_size);
1049  }
1050 
1051  if (s->sh.cu_chroma_qp_offset_enabled_flag && cbf_chroma &&
1053  int cu_chroma_qp_offset_flag = ff_hevc_cu_chroma_qp_offset_flag(s);
1054  if (cu_chroma_qp_offset_flag) {
1055  int cu_chroma_qp_offset_idx = 0;
1056  if (s->ps.pps->chroma_qp_offset_list_len_minus1 > 0) {
1057  cu_chroma_qp_offset_idx = ff_hevc_cu_chroma_qp_offset_idx(s);
1059  "cu_chroma_qp_offset_idx not yet tested.\n");
1060  }
1061  lc->tu.cu_qp_offset_cb = s->ps.pps->cb_qp_offset_list[cu_chroma_qp_offset_idx];
1062  lc->tu.cu_qp_offset_cr = s->ps.pps->cr_qp_offset_list[cu_chroma_qp_offset_idx];
1063  } else {
1064  lc->tu.cu_qp_offset_cb = 0;
1065  lc->tu.cu_qp_offset_cr = 0;
1066  }
1068  }
1069 
1070  if (lc->cu.pred_mode == MODE_INTRA && log2_trafo_size < 4) {
1071  if (lc->tu.intra_pred_mode >= 6 &&
1072  lc->tu.intra_pred_mode <= 14) {
1073  scan_idx = SCAN_VERT;
1074  } else if (lc->tu.intra_pred_mode >= 22 &&
1075  lc->tu.intra_pred_mode <= 30) {
1076  scan_idx = SCAN_HORIZ;
1077  }
1078 
1079  if (lc->tu.intra_pred_mode_c >= 6 &&
1080  lc->tu.intra_pred_mode_c <= 14) {
1081  scan_idx_c = SCAN_VERT;
1082  } else if (lc->tu.intra_pred_mode_c >= 22 &&
1083  lc->tu.intra_pred_mode_c <= 30) {
1084  scan_idx_c = SCAN_HORIZ;
1085  }
1086  }
1087 
1088  lc->tu.cross_pf = 0;
1089 
1090  if (cbf_luma)
1091  ff_hevc_hls_residual_coding(s, x0, y0, log2_trafo_size, scan_idx, 0);
1092  if (s->ps.sps->chroma_format_idc && (log2_trafo_size > 2 || s->ps.sps->chroma_format_idc == 3)) {
1093  int trafo_size_h = 1 << (log2_trafo_size_c + s->ps.sps->hshift[1]);
1094  int trafo_size_v = 1 << (log2_trafo_size_c + s->ps.sps->vshift[1]);
1095  lc->tu.cross_pf = (s->ps.pps->cross_component_prediction_enabled_flag && cbf_luma &&
1096  (lc->cu.pred_mode == MODE_INTER ||
1097  (lc->tu.chroma_mode_c == 4)));
1098 
1099  if (lc->tu.cross_pf) {
1101  }
1102  for (i = 0; i < (s->ps.sps->chroma_format_idc == 2 ? 2 : 1); i++) {
1103  if (lc->cu.pred_mode == MODE_INTRA) {
1104  ff_hevc_set_neighbour_available(s, x0, y0 + (i << log2_trafo_size_c), trafo_size_h, trafo_size_v);
1105  s->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0 + (i << log2_trafo_size_c), 1);
1106  }
1107  if (cbf_cb[i])
1108  ff_hevc_hls_residual_coding(s, x0, y0 + (i << log2_trafo_size_c),
1109  log2_trafo_size_c, scan_idx_c, 1);
1110  else
1111  if (lc->tu.cross_pf) {
1112  ptrdiff_t stride = s->frame->linesize[1];
1113  int hshift = s->ps.sps->hshift[1];
1114  int vshift = s->ps.sps->vshift[1];
1115  int16_t *coeffs_y = (int16_t*)lc->edge_emu_buffer;
1116  int16_t *coeffs = (int16_t*)lc->edge_emu_buffer2;
1117  int size = 1 << log2_trafo_size_c;
1118 
1119  uint8_t *dst = &s->frame->data[1][(y0 >> vshift) * stride +
1120  ((x0 >> hshift) << s->ps.sps->pixel_shift)];
1121  for (i = 0; i < (size * size); i++) {
1122  coeffs[i] = ((lc->tu.res_scale_val * coeffs_y[i]) >> 3);
1123  }
1124  s->hevcdsp.add_residual[log2_trafo_size_c-2](dst, coeffs, stride);
1125  }
1126  }
1127 
1128  if (lc->tu.cross_pf) {
1130  }
1131  for (i = 0; i < (s->ps.sps->chroma_format_idc == 2 ? 2 : 1); i++) {
1132  if (lc->cu.pred_mode == MODE_INTRA) {
1133  ff_hevc_set_neighbour_available(s, x0, y0 + (i << log2_trafo_size_c), trafo_size_h, trafo_size_v);
1134  s->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0 + (i << log2_trafo_size_c), 2);
1135  }
1136  if (cbf_cr[i])
1137  ff_hevc_hls_residual_coding(s, x0, y0 + (i << log2_trafo_size_c),
1138  log2_trafo_size_c, scan_idx_c, 2);
1139  else
1140  if (lc->tu.cross_pf) {
1141  ptrdiff_t stride = s->frame->linesize[2];
1142  int hshift = s->ps.sps->hshift[2];
1143  int vshift = s->ps.sps->vshift[2];
1144  int16_t *coeffs_y = (int16_t*)lc->edge_emu_buffer;
1145  int16_t *coeffs = (int16_t*)lc->edge_emu_buffer2;
1146  int size = 1 << log2_trafo_size_c;
1147 
1148  uint8_t *dst = &s->frame->data[2][(y0 >> vshift) * stride +
1149  ((x0 >> hshift) << s->ps.sps->pixel_shift)];
1150  for (i = 0; i < (size * size); i++) {
1151  coeffs[i] = ((lc->tu.res_scale_val * coeffs_y[i]) >> 3);
1152  }
1153  s->hevcdsp.add_residual[log2_trafo_size_c-2](dst, coeffs, stride);
1154  }
1155  }
1156  } else if (s->ps.sps->chroma_format_idc && blk_idx == 3) {
1157  int trafo_size_h = 1 << (log2_trafo_size + 1);
1158  int trafo_size_v = 1 << (log2_trafo_size + s->ps.sps->vshift[1]);
1159  for (i = 0; i < (s->ps.sps->chroma_format_idc == 2 ? 2 : 1); i++) {
1160  if (lc->cu.pred_mode == MODE_INTRA) {
1161  ff_hevc_set_neighbour_available(s, xBase, yBase + (i << log2_trafo_size),
1162  trafo_size_h, trafo_size_v);
1163  s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase + (i << log2_trafo_size), 1);
1164  }
1165  if (cbf_cb[i])
1166  ff_hevc_hls_residual_coding(s, xBase, yBase + (i << log2_trafo_size),
1167  log2_trafo_size, scan_idx_c, 1);
1168  }
1169  for (i = 0; i < (s->ps.sps->chroma_format_idc == 2 ? 2 : 1); i++) {
1170  if (lc->cu.pred_mode == MODE_INTRA) {
1171  ff_hevc_set_neighbour_available(s, xBase, yBase + (i << log2_trafo_size),
1172  trafo_size_h, trafo_size_v);
1173  s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase + (i << log2_trafo_size), 2);
1174  }
1175  if (cbf_cr[i])
1176  ff_hevc_hls_residual_coding(s, xBase, yBase + (i << log2_trafo_size),
1177  log2_trafo_size, scan_idx_c, 2);
1178  }
1179  }
1180  } else if (s->ps.sps->chroma_format_idc && lc->cu.pred_mode == MODE_INTRA) {
1181  if (log2_trafo_size > 2 || s->ps.sps->chroma_format_idc == 3) {
1182  int trafo_size_h = 1 << (log2_trafo_size_c + s->ps.sps->hshift[1]);
1183  int trafo_size_v = 1 << (log2_trafo_size_c + s->ps.sps->vshift[1]);
1184  ff_hevc_set_neighbour_available(s, x0, y0, trafo_size_h, trafo_size_v);
1185  s->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0, 1);
1186  s->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0, 2);
1187  if (s->ps.sps->chroma_format_idc == 2) {
1188  ff_hevc_set_neighbour_available(s, x0, y0 + (1 << log2_trafo_size_c),
1189  trafo_size_h, trafo_size_v);
1190  s->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0 + (1 << log2_trafo_size_c), 1);
1191  s->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0 + (1 << log2_trafo_size_c), 2);
1192  }
1193  } else if (blk_idx == 3) {
1194  int trafo_size_h = 1 << (log2_trafo_size + 1);
1195  int trafo_size_v = 1 << (log2_trafo_size + s->ps.sps->vshift[1]);
1196  ff_hevc_set_neighbour_available(s, xBase, yBase,
1197  trafo_size_h, trafo_size_v);
1198  s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase, 1);
1199  s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase, 2);
1200  if (s->ps.sps->chroma_format_idc == 2) {
1201  ff_hevc_set_neighbour_available(s, xBase, yBase + (1 << (log2_trafo_size)),
1202  trafo_size_h, trafo_size_v);
1203  s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase + (1 << (log2_trafo_size)), 1);
1204  s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase + (1 << (log2_trafo_size)), 2);
1205  }
1206  }
1207  }
1208 
1209  return 0;
1210 }
1211 
1212 static void set_deblocking_bypass(HEVCContext *s, int x0, int y0, int log2_cb_size)
1213 {
1214  int cb_size = 1 << log2_cb_size;
1215  int log2_min_pu_size = s->ps.sps->log2_min_pu_size;
1216 
1217  int min_pu_width = s->ps.sps->min_pu_width;
1218  int x_end = FFMIN(x0 + cb_size, s->ps.sps->width);
1219  int y_end = FFMIN(y0 + cb_size, s->ps.sps->height);
1220  int i, j;
1221 
1222  for (j = (y0 >> log2_min_pu_size); j < (y_end >> log2_min_pu_size); j++)
1223  for (i = (x0 >> log2_min_pu_size); i < (x_end >> log2_min_pu_size); i++)
1224  s->is_pcm[i + j * min_pu_width] = 2;
1225 }
1226 
1227 static int hls_transform_tree(HEVCContext *s, int x0, int y0,
1228  int xBase, int yBase, int cb_xBase, int cb_yBase,
1229  int log2_cb_size, int log2_trafo_size,
1230  int trafo_depth, int blk_idx,
1231  const int *base_cbf_cb, const int *base_cbf_cr)
1232 {
1233  HEVCLocalContext *lc = s->HEVClc;
1234  uint8_t split_transform_flag;
1235  int cbf_cb[2];
1236  int cbf_cr[2];
1237  int ret;
1238 
1239  cbf_cb[0] = base_cbf_cb[0];
1240  cbf_cb[1] = base_cbf_cb[1];
1241  cbf_cr[0] = base_cbf_cr[0];
1242  cbf_cr[1] = base_cbf_cr[1];
1243 
1244  if (lc->cu.intra_split_flag) {
1245  if (trafo_depth == 1) {
1246  lc->tu.intra_pred_mode = lc->pu.intra_pred_mode[blk_idx];
1247  if (s->ps.sps->chroma_format_idc == 3) {
1248  lc->tu.intra_pred_mode_c = lc->pu.intra_pred_mode_c[blk_idx];
1249  lc->tu.chroma_mode_c = lc->pu.chroma_mode_c[blk_idx];
1250  } else {
1252  lc->tu.chroma_mode_c = lc->pu.chroma_mode_c[0];
1253  }
1254  }
1255  } else {
1256  lc->tu.intra_pred_mode = lc->pu.intra_pred_mode[0];
1258  lc->tu.chroma_mode_c = lc->pu.chroma_mode_c[0];
1259  }
1260 
1261  if (log2_trafo_size <= s->ps.sps->log2_max_trafo_size &&
1262  log2_trafo_size > s->ps.sps->log2_min_tb_size &&
1263  trafo_depth < lc->cu.max_trafo_depth &&
1264  !(lc->cu.intra_split_flag && trafo_depth == 0)) {
1265  split_transform_flag = ff_hevc_split_transform_flag_decode(s, log2_trafo_size);
1266  } else {
1267  int inter_split = s->ps.sps->max_transform_hierarchy_depth_inter == 0 &&
1268  lc->cu.pred_mode == MODE_INTER &&
1269  lc->cu.part_mode != PART_2Nx2N &&
1270  trafo_depth == 0;
1271 
1272  split_transform_flag = log2_trafo_size > s->ps.sps->log2_max_trafo_size ||
1273  (lc->cu.intra_split_flag && trafo_depth == 0) ||
1274  inter_split;
1275  }
1276 
1277  if (s->ps.sps->chroma_format_idc && (log2_trafo_size > 2 || s->ps.sps->chroma_format_idc == 3)) {
1278  if (trafo_depth == 0 || cbf_cb[0]) {
1279  cbf_cb[0] = ff_hevc_cbf_cb_cr_decode(s, trafo_depth);
1280  if (s->ps.sps->chroma_format_idc == 2 && (!split_transform_flag || log2_trafo_size == 3)) {
1281  cbf_cb[1] = ff_hevc_cbf_cb_cr_decode(s, trafo_depth);
1282  }
1283  }
1284 
1285  if (trafo_depth == 0 || cbf_cr[0]) {
1286  cbf_cr[0] = ff_hevc_cbf_cb_cr_decode(s, trafo_depth);
1287  if (s->ps.sps->chroma_format_idc == 2 && (!split_transform_flag || log2_trafo_size == 3)) {
1288  cbf_cr[1] = ff_hevc_cbf_cb_cr_decode(s, trafo_depth);
1289  }
1290  }
1291  }
1292 
1293  if (split_transform_flag) {
1294  const int trafo_size_split = 1 << (log2_trafo_size - 1);
1295  const int x1 = x0 + trafo_size_split;
1296  const int y1 = y0 + trafo_size_split;
1297 
1298 #define SUBDIVIDE(x, y, idx) \
1299 do { \
1300  ret = hls_transform_tree(s, x, y, x0, y0, cb_xBase, cb_yBase, log2_cb_size, \
1301  log2_trafo_size - 1, trafo_depth + 1, idx, \
1302  cbf_cb, cbf_cr); \
1303  if (ret < 0) \
1304  return ret; \
1305 } while (0)
1306 
1307  SUBDIVIDE(x0, y0, 0);
1308  SUBDIVIDE(x1, y0, 1);
1309  SUBDIVIDE(x0, y1, 2);
1310  SUBDIVIDE(x1, y1, 3);
1311 
1312 #undef SUBDIVIDE
1313  } else {
1314  int min_tu_size = 1 << s->ps.sps->log2_min_tb_size;
1315  int log2_min_tu_size = s->ps.sps->log2_min_tb_size;
1316  int min_tu_width = s->ps.sps->min_tb_width;
1317  int cbf_luma = 1;
1318 
1319  if (lc->cu.pred_mode == MODE_INTRA || trafo_depth != 0 ||
1320  cbf_cb[0] || cbf_cr[0] ||
1321  (s->ps.sps->chroma_format_idc == 2 && (cbf_cb[1] || cbf_cr[1]))) {
1322  cbf_luma = ff_hevc_cbf_luma_decode(s, trafo_depth);
1323  }
1324 
1325  ret = hls_transform_unit(s, x0, y0, xBase, yBase, cb_xBase, cb_yBase,
1326  log2_cb_size, log2_trafo_size,
1327  blk_idx, cbf_luma, cbf_cb, cbf_cr);
1328  if (ret < 0)
1329  return ret;
1330  // TODO: store cbf_luma somewhere else
1331  if (cbf_luma) {
1332  int i, j;
1333  for (i = 0; i < (1 << log2_trafo_size); i += min_tu_size)
1334  for (j = 0; j < (1 << log2_trafo_size); j += min_tu_size) {
1335  int x_tu = (x0 + j) >> log2_min_tu_size;
1336  int y_tu = (y0 + i) >> log2_min_tu_size;
1337  s->cbf_luma[y_tu * min_tu_width + x_tu] = 1;
1338  }
1339  }
1341  ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_trafo_size);
1344  set_deblocking_bypass(s, x0, y0, log2_trafo_size);
1345  }
1346  }
1347  return 0;
1348 }
1349 
1350 static int hls_pcm_sample(HEVCContext *s, int x0, int y0, int log2_cb_size)
1351 {
1352  HEVCLocalContext *lc = s->HEVClc;
1353  GetBitContext gb;
1354  int cb_size = 1 << log2_cb_size;
1355  ptrdiff_t stride0 = s->frame->linesize[0];
1356  ptrdiff_t stride1 = s->frame->linesize[1];
1357  ptrdiff_t stride2 = s->frame->linesize[2];
1358  uint8_t *dst0 = &s->frame->data[0][y0 * stride0 + (x0 << s->ps.sps->pixel_shift)];
1359  uint8_t *dst1 = &s->frame->data[1][(y0 >> s->ps.sps->vshift[1]) * stride1 + ((x0 >> s->ps.sps->hshift[1]) << s->ps.sps->pixel_shift)];
1360  uint8_t *dst2 = &s->frame->data[2][(y0 >> s->ps.sps->vshift[2]) * stride2 + ((x0 >> s->ps.sps->hshift[2]) << s->ps.sps->pixel_shift)];
1361 
1362  int length = cb_size * cb_size * s->ps.sps->pcm.bit_depth +
1363  (((cb_size >> s->ps.sps->hshift[1]) * (cb_size >> s->ps.sps->vshift[1])) +
1364  ((cb_size >> s->ps.sps->hshift[2]) * (cb_size >> s->ps.sps->vshift[2]))) *
1365  s->ps.sps->pcm.bit_depth_chroma;
1366  const uint8_t *pcm = skip_bytes(&lc->cc, (length + 7) >> 3);
1367  int ret;
1368 
1370  ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_cb_size);
1371 
1372  ret = init_get_bits(&gb, pcm, length);
1373  if (ret < 0)
1374  return ret;
1375 
1376  s->hevcdsp.put_pcm(dst0, stride0, cb_size, cb_size, &gb, s->ps.sps->pcm.bit_depth);
1377  if (s->ps.sps->chroma_format_idc) {
1378  s->hevcdsp.put_pcm(dst1, stride1,
1379  cb_size >> s->ps.sps->hshift[1],
1380  cb_size >> s->ps.sps->vshift[1],
1381  &gb, s->ps.sps->pcm.bit_depth_chroma);
1382  s->hevcdsp.put_pcm(dst2, stride2,
1383  cb_size >> s->ps.sps->hshift[2],
1384  cb_size >> s->ps.sps->vshift[2],
1385  &gb, s->ps.sps->pcm.bit_depth_chroma);
1386  }
1387 
1388  return 0;
1389 }
1390 
1391 /**
1392  * 8.5.3.2.2.1 Luma sample unidirectional interpolation process
1393  *
1394  * @param s HEVC decoding context
1395  * @param dst target buffer for block data at block position
1396  * @param dststride stride of the dst buffer
1397  * @param ref reference picture buffer at origin (0, 0)
1398  * @param mv motion vector (relative to block position) to get pixel data from
1399  * @param x_off horizontal position of block from origin (0, 0)
1400  * @param y_off vertical position of block from origin (0, 0)
1401  * @param block_w width of block
1402  * @param block_h height of block
1403  * @param luma_weight weighting factor applied to the luma prediction
1404  * @param luma_offset additive offset applied to the luma prediction value
1405  */
1406 
1407 static void luma_mc_uni(HEVCContext *s, uint8_t *dst, ptrdiff_t dststride,
1408  AVFrame *ref, const Mv *mv, int x_off, int y_off,
1409  int block_w, int block_h, int luma_weight, int luma_offset)
1410 {
1411  HEVCLocalContext *lc = s->HEVClc;
1412  uint8_t *src = ref->data[0];
1413  ptrdiff_t srcstride = ref->linesize[0];
1414  int pic_width = s->ps.sps->width;
1415  int pic_height = s->ps.sps->height;
1416  int mx = mv->x & 3;
1417  int my = mv->y & 3;
1418  int weight_flag = (s->sh.slice_type == HEVC_SLICE_P && s->ps.pps->weighted_pred_flag) ||
1420  int idx = ff_hevc_pel_weight[block_w];
1421 
1422  x_off += mv->x >> 2;
1423  y_off += mv->y >> 2;
1424  src += y_off * srcstride + (x_off * (1 << s->ps.sps->pixel_shift));
1425 
1426  if (x_off < QPEL_EXTRA_BEFORE || y_off < QPEL_EXTRA_AFTER ||
1427  x_off >= pic_width - block_w - QPEL_EXTRA_AFTER ||
1428  y_off >= pic_height - block_h - QPEL_EXTRA_AFTER) {
1429  const ptrdiff_t edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->ps.sps->pixel_shift;
1430  int offset = QPEL_EXTRA_BEFORE * srcstride + (QPEL_EXTRA_BEFORE << s->ps.sps->pixel_shift);
1431  int buf_offset = QPEL_EXTRA_BEFORE * edge_emu_stride + (QPEL_EXTRA_BEFORE << s->ps.sps->pixel_shift);
1432 
1433  s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src - offset,
1434  edge_emu_stride, srcstride,
1435  block_w + QPEL_EXTRA,
1436  block_h + QPEL_EXTRA,
1437  x_off - QPEL_EXTRA_BEFORE, y_off - QPEL_EXTRA_BEFORE,
1438  pic_width, pic_height);
1439  src = lc->edge_emu_buffer + buf_offset;
1440  srcstride = edge_emu_stride;
1441  }
1442 
1443  if (!weight_flag)
1444  s->hevcdsp.put_hevc_qpel_uni[idx][!!my][!!mx](dst, dststride, src, srcstride,
1445  block_h, mx, my, block_w);
1446  else
1447  s->hevcdsp.put_hevc_qpel_uni_w[idx][!!my][!!mx](dst, dststride, src, srcstride,
1448  block_h, s->sh.luma_log2_weight_denom,
1449  luma_weight, luma_offset, mx, my, block_w);
1450 }
1451 
1452 /**
1453  * 8.5.3.2.2.1 Luma sample bidirectional interpolation process
1454  *
1455  * @param s HEVC decoding context
1456  * @param dst target buffer for block data at block position
1457  * @param dststride stride of the dst buffer
1458  * @param ref0 reference picture0 buffer at origin (0, 0)
1459  * @param mv0 motion vector0 (relative to block position) to get pixel data from
1460  * @param x_off horizontal position of block from origin (0, 0)
1461  * @param y_off vertical position of block from origin (0, 0)
1462  * @param block_w width of block
1463  * @param block_h height of block
1464  * @param ref1 reference picture1 buffer at origin (0, 0)
1465  * @param mv1 motion vector1 (relative to block position) to get pixel data from
1466  * @param current_mv current motion vector structure
1467  */
1468  static void luma_mc_bi(HEVCContext *s, uint8_t *dst, ptrdiff_t dststride,
1469  AVFrame *ref0, const Mv *mv0, int x_off, int y_off,
1470  int block_w, int block_h, AVFrame *ref1, const Mv *mv1, struct MvField *current_mv)
1471 {
1472  HEVCLocalContext *lc = s->HEVClc;
1473  ptrdiff_t src0stride = ref0->linesize[0];
1474  ptrdiff_t src1stride = ref1->linesize[0];
1475  int pic_width = s->ps.sps->width;
1476  int pic_height = s->ps.sps->height;
1477  int mx0 = mv0->x & 3;
1478  int my0 = mv0->y & 3;
1479  int mx1 = mv1->x & 3;
1480  int my1 = mv1->y & 3;
1481  int weight_flag = (s->sh.slice_type == HEVC_SLICE_P && s->ps.pps->weighted_pred_flag) ||
1483  int x_off0 = x_off + (mv0->x >> 2);
1484  int y_off0 = y_off + (mv0->y >> 2);
1485  int x_off1 = x_off + (mv1->x >> 2);
1486  int y_off1 = y_off + (mv1->y >> 2);
1487  int idx = ff_hevc_pel_weight[block_w];
1488 
1489  uint8_t *src0 = ref0->data[0] + y_off0 * src0stride + (int)((unsigned)x_off0 << s->ps.sps->pixel_shift);
1490  uint8_t *src1 = ref1->data[0] + y_off1 * src1stride + (int)((unsigned)x_off1 << s->ps.sps->pixel_shift);
1491 
1492  if (x_off0 < QPEL_EXTRA_BEFORE || y_off0 < QPEL_EXTRA_AFTER ||
1493  x_off0 >= pic_width - block_w - QPEL_EXTRA_AFTER ||
1494  y_off0 >= pic_height - block_h - QPEL_EXTRA_AFTER) {
1495  const ptrdiff_t edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->ps.sps->pixel_shift;
1496  int offset = QPEL_EXTRA_BEFORE * src0stride + (QPEL_EXTRA_BEFORE << s->ps.sps->pixel_shift);
1497  int buf_offset = QPEL_EXTRA_BEFORE * edge_emu_stride + (QPEL_EXTRA_BEFORE << s->ps.sps->pixel_shift);
1498 
1499  s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src0 - offset,
1500  edge_emu_stride, src0stride,
1501  block_w + QPEL_EXTRA,
1502  block_h + QPEL_EXTRA,
1503  x_off0 - QPEL_EXTRA_BEFORE, y_off0 - QPEL_EXTRA_BEFORE,
1504  pic_width, pic_height);
1505  src0 = lc->edge_emu_buffer + buf_offset;
1506  src0stride = edge_emu_stride;
1507  }
1508 
1509  if (x_off1 < QPEL_EXTRA_BEFORE || y_off1 < QPEL_EXTRA_AFTER ||
1510  x_off1 >= pic_width - block_w - QPEL_EXTRA_AFTER ||
1511  y_off1 >= pic_height - block_h - QPEL_EXTRA_AFTER) {
1512  const ptrdiff_t edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->ps.sps->pixel_shift;
1513  int offset = QPEL_EXTRA_BEFORE * src1stride + (QPEL_EXTRA_BEFORE << s->ps.sps->pixel_shift);
1514  int buf_offset = QPEL_EXTRA_BEFORE * edge_emu_stride + (QPEL_EXTRA_BEFORE << s->ps.sps->pixel_shift);
1515 
1516  s->vdsp.emulated_edge_mc(lc->edge_emu_buffer2, src1 - offset,
1517  edge_emu_stride, src1stride,
1518  block_w + QPEL_EXTRA,
1519  block_h + QPEL_EXTRA,
1520  x_off1 - QPEL_EXTRA_BEFORE, y_off1 - QPEL_EXTRA_BEFORE,
1521  pic_width, pic_height);
1522  src1 = lc->edge_emu_buffer2 + buf_offset;
1523  src1stride = edge_emu_stride;
1524  }
1525 
1526  s->hevcdsp.put_hevc_qpel[idx][!!my0][!!mx0](lc->tmp, src0, src0stride,
1527  block_h, mx0, my0, block_w);
1528  if (!weight_flag)
1529  s->hevcdsp.put_hevc_qpel_bi[idx][!!my1][!!mx1](dst, dststride, src1, src1stride, lc->tmp,
1530  block_h, mx1, my1, block_w);
1531  else
1532  s->hevcdsp.put_hevc_qpel_bi_w[idx][!!my1][!!mx1](dst, dststride, src1, src1stride, lc->tmp,
1533  block_h, s->sh.luma_log2_weight_denom,
1534  s->sh.luma_weight_l0[current_mv->ref_idx[0]],
1535  s->sh.luma_weight_l1[current_mv->ref_idx[1]],
1536  s->sh.luma_offset_l0[current_mv->ref_idx[0]],
1537  s->sh.luma_offset_l1[current_mv->ref_idx[1]],
1538  mx1, my1, block_w);
1539 
1540 }
1541 
1542 /**
1543  * 8.5.3.2.2.2 Chroma sample uniprediction interpolation process
1544  *
1545  * @param s HEVC decoding context
1546  * @param dst1 target buffer for block data at block position (U plane)
1547  * @param dst2 target buffer for block data at block position (V plane)
1548  * @param dststride stride of the dst1 and dst2 buffers
1549  * @param ref reference picture buffer at origin (0, 0)
1550  * @param mv motion vector (relative to block position) to get pixel data from
1551  * @param x_off horizontal position of block from origin (0, 0)
1552  * @param y_off vertical position of block from origin (0, 0)
1553  * @param block_w width of block
1554  * @param block_h height of block
1555  * @param chroma_weight weighting factor applied to the chroma prediction
1556  * @param chroma_offset additive offset applied to the chroma prediction value
1557  */
1558 
1559 static void chroma_mc_uni(HEVCContext *s, uint8_t *dst0,
1560  ptrdiff_t dststride, uint8_t *src0, ptrdiff_t srcstride, int reflist,
1561  int x_off, int y_off, int block_w, int block_h, struct MvField *current_mv, int chroma_weight, int chroma_offset)
1562 {
1563  HEVCLocalContext *lc = s->HEVClc;
1564  int pic_width = s->ps.sps->width >> s->ps.sps->hshift[1];
1565  int pic_height = s->ps.sps->height >> s->ps.sps->vshift[1];
1566  const Mv *mv = &current_mv->mv[reflist];
1567  int weight_flag = (s->sh.slice_type == HEVC_SLICE_P && s->ps.pps->weighted_pred_flag) ||
1569  int idx = ff_hevc_pel_weight[block_w];
1570  int hshift = s->ps.sps->hshift[1];
1571  int vshift = s->ps.sps->vshift[1];
1572  intptr_t mx = av_mod_uintp2(mv->x, 2 + hshift);
1573  intptr_t my = av_mod_uintp2(mv->y, 2 + vshift);
1574  intptr_t _mx = mx << (1 - hshift);
1575  intptr_t _my = my << (1 - vshift);
1576 
1577  x_off += mv->x >> (2 + hshift);
1578  y_off += mv->y >> (2 + vshift);
1579  src0 += y_off * srcstride + (x_off * (1 << s->ps.sps->pixel_shift));
1580 
1581  if (x_off < EPEL_EXTRA_BEFORE || y_off < EPEL_EXTRA_AFTER ||
1582  x_off >= pic_width - block_w - EPEL_EXTRA_AFTER ||
1583  y_off >= pic_height - block_h - EPEL_EXTRA_AFTER) {
1584  const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->ps.sps->pixel_shift;
1585  int offset0 = EPEL_EXTRA_BEFORE * (srcstride + (1 << s->ps.sps->pixel_shift));
1586  int buf_offset0 = EPEL_EXTRA_BEFORE *
1587  (edge_emu_stride + (1 << s->ps.sps->pixel_shift));
1588  s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src0 - offset0,
1589  edge_emu_stride, srcstride,
1590  block_w + EPEL_EXTRA, block_h + EPEL_EXTRA,
1591  x_off - EPEL_EXTRA_BEFORE,
1592  y_off - EPEL_EXTRA_BEFORE,
1593  pic_width, pic_height);
1594 
1595  src0 = lc->edge_emu_buffer + buf_offset0;
1596  srcstride = edge_emu_stride;
1597  }
1598  if (!weight_flag)
1599  s->hevcdsp.put_hevc_epel_uni[idx][!!my][!!mx](dst0, dststride, src0, srcstride,
1600  block_h, _mx, _my, block_w);
1601  else
1602  s->hevcdsp.put_hevc_epel_uni_w[idx][!!my][!!mx](dst0, dststride, src0, srcstride,
1603  block_h, s->sh.chroma_log2_weight_denom,
1604  chroma_weight, chroma_offset, _mx, _my, block_w);
1605 }
1606 
1607 /**
1608  * 8.5.3.2.2.2 Chroma sample bidirectional interpolation process
1609  *
1610  * @param s HEVC decoding context
1611  * @param dst target buffer for block data at block position
1612  * @param dststride stride of the dst buffer
1613  * @param ref0 reference picture0 buffer at origin (0, 0)
1614  * @param mv0 motion vector0 (relative to block position) to get pixel data from
1615  * @param x_off horizontal position of block from origin (0, 0)
1616  * @param y_off vertical position of block from origin (0, 0)
1617  * @param block_w width of block
1618  * @param block_h height of block
1619  * @param ref1 reference picture1 buffer at origin (0, 0)
1620  * @param mv1 motion vector1 (relative to block position) to get pixel data from
1621  * @param current_mv current motion vector structure
1622  * @param cidx chroma component(cb, cr)
1623  */
1624 static void chroma_mc_bi(HEVCContext *s, uint8_t *dst0, ptrdiff_t dststride, AVFrame *ref0, AVFrame *ref1,
1625  int x_off, int y_off, int block_w, int block_h, struct MvField *current_mv, int cidx)
1626 {
1627  HEVCLocalContext *lc = s->HEVClc;
1628  uint8_t *src1 = ref0->data[cidx+1];
1629  uint8_t *src2 = ref1->data[cidx+1];
1630  ptrdiff_t src1stride = ref0->linesize[cidx+1];
1631  ptrdiff_t src2stride = ref1->linesize[cidx+1];
1632  int weight_flag = (s->sh.slice_type == HEVC_SLICE_P && s->ps.pps->weighted_pred_flag) ||
1634  int pic_width = s->ps.sps->width >> s->ps.sps->hshift[1];
1635  int pic_height = s->ps.sps->height >> s->ps.sps->vshift[1];
1636  Mv *mv0 = &current_mv->mv[0];
1637  Mv *mv1 = &current_mv->mv[1];
1638  int hshift = s->ps.sps->hshift[1];
1639  int vshift = s->ps.sps->vshift[1];
1640 
1641  intptr_t mx0 = av_mod_uintp2(mv0->x, 2 + hshift);
1642  intptr_t my0 = av_mod_uintp2(mv0->y, 2 + vshift);
1643  intptr_t mx1 = av_mod_uintp2(mv1->x, 2 + hshift);
1644  intptr_t my1 = av_mod_uintp2(mv1->y, 2 + vshift);
1645  intptr_t _mx0 = mx0 << (1 - hshift);
1646  intptr_t _my0 = my0 << (1 - vshift);
1647  intptr_t _mx1 = mx1 << (1 - hshift);
1648  intptr_t _my1 = my1 << (1 - vshift);
1649 
1650  int x_off0 = x_off + (mv0->x >> (2 + hshift));
1651  int y_off0 = y_off + (mv0->y >> (2 + vshift));
1652  int x_off1 = x_off + (mv1->x >> (2 + hshift));
1653  int y_off1 = y_off + (mv1->y >> (2 + vshift));
1654  int idx = ff_hevc_pel_weight[block_w];
1655  src1 += y_off0 * src1stride + (int)((unsigned)x_off0 << s->ps.sps->pixel_shift);
1656  src2 += y_off1 * src2stride + (int)((unsigned)x_off1 << s->ps.sps->pixel_shift);
1657 
1658  if (x_off0 < EPEL_EXTRA_BEFORE || y_off0 < EPEL_EXTRA_AFTER ||
1659  x_off0 >= pic_width - block_w - EPEL_EXTRA_AFTER ||
1660  y_off0 >= pic_height - block_h - EPEL_EXTRA_AFTER) {
1661  const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->ps.sps->pixel_shift;
1662  int offset1 = EPEL_EXTRA_BEFORE * (src1stride + (1 << s->ps.sps->pixel_shift));
1663  int buf_offset1 = EPEL_EXTRA_BEFORE *
1664  (edge_emu_stride + (1 << s->ps.sps->pixel_shift));
1665 
1666  s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src1 - offset1,
1667  edge_emu_stride, src1stride,
1668  block_w + EPEL_EXTRA, block_h + EPEL_EXTRA,
1669  x_off0 - EPEL_EXTRA_BEFORE,
1670  y_off0 - EPEL_EXTRA_BEFORE,
1671  pic_width, pic_height);
1672 
1673  src1 = lc->edge_emu_buffer + buf_offset1;
1674  src1stride = edge_emu_stride;
1675  }
1676 
1677  if (x_off1 < EPEL_EXTRA_BEFORE || y_off1 < EPEL_EXTRA_AFTER ||
1678  x_off1 >= pic_width - block_w - EPEL_EXTRA_AFTER ||
1679  y_off1 >= pic_height - block_h - EPEL_EXTRA_AFTER) {
1680  const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->ps.sps->pixel_shift;
1681  int offset1 = EPEL_EXTRA_BEFORE * (src2stride + (1 << s->ps.sps->pixel_shift));
1682  int buf_offset1 = EPEL_EXTRA_BEFORE *
1683  (edge_emu_stride + (1 << s->ps.sps->pixel_shift));
1684 
1685  s->vdsp.emulated_edge_mc(lc->edge_emu_buffer2, src2 - offset1,
1686  edge_emu_stride, src2stride,
1687  block_w + EPEL_EXTRA, block_h + EPEL_EXTRA,
1688  x_off1 - EPEL_EXTRA_BEFORE,
1689  y_off1 - EPEL_EXTRA_BEFORE,
1690  pic_width, pic_height);
1691 
1692  src2 = lc->edge_emu_buffer2 + buf_offset1;
1693  src2stride = edge_emu_stride;
1694  }
1695 
1696  s->hevcdsp.put_hevc_epel[idx][!!my0][!!mx0](lc->tmp, src1, src1stride,
1697  block_h, _mx0, _my0, block_w);
1698  if (!weight_flag)
1699  s->hevcdsp.put_hevc_epel_bi[idx][!!my1][!!mx1](dst0, s->frame->linesize[cidx+1],
1700  src2, src2stride, lc->tmp,
1701  block_h, _mx1, _my1, block_w);
1702  else
1703  s->hevcdsp.put_hevc_epel_bi_w[idx][!!my1][!!mx1](dst0, s->frame->linesize[cidx+1],
1704  src2, src2stride, lc->tmp,
1705  block_h,
1707  s->sh.chroma_weight_l0[current_mv->ref_idx[0]][cidx],
1708  s->sh.chroma_weight_l1[current_mv->ref_idx[1]][cidx],
1709  s->sh.chroma_offset_l0[current_mv->ref_idx[0]][cidx],
1710  s->sh.chroma_offset_l1[current_mv->ref_idx[1]][cidx],
1711  _mx1, _my1, block_w);
1712 }
1713 
1715  const Mv *mv, int y0, int height)
1716 {
1717  if (s->threads_type == FF_THREAD_FRAME ) {
1718  int y = FFMAX(0, (mv->y >> 2) + y0 + height + 9);
1719 
1720  ff_thread_await_progress(&ref->tf, y, 0);
1721  }
1722 }
1723 
1724 static void hevc_luma_mv_mvp_mode(HEVCContext *s, int x0, int y0, int nPbW,
1725  int nPbH, int log2_cb_size, int part_idx,
1726  int merge_idx, MvField *mv)
1727 {
1728  HEVCLocalContext *lc = s->HEVClc;
1729  enum InterPredIdc inter_pred_idc = PRED_L0;
1730  int mvp_flag;
1731 
1732  ff_hevc_set_neighbour_available(s, x0, y0, nPbW, nPbH);
1733  mv->pred_flag = 0;
1734  if (s->sh.slice_type == HEVC_SLICE_B)
1735  inter_pred_idc = ff_hevc_inter_pred_idc_decode(s, nPbW, nPbH);
1736 
1737  if (inter_pred_idc != PRED_L1) {
1738  if (s->sh.nb_refs[L0])
1739  mv->ref_idx[0]= ff_hevc_ref_idx_lx_decode(s, s->sh.nb_refs[L0]);
1740 
1741  mv->pred_flag = PF_L0;
1742  ff_hevc_hls_mvd_coding(s, x0, y0, 0);
1743  mvp_flag = ff_hevc_mvp_lx_flag_decode(s);
1744  ff_hevc_luma_mv_mvp_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
1745  part_idx, merge_idx, mv, mvp_flag, 0);
1746  mv->mv[0].x += lc->pu.mvd.x;
1747  mv->mv[0].y += lc->pu.mvd.y;
1748  }
1749 
1750  if (inter_pred_idc != PRED_L0) {
1751  if (s->sh.nb_refs[L1])
1752  mv->ref_idx[1]= ff_hevc_ref_idx_lx_decode(s, s->sh.nb_refs[L1]);
1753 
1754  if (s->sh.mvd_l1_zero_flag == 1 && inter_pred_idc == PRED_BI) {
1755  AV_ZERO32(&lc->pu.mvd);
1756  } else {
1757  ff_hevc_hls_mvd_coding(s, x0, y0, 1);
1758  }
1759 
1760  mv->pred_flag += PF_L1;
1761  mvp_flag = ff_hevc_mvp_lx_flag_decode(s);
1762  ff_hevc_luma_mv_mvp_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
1763  part_idx, merge_idx, mv, mvp_flag, 1);
1764  mv->mv[1].x += lc->pu.mvd.x;
1765  mv->mv[1].y += lc->pu.mvd.y;
1766  }
1767 }
1768 
1769 static void hls_prediction_unit(HEVCContext *s, int x0, int y0,
1770  int nPbW, int nPbH,
1771  int log2_cb_size, int partIdx, int idx)
1772 {
1773 #define POS(c_idx, x, y) \
1774  &s->frame->data[c_idx][((y) >> s->ps.sps->vshift[c_idx]) * s->frame->linesize[c_idx] + \
1775  (((x) >> s->ps.sps->hshift[c_idx]) << s->ps.sps->pixel_shift)]
1776  HEVCLocalContext *lc = s->HEVClc;
1777  int merge_idx = 0;
1778  struct MvField current_mv = {{{ 0 }}};
1779 
1780  int min_pu_width = s->ps.sps->min_pu_width;
1781 
1782  MvField *tab_mvf = s->ref->tab_mvf;
1783  RefPicList *refPicList = s->ref->refPicList;
1784  HEVCFrame *ref0 = NULL, *ref1 = NULL;
1785  uint8_t *dst0 = POS(0, x0, y0);
1786  uint8_t *dst1 = POS(1, x0, y0);
1787  uint8_t *dst2 = POS(2, x0, y0);
1788  int log2_min_cb_size = s->ps.sps->log2_min_cb_size;
1789  int min_cb_width = s->ps.sps->min_cb_width;
1790  int x_cb = x0 >> log2_min_cb_size;
1791  int y_cb = y0 >> log2_min_cb_size;
1792  int x_pu, y_pu;
1793  int i, j;
1794 
1795  int skip_flag = SAMPLE_CTB(s->skip_flag, x_cb, y_cb);
1796 
1797  if (!skip_flag)
1799 
1800  if (skip_flag || lc->pu.merge_flag) {
1801  if (s->sh.max_num_merge_cand > 1)
1802  merge_idx = ff_hevc_merge_idx_decode(s);
1803  else
1804  merge_idx = 0;
1805 
1806  ff_hevc_luma_mv_merge_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
1807  partIdx, merge_idx, &current_mv);
1808  } else {
1809  hevc_luma_mv_mvp_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
1810  partIdx, merge_idx, &current_mv);
1811  }
1812 
1813  x_pu = x0 >> s->ps.sps->log2_min_pu_size;
1814  y_pu = y0 >> s->ps.sps->log2_min_pu_size;
1815 
1816  for (j = 0; j < nPbH >> s->ps.sps->log2_min_pu_size; j++)
1817  for (i = 0; i < nPbW >> s->ps.sps->log2_min_pu_size; i++)
1818  tab_mvf[(y_pu + j) * min_pu_width + x_pu + i] = current_mv;
1819 
1820  if (current_mv.pred_flag & PF_L0) {
1821  ref0 = refPicList[0].ref[current_mv.ref_idx[0]];
1822  if (!ref0)
1823  return;
1824  hevc_await_progress(s, ref0, &current_mv.mv[0], y0, nPbH);
1825  }
1826  if (current_mv.pred_flag & PF_L1) {
1827  ref1 = refPicList[1].ref[current_mv.ref_idx[1]];
1828  if (!ref1)
1829  return;
1830  hevc_await_progress(s, ref1, &current_mv.mv[1], y0, nPbH);
1831  }
1832 
1833  if (current_mv.pred_flag == PF_L0) {
1834  int x0_c = x0 >> s->ps.sps->hshift[1];
1835  int y0_c = y0 >> s->ps.sps->vshift[1];
1836  int nPbW_c = nPbW >> s->ps.sps->hshift[1];
1837  int nPbH_c = nPbH >> s->ps.sps->vshift[1];
1838 
1839  luma_mc_uni(s, dst0, s->frame->linesize[0], ref0->frame,
1840  &current_mv.mv[0], x0, y0, nPbW, nPbH,
1841  s->sh.luma_weight_l0[current_mv.ref_idx[0]],
1842  s->sh.luma_offset_l0[current_mv.ref_idx[0]]);
1843 
1844  if (s->ps.sps->chroma_format_idc) {
1845  chroma_mc_uni(s, dst1, s->frame->linesize[1], ref0->frame->data[1], ref0->frame->linesize[1],
1846  0, x0_c, y0_c, nPbW_c, nPbH_c, &current_mv,
1847  s->sh.chroma_weight_l0[current_mv.ref_idx[0]][0], s->sh.chroma_offset_l0[current_mv.ref_idx[0]][0]);
1848  chroma_mc_uni(s, dst2, s->frame->linesize[2], ref0->frame->data[2], ref0->frame->linesize[2],
1849  0, x0_c, y0_c, nPbW_c, nPbH_c, &current_mv,
1850  s->sh.chroma_weight_l0[current_mv.ref_idx[0]][1], s->sh.chroma_offset_l0[current_mv.ref_idx[0]][1]);
1851  }
1852  } else if (current_mv.pred_flag == PF_L1) {
1853  int x0_c = x0 >> s->ps.sps->hshift[1];
1854  int y0_c = y0 >> s->ps.sps->vshift[1];
1855  int nPbW_c = nPbW >> s->ps.sps->hshift[1];
1856  int nPbH_c = nPbH >> s->ps.sps->vshift[1];
1857 
1858  luma_mc_uni(s, dst0, s->frame->linesize[0], ref1->frame,
1859  &current_mv.mv[1], x0, y0, nPbW, nPbH,
1860  s->sh.luma_weight_l1[current_mv.ref_idx[1]],
1861  s->sh.luma_offset_l1[current_mv.ref_idx[1]]);
1862 
1863  if (s->ps.sps->chroma_format_idc) {
1864  chroma_mc_uni(s, dst1, s->frame->linesize[1], ref1->frame->data[1], ref1->frame->linesize[1],
1865  1, x0_c, y0_c, nPbW_c, nPbH_c, &current_mv,
1866  s->sh.chroma_weight_l1[current_mv.ref_idx[1]][0], s->sh.chroma_offset_l1[current_mv.ref_idx[1]][0]);
1867 
1868  chroma_mc_uni(s, dst2, s->frame->linesize[2], ref1->frame->data[2], ref1->frame->linesize[2],
1869  1, x0_c, y0_c, nPbW_c, nPbH_c, &current_mv,
1870  s->sh.chroma_weight_l1[current_mv.ref_idx[1]][1], s->sh.chroma_offset_l1[current_mv.ref_idx[1]][1]);
1871  }
1872  } else if (current_mv.pred_flag == PF_BI) {
1873  int x0_c = x0 >> s->ps.sps->hshift[1];
1874  int y0_c = y0 >> s->ps.sps->vshift[1];
1875  int nPbW_c = nPbW >> s->ps.sps->hshift[1];
1876  int nPbH_c = nPbH >> s->ps.sps->vshift[1];
1877 
1878  luma_mc_bi(s, dst0, s->frame->linesize[0], ref0->frame,
1879  &current_mv.mv[0], x0, y0, nPbW, nPbH,
1880  ref1->frame, &current_mv.mv[1], &current_mv);
1881 
1882  if (s->ps.sps->chroma_format_idc) {
1883  chroma_mc_bi(s, dst1, s->frame->linesize[1], ref0->frame, ref1->frame,
1884  x0_c, y0_c, nPbW_c, nPbH_c, &current_mv, 0);
1885 
1886  chroma_mc_bi(s, dst2, s->frame->linesize[2], ref0->frame, ref1->frame,
1887  x0_c, y0_c, nPbW_c, nPbH_c, &current_mv, 1);
1888  }
1889  }
1890 }
1891 
1892 /**
1893  * 8.4.1
1894  */
1895 static int luma_intra_pred_mode(HEVCContext *s, int x0, int y0, int pu_size,
1896  int prev_intra_luma_pred_flag)
1897 {
1898  HEVCLocalContext *lc = s->HEVClc;
1899  int x_pu = x0 >> s->ps.sps->log2_min_pu_size;
1900  int y_pu = y0 >> s->ps.sps->log2_min_pu_size;
1901  int min_pu_width = s->ps.sps->min_pu_width;
1902  int size_in_pus = pu_size >> s->ps.sps->log2_min_pu_size;
1903  int x0b = av_mod_uintp2(x0, s->ps.sps->log2_ctb_size);
1904  int y0b = av_mod_uintp2(y0, s->ps.sps->log2_ctb_size);
1905 
1906  int cand_up = (lc->ctb_up_flag || y0b) ?
1907  s->tab_ipm[(y_pu - 1) * min_pu_width + x_pu] : INTRA_DC;
1908  int cand_left = (lc->ctb_left_flag || x0b) ?
1909  s->tab_ipm[y_pu * min_pu_width + x_pu - 1] : INTRA_DC;
1910 
1911  int y_ctb = (y0 >> (s->ps.sps->log2_ctb_size)) << (s->ps.sps->log2_ctb_size);
1912 
1913  MvField *tab_mvf = s->ref->tab_mvf;
1914  int intra_pred_mode;
1915  int candidate[3];
1916  int i, j;
1917 
1918  // intra_pred_mode prediction does not cross vertical CTB boundaries
1919  if ((y0 - 1) < y_ctb)
1920  cand_up = INTRA_DC;
1921 
1922  if (cand_left == cand_up) {
1923  if (cand_left < 2) {
1924  candidate[0] = INTRA_PLANAR;
1925  candidate[1] = INTRA_DC;
1926  candidate[2] = INTRA_ANGULAR_26;
1927  } else {
1928  candidate[0] = cand_left;
1929  candidate[1] = 2 + ((cand_left - 2 - 1 + 32) & 31);
1930  candidate[2] = 2 + ((cand_left - 2 + 1) & 31);
1931  }
1932  } else {
1933  candidate[0] = cand_left;
1934  candidate[1] = cand_up;
1935  if (candidate[0] != INTRA_PLANAR && candidate[1] != INTRA_PLANAR) {
1936  candidate[2] = INTRA_PLANAR;
1937  } else if (candidate[0] != INTRA_DC && candidate[1] != INTRA_DC) {
1938  candidate[2] = INTRA_DC;
1939  } else {
1940  candidate[2] = INTRA_ANGULAR_26;
1941  }
1942  }
1943 
1944  if (prev_intra_luma_pred_flag) {
1945  intra_pred_mode = candidate[lc->pu.mpm_idx];
1946  } else {
1947  if (candidate[0] > candidate[1])
1948  FFSWAP(uint8_t, candidate[0], candidate[1]);
1949  if (candidate[0] > candidate[2])
1950  FFSWAP(uint8_t, candidate[0], candidate[2]);
1951  if (candidate[1] > candidate[2])
1952  FFSWAP(uint8_t, candidate[1], candidate[2]);
1953 
1954  intra_pred_mode = lc->pu.rem_intra_luma_pred_mode;
1955  for (i = 0; i < 3; i++)
1956  if (intra_pred_mode >= candidate[i])
1957  intra_pred_mode++;
1958  }
1959 
1960  /* write the intra prediction units into the mv array */
1961  if (!size_in_pus)
1962  size_in_pus = 1;
1963  for (i = 0; i < size_in_pus; i++) {
1964  memset(&s->tab_ipm[(y_pu + i) * min_pu_width + x_pu],
1965  intra_pred_mode, size_in_pus);
1966 
1967  for (j = 0; j < size_in_pus; j++) {
1968  tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].pred_flag = PF_INTRA;
1969  }
1970  }
1971 
1972  return intra_pred_mode;
1973 }
1974 
1975 static av_always_inline void set_ct_depth(HEVCContext *s, int x0, int y0,
1976  int log2_cb_size, int ct_depth)
1977 {
1978  int length = (1 << log2_cb_size) >> s->ps.sps->log2_min_cb_size;
1979  int x_cb = x0 >> s->ps.sps->log2_min_cb_size;
1980  int y_cb = y0 >> s->ps.sps->log2_min_cb_size;
1981  int y;
1982 
1983  for (y = 0; y < length; y++)
1984  memset(&s->tab_ct_depth[(y_cb + y) * s->ps.sps->min_cb_width + x_cb],
1985  ct_depth, length);
1986 }
1987 
1988 static const uint8_t tab_mode_idx[] = {
1989  0, 1, 2, 2, 2, 2, 3, 5, 7, 8, 10, 12, 13, 15, 17, 18, 19, 20,
1990  21, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 29, 29, 30, 31};
1991 
1992 static void intra_prediction_unit(HEVCContext *s, int x0, int y0,
1993  int log2_cb_size)
1994 {
1995  HEVCLocalContext *lc = s->HEVClc;
1996  static const uint8_t intra_chroma_table[4] = { 0, 26, 10, 1 };
1997  uint8_t prev_intra_luma_pred_flag[4];
1998  int split = lc->cu.part_mode == PART_NxN;
1999  int pb_size = (1 << log2_cb_size) >> split;
2000  int side = split + 1;
2001  int chroma_mode;
2002  int i, j;
2003 
2004  for (i = 0; i < side; i++)
2005  for (j = 0; j < side; j++)
2006  prev_intra_luma_pred_flag[2 * i + j] = ff_hevc_prev_intra_luma_pred_flag_decode(s);
2007 
2008  for (i = 0; i < side; i++) {
2009  for (j = 0; j < side; j++) {
2010  if (prev_intra_luma_pred_flag[2 * i + j])
2012  else
2014 
2015  lc->pu.intra_pred_mode[2 * i + j] =
2016  luma_intra_pred_mode(s, x0 + pb_size * j, y0 + pb_size * i, pb_size,
2017  prev_intra_luma_pred_flag[2 * i + j]);
2018  }
2019  }
2020 
2021  if (s->ps.sps->chroma_format_idc == 3) {
2022  for (i = 0; i < side; i++) {
2023  for (j = 0; j < side; j++) {
2024  lc->pu.chroma_mode_c[2 * i + j] = chroma_mode = ff_hevc_intra_chroma_pred_mode_decode(s);
2025  if (chroma_mode != 4) {
2026  if (lc->pu.intra_pred_mode[2 * i + j] == intra_chroma_table[chroma_mode])
2027  lc->pu.intra_pred_mode_c[2 * i + j] = 34;
2028  else
2029  lc->pu.intra_pred_mode_c[2 * i + j] = intra_chroma_table[chroma_mode];
2030  } else {
2031  lc->pu.intra_pred_mode_c[2 * i + j] = lc->pu.intra_pred_mode[2 * i + j];
2032  }
2033  }
2034  }
2035  } else if (s->ps.sps->chroma_format_idc == 2) {
2036  int mode_idx;
2037  lc->pu.chroma_mode_c[0] = chroma_mode = ff_hevc_intra_chroma_pred_mode_decode(s);
2038  if (chroma_mode != 4) {
2039  if (lc->pu.intra_pred_mode[0] == intra_chroma_table[chroma_mode])
2040  mode_idx = 34;
2041  else
2042  mode_idx = intra_chroma_table[chroma_mode];
2043  } else {
2044  mode_idx = lc->pu.intra_pred_mode[0];
2045  }
2046  lc->pu.intra_pred_mode_c[0] = tab_mode_idx[mode_idx];
2047  } else if (s->ps.sps->chroma_format_idc != 0) {
2048  chroma_mode = ff_hevc_intra_chroma_pred_mode_decode(s);
2049  if (chroma_mode != 4) {
2050  if (lc->pu.intra_pred_mode[0] == intra_chroma_table[chroma_mode])
2051  lc->pu.intra_pred_mode_c[0] = 34;
2052  else
2053  lc->pu.intra_pred_mode_c[0] = intra_chroma_table[chroma_mode];
2054  } else {
2055  lc->pu.intra_pred_mode_c[0] = lc->pu.intra_pred_mode[0];
2056  }
2057  }
2058 }
2059 
2061  int x0, int y0,
2062  int log2_cb_size)
2063 {
2064  HEVCLocalContext *lc = s->HEVClc;
2065  int pb_size = 1 << log2_cb_size;
2066  int size_in_pus = pb_size >> s->ps.sps->log2_min_pu_size;
2067  int min_pu_width = s->ps.sps->min_pu_width;
2068  MvField *tab_mvf = s->ref->tab_mvf;
2069  int x_pu = x0 >> s->ps.sps->log2_min_pu_size;
2070  int y_pu = y0 >> s->ps.sps->log2_min_pu_size;
2071  int j, k;
2072 
2073  if (size_in_pus == 0)
2074  size_in_pus = 1;
2075  for (j = 0; j < size_in_pus; j++)
2076  memset(&s->tab_ipm[(y_pu + j) * min_pu_width + x_pu], INTRA_DC, size_in_pus);
2077  if (lc->cu.pred_mode == MODE_INTRA)
2078  for (j = 0; j < size_in_pus; j++)
2079  for (k = 0; k < size_in_pus; k++)
2080  tab_mvf[(y_pu + j) * min_pu_width + x_pu + k].pred_flag = PF_INTRA;
2081 }
2082 
2083 static int hls_coding_unit(HEVCContext *s, int x0, int y0, int log2_cb_size)
2084 {
2085  int cb_size = 1 << log2_cb_size;
2086  HEVCLocalContext *lc = s->HEVClc;
2087  int log2_min_cb_size = s->ps.sps->log2_min_cb_size;
2088  int length = cb_size >> log2_min_cb_size;
2089  int min_cb_width = s->ps.sps->min_cb_width;
2090  int x_cb = x0 >> log2_min_cb_size;
2091  int y_cb = y0 >> log2_min_cb_size;
2092  int idx = log2_cb_size - 2;
2093  int qp_block_mask = (1<<(s->ps.sps->log2_ctb_size - s->ps.pps->diff_cu_qp_delta_depth)) - 1;
2094  int x, y, ret;
2095 
2096  lc->cu.x = x0;
2097  lc->cu.y = y0;
2098  lc->cu.pred_mode = MODE_INTRA;
2099  lc->cu.part_mode = PART_2Nx2N;
2100  lc->cu.intra_split_flag = 0;
2101 
2102  SAMPLE_CTB(s->skip_flag, x_cb, y_cb) = 0;
2103  for (x = 0; x < 4; x++)
2104  lc->pu.intra_pred_mode[x] = 1;
2107  if (lc->cu.cu_transquant_bypass_flag)
2108  set_deblocking_bypass(s, x0, y0, log2_cb_size);
2109  } else
2110  lc->cu.cu_transquant_bypass_flag = 0;
2111 
2112  if (s->sh.slice_type != HEVC_SLICE_I) {
2113  uint8_t skip_flag = ff_hevc_skip_flag_decode(s, x0, y0, x_cb, y_cb);
2114 
2115  x = y_cb * min_cb_width + x_cb;
2116  for (y = 0; y < length; y++) {
2117  memset(&s->skip_flag[x], skip_flag, length);
2118  x += min_cb_width;
2119  }
2120  lc->cu.pred_mode = skip_flag ? MODE_SKIP : MODE_INTER;
2121  } else {
2122  x = y_cb * min_cb_width + x_cb;
2123  for (y = 0; y < length; y++) {
2124  memset(&s->skip_flag[x], 0, length);
2125  x += min_cb_width;
2126  }
2127  }
2128 
2129  if (SAMPLE_CTB(s->skip_flag, x_cb, y_cb)) {
2130  hls_prediction_unit(s, x0, y0, cb_size, cb_size, log2_cb_size, 0, idx);
2131  intra_prediction_unit_default_value(s, x0, y0, log2_cb_size);
2132 
2134  ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_cb_size);
2135  } else {
2136  int pcm_flag = 0;
2137 
2138  if (s->sh.slice_type != HEVC_SLICE_I)
2140  if (lc->cu.pred_mode != MODE_INTRA ||
2141  log2_cb_size == s->ps.sps->log2_min_cb_size) {
2142  lc->cu.part_mode = ff_hevc_part_mode_decode(s, log2_cb_size);
2143  lc->cu.intra_split_flag = lc->cu.part_mode == PART_NxN &&
2144  lc->cu.pred_mode == MODE_INTRA;
2145  }
2146 
2147  if (lc->cu.pred_mode == MODE_INTRA) {
2148  if (lc->cu.part_mode == PART_2Nx2N && s->ps.sps->pcm_enabled_flag &&
2149  log2_cb_size >= s->ps.sps->pcm.log2_min_pcm_cb_size &&
2150  log2_cb_size <= s->ps.sps->pcm.log2_max_pcm_cb_size) {
2151  pcm_flag = ff_hevc_pcm_flag_decode(s);
2152  }
2153  if (pcm_flag) {
2154  intra_prediction_unit_default_value(s, x0, y0, log2_cb_size);
2155  ret = hls_pcm_sample(s, x0, y0, log2_cb_size);
2157  set_deblocking_bypass(s, x0, y0, log2_cb_size);
2158 
2159  if (ret < 0)
2160  return ret;
2161  } else {
2162  intra_prediction_unit(s, x0, y0, log2_cb_size);
2163  }
2164  } else {
2165  intra_prediction_unit_default_value(s, x0, y0, log2_cb_size);
2166  switch (lc->cu.part_mode) {
2167  case PART_2Nx2N:
2168  hls_prediction_unit(s, x0, y0, cb_size, cb_size, log2_cb_size, 0, idx);
2169  break;
2170  case PART_2NxN:
2171  hls_prediction_unit(s, x0, y0, cb_size, cb_size / 2, log2_cb_size, 0, idx);
2172  hls_prediction_unit(s, x0, y0 + cb_size / 2, cb_size, cb_size / 2, log2_cb_size, 1, idx);
2173  break;
2174  case PART_Nx2N:
2175  hls_prediction_unit(s, x0, y0, cb_size / 2, cb_size, log2_cb_size, 0, idx - 1);
2176  hls_prediction_unit(s, x0 + cb_size / 2, y0, cb_size / 2, cb_size, log2_cb_size, 1, idx - 1);
2177  break;
2178  case PART_2NxnU:
2179  hls_prediction_unit(s, x0, y0, cb_size, cb_size / 4, log2_cb_size, 0, idx);
2180  hls_prediction_unit(s, x0, y0 + cb_size / 4, cb_size, cb_size * 3 / 4, log2_cb_size, 1, idx);
2181  break;
2182  case PART_2NxnD:
2183  hls_prediction_unit(s, x0, y0, cb_size, cb_size * 3 / 4, log2_cb_size, 0, idx);
2184  hls_prediction_unit(s, x0, y0 + cb_size * 3 / 4, cb_size, cb_size / 4, log2_cb_size, 1, idx);
2185  break;
2186  case PART_nLx2N:
2187  hls_prediction_unit(s, x0, y0, cb_size / 4, cb_size, log2_cb_size, 0, idx - 2);
2188  hls_prediction_unit(s, x0 + cb_size / 4, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 1, idx - 2);
2189  break;
2190  case PART_nRx2N:
2191  hls_prediction_unit(s, x0, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 0, idx - 2);
2192  hls_prediction_unit(s, x0 + cb_size * 3 / 4, y0, cb_size / 4, cb_size, log2_cb_size, 1, idx - 2);
2193  break;
2194  case PART_NxN:
2195  hls_prediction_unit(s, x0, y0, cb_size / 2, cb_size / 2, log2_cb_size, 0, idx - 1);
2196  hls_prediction_unit(s, x0 + cb_size / 2, y0, cb_size / 2, cb_size / 2, log2_cb_size, 1, idx - 1);
2197  hls_prediction_unit(s, x0, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 2, idx - 1);
2198  hls_prediction_unit(s, x0 + cb_size / 2, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 3, idx - 1);
2199  break;
2200  }
2201  }
2202 
2203  if (!pcm_flag) {
2204  int rqt_root_cbf = 1;
2205 
2206  if (lc->cu.pred_mode != MODE_INTRA &&
2207  !(lc->cu.part_mode == PART_2Nx2N && lc->pu.merge_flag)) {
2208  rqt_root_cbf = ff_hevc_no_residual_syntax_flag_decode(s);
2209  }
2210  if (rqt_root_cbf) {
2211  const static int cbf[2] = { 0 };
2212  lc->cu.max_trafo_depth = lc->cu.pred_mode == MODE_INTRA ?
2215  ret = hls_transform_tree(s, x0, y0, x0, y0, x0, y0,
2216  log2_cb_size,
2217  log2_cb_size, 0, 0, cbf, cbf);
2218  if (ret < 0)
2219  return ret;
2220  } else {
2222  ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_cb_size);
2223  }
2224  }
2225  }
2226 
2228  ff_hevc_set_qPy(s, x0, y0, log2_cb_size);
2229 
2230  x = y_cb * min_cb_width + x_cb;
2231  for (y = 0; y < length; y++) {
2232  memset(&s->qp_y_tab[x], lc->qp_y, length);
2233  x += min_cb_width;
2234  }
2235 
2236  if(((x0 + (1<<log2_cb_size)) & qp_block_mask) == 0 &&
2237  ((y0 + (1<<log2_cb_size)) & qp_block_mask) == 0) {
2238  lc->qPy_pred = lc->qp_y;
2239  }
2240 
2241  set_ct_depth(s, x0, y0, log2_cb_size, lc->ct_depth);
2242 
2243  return 0;
2244 }
2245 
2246 static int hls_coding_quadtree(HEVCContext *s, int x0, int y0,
2247  int log2_cb_size, int cb_depth)
2248 {
2249  HEVCLocalContext *lc = s->HEVClc;
2250  const int cb_size = 1 << log2_cb_size;
2251  int ret;
2252  int split_cu;
2253 
2254  lc->ct_depth = cb_depth;
2255  if (x0 + cb_size <= s->ps.sps->width &&
2256  y0 + cb_size <= s->ps.sps->height &&
2257  log2_cb_size > s->ps.sps->log2_min_cb_size) {
2258  split_cu = ff_hevc_split_coding_unit_flag_decode(s, cb_depth, x0, y0);
2259  } else {
2260  split_cu = (log2_cb_size > s->ps.sps->log2_min_cb_size);
2261  }
2262  if (s->ps.pps->cu_qp_delta_enabled_flag &&
2263  log2_cb_size >= s->ps.sps->log2_ctb_size - s->ps.pps->diff_cu_qp_delta_depth) {
2264  lc->tu.is_cu_qp_delta_coded = 0;
2265  lc->tu.cu_qp_delta = 0;
2266  }
2267 
2269  log2_cb_size >= s->ps.sps->log2_ctb_size - s->ps.pps->diff_cu_chroma_qp_offset_depth) {
2271  }
2272 
2273  if (split_cu) {
2274  int qp_block_mask = (1<<(s->ps.sps->log2_ctb_size - s->ps.pps->diff_cu_qp_delta_depth)) - 1;
2275  const int cb_size_split = cb_size >> 1;
2276  const int x1 = x0 + cb_size_split;
2277  const int y1 = y0 + cb_size_split;
2278 
2279  int more_data = 0;
2280 
2281  more_data = hls_coding_quadtree(s, x0, y0, log2_cb_size - 1, cb_depth + 1);
2282  if (more_data < 0)
2283  return more_data;
2284 
2285  if (more_data && x1 < s->ps.sps->width) {
2286  more_data = hls_coding_quadtree(s, x1, y0, log2_cb_size - 1, cb_depth + 1);
2287  if (more_data < 0)
2288  return more_data;
2289  }
2290  if (more_data && y1 < s->ps.sps->height) {
2291  more_data = hls_coding_quadtree(s, x0, y1, log2_cb_size - 1, cb_depth + 1);
2292  if (more_data < 0)
2293  return more_data;
2294  }
2295  if (more_data && x1 < s->ps.sps->width &&
2296  y1 < s->ps.sps->height) {
2297  more_data = hls_coding_quadtree(s, x1, y1, log2_cb_size - 1, cb_depth + 1);
2298  if (more_data < 0)
2299  return more_data;
2300  }
2301 
2302  if(((x0 + (1<<log2_cb_size)) & qp_block_mask) == 0 &&
2303  ((y0 + (1<<log2_cb_size)) & qp_block_mask) == 0)
2304  lc->qPy_pred = lc->qp_y;
2305 
2306  if (more_data)
2307  return ((x1 + cb_size_split) < s->ps.sps->width ||
2308  (y1 + cb_size_split) < s->ps.sps->height);
2309  else
2310  return 0;
2311  } else {
2312  ret = hls_coding_unit(s, x0, y0, log2_cb_size);
2313  if (ret < 0)
2314  return ret;
2315  if ((!((x0 + cb_size) %
2316  (1 << (s->ps.sps->log2_ctb_size))) ||
2317  (x0 + cb_size >= s->ps.sps->width)) &&
2318  (!((y0 + cb_size) %
2319  (1 << (s->ps.sps->log2_ctb_size))) ||
2320  (y0 + cb_size >= s->ps.sps->height))) {
2321  int end_of_slice_flag = ff_hevc_end_of_slice_flag_decode(s);
2322  return !end_of_slice_flag;
2323  } else {
2324  return 1;
2325  }
2326  }
2327 
2328  return 0;
2329 }
2330 
2331 static void hls_decode_neighbour(HEVCContext *s, int x_ctb, int y_ctb,
2332  int ctb_addr_ts)
2333 {
2334  HEVCLocalContext *lc = s->HEVClc;
2335  int ctb_size = 1 << s->ps.sps->log2_ctb_size;
2336  int ctb_addr_rs = s->ps.pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2337  int ctb_addr_in_slice = ctb_addr_rs - s->sh.slice_addr;
2338 
2339  s->tab_slice_address[ctb_addr_rs] = s->sh.slice_addr;
2340 
2342  if (x_ctb == 0 && (y_ctb & (ctb_size - 1)) == 0)
2343  lc->first_qp_group = 1;
2344  lc->end_of_tiles_x = s->ps.sps->width;
2345  } else if (s->ps.pps->tiles_enabled_flag) {
2346  if (ctb_addr_ts && s->ps.pps->tile_id[ctb_addr_ts] != s->ps.pps->tile_id[ctb_addr_ts - 1]) {
2347  int idxX = s->ps.pps->col_idxX[x_ctb >> s->ps.sps->log2_ctb_size];
2348  lc->end_of_tiles_x = x_ctb + (s->ps.pps->column_width[idxX] << s->ps.sps->log2_ctb_size);
2349  lc->first_qp_group = 1;
2350  }
2351  } else {
2352  lc->end_of_tiles_x = s->ps.sps->width;
2353  }
2354 
2355  lc->end_of_tiles_y = FFMIN(y_ctb + ctb_size, s->ps.sps->height);
2356 
2357  lc->boundary_flags = 0;
2358  if (s->ps.pps->tiles_enabled_flag) {
2359  if (x_ctb > 0 && s->ps.pps->tile_id[ctb_addr_ts] != s->ps.pps->tile_id[s->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs - 1]])
2361  if (x_ctb > 0 && s->tab_slice_address[ctb_addr_rs] != s->tab_slice_address[ctb_addr_rs - 1])
2363  if (y_ctb > 0 && s->ps.pps->tile_id[ctb_addr_ts] != s->ps.pps->tile_id[s->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs - s->ps.sps->ctb_width]])
2365  if (y_ctb > 0 && s->tab_slice_address[ctb_addr_rs] != s->tab_slice_address[ctb_addr_rs - s->ps.sps->ctb_width])
2367  } else {
2368  if (ctb_addr_in_slice <= 0)
2370  if (ctb_addr_in_slice < s->ps.sps->ctb_width)
2372  }
2373 
2374  lc->ctb_left_flag = ((x_ctb > 0) && (ctb_addr_in_slice > 0) && !(lc->boundary_flags & BOUNDARY_LEFT_TILE));
2375  lc->ctb_up_flag = ((y_ctb > 0) && (ctb_addr_in_slice >= s->ps.sps->ctb_width) && !(lc->boundary_flags & BOUNDARY_UPPER_TILE));
2376  lc->ctb_up_right_flag = ((y_ctb > 0) && (ctb_addr_in_slice+1 >= s->ps.sps->ctb_width) && (s->ps.pps->tile_id[ctb_addr_ts] == s->ps.pps->tile_id[s->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs+1 - s->ps.sps->ctb_width]]));
2377  lc->ctb_up_left_flag = ((x_ctb > 0) && (y_ctb > 0) && (ctb_addr_in_slice-1 >= s->ps.sps->ctb_width) && (s->ps.pps->tile_id[ctb_addr_ts] == s->ps.pps->tile_id[s->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs-1 - s->ps.sps->ctb_width]]));
2378 }
2379 
2380 static int hls_decode_entry(AVCodecContext *avctxt, void *isFilterThread)
2381 {
2382  HEVCContext *s = avctxt->priv_data;
2383  int ctb_size = 1 << s->ps.sps->log2_ctb_size;
2384  int more_data = 1;
2385  int x_ctb = 0;
2386  int y_ctb = 0;
2387  int ctb_addr_ts = s->ps.pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs];
2388  int ret;
2389 
2390  if (!ctb_addr_ts && s->sh.dependent_slice_segment_flag) {
2391  av_log(s->avctx, AV_LOG_ERROR, "Impossible initial tile.\n");
2392  return AVERROR_INVALIDDATA;
2393  }
2394 
2396  int prev_rs = s->ps.pps->ctb_addr_ts_to_rs[ctb_addr_ts - 1];
2397  if (s->tab_slice_address[prev_rs] != s->sh.slice_addr) {
2398  av_log(s->avctx, AV_LOG_ERROR, "Previous slice segment missing\n");
2399  return AVERROR_INVALIDDATA;
2400  }
2401  }
2402 
2403  while (more_data && ctb_addr_ts < s->ps.sps->ctb_size) {
2404  int ctb_addr_rs = s->ps.pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2405 
2406  x_ctb = (ctb_addr_rs % ((s->ps.sps->width + ctb_size - 1) >> s->ps.sps->log2_ctb_size)) << s->ps.sps->log2_ctb_size;
2407  y_ctb = (ctb_addr_rs / ((s->ps.sps->width + ctb_size - 1) >> s->ps.sps->log2_ctb_size)) << s->ps.sps->log2_ctb_size;
2408  hls_decode_neighbour(s, x_ctb, y_ctb, ctb_addr_ts);
2409 
2410  ret = ff_hevc_cabac_init(s, ctb_addr_ts);
2411  if (ret < 0) {
2412  s->tab_slice_address[ctb_addr_rs] = -1;
2413  return ret;
2414  }
2415 
2416  hls_sao_param(s, x_ctb >> s->ps.sps->log2_ctb_size, y_ctb >> s->ps.sps->log2_ctb_size);
2417 
2418  s->deblock[ctb_addr_rs].beta_offset = s->sh.beta_offset;
2419  s->deblock[ctb_addr_rs].tc_offset = s->sh.tc_offset;
2421 
2422  more_data = hls_coding_quadtree(s, x_ctb, y_ctb, s->ps.sps->log2_ctb_size, 0);
2423  if (more_data < 0) {
2424  s->tab_slice_address[ctb_addr_rs] = -1;
2425  return more_data;
2426  }
2427 
2428 
2429  ctb_addr_ts++;
2430  ff_hevc_save_states(s, ctb_addr_ts);
2431  ff_hevc_hls_filters(s, x_ctb, y_ctb, ctb_size);
2432  }
2433 
2434  if (x_ctb + ctb_size >= s->ps.sps->width &&
2435  y_ctb + ctb_size >= s->ps.sps->height)
2436  ff_hevc_hls_filter(s, x_ctb, y_ctb, ctb_size);
2437 
2438  return ctb_addr_ts;
2439 }
2440 
2442 {
2443  int arg[2];
2444  int ret[2];
2445 
2446  arg[0] = 0;
2447  arg[1] = 1;
2448 
2449  s->avctx->execute(s->avctx, hls_decode_entry, arg, ret , 1, sizeof(int));
2450  return ret[0];
2451 }
2452 static int hls_decode_entry_wpp(AVCodecContext *avctxt, void *input_ctb_row, int job, int self_id)
2453 {
2454  HEVCContext *s1 = avctxt->priv_data, *s;
2455  HEVCLocalContext *lc;
2456  int ctb_size = 1<< s1->ps.sps->log2_ctb_size;
2457  int more_data = 1;
2458  int *ctb_row_p = input_ctb_row;
2459  int ctb_row = ctb_row_p[job];
2460  int ctb_addr_rs = s1->sh.slice_ctb_addr_rs + ctb_row * ((s1->ps.sps->width + ctb_size - 1) >> s1->ps.sps->log2_ctb_size);
2461  int ctb_addr_ts = s1->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs];
2462  int thread = ctb_row % s1->threads_number;
2463  int ret;
2464 
2465  s = s1->sList[self_id];
2466  lc = s->HEVClc;
2467 
2468  if(ctb_row) {
2469  ret = init_get_bits8(&lc->gb, s->data + s->sh.offset[ctb_row - 1], s->sh.size[ctb_row - 1]);
2470  if (ret < 0)
2471  goto error;
2472  ff_init_cabac_decoder(&lc->cc, s->data + s->sh.offset[(ctb_row)-1], s->sh.size[ctb_row - 1]);
2473  }
2474 
2475  while(more_data && ctb_addr_ts < s->ps.sps->ctb_size) {
2476  int x_ctb = (ctb_addr_rs % s->ps.sps->ctb_width) << s->ps.sps->log2_ctb_size;
2477  int y_ctb = (ctb_addr_rs / s->ps.sps->ctb_width) << s->ps.sps->log2_ctb_size;
2478 
2479  hls_decode_neighbour(s, x_ctb, y_ctb, ctb_addr_ts);
2480 
2481  ff_thread_await_progress2(s->avctx, ctb_row, thread, SHIFT_CTB_WPP);
2482 
2483  if (atomic_load(&s1->wpp_err)) {
2484  ff_thread_report_progress2(s->avctx, ctb_row , thread, SHIFT_CTB_WPP);
2485  return 0;
2486  }
2487 
2488  ret = ff_hevc_cabac_init(s, ctb_addr_ts);
2489  if (ret < 0)
2490  goto error;
2491  hls_sao_param(s, x_ctb >> s->ps.sps->log2_ctb_size, y_ctb >> s->ps.sps->log2_ctb_size);
2492  more_data = hls_coding_quadtree(s, x_ctb, y_ctb, s->ps.sps->log2_ctb_size, 0);
2493 
2494  if (more_data < 0) {
2495  ret = more_data;
2496  goto error;
2497  }
2498 
2499  ctb_addr_ts++;
2500 
2501  ff_hevc_save_states(s, ctb_addr_ts);
2502  ff_thread_report_progress2(s->avctx, ctb_row, thread, 1);
2503  ff_hevc_hls_filters(s, x_ctb, y_ctb, ctb_size);
2504 
2505  if (!more_data && (x_ctb+ctb_size) < s->ps.sps->width && ctb_row != s->sh.num_entry_point_offsets) {
2506  atomic_store(&s1->wpp_err, 1);
2507  ff_thread_report_progress2(s->avctx, ctb_row ,thread, SHIFT_CTB_WPP);
2508  return 0;
2509  }
2510 
2511  if ((x_ctb+ctb_size) >= s->ps.sps->width && (y_ctb+ctb_size) >= s->ps.sps->height ) {
2512  ff_hevc_hls_filter(s, x_ctb, y_ctb, ctb_size);
2513  ff_thread_report_progress2(s->avctx, ctb_row , thread, SHIFT_CTB_WPP);
2514  return ctb_addr_ts;
2515  }
2516  ctb_addr_rs = s->ps.pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2517  x_ctb+=ctb_size;
2518 
2519  if(x_ctb >= s->ps.sps->width) {
2520  break;
2521  }
2522  }
2523  ff_thread_report_progress2(s->avctx, ctb_row ,thread, SHIFT_CTB_WPP);
2524 
2525  return 0;
2526 error:
2527  s->tab_slice_address[ctb_addr_rs] = -1;
2528  atomic_store(&s1->wpp_err, 1);
2529  ff_thread_report_progress2(s->avctx, ctb_row ,thread, SHIFT_CTB_WPP);
2530  return ret;
2531 }
2532 
2533 static int hls_slice_data_wpp(HEVCContext *s, const H2645NAL *nal)
2534 {
2535  const uint8_t *data = nal->data;
2536  int length = nal->size;
2537  HEVCLocalContext *lc = s->HEVClc;
2538  int *ret = av_malloc_array(s->sh.num_entry_point_offsets + 1, sizeof(int));
2539  int *arg = av_malloc_array(s->sh.num_entry_point_offsets + 1, sizeof(int));
2540  int64_t offset;
2541  int64_t startheader, cmpt = 0;
2542  int i, j, res = 0;
2543 
2544  if (!ret || !arg) {
2545  av_free(ret);
2546  av_free(arg);
2547  return AVERROR(ENOMEM);
2548  }
2549 
2551  av_log(s->avctx, AV_LOG_ERROR, "WPP ctb addresses are wrong (%d %d %d %d)\n",
2553  s->ps.sps->ctb_width, s->ps.sps->ctb_height
2554  );
2555  res = AVERROR_INVALIDDATA;
2556  goto error;
2557  }
2558 
2560 
2561  if (!s->sList[1]) {
2562  for (i = 1; i < s->threads_number; i++) {
2563  s->sList[i] = av_malloc(sizeof(HEVCContext));
2564  memcpy(s->sList[i], s, sizeof(HEVCContext));
2565  s->HEVClcList[i] = av_mallocz(sizeof(HEVCLocalContext));
2566  s->sList[i]->HEVClc = s->HEVClcList[i];
2567  }
2568  }
2569 
2570  offset = (lc->gb.index >> 3);
2571 
2572  for (j = 0, cmpt = 0, startheader = offset + s->sh.entry_point_offset[0]; j < nal->skipped_bytes; j++) {
2573  if (nal->skipped_bytes_pos[j] >= offset && nal->skipped_bytes_pos[j] < startheader) {
2574  startheader--;
2575  cmpt++;
2576  }
2577  }
2578 
2579  for (i = 1; i < s->sh.num_entry_point_offsets; i++) {
2580  offset += (s->sh.entry_point_offset[i - 1] - cmpt);
2581  for (j = 0, cmpt = 0, startheader = offset
2582  + s->sh.entry_point_offset[i]; j < nal->skipped_bytes; j++) {
2583  if (nal->skipped_bytes_pos[j] >= offset && nal->skipped_bytes_pos[j] < startheader) {
2584  startheader--;
2585  cmpt++;
2586  }
2587  }
2588  s->sh.size[i - 1] = s->sh.entry_point_offset[i] - cmpt;
2589  s->sh.offset[i - 1] = offset;
2590 
2591  }
2592  if (s->sh.num_entry_point_offsets != 0) {
2593  offset += s->sh.entry_point_offset[s->sh.num_entry_point_offsets - 1] - cmpt;
2594  if (length < offset) {
2595  av_log(s->avctx, AV_LOG_ERROR, "entry_point_offset table is corrupted\n");
2596  res = AVERROR_INVALIDDATA;
2597  goto error;
2598  }
2599  s->sh.size[s->sh.num_entry_point_offsets - 1] = length - offset;
2600  s->sh.offset[s->sh.num_entry_point_offsets - 1] = offset;
2601 
2602  }
2603  s->data = data;
2604 
2605  for (i = 1; i < s->threads_number; i++) {
2606  s->sList[i]->HEVClc->first_qp_group = 1;
2607  s->sList[i]->HEVClc->qp_y = s->sList[0]->HEVClc->qp_y;
2608  memcpy(s->sList[i], s, sizeof(HEVCContext));
2609  s->sList[i]->HEVClc = s->HEVClcList[i];
2610  }
2611 
2612  atomic_store(&s->wpp_err, 0);
2613  ff_reset_entries(s->avctx);
2614 
2615  for (i = 0; i <= s->sh.num_entry_point_offsets; i++) {
2616  arg[i] = i;
2617  ret[i] = 0;
2618  }
2619 
2622 
2623  for (i = 0; i <= s->sh.num_entry_point_offsets; i++)
2624  res += ret[i];
2625 error:
2626  av_free(ret);
2627  av_free(arg);
2628  return res;
2629 }
2630 
2632 {
2633  AVFrame *out = s->ref->frame;
2634 
2635  if (s->sei.frame_packing.present &&
2641  if (!stereo)
2642  return AVERROR(ENOMEM);
2643 
2644  switch (s->sei.frame_packing.arrangement_type) {
2645  case 3:
2648  else
2649  stereo->type = AV_STEREO3D_SIDEBYSIDE;
2650  break;
2651  case 4:
2652  stereo->type = AV_STEREO3D_TOPBOTTOM;
2653  break;
2654  case 5:
2655  stereo->type = AV_STEREO3D_FRAMESEQUENCE;
2656  break;
2657  }
2658 
2660  stereo->flags = AV_STEREO3D_FLAG_INVERT;
2661  }
2662 
2663  if (s->sei.display_orientation.present &&
2666  double angle = s->sei.display_orientation.anticlockwise_rotation * 360 / (double) (1 << 16);
2667  AVFrameSideData *rotation = av_frame_new_side_data(out,
2669  sizeof(int32_t) * 9);
2670  if (!rotation)
2671  return AVERROR(ENOMEM);
2672 
2673  av_display_rotation_set((int32_t *)rotation->data, angle);
2674  av_display_matrix_flip((int32_t *)rotation->data,
2677  }
2678 
2679  // Decrement the mastering display flag when IRAP frame has no_rasl_output_flag=1
2680  // so the side data persists for the entire coded video sequence.
2681  if (s->sei.mastering_display.present > 0 &&
2682  IS_IRAP(s) && s->no_rasl_output_flag) {
2684  }
2685  if (s->sei.mastering_display.present) {
2686  // HEVC uses a g,b,r ordering, which we convert to a more natural r,g,b
2687  const int mapping[3] = {2, 0, 1};
2688  const int chroma_den = 50000;
2689  const int luma_den = 10000;
2690  int i;
2691  AVMasteringDisplayMetadata *metadata =
2693  if (!metadata)
2694  return AVERROR(ENOMEM);
2695 
2696  for (i = 0; i < 3; i++) {
2697  const int j = mapping[i];
2698  metadata->display_primaries[i][0].num = s->sei.mastering_display.display_primaries[j][0];
2699  metadata->display_primaries[i][0].den = chroma_den;
2700  metadata->display_primaries[i][1].num = s->sei.mastering_display.display_primaries[j][1];
2701  metadata->display_primaries[i][1].den = chroma_den;
2702  }
2703  metadata->white_point[0].num = s->sei.mastering_display.white_point[0];
2704  metadata->white_point[0].den = chroma_den;
2705  metadata->white_point[1].num = s->sei.mastering_display.white_point[1];
2706  metadata->white_point[1].den = chroma_den;
2707 
2709  metadata->max_luminance.den = luma_den;
2711  metadata->min_luminance.den = luma_den;
2712  metadata->has_luminance = 1;
2713  metadata->has_primaries = 1;
2714 
2715  av_log(s->avctx, AV_LOG_DEBUG, "Mastering Display Metadata:\n");
2717  "r(%5.4f,%5.4f) g(%5.4f,%5.4f) b(%5.4f %5.4f) wp(%5.4f, %5.4f)\n",
2718  av_q2d(metadata->display_primaries[0][0]),
2719  av_q2d(metadata->display_primaries[0][1]),
2720  av_q2d(metadata->display_primaries[1][0]),
2721  av_q2d(metadata->display_primaries[1][1]),
2722  av_q2d(metadata->display_primaries[2][0]),
2723  av_q2d(metadata->display_primaries[2][1]),
2724  av_q2d(metadata->white_point[0]), av_q2d(metadata->white_point[1]));
2726  "min_luminance=%f, max_luminance=%f\n",
2727  av_q2d(metadata->min_luminance), av_q2d(metadata->max_luminance));
2728  }
2729  // Decrement the mastering display flag when IRAP frame has no_rasl_output_flag=1
2730  // so the side data persists for the entire coded video sequence.
2731  if (s->sei.content_light.present > 0 &&
2732  IS_IRAP(s) && s->no_rasl_output_flag) {
2733  s->sei.content_light.present--;
2734  }
2735  if (s->sei.content_light.present) {
2736  AVContentLightMetadata *metadata =
2738  if (!metadata)
2739  return AVERROR(ENOMEM);
2742 
2743  av_log(s->avctx, AV_LOG_DEBUG, "Content Light Level Metadata:\n");
2744  av_log(s->avctx, AV_LOG_DEBUG, "MaxCLL=%d, MaxFALL=%d\n",
2745  metadata->MaxCLL, metadata->MaxFALL);
2746  }
2747 
2748  if (s->sei.a53_caption.a53_caption) {
2752  if (sd)
2757  }
2758 
2759  if (s->sei.alternative_transfer.present &&
2763  }
2764 
2765  return 0;
2766 }
2767 
2769 {
2770  HEVCLocalContext *lc = s->HEVClc;
2771  int pic_size_in_ctb = ((s->ps.sps->width >> s->ps.sps->log2_min_cb_size) + 1) *
2772  ((s->ps.sps->height >> s->ps.sps->log2_min_cb_size) + 1);
2773  int ret;
2774 
2775  memset(s->horizontal_bs, 0, s->bs_width * s->bs_height);
2776  memset(s->vertical_bs, 0, s->bs_width * s->bs_height);
2777  memset(s->cbf_luma, 0, s->ps.sps->min_tb_width * s->ps.sps->min_tb_height);
2778  memset(s->is_pcm, 0, (s->ps.sps->min_pu_width + 1) * (s->ps.sps->min_pu_height + 1));
2779  memset(s->tab_slice_address, -1, pic_size_in_ctb * sizeof(*s->tab_slice_address));
2780 
2781  s->is_decoded = 0;
2782  s->first_nal_type = s->nal_unit_type;
2783 
2785 
2786  if (s->ps.pps->tiles_enabled_flag)
2787  lc->end_of_tiles_x = s->ps.pps->column_width[0] << s->ps.sps->log2_ctb_size;
2788 
2789  ret = ff_hevc_set_new_ref(s, &s->frame, s->poc);
2790  if (ret < 0)
2791  goto fail;
2792 
2793  ret = ff_hevc_frame_rps(s);
2794  if (ret < 0) {
2795  av_log(s->avctx, AV_LOG_ERROR, "Error constructing the frame RPS.\n");
2796  goto fail;
2797  }
2798 
2799  s->ref->frame->key_frame = IS_IRAP(s);
2800 
2801  ret = set_side_data(s);
2802  if (ret < 0)
2803  goto fail;
2804 
2805  s->frame->pict_type = 3 - s->sh.slice_type;
2806 
2807  if (!IS_IRAP(s))
2808  ff_hevc_bump_frame(s);
2809 
2811  ret = ff_hevc_output_frame(s, s->output_frame, 0);
2812  if (ret < 0)
2813  goto fail;
2814 
2815  if (!s->avctx->hwaccel)
2817 
2818  return 0;
2819 
2820 fail:
2821  if (s->ref)
2822  ff_hevc_unref_frame(s, s->ref, ~0);
2823  s->ref = NULL;
2824  return ret;
2825 }
2826 
2827 static int decode_nal_unit(HEVCContext *s, const H2645NAL *nal)
2828 {
2829  HEVCLocalContext *lc = s->HEVClc;
2830  GetBitContext *gb = &lc->gb;
2831  int ctb_addr_ts, ret;
2832 
2833  *gb = nal->gb;
2834  s->nal_unit_type = nal->type;
2835  s->temporal_id = nal->temporal_id;
2836 
2837  switch (s->nal_unit_type) {
2838  case HEVC_NAL_VPS:
2839  ret = ff_hevc_decode_nal_vps(gb, s->avctx, &s->ps);
2840  if (ret < 0)
2841  goto fail;
2842  break;
2843  case HEVC_NAL_SPS:
2844  ret = ff_hevc_decode_nal_sps(gb, s->avctx, &s->ps,
2845  s->apply_defdispwin);
2846  if (ret < 0)
2847  goto fail;
2848  break;
2849  case HEVC_NAL_PPS:
2850  ret = ff_hevc_decode_nal_pps(gb, s->avctx, &s->ps);
2851  if (ret < 0)
2852  goto fail;
2853  break;
2854  case HEVC_NAL_SEI_PREFIX:
2855  case HEVC_NAL_SEI_SUFFIX:
2856  ret = ff_hevc_decode_nal_sei(gb, s->avctx, &s->sei, &s->ps, s->nal_unit_type);
2857  if (ret < 0)
2858  goto fail;
2859  break;
2860  case HEVC_NAL_TRAIL_R:
2861  case HEVC_NAL_TRAIL_N:
2862  case HEVC_NAL_TSA_N:
2863  case HEVC_NAL_TSA_R:
2864  case HEVC_NAL_STSA_N:
2865  case HEVC_NAL_STSA_R:
2866  case HEVC_NAL_BLA_W_LP:
2867  case HEVC_NAL_BLA_W_RADL:
2868  case HEVC_NAL_BLA_N_LP:
2869  case HEVC_NAL_IDR_W_RADL:
2870  case HEVC_NAL_IDR_N_LP:
2871  case HEVC_NAL_CRA_NUT:
2872  case HEVC_NAL_RADL_N:
2873  case HEVC_NAL_RADL_R:
2874  case HEVC_NAL_RASL_N:
2875  case HEVC_NAL_RASL_R:
2876  ret = hls_slice_header(s);
2877  if (ret < 0)
2878  return ret;
2879  if (ret == 1) {
2880  ret = AVERROR_INVALIDDATA;
2881  goto fail;
2882  }
2883 
2884 
2885  if (s->sh.first_slice_in_pic_flag) {
2886  if (s->max_ra == INT_MAX) {
2887  if (s->nal_unit_type == HEVC_NAL_CRA_NUT || IS_BLA(s)) {
2888  s->max_ra = s->poc;
2889  } else {
2890  if (IS_IDR(s))
2891  s->max_ra = INT_MIN;
2892  }
2893  }
2894 
2896  s->poc <= s->max_ra) {
2897  s->is_decoded = 0;
2898  break;
2899  } else {
2900  if (s->nal_unit_type == HEVC_NAL_RASL_R && s->poc > s->max_ra)
2901  s->max_ra = INT_MIN;
2902  }
2903 
2904  ret = hevc_frame_start(s);
2905  if (ret < 0)
2906  return ret;
2907  } else if (!s->ref) {
2908  av_log(s->avctx, AV_LOG_ERROR, "First slice in a frame missing.\n");
2909  goto fail;
2910  }
2911 
2912  if (s->nal_unit_type != s->first_nal_type) {
2914  "Non-matching NAL types of the VCL NALUs: %d %d\n",
2915  s->first_nal_type, s->nal_unit_type);
2916  return AVERROR_INVALIDDATA;
2917  }
2918 
2919  if (!s->sh.dependent_slice_segment_flag &&
2920  s->sh.slice_type != HEVC_SLICE_I) {
2921  ret = ff_hevc_slice_rpl(s);
2922  if (ret < 0) {
2924  "Error constructing the reference lists for the current slice.\n");
2925  goto fail;
2926  }
2927  }
2928 
2929  if (s->sh.first_slice_in_pic_flag && s->avctx->hwaccel) {
2930  ret = s->avctx->hwaccel->start_frame(s->avctx, NULL, 0);
2931  if (ret < 0)
2932  goto fail;
2933  }
2934 
2935  if (s->avctx->hwaccel) {
2936  ret = s->avctx->hwaccel->decode_slice(s->avctx, nal->raw_data, nal->raw_size);
2937  if (ret < 0)
2938  goto fail;
2939  } else {
2940  if (s->threads_number > 1 && s->sh.num_entry_point_offsets > 0)
2941  ctb_addr_ts = hls_slice_data_wpp(s, nal);
2942  else
2943  ctb_addr_ts = hls_slice_data(s);
2944  if (ctb_addr_ts >= (s->ps.sps->ctb_width * s->ps.sps->ctb_height)) {
2945  s->is_decoded = 1;
2946  }
2947 
2948  if (ctb_addr_ts < 0) {
2949  ret = ctb_addr_ts;
2950  goto fail;
2951  }
2952  }
2953  break;
2954  case HEVC_NAL_EOS_NUT:
2955  case HEVC_NAL_EOB_NUT:
2956  s->seq_decode = (s->seq_decode + 1) & 0xff;
2957  s->max_ra = INT_MAX;
2958  break;
2959  case HEVC_NAL_AUD:
2960  case HEVC_NAL_FD_NUT:
2961  break;
2962  default:
2963  av_log(s->avctx, AV_LOG_INFO,
2964  "Skipping NAL unit %d\n", s->nal_unit_type);
2965  }
2966 
2967  return 0;
2968 fail:
2970  return ret;
2971  return 0;
2972 }
2973 
2974 static int decode_nal_units(HEVCContext *s, const uint8_t *buf, int length)
2975 {
2976  int i, ret = 0;
2977  int eos_at_start = 1;
2978 
2979  s->ref = NULL;
2980  s->last_eos = s->eos;
2981  s->eos = 0;
2982 
2983  /* split the input packet into NAL units, so we know the upper bound on the
2984  * number of slices in the frame */
2985  ret = ff_h2645_packet_split(&s->pkt, buf, length, s->avctx, s->is_nalff,
2986  s->nal_length_size, s->avctx->codec_id, 1);
2987  if (ret < 0) {
2989  "Error splitting the input into NAL units.\n");
2990  return ret;
2991  }
2992 
2993  for (i = 0; i < s->pkt.nb_nals; i++) {
2994  if (s->pkt.nals[i].type == HEVC_NAL_EOB_NUT ||
2995  s->pkt.nals[i].type == HEVC_NAL_EOS_NUT) {
2996  if (eos_at_start) {
2997  s->last_eos = 1;
2998  } else {
2999  s->eos = 1;
3000  }
3001  } else {
3002  eos_at_start = 0;
3003  }
3004  }
3005 
3006  /* decode the NAL units */
3007  for (i = 0; i < s->pkt.nb_nals; i++) {
3008  ret = decode_nal_unit(s, &s->pkt.nals[i]);
3009  if (ret < 0) {
3011  "Error parsing NAL unit #%d.\n", i);
3012  goto fail;
3013  }
3014  }
3015 
3016 fail:
3017  if (s->ref && s->threads_type == FF_THREAD_FRAME)
3018  ff_thread_report_progress(&s->ref->tf, INT_MAX, 0);
3019 
3020  return ret;
3021 }
3022 
3023 static void print_md5(void *log_ctx, int level, uint8_t md5[16])
3024 {
3025  int i;
3026  for (i = 0; i < 16; i++)
3027  av_log(log_ctx, level, "%02"PRIx8, md5[i]);
3028 }
3029 
3031 {
3033  int pixel_shift;
3034  int i, j;
3035 
3036  if (!desc)
3037  return AVERROR(EINVAL);
3038 
3039  pixel_shift = desc->comp[0].depth > 8;
3040 
3041  av_log(s->avctx, AV_LOG_DEBUG, "Verifying checksum for frame with POC %d: ",
3042  s->poc);
3043 
3044  /* the checksums are LE, so we have to byteswap for >8bpp formats
3045  * on BE arches */
3046 #if HAVE_BIGENDIAN
3047  if (pixel_shift && !s->checksum_buf) {
3049  FFMAX3(frame->linesize[0], frame->linesize[1],
3050  frame->linesize[2]));
3051  if (!s->checksum_buf)
3052  return AVERROR(ENOMEM);
3053  }
3054 #endif
3055 
3056  for (i = 0; frame->data[i]; i++) {
3057  int width = s->avctx->coded_width;
3058  int height = s->avctx->coded_height;
3059  int w = (i == 1 || i == 2) ? (width >> desc->log2_chroma_w) : width;
3060  int h = (i == 1 || i == 2) ? (height >> desc->log2_chroma_h) : height;
3061  uint8_t md5[16];
3062 
3064  for (j = 0; j < h; j++) {
3065  const uint8_t *src = frame->data[i] + j * frame->linesize[i];
3066 #if HAVE_BIGENDIAN
3067  if (pixel_shift) {
3068  s->bdsp.bswap16_buf((uint16_t *) s->checksum_buf,
3069  (const uint16_t *) src, w);
3070  src = s->checksum_buf;
3071  }
3072 #endif
3073  av_md5_update(s->sei.picture_hash.md5_ctx, src, w << pixel_shift);
3074  }
3076 
3077  if (!memcmp(md5, s->sei.picture_hash.md5[i], 16)) {
3078  av_log (s->avctx, AV_LOG_DEBUG, "plane %d - correct ", i);
3079  print_md5(s->avctx, AV_LOG_DEBUG, md5);
3080  av_log (s->avctx, AV_LOG_DEBUG, "; ");
3081  } else {
3082  av_log (s->avctx, AV_LOG_ERROR, "mismatching checksum of plane %d - ", i);
3083  print_md5(s->avctx, AV_LOG_ERROR, md5);
3084  av_log (s->avctx, AV_LOG_ERROR, " != ");
3086  av_log (s->avctx, AV_LOG_ERROR, "\n");
3087  return AVERROR_INVALIDDATA;
3088  }
3089  }
3090 
3091  av_log(s->avctx, AV_LOG_DEBUG, "\n");
3092 
3093  return 0;
3094 }
3095 
3096 static int hevc_decode_extradata(HEVCContext *s, uint8_t *buf, int length, int first)
3097 {
3098  int ret, i;
3099 
3100  ret = ff_hevc_decode_extradata(buf, length, &s->ps, &s->sei, &s->is_nalff,
3102  s->apply_defdispwin, s->avctx);
3103  if (ret < 0)
3104  return ret;
3105 
3106  /* export stream parameters from the first SPS */
3107  for (i = 0; i < FF_ARRAY_ELEMS(s->ps.sps_list); i++) {
3108  if (first && s->ps.sps_list[i]) {
3109  const HEVCSPS *sps = (const HEVCSPS*)s->ps.sps_list[i]->data;
3110  export_stream_params(s->avctx, &s->ps, sps);
3111  break;
3112  }
3113  }
3114 
3115  return 0;
3116 }
3117 
3118 static int hevc_decode_frame(AVCodecContext *avctx, void *data, int *got_output,
3119  AVPacket *avpkt)
3120 {
3121  int ret;
3122  int new_extradata_size;
3123  uint8_t *new_extradata;
3124  HEVCContext *s = avctx->priv_data;
3125 
3126  if (!avpkt->size) {
3127  ret = ff_hevc_output_frame(s, data, 1);
3128  if (ret < 0)
3129  return ret;
3130 
3131  *got_output = ret;
3132  return 0;
3133  }
3134 
3135  new_extradata = av_packet_get_side_data(avpkt, AV_PKT_DATA_NEW_EXTRADATA,
3136  &new_extradata_size);
3137  if (new_extradata && new_extradata_size > 0) {
3138  ret = hevc_decode_extradata(s, new_extradata, new_extradata_size, 0);
3139  if (ret < 0)
3140  return ret;
3141  }
3142 
3143  s->ref = NULL;
3144  ret = decode_nal_units(s, avpkt->data, avpkt->size);
3145  if (ret < 0)
3146  return ret;
3147 
3148  if (avctx->hwaccel) {
3149  if (s->ref && (ret = avctx->hwaccel->end_frame(avctx)) < 0) {
3150  av_log(avctx, AV_LOG_ERROR,
3151  "hardware accelerator failed to decode picture\n");
3152  ff_hevc_unref_frame(s, s->ref, ~0);
3153  return ret;
3154  }
3155  } else {
3156  /* verify the SEI checksum */
3157  if (avctx->err_recognition & AV_EF_CRCCHECK && s->is_decoded &&
3158  s->sei.picture_hash.is_md5) {
3159  ret = verify_md5(s, s->ref->frame);
3160  if (ret < 0 && avctx->err_recognition & AV_EF_EXPLODE) {
3161  ff_hevc_unref_frame(s, s->ref, ~0);
3162  return ret;
3163  }
3164  }
3165  }
3166  s->sei.picture_hash.is_md5 = 0;
3167 
3168  if (s->is_decoded) {
3169  av_log(avctx, AV_LOG_DEBUG, "Decoded frame with POC %d.\n", s->poc);
3170  s->is_decoded = 0;
3171  }
3172 
3173  if (s->output_frame->buf[0]) {
3174  av_frame_move_ref(data, s->output_frame);
3175  *got_output = 1;
3176  }
3177 
3178  return avpkt->size;
3179 }
3180 
3182 {
3183  int ret;
3184 
3185  ret = ff_thread_ref_frame(&dst->tf, &src->tf);
3186  if (ret < 0)
3187  return ret;
3188 
3189  dst->tab_mvf_buf = av_buffer_ref(src->tab_mvf_buf);
3190  if (!dst->tab_mvf_buf)
3191  goto fail;
3192  dst->tab_mvf = src->tab_mvf;
3193 
3194  dst->rpl_tab_buf = av_buffer_ref(src->rpl_tab_buf);
3195  if (!dst->rpl_tab_buf)
3196  goto fail;
3197  dst->rpl_tab = src->rpl_tab;
3198 
3199  dst->rpl_buf = av_buffer_ref(src->rpl_buf);
3200  if (!dst->rpl_buf)
3201  goto fail;
3202 
3203  dst->poc = src->poc;
3204  dst->ctb_count = src->ctb_count;
3205  dst->flags = src->flags;
3206  dst->sequence = src->sequence;
3207 
3208  if (src->hwaccel_picture_private) {
3210  if (!dst->hwaccel_priv_buf)
3211  goto fail;
3213  }
3214 
3215  return 0;
3216 fail:
3217  ff_hevc_unref_frame(s, dst, ~0);
3218  return AVERROR(ENOMEM);
3219 }
3220 
3222 {
3223  HEVCContext *s = avctx->priv_data;
3224  int i;
3225 
3226  pic_arrays_free(s);
3227 
3229 
3230  av_freep(&s->cabac_state);
3231 
3232  for (i = 0; i < 3; i++) {
3233  av_freep(&s->sao_pixel_buffer_h[i]);
3234  av_freep(&s->sao_pixel_buffer_v[i]);
3235  }
3237 
3238  for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
3239  ff_hevc_unref_frame(s, &s->DPB[i], ~0);
3240  av_frame_free(&s->DPB[i].frame);
3241  }
3242 
3243  ff_hevc_ps_uninit(&s->ps);
3244 
3246  av_freep(&s->sh.offset);
3247  av_freep(&s->sh.size);
3248 
3249  for (i = 1; i < s->threads_number; i++) {
3250  HEVCLocalContext *lc = s->HEVClcList[i];
3251  if (lc) {
3252  av_freep(&s->HEVClcList[i]);
3253  av_freep(&s->sList[i]);
3254  }
3255  }
3256  if (s->HEVClc == s->HEVClcList[0])
3257  s->HEVClc = NULL;
3258  av_freep(&s->HEVClcList[0]);
3259 
3261 
3262  ff_hevc_reset_sei(&s->sei);
3263 
3264  return 0;
3265 }
3266 
3268 {
3269  HEVCContext *s = avctx->priv_data;
3270  int i;
3271 
3272  s->avctx = avctx;
3273 
3274  s->HEVClc = av_mallocz(sizeof(HEVCLocalContext));
3275  if (!s->HEVClc)
3276  goto fail;
3277  s->HEVClcList[0] = s->HEVClc;
3278  s->sList[0] = s;
3279 
3281  if (!s->cabac_state)
3282  goto fail;
3283 
3285  if (!s->output_frame)
3286  goto fail;
3287 
3288  for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
3289  s->DPB[i].frame = av_frame_alloc();
3290  if (!s->DPB[i].frame)
3291  goto fail;
3292  s->DPB[i].tf.f = s->DPB[i].frame;
3293  }
3294 
3295  s->max_ra = INT_MAX;
3296 
3298  if (!s->sei.picture_hash.md5_ctx)
3299  goto fail;
3300 
3301  ff_bswapdsp_init(&s->bdsp);
3302 
3303  s->context_initialized = 1;
3304  s->eos = 0;
3305 
3306  ff_hevc_reset_sei(&s->sei);
3307 
3308  return 0;
3309 
3310 fail:
3311  hevc_decode_free(avctx);
3312  return AVERROR(ENOMEM);
3313 }
3314 
3316  const AVCodecContext *src)
3317 {
3318  HEVCContext *s = dst->priv_data;
3319  HEVCContext *s0 = src->priv_data;
3320  int i, ret;
3321 
3322  if (!s->context_initialized) {
3323  ret = hevc_init_context(dst);
3324  if (ret < 0)
3325  return ret;
3326  }
3327 
3328  for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
3329  ff_hevc_unref_frame(s, &s->DPB[i], ~0);
3330  if (s0->DPB[i].frame->buf[0]) {
3331  ret = hevc_ref_frame(s, &s->DPB[i], &s0->DPB[i]);
3332  if (ret < 0)
3333  return ret;
3334  }
3335  }
3336 
3337  if (s->ps.sps != s0->ps.sps)
3338  s->ps.sps = NULL;
3339  for (i = 0; i < FF_ARRAY_ELEMS(s->ps.vps_list); i++) {
3340  av_buffer_unref(&s->ps.vps_list[i]);
3341  if (s0->ps.vps_list[i]) {
3342  s->ps.vps_list[i] = av_buffer_ref(s0->ps.vps_list[i]);
3343  if (!s->ps.vps_list[i])
3344  return AVERROR(ENOMEM);
3345  }
3346  }
3347 
3348  for (i = 0; i < FF_ARRAY_ELEMS(s->ps.sps_list); i++) {
3349  av_buffer_unref(&s->ps.sps_list[i]);
3350  if (s0->ps.sps_list[i]) {
3351  s->ps.sps_list[i] = av_buffer_ref(s0->ps.sps_list[i]);
3352  if (!s->ps.sps_list[i])
3353  return AVERROR(ENOMEM);
3354  }
3355  }
3356 
3357  for (i = 0; i < FF_ARRAY_ELEMS(s->ps.pps_list); i++) {
3358  av_buffer_unref(&s->ps.pps_list[i]);
3359  if (s0->ps.pps_list[i]) {
3360  s->ps.pps_list[i] = av_buffer_ref(s0->ps.pps_list[i]);
3361  if (!s->ps.pps_list[i])
3362  return AVERROR(ENOMEM);
3363  }
3364  }
3365 
3366  if (s->ps.sps != s0->ps.sps)
3367  if ((ret = set_sps(s, s0->ps.sps, src->pix_fmt)) < 0)
3368  return ret;
3369 
3370  s->seq_decode = s0->seq_decode;
3371  s->seq_output = s0->seq_output;
3372  s->pocTid0 = s0->pocTid0;
3373  s->max_ra = s0->max_ra;
3374  s->eos = s0->eos;
3376 
3377  s->is_nalff = s0->is_nalff;
3379 
3380  s->threads_number = s0->threads_number;
3381  s->threads_type = s0->threads_type;
3382 
3383  if (s0->eos) {
3384  s->seq_decode = (s->seq_decode + 1) & 0xff;
3385  s->max_ra = INT_MAX;
3386  }
3387 
3393 
3394  return 0;
3395 }
3396 
3398 {
3399  HEVCContext *s = avctx->priv_data;
3400  int ret;
3401 
3402  avctx->internal->allocate_progress = 1;
3403 
3404  ret = hevc_init_context(avctx);
3405  if (ret < 0)
3406  return ret;
3407 
3408  s->enable_parallel_tiles = 0;
3410  s->eos = 1;
3411 
3412  atomic_init(&s->wpp_err, 0);
3413 
3414  if(avctx->active_thread_type & FF_THREAD_SLICE)
3415  s->threads_number = avctx->thread_count;
3416  else
3417  s->threads_number = 1;
3418 
3419  if (avctx->extradata_size > 0 && avctx->extradata) {
3420  ret = hevc_decode_extradata(s, avctx->extradata, avctx->extradata_size, 1);
3421  if (ret < 0) {
3422  hevc_decode_free(avctx);
3423  return ret;
3424  }
3425  }
3426 
3427  if((avctx->active_thread_type & FF_THREAD_FRAME) && avctx->thread_count > 1)
3429  else
3431 
3432  return 0;
3433 }
3434 
3436 {
3437  HEVCContext *s = avctx->priv_data;
3438  int ret;
3439 
3440  memset(s, 0, sizeof(*s));
3441 
3442  ret = hevc_init_context(avctx);
3443  if (ret < 0)
3444  return ret;
3445 
3446  return 0;
3447 }
3448 
3450 {
3451  HEVCContext *s = avctx->priv_data;
3452  ff_hevc_flush_dpb(s);
3453  ff_hevc_reset_sei(&s->sei);
3454  s->max_ra = INT_MAX;
3455  s->eos = 1;
3456 }
3457 
3458 #define OFFSET(x) offsetof(HEVCContext, x)
3459 #define PAR (AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
3460 
3461 static const AVOption options[] = {
3462  { "apply_defdispwin", "Apply default display window from VUI", OFFSET(apply_defdispwin),
3463  AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, PAR },
3464  { "strict-displaywin", "stricly apply default display window size", OFFSET(apply_defdispwin),
3465  AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, PAR },
3466  { NULL },
3467 };
3468 
3469 static const AVClass hevc_decoder_class = {
3470  .class_name = "HEVC decoder",
3471  .item_name = av_default_item_name,
3472  .option = options,
3473  .version = LIBAVUTIL_VERSION_INT,
3474 };
3475 
3477  .name = "hevc",
3478  .long_name = NULL_IF_CONFIG_SMALL("HEVC (High Efficiency Video Coding)"),
3479  .type = AVMEDIA_TYPE_VIDEO,
3480  .id = AV_CODEC_ID_HEVC,
3481  .priv_data_size = sizeof(HEVCContext),
3482  .priv_class = &hevc_decoder_class,
3484  .close = hevc_decode_free,
3487  .update_thread_context = hevc_update_thread_context,
3489  .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY |
3493 };
static int set_side_data(HEVCContext *s)
Definition: hevcdec.c:2631
#define AV_STEREO3D_FLAG_INVERT
Inverted views, Right/Bottom represents the left view.
Definition: stereo3d.h:148
static void luma_mc_uni(HEVCContext *s, uint8_t *dst, ptrdiff_t dststride, AVFrame *ref, const Mv *mv, int x_off, int y_off, int block_w, int block_h, int luma_weight, int luma_offset)
8.5.3.2.2.1 Luma sample unidirectional interpolation process
Definition: hevcdec.c:1407
int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length, void *logctx, int is_nalff, int nal_length_size, enum AVCodecID codec_id, int small_padding)
Split an input packet into NAL units.
Definition: h2645_parse.c:250
int8_t cu_qp_offset_cr
Definition: hevcdec.h:296
static void intra_prediction_unit(HEVCContext *s, int x0, int y0, int log2_cb_size)
Definition: hevcdec.c:1992
uint8_t ctb_up_flag
Definition: hevcdec.h:357
const HEVCPPS * pps
Definition: hevc_ps.h:402
AVFrame * frame
Definition: hevcdec.h:311
av_cold void ff_videodsp_init(VideoDSPContext *ctx, int bpc)
Definition: videodsp.c:38
#define NULL
Definition: coverity.c:32
unsigned int log2_min_cb_size
Definition: hevc_ps.h:277
#define SHIFT_CTB_WPP
Definition: hevcdec.h:45
AVRational framerate
Definition: avcodec.h:3460
const char const char void * val
Definition: avisynth_c.h:771
uint8_t log2_sao_offset_scale_luma
Definition: hevc_ps.h:373
HEVCPredContext hpc
Definition: hevcdec.h:434
const char * s
Definition: avisynth_c.h:768
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
static enum AVPixelFormat pix_fmt
int pic_order_cnt_lsb
Definition: hevc_ps.h:58
int short_term_ref_pic_set_sps_flag
Definition: hevc_ps.h:66
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it...
Definition: buffer.c:125
int size
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:2419
static int verify_md5(HEVCContext *s, AVFrame *frame)
Definition: hevcdec.c:3030
This structure describes decoded (raw) audio or video data.
Definition: frame.h:201
HEVCFrame * ref
Definition: hevcdec.h:420
HEVCSEIPictureTiming picture_timing
Definition: hevc_sei.h:113
void(* bswap16_buf)(uint16_t *dst, const uint16_t *src, int len)
Definition: bswapdsp.h:26
#define HEVC_CONTEXTS
Definition: hevcdec.h:54
unsigned MaxCLL
Max content light level (cd/m^2).
int ctb_height
Definition: hevc_ps.h:298
uint8_t is_cu_qp_delta_coded
Definition: hevcdec.h:293
#define atomic_store(object, desired)
Definition: stdatomic.h:85
AVOption.
Definition: opt.h:246
AVBufferRef * vps_list[HEVC_MAX_VPS_COUNT]
Definition: hevc_ps.h:395
static void flush(AVCodecContext *avctx)
int size
Definition: h2645_parse.h:35
uint8_t diff_cu_chroma_qp_offset_depth
Definition: hevc_ps.h:369
static int get_se_golomb(GetBitContext *gb)
read signed exp golomb code.
Definition: golomb.h:185
int coded_width
Bitstream width / height, may be different from width/height e.g.
Definition: avcodec.h:1963
int max_dec_pic_buffering
Definition: hevc_ps.h:244
const char * fmt
Definition: avisynth_c.h:769
void(* put_pcm)(uint8_t *_dst, ptrdiff_t _stride, int width, int height, struct GetBitContext *gb, int pcm_bit_depth)
Definition: hevcdsp.h:46
void ff_hevc_pred_init(HEVCPredContext *hpc, int bit_depth)
Definition: hevcpred.c:43
VideoDSPContext vdsp
Definition: hevcdec.h:436
int ff_hevc_split_coding_unit_flag_decode(HEVCContext *s, int ct_depth, int x0, int y0)
Definition: hevc_cabac.c:686
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:262
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:182
static int init_thread_copy(AVCodecContext *avctx)
Definition: tta.c:392
void(* put_hevc_qpel_bi_w[10][2][2])(uint8_t *dst, ptrdiff_t dststride, uint8_t *_src, ptrdiff_t _srcstride, int16_t *src2, int height, int denom, int wx0, int wx1, int ox0, int ox1, intptr_t mx, intptr_t my, int width)
Definition: hevcdsp.h:82
AVFrame * f
Definition: thread.h:36
#define LIBAVUTIL_VERSION_INT
Definition: version.h:86
int ff_hevc_set_new_ref(HEVCContext *s, AVFrame **frame, int poc)
Definition: hevc_refs.c:135
AVBufferRef * buf[AV_NUM_DATA_POINTERS]
AVBuffer references backing the data for this frame.
Definition: frame.h:393
int16_t x
horizontal component of motion vector
Definition: hevcdec.h:255
const char * desc
Definition: nvenc.c:60
hardware decoding through Videotoolbox
Definition: pixfmt.h:300
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
static int decode_nal_unit(HEVCContext *s, const H2645NAL *nal)
Definition: hevcdec.c:2827
ShortTermRPS st_rps[HEVC_MAX_SHORT_TERM_RPS_COUNT]
Definition: hevc_ps.h:257
void * hwaccel_picture_private
Definition: hevcdec.h:325
uint8_t * cabac_state
Definition: hevcdec.h:397
InterPredIdc
Definition: hevcdec.h:159
uint8_t nb_refs
Definition: hevc_ps.h:45
MvField * tab_mvf
Definition: hevcdec.h:313
int pic_init_qp_minus26
Definition: hevc_ps.h:326
int bs_width
Definition: hevcdec.h:428
uint8_t intra_split_flag
IntraSplitFlag.
Definition: hevcdec.h:249
VUI vui
Definition: hevc_ps.h:250
int rem_intra_luma_pred_mode
Definition: hevcdec.h:276
static void chroma_mc_bi(HEVCContext *s, uint8_t *dst0, ptrdiff_t dststride, AVFrame *ref0, AVFrame *ref1, int x_off, int y_off, int block_w, int block_h, struct MvField *current_mv, int cidx)
8.5.3.2.2.2 Chroma sample bidirectional interpolation process
Definition: hevcdec.c:1624
enum AVColorRange color_range
MPEG vs JPEG YUV range.
Definition: avcodec.h:2498
static int hls_transform_tree(HEVCContext *s, int x0, int y0, int xBase, int yBase, int cb_xBase, int cb_yBase, int log2_cb_size, int log2_trafo_size, int trafo_depth, int blk_idx, const int *base_cbf_cb, const int *base_cbf_cr)
Definition: hevcdec.c:1227
int vshift[3]
Definition: hevc_ps.h:309
AVRational white_point[2]
CIE 1931 xy chromaticity coords of white point.
void ff_hevc_flush_dpb(HEVCContext *s)
Drop all frames currently in DPB.
Definition: hevc_refs.c:75
int ff_hevc_cbf_luma_decode(HEVCContext *s, int trafo_depth)
Definition: hevc_cabac.c:876
static const AVClass hevc_decoder_class
Definition: hevcdec.c:3469
int num
Numerator.
Definition: rational.h:59
Views are next to each other, but when upscaling apply a checkerboard pattern.
Definition: stereo3d.h:117
int size
Definition: avcodec.h:1680
unsigned int slice_addr
Definition: hevc_ps.h:54
uint32_t vui_time_scale
Definition: hevc_ps.h:159
static int decode_lt_rps(HEVCContext *s, LongTermRPS *rps, GetBitContext *gb)
Definition: hevcdec.c:258
uint8_t weighted_bipred_flag
Definition: hevc_ps.h:338
static void hevc_decode_flush(AVCodecContext *avctx)
Definition: hevcdec.c:3449
int ff_hevc_sao_offset_sign_decode(HEVCContext *s)
Definition: hevc_cabac.c:596
int ff_hevc_frame_rps(HEVCContext *s)
Construct the reference picture sets for the current frame.
Definition: hevc_refs.c:454
int ff_hevc_decode_short_term_rps(GetBitContext *gb, AVCodecContext *avctx, ShortTermRPS *rps, const HEVCSPS *sps, int is_slice_header)
Definition: hevc_ps.c:111
int tc_offset
Definition: hevcdec.h:302
PredictionUnit pu
Definition: hevcdec.h:370
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:1989
uint8_t seq_loop_filter_across_slices_enabled_flag
Definition: hevc_ps.h:351
uint8_t cabac_init_present_flag
Definition: hevc_ps.h:322
int16_t chroma_offset_l1[16][2]
Definition: hevc_ps.h:120
H.265 parser code.
void av_frame_move_ref(AVFrame *dst, AVFrame *src)
Move everything contained in src to dst and reset src.
Definition: frame.c:531
void(* put_hevc_epel_uni[10][2][2])(uint8_t *dst, ptrdiff_t dststride, uint8_t *_src, ptrdiff_t _srcstride, int height, intptr_t mx, intptr_t my, int width)
Definition: hevcdsp.h:89
int has_primaries
Flag indicating whether the display primaries (and white point) are set.
HEVCParamSets ps
Definition: hevcdec.h:407
Views are next to each other.
Definition: stereo3d.h:67
int min_cb_height
Definition: hevc_ps.h:301
int * ctb_addr_ts_to_rs
CtbAddrTSToRS.
Definition: hevc_ps.h:384
int num_ref_idx_l0_default_active
num_ref_idx_l0_default_active_minus1 + 1
Definition: hevc_ps.h:324
void ff_thread_await_progress(ThreadFrame *f, int n, int field)
Wait for earlier decoding threads to finish reference pictures.
int8_t cr_qp_offset_list[6]
Definition: hevc_ps.h:372
int ff_hevc_merge_flag_decode(HEVCContext *s)
Definition: hevc_cabac.c:792
HEVCSEIDisplayOrientation display_orientation
Definition: hevc_sei.h:112
uint8_t dependent_slice_segment_flag
Definition: hevc_ps.h:61
#define src
Definition: vp8dsp.c:254
CABACContext cc
Definition: hevcdec.h:347
ShortTermRPS slice_rps
Definition: hevc_ps.h:68
#define SET_SAO(elem, value)
Definition: hevcdec.c:904
int profile
profile
Definition: avcodec.h:3266
int stride
Definition: mace.c:144
AVCodec.
Definition: avcodec.h:3739
void ff_thread_await_progress2(AVCodecContext *avctx, int field, int thread, int shift)
int width
Definition: hevc_ps.h:295
uint8_t is_md5
Definition: hevc_sei.h:65
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
Definition: decode_audio.c:42
uint8_t log2_chroma_w
Amount to shift the luma width right to find the chroma width.
Definition: pixdesc.h:92
static void hls_sao_param(HEVCContext *s, int rx, int ry)
Definition: hevcdec.c:916
uint16_t seq_decode
Sequence counters for decoded and output frames, so that old frames are output first after a POC rese...
Definition: hevcdec.h:464
static void hls_decode_neighbour(HEVCContext *s, int x_ctb, int y_ctb, int ctb_addr_ts)
Definition: hevcdec.c:2331
int a53_caption_size
Definition: hevc_sei.h:86
void av_display_matrix_flip(int32_t matrix[9], int hflip, int vflip)
Flip the input matrix horizontally and/or vertically.
Definition: display.c:65
void av_md5_update(AVMD5 *ctx, const uint8_t *src, int len)
Update hash value.
Definition: md5.c:154
uint8_t threads_type
Definition: hevcdec.h:391
Macro definitions for various function/variable attributes.
int qp_bd_offset
Definition: hevc_ps.h:311
void av_display_rotation_set(int32_t matrix[9], double angle)
Initialize a transformation matrix describing a pure counterclockwise rotation by the specified angle...
Definition: display.c:50
int pixel_shift
Definition: hevc_ps.h:236
uint8_t entropy_coding_sync_enabled_flag
Definition: hevc_ps.h:344
#define PAR
Definition: hevcdec.c:3459
HEVCWindow output_window
Definition: hevc_ps.h:230
int max_ra
Definition: hevcdec.h:427
int ff_hevc_no_residual_syntax_flag_decode(HEVCContext *s)
Definition: hevc_cabac.c:828
const uint8_t * data
Definition: hevcdec.h:470
AVBufferPool * rpl_tab_pool
candidate references for the current frame
Definition: hevcdec.h:410
uint8_t log2_sao_offset_scale_chroma
Definition: hevc_ps.h:374
struct AVHWAccel * hwaccel
Hardware accelerator in use.
Definition: avcodec.h:3082
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:72
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
Definition: avcodec.h:1027
void(* emulated_edge_mc)(uint8_t *dst, const uint8_t *src, ptrdiff_t dst_linesize, ptrdiff_t src_linesize, int block_w, int block_h, int src_x, int src_y, int w, int h)
Copy a rectangular area of samples to a temporary buffer and replicate the border samples...
Definition: videodsp.h:63
int chroma_format_idc
Definition: hevc_ps.h:227
uint8_t disable_dbf
Definition: hevc_ps.h:355
unsigned int log2_max_trafo_size
Definition: hevc_ps.h:280
unsigned int slice_segment_addr
address (in raster order) of the first block in the current slice
Definition: hevc_ps.h:52
void ff_hevc_unref_frame(HEVCContext *s, HEVCFrame *frame, int flags)
Definition: hevc_refs.c:32
void(* put_hevc_epel[10][2][2])(int16_t *dst, uint8_t *src, ptrdiff_t srcstride, int height, intptr_t mx, intptr_t my, int width)
Definition: hevcdsp.h:86
enum HEVCSliceType slice_type
Definition: hevc_ps.h:56
AVBufferRef * sps_list[HEVC_MAX_SPS_COUNT]
Definition: hevc_ps.h:396
int ff_hevc_split_transform_flag_decode(HEVCContext *s, int log2_trafo_size)
Definition: hevc_cabac.c:866
struct AVMD5 * av_md5_alloc(void)
Allocate an AVMD5 context.
Definition: md5.c:48
int ff_hevc_sao_merge_flag_decode(HEVCContext *s)
Definition: hevc_cabac.c:561
#define FF_CODEC_CAP_INIT_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
Definition: internal.h:40
int is_nalff
this flag is != 0 if bitstream is encapsulated as a format defined in 14496-15
Definition: hevcdec.h:477
int ff_hevc_rem_intra_luma_pred_mode_decode(HEVCContext *s)
Definition: hevc_cabac.c:760
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
Definition: pixdesc.h:117
int end_of_tiles_x
Definition: hevcdec.h:360
uint8_t
#define av_cold
Definition: attributes.h:82
#define av_malloc(s)
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition: frame.c:150
enum HEVCNALUnitType nal_unit_type
Definition: hevcdec.h:418
static av_always_inline void set_ct_depth(HEVCContext *s, int x0, int y0, int log2_cb_size, int ct_depth)
Definition: hevcdec.c:1975
static void set_deblocking_bypass(HEVCContext *s, int x0, int y0, int log2_cb_size)
Definition: hevcdec.c:1212
float delta
AVOptions.
Stereo 3D type: this structure describes how two videos are packed within a single video surface...
Definition: stereo3d.h:157
uint8_t ctb_up_right_flag
Definition: hevcdec.h:358
LongTermRPS long_term_rps
Definition: hevc_ps.h:71
int ff_hevc_inter_pred_idc_decode(HEVCContext *s, int nPbW, int nPbH)
Definition: hevc_cabac.c:797
int poc[32]
Definition: hevc_ps.h:43
static int hls_slice_data_wpp(HEVCContext *s, const H2645NAL *nal)
Definition: hevcdec.c:2533
struct HEVCFrame * ref[HEVC_MAX_REFS]
Definition: hevcdec.h:231
uint8_t vps_timing_info_present_flag
Definition: hevc_ps.h:207
uint8_t matrix_coeffs
Definition: hevc_ps.h:144
#define OFFSET(x)
Definition: hevcdec.c:3458
void ff_hevc_deblocking_boundary_strengths(HEVCContext *s, int x0, int y0, int log2_trafo_size)
Definition: hevc_filter.c:714
int min_tb_width
Definition: hevc_ps.h:302
int num_entry_point_offsets
Definition: hevc_ps.h:104
#define BOUNDARY_LEFT_TILE
Definition: hevcdec.h:374
int ff_hevc_part_mode_decode(HEVCContext *s, int log2_cb_size)
Definition: hevc_cabac.c:705
AVFrame * output_frame
Definition: hevcdec.h:403
int apply_defdispwin
Definition: hevcdec.h:479
SAOParams * sao
Definition: hevcdec.h:416
const HEVCVPS * vps
Definition: hevc_ps.h:400
int num_ref_idx_l1_default_active
num_ref_idx_l1_default_active_minus1 + 1
Definition: hevc_ps.h:325
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
Definition: avcodec.h:1876
unsigned int log2_min_pcm_cb_size
Definition: hevc_ps.h:270
struct HEVCSPS::@69 temporal_layer[HEVC_MAX_SUB_LAYERS]
AVCodecContext * avctx
Definition: hevcdec.h:384
int min_cb_width
Definition: hevc_ps.h:300
int ff_hevc_prev_intra_luma_pred_flag_decode(HEVCContext *s)
Definition: hevc_cabac.c:747
void ff_h2645_packet_uninit(H2645Packet *pkt)
Free all the allocated memory in the packet.
Definition: h2645_parse.c:371
static AVFrame * frame
#define QPEL_EXTRA_BEFORE
Definition: hevcdec.h:64
struct AVMD5 * md5
Definition: movenc.c:56
const char data[16]
Definition: mxf.c:90
Structure to hold side data for an AVFrame.
Definition: frame.h:163
int ff_hevc_slice_rpl(HEVCContext *s)
Construct the reference picture list(s) for the current slice.
Definition: hevc_refs.c:294
BswapDSPContext bdsp
Definition: hevcdec.h:437
#define height
ThreadFrame tf
Definition: hevcdec.h:312
uint8_t first_slice_in_pic_flag
Definition: hevc_ps.h:60
uint8_t * data
Definition: avcodec.h:1679
static double av_q2d(AVRational a)
Convert an AVRational to a double.
Definition: rational.h:104
uint8_t ctb_up_left_flag
Definition: hevcdec.h:359
void ff_hevc_hls_mvd_coding(HEVCContext *s, int x0, int y0, int log2_cb_size)
Definition: hevc_cabac.c:1534
int ff_hevc_skip_flag_decode(HEVCContext *s, int x0, int y0, int x_cb, int y_cb)
Definition: hevc_cabac.c:618
int ff_thread_ref_frame(ThreadFrame *dst, ThreadFrame *src)
Definition: utils.c:2127
uint8_t threads_number
Definition: hevcdec.h:392
uint8_t is_cu_chroma_qp_offset_coded
Definition: hevcdec.h:294
int ff_set_sar(AVCodecContext *avctx, AVRational sar)
Check that the provided sample aspect ratio is valid and set it on the codec context.
Definition: utils.c:226
void(* put_hevc_qpel_uni_w[10][2][2])(uint8_t *_dst, ptrdiff_t _dststride, uint8_t *_src, ptrdiff_t _srcstride, int height, int denom, int wx, int ox, intptr_t mx, intptr_t my, int width)
Definition: hevcdsp.h:76
int8_t pred_flag
Definition: hevcdec.h:262
int quincunx_subsampling
Definition: hevc_sei.h:72
AVBufferRef * pps_list[HEVC_MAX_PPS_COUNT]
Definition: hevc_ps.h:397
int8_t * qp_y_tab
Definition: hevcdec.h:438
uint8_t loop_filter_disable_flag
Definition: hevc_ps.h:272
int ff_hevc_cbf_cb_cr_decode(HEVCContext *s, int trafo_depth)
Definition: hevc_cabac.c:871
uint8_t pic_output_flag
Definition: hevc_ps.h:62
int has_luminance
Flag indicating whether the luminance (min_ and max_) have been set.
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
Definition: rational.c:35
uint8_t * tab_ct_depth
Definition: hevcdec.h:446
uint8_t cu_transquant_bypass_flag
Definition: hevcdec.h:251
void ff_hevc_hls_filter(HEVCContext *s, int x, int y, int ctb_size)
Definition: hevc_filter.c:842
void ff_thread_finish_setup(AVCodecContext *avctx)
If the codec defines update_thread_context(), call this when they are ready for the next thread to st...
void(* put_hevc_qpel[10][2][2])(int16_t *dst, uint8_t *src, ptrdiff_t srcstride, int height, intptr_t mx, intptr_t my, int width)
Definition: hevcdsp.h:72
int8_t cb_qp_offset_list[6]
Definition: hevc_ps.h:371
static av_unused const uint8_t * skip_bytes(CABACContext *c, int n)
Skip n bytes and reset the decoder.
int ff_hevc_log2_res_scale_abs(HEVCContext *s, int idx)
Definition: hevc_cabac.c:896
uint8_t transquant_bypass_enable_flag
Definition: hevc_ps.h:340
#define av_log(a,...)
uint8_t used[32]
Definition: hevc_ps.h:44
int temporal_id
temporal_id_plus1 - 1
Definition: hevcdec.h:419
uint8_t first_qp_group
Definition: hevcdec.h:344
HEVCDSPContext hevcdsp
Definition: hevcdec.h:435
int ctb_count
Definition: hevcdec.h:316
uint8_t no_output_of_prior_pics_flag
Definition: hevc_ps.h:75
HEVCLocalContext * HEVClcList[MAX_NB_THREADS]
Definition: hevcdec.h:388
int ff_hevc_cu_chroma_qp_offset_idx(HEVCContext *s)
Definition: hevc_cabac.c:670
int bit_depth_chroma
Definition: hevc_ps.h:235
const AVProfile ff_hevc_profiles[]
Definition: profiles.c:78
int slice_idx
number of the slice being currently decoded
Definition: hevcdec.h:424
#define U(x)
Definition: vp56_arith.h:37
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:589
static int hls_decode_entry_wpp(AVCodecContext *avctxt, void *input_ctb_row, int job, int self_id)
Definition: hevcdec.c:2452
uint8_t intra_pred_mode[4]
Definition: hevcdec.h:277
uint8_t colour_plane_id
RPS coded in the slice header itself is stored here.
Definition: hevc_ps.h:63
#define QPEL_EXTRA_AFTER
Definition: hevcdec.h:65
Content light level needed by to transmit HDR over HDMI (CTA-861.3).
int ff_hevc_cu_transquant_bypass_flag_decode(HEVCContext *s)
Definition: hevc_cabac.c:613
#define SAMPLE_CTB(tab, x, y)
Definition: hevcdec.h:74
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
int has_b_frames
Size of the frame reordering buffer in the decoder.
Definition: avcodec.h:2083
uint8_t cu_chroma_qp_offset_enabled_flag
Definition: hevc_ps.h:94
int flags
Additional information about the frame packing.
Definition: stereo3d.h:166
uint8_t slice_initialized
1 if the independent slice segment header was successfully parsed
Definition: hevcdec.h:400
unsigned int log2_max_poc_lsb
Definition: hevc_ps.h:239
uint8_t log2_chroma_h
Amount to shift the luma height right to find the chroma height.
Definition: pixdesc.h:101
static int hevc_ref_frame(HEVCContext *s, HEVCFrame *dst, HEVCFrame *src)
Definition: hevcdec.c:3181
int * skipped_bytes_pos
Definition: h2645_parse.h:61
int min_pu_height
Definition: hevc_ps.h:305
int ff_hevc_compute_poc(const HEVCSPS *sps, int pocTid0, int poc_lsb, int nal_unit_type)
Compute POC of the current frame and return it.
Definition: hevc_ps.c:1735
int content_interpretation_type
Definition: hevc_sei.h:71
#define atomic_load(object)
Definition: stdatomic.h:93
uint8_t md5[3][16]
Definition: hevc_sei.h:64
int ff_hevc_decode_nal_vps(GetBitContext *gb, AVCodecContext *avctx, HEVCParamSets *ps)
Definition: hevc_ps.c:416
av_default_item_name
AVBufferRef * rpl_tab_buf
Definition: hevcdec.h:321
#define AVERROR(e)
Definition: error.h:43
uint8_t * av_packet_get_side_data(const AVPacket *pkt, enum AVPacketSideDataType type, int *size)
Get side information from packet.
Definition: avpacket.c:350
void ff_hevc_hls_filters(HEVCContext *s, int x_ctb, int y_ctb, int ctb_size)
Definition: hevc_filter.c:867
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:163
uint8_t rpl_modification_flag[2]
Definition: hevc_ps.h:74
int * size
Definition: hevc_ps.h:103
int vui_timing_info_present_flag
Definition: hevc_ps.h:157
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Definition: internal.h:181
static int decode_nal_units(HEVCContext *s, const uint8_t *buf, int length)
Definition: hevcdec.c:2974
Display matrix.
int active_thread_type
Which multithreading methods are in use by the codec.
Definition: avcodec.h:3211
static int hls_pcm_sample(HEVCContext *s, int x0, int y0, int log2_cb_size)
Definition: hevcdec.c:1350
RefPicList * refPicList
Definition: hevcdec.h:314
int16_t luma_offset_l0[16]
Definition: hevc_ps.h:116
int bs_height
Definition: hevcdec.h:429
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:197
ATSC A53 Part 4 Closed Captions.
Definition: frame.h:58
void(* intra_pred[4])(struct HEVCContext *s, int x0, int y0, int c_idx)
Definition: hevcpred.h:32
#define CTB(tab, x, y)
Definition: hevcdec.c:902
#define s0
Definition: regdef.h:37
static void intra_prediction_unit_default_value(HEVCContext *s, int x0, int y0, int log2_cb_size)
Definition: hevcdec.c:2060
const char * arg
Definition: jacosubdec.c:66
unsigned int log2_ctb_size
Definition: hevc_ps.h:281
static int set_sps(HEVCContext *s, const HEVCSPS *sps, enum AVPixelFormat pix_fmt)
Definition: hevcdec.c:415
uint16_t width
Definition: gdv.c:47
uint8_t * sao_pixel_buffer_h[3]
Definition: hevcdec.h:404
int8_t cu_qp_offset_cb
Definition: hevcdec.h:295
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:222
int tc_offset
tc_offset_div2 * 2
Definition: hevc_ps.h:97
const char * name
Name of the codec implementation.
Definition: avcodec.h:3746
const ShortTermRPS * short_term_rps
Definition: hevc_ps.h:69
uint8_t merge_flag
Definition: hevcdec.h:279
#define IS_IDR(s)
Definition: hevcdec.h:76
HEVCSEIMasteringDisplay mastering_display
Definition: hevc_sei.h:115
unsigned * entry_point_offset
Definition: hevc_ps.h:101
static const uint8_t offset[127][2]
Definition: vf_spp.c:92
int8_t slice_qp
Definition: hevc_ps.h:106
#define FFMAX(a, b)
Definition: common.h:94
#define BOUNDARY_UPPER_TILE
Definition: hevcdec.h:376
AVRational max_luminance
Max luminance of mastering display (cd/m^2).
static void * av_mallocz_array(size_t nmemb, size_t size)
Allocate a memory block for an array with av_mallocz().
Definition: mem.h:229
#define fail()
Definition: checkasm.h:109
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
Definition: avcodec.h:1065
uint8_t max_trafo_depth
MaxTrafoDepth.
Definition: hevcdec.h:250
int raw_size
Definition: h2645_parse.h:44
uint16_t sequence
A sequence counter, so that old frames are output first after a POC reset.
Definition: hevcdec.h:331
HEVCSEIPictureHash picture_hash
Definition: hevc_sei.h:110
uint8_t colour_primaries
Definition: hevc_ps.h:142
static int hevc_decode_frame(AVCodecContext *avctx, void *data, int *got_output, AVPacket *avpkt)
Definition: hevcdec.c:3118
static int hls_coding_unit(HEVCContext *s, int x0, int y0, int log2_cb_size)
Definition: hevcdec.c:2083
#define FF_CODEC_CAP_EXPORTS_CROPPING
The decoder sets the cropping fields in the output frames manually.
Definition: internal.h:66
uint8_t slice_temporal_mvp_enabled_flag
Definition: hevc_ps.h:76
Definition: hevcdec.h:168
uint8_t * vertical_bs
Definition: hevcdec.h:440
int ff_hevc_sao_band_position_decode(HEVCContext *s)
Definition: hevc_cabac.c:576
static char * split(char *message, char delim)
Definition: af_channelmap.c:81
int chroma_mode_c
Definition: hevcdec.h:292
uint8_t tiles_enabled_flag
Definition: hevc_ps.h:343
int ff_alloc_entries(AVCodecContext *avctx, int count)
int eo_class[3]
sao_eo_class
Definition: hevcdsp.h:38
AVStereo3D * av_stereo3d_create_side_data(AVFrame *frame)
Allocate a complete AVFrameSideData and add it to the frame.
Definition: stereo3d.c:33
uint32_t vps_num_units_in_tick
Definition: hevc_ps.h:208
int16_t luma_weight_l0[16]
Definition: hevc_ps.h:111
void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size)
Allocate a buffer, reusing the given one if large enough.
Definition: mem.c:481
Views are alternated temporally.
Definition: stereo3d.h:92
int * col_idxX
Definition: hevc_ps.h:381
struct HEVCContext * sList[MAX_NB_THREADS]
Definition: hevcdec.h:386
int slice_qp_delta
Definition: hevc_ps.h:90
common internal API header
int intra_pred_mode
Definition: hevcdec.h:290
enum HEVCNALUnitType first_nal_type
Definition: hevcdec.h:474
const HEVCSPS * sps
Definition: hevc_ps.h:401
int ff_hevc_sao_eo_class_decode(HEVCContext *s)
Definition: hevc_cabac.c:601
uint8_t lists_modification_present_flag
Definition: hevc_ps.h:362
#define IS_IRAP(s)
Definition: hevcdec.h:79
uint8_t profile_idc
Definition: hevc_ps.h:178
#define L1
Definition: hevcdec.h:59
AVBufferRef * tab_mvf_buf
Definition: hevcdec.h:320
HEVCSEIContext sei
Definition: hevcdec.h:484
int ff_hevc_output_frame(HEVCContext *s, AVFrame *out, int flush)
Find next frame in output order and put a reference to it in frame.
Definition: hevc_refs.c:174
uint8_t type_idx[3]
sao_type_idx
Definition: hevcdsp.h:42
uint8_t chroma_mode_c[4]
Definition: hevcdec.h:281
int beta_offset
beta_offset_div2 * 2
Definition: hevc_ps.h:96
AVMasteringDisplayMetadata * av_mastering_display_metadata_create_side_data(AVFrame *frame)
Allocate a complete AVMasteringDisplayMetadata and add it to the frame.
enum AVPictureType pict_type
Picture type of the frame.
Definition: frame.h:284
int res_scale_val
Definition: hevcdec.h:287
int ff_hevc_res_scale_sign_flag(HEVCContext *s, int idx)
Definition: hevc_cabac.c:905
int err_recognition
Error recognition; may misdetect some more or less valid parts as errors.
Definition: avcodec.h:3050
HEVCSEIContentLight content_light
Definition: hevc_sei.h:116
Definition: hevcdec.h:169
#define FF_THREAD_FRAME
Decode more than one frame at once.
Definition: avcodec.h:3203
int max_transform_hierarchy_depth_inter
Definition: hevc_ps.h:284
#define FFMIN(a, b)
Definition: common.h:96
uint8_t * sao_pixel_buffer_v[3]
Definition: hevcdec.h:405
#define EPEL_EXTRA_BEFORE
Definition: hevcdec.h:61
int slice_cr_qp_offset
Definition: hevc_ps.h:92
planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting col...
Definition: pixfmt.h:78
AVRational min_luminance
Min luminance of mastering display (cd/m^2).
int offset_abs[3][4]
sao_offset_abs
Definition: hevcdsp.h:33
int width
picture width / height.
Definition: avcodec.h:1948
uint8_t * tab_ipm
Definition: hevcdec.h:448
static int luma_intra_pred_mode(HEVCContext *s, int x0, int y0, int pu_size, int prev_intra_luma_pred_flag)
8.4.1
Definition: hevcdec.c:1895
int hshift[3]
Definition: hevc_ps.h:308
void ff_thread_report_progress(ThreadFrame *f, int n, int field)
Notify later decoding threads when part of their reference picture is ready.
int32_t
int ff_init_cabac_decoder(CABACContext *c, const uint8_t *buf, int buf_size)
Definition: cabac.c:177
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
Definition: avcodec.h:2477
uint8_t cu_qp_delta_enabled_flag
Definition: hevc_ps.h:331
uint8_t used_by_curr_pic_lt_sps_flag[32]
Definition: hevc_ps.h:264
static void print_md5(void *log_ctx, int level, uint8_t md5[16])
Definition: hevcdec.c:3023
#define FF_THREAD_SLICE
Decode more than one part of a single frame at once.
Definition: avcodec.h:3204
Context Adaptive Binary Arithmetic Coder inline functions.
int level
level
Definition: avcodec.h:3364
int intra_pred_mode_c
Definition: hevcdec.h:291
int ctb_width
Definition: hevc_ps.h:297
static void pic_arrays_free(HEVCContext *s)
NOTE: Each function hls_foo correspond to the function foo in the specification (HLS stands for High ...
Definition: hevcdec.c:58
int16_t chroma_weight_l0[16][2]
Definition: hevc_ps.h:112
int height
Definition: hevc_ps.h:296
#define AV_EF_EXPLODE
abort decoding on minor error detection
Definition: avcodec.h:3061
void(* put_hevc_qpel_bi[10][2][2])(uint8_t *dst, ptrdiff_t dststride, uint8_t *_src, ptrdiff_t _srcstride, int16_t *src2, int height, intptr_t mx, intptr_t my, int width)
Definition: hevcdsp.h:79
static av_cold int hevc_decode_init(AVCodecContext *avctx)
Definition: hevcdec.c:3397
uint8_t output_flag_present_flag
Definition: hevc_ps.h:339
uint16_t seq_output
Definition: hevcdec.h:465
PTLCommon general_ptl
Definition: hevc_ps.h:188
static int hevc_decode_extradata(HEVCContext *s, uint8_t *buf, int length, int first)
Definition: hevcdec.c:3096
int16_t luma_offset_l1[16]
Definition: hevc_ps.h:119
struct AVMD5 * md5_ctx
Definition: hevc_sei.h:63
int16_t chroma_offset_l0[16][2]
Definition: hevc_ps.h:117
if(ret< 0)
Definition: vf_mcdeint.c:279
int type
NAL unit type.
Definition: h2645_parse.h:52
static void error(const char *err)
#define IS_BLA(s)
Definition: hevcdec.h:77
#define POS(c_idx, x, y)
unsigned vps_id
Definition: hevc_ps.h:226
#define FF_ARRAY_ELEMS(a)
int thread_count
thread count is used to decide how many independent tasks should be passed to execute() ...
Definition: avcodec.h:3192
the normal 2^n-1 "JPEG" YUV ranges
Definition: pixfmt.h:514
unsigned int pps_id
address (in raster order) of the first block in the current slice segment
Definition: hevc_ps.h:49
uint8_t pic_slice_level_chroma_qp_offsets_present_flag
Definition: hevc_ps.h:336
static unsigned get_ue_golomb_long(GetBitContext *gb)
Read an unsigned Exp-Golomb code in the range 0 to UINT32_MAX-1.
Definition: golomb.h:87
uint32_t vps_time_scale
Definition: hevc_ps.h:209
void ff_reset_entries(AVCodecContext *avctx)
int colour_description_present_flag
Definition: hevc_ps.h:141
#define AV_CODEC_CAP_SLICE_THREADS
Codec supports slice-based (or partition-based) multithreading.
Definition: avcodec.h:1069
static const int8_t mv[256][2]
Definition: 4xm.c:77
HEVCFrame DPB[32]
Definition: hevcdec.h:421
void ff_hevc_ps_uninit(HEVCParamSets *ps)
Definition: hevc_ps.c:1719
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames...
Definition: frame.h:274
enum AVPixelFormat pix_fmt
Definition: hevc_ps.h:237
RefPicListTab ** rpl_tab
Definition: hevcdec.h:315
int ff_hevc_merge_idx_decode(HEVCContext *s)
Definition: hevc_cabac.c:781
int(* execute2)(struct AVCodecContext *c, int(*func)(struct AVCodecContext *c2, void *arg, int jobnr, int threadnr), void *arg2, int *ret, int count)
The codec may call this to execute several independent things.
Definition: avcodec.h:3252
int slice_cb_qp_offset
Definition: hevc_ps.h:91
void ff_hevc_dsp_init(HEVCDSPContext *hevcdsp, int bit_depth)
Definition: hevcdsp.c:126
The AV_PKT_DATA_NEW_EXTRADATA is used to notify the codec or the format that the extradata buffer was...
Definition: avcodec.h:1420
const uint8_t ff_hevc_pel_weight[65]
Definition: hevcdec.c:46
#define src1
Definition: h264pred.c:139
enum AVStereo3DType type
How views are packed within the video.
Definition: stereo3d.h:161
#define AV_LOG_INFO
Standard information.
Definition: log.h:187
void ff_hevc_clear_refs(HEVCContext *s)
Mark all frames in DPB as unused for reference.
Definition: hevc_refs.c:66
static void chroma_mc_uni(HEVCContext *s, uint8_t *dst0, ptrdiff_t dststride, uint8_t *src0, ptrdiff_t srcstride, int reflist, int x_off, int y_off, int block_w, int block_h, struct MvField *current_mv, int chroma_weight, int chroma_offset)
8.5.3.2.2.2 Chroma sample uniprediction interpolation process
Definition: hevcdec.c:1559
uint16_t num_tile_columns
num_tile_columns_minus1 + 1
Definition: hevc_ps.h:346
int short_term_ref_pic_set_size
Definition: hevc_ps.h:67
static void hevc_luma_mv_mvp_mode(HEVCContext *s, int x0, int y0, int nPbW, int nPbH, int log2_cb_size, int part_idx, int merge_idx, MvField *mv)
Definition: hevcdec.c:1724
Views are on top of each other.
Definition: stereo3d.h:79
void ff_thread_report_progress2(AVCodecContext *avctx, int field, int thread, int n)
This side data contains a 3x3 transformation matrix describing an affine transformation that needs to...
Definition: frame.h:84
int16_t tmp[64 *64]
Definition: hevcdec.h:366
int(* end_frame)(AVCodecContext *avctx)
Called at the end of each frame or field picture.
Definition: avcodec.h:3955
#define L0
Definition: hevcdec.h:58
static int hls_transform_unit(HEVCContext *s, int x0, int y0, int xBase, int yBase, int cb_xBase, int cb_yBase, int log2_cb_size, int log2_trafo_size, int blk_idx, int cbf_luma, int *cbf_cb, int *cbf_cr)
Definition: hevcdec.c:1006
enum AVCodecID codec_id
Definition: avcodec.h:1778
int * ctb_addr_rs_to_ts
CtbAddrRSToTS.
Definition: hevc_ps.h:383
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Definition: frame.h:232
PTL ptl
Definition: hevc_ps.h:251
int max_sub_layers
Definition: hevc_ps.h:242
#define EPEL_EXTRA_AFTER
Definition: hevcdec.h:62
unsigned int log2_min_pu_size
Definition: hevc_ps.h:282
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition: get_bits.h:457
int ff_hevc_end_of_slice_flag_decode(HEVCContext *s)
Definition: hevc_cabac.c:608
unsigned int sps_id
seq_parameter_set_id
Definition: hevc_ps.h:318
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:81
int long_term_ref_pic_set_size
Definition: hevc_ps.h:70
main external API structure.
Definition: avcodec.h:1761
uint8_t sao_enabled
Definition: hevc_ps.h:260
enum PredMode pred_mode
PredMode.
Definition: hevcdec.h:245
AVBufferRef * hwaccel_priv_buf
Definition: hevcdec.h:324
int num_extra_slice_header_bits
Definition: hevc_ps.h:364
uint8_t * data
The data buffer.
Definition: buffer.h:89
atomic_int wpp_err
Definition: hevcdec.h:468
int16_t y
vertical component of motion vector
Definition: hevcdec.h:256
uint8_t cross_pf
Definition: hevcdec.h:297
#define EDGE_EMU_BUFFER_STRIDE
Definition: hevcdec.h:68
const uint8_t * data
Definition: h2645_parse.h:36
uint8_t num_long_term_ref_pics_sps
Definition: hevc_ps.h:265
uint8_t * data
Definition: frame.h:165
void av_md5_init(AVMD5 *ctx)
Initialize MD5 hashing.
Definition: md5.c:143
TransformUnit tu
Definition: hevcdec.h:354
uint8_t cross_component_prediction_enabled_flag
Definition: hevc_ps.h:367
void * buf
Definition: avisynth_c.h:690
uint32_t vui_num_units_in_tick
Definition: hevc_ps.h:158
int extradata_size
Definition: avcodec.h:1877
AVBufferRef * av_buffer_allocz(int size)
Same as av_buffer_alloc(), except the returned buffer will be initialized to zero.
Definition: buffer.c:83
uint8_t ctb_left_flag
Definition: hevcdec.h:356
uint8_t deblocking_filter_control_present_flag
Definition: hevc_ps.h:353
int cu_qp_delta
Definition: hevcdec.h:285
uint8_t * is_pcm
Definition: hevcdec.h:451
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:314
static int pred_weight_table(HEVCContext *s, GetBitContext *gb)
Definition: hevcdec.c:142
uint8_t * checksum_buf
used on BE to byteswap the lines for checksumming
Definition: hevcdec.h:457
#define AV_PIX_FMT_YUV420P10
Definition: pixfmt.h:383
uint8_t sps_temporal_mvp_enabled_flag
Definition: hevc_ps.h:274
int ff_hevc_decode_nal_sei(GetBitContext *gb, void *logctx, HEVCSEIContext *s, const HEVCParamSets *ps, int type)
Definition: hevc_sei.c:353
int ff_hevc_cu_qp_delta_sign_flag(HEVCContext *s)
Definition: hevc_cabac.c:660
unsigned int nb_st_rps
Definition: hevc_ps.h:256
AVContentLightMetadata * av_content_light_metadata_create_side_data(AVFrame *frame)
Allocate a complete AVContentLightMetadata and add it to the frame.
int coded_height
Definition: avcodec.h:1963
uint8_t cabac_init_flag
Definition: hevc_ps.h:83
Describe the class of an AVClass context structure.
Definition: log.h:67
void ff_hevc_bump_frame(HEVCContext *s)
Definition: hevc_refs.c:236
#define FF_CODEC_PROPERTY_CLOSED_CAPTIONS
Definition: avcodec.h:3583
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:307
uint16_t max_pic_average_light_level
Definition: hevc_sei.h:101
static const AVProfile profiles[]
AVFrameSideData * av_frame_new_side_data(AVFrame *frame, enum AVFrameSideDataType type, int size)
Add a new side data to a frame.
Definition: frame.c:674
uint8_t chroma_qp_offset_list_enabled_flag
Definition: hevc_ps.h:368
int poc
Definition: hevcdec.h:317
void av_buffer_pool_uninit(AVBufferPool **ppool)
Mark the pool as being available for freeing.
Definition: buffer.c:275
enum AVColorSpace colorspace
YUV colorspace type.
Definition: avcodec.h:2491
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
Definition: avcodec.h:2484
Copyright (c) 2016 Neil Birkbeck neil.birkbeck@gmail.com
HW acceleration through VDPAU, Picture.data[3] contains a VdpVideoSurface.
Definition: pixfmt.h:213
AVFrame * frame
Definition: hevcdec.h:402
static av_cold int hevc_init_context(AVCodecContext *avctx)
Definition: hevcdec.c:3267
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:426
int enable_parallel_tiles
Definition: hevcdec.h:467
uint8_t edge_emu_buffer[(MAX_PB_SIZE+7) *EDGE_EMU_BUFFER_STRIDE *2]
Definition: hevcdec.h:363
void ff_hevc_save_states(HEVCContext *s, int ctb_addr_ts)
Definition: hevc_cabac.c:450
void(* add_residual[4])(uint8_t *dst, int16_t *res, ptrdiff_t stride)
Definition: hevcdsp.h:49
unsigned int max_num_merge_cand
5 - 5_minus_max_num_merge_cand
Definition: hevc_ps.h:99
int checksum_buf_size
Definition: hevcdec.h:458
int last_eos
last packet contains an EOS/EOB NAL
Definition: hevcdec.h:426
DBParams * deblock
Definition: hevcdec.h:417
GetBitContext gb
Definition: hevcdec.h:346
#define BOUNDARY_UPPER_SLICE
Definition: hevcdec.h:375
#define AV_EF_CRCCHECK
Verify checksums embedded in the bitstream (could be of either encoded or decoded data...
Definition: avcodec.h:3058
static int hevc_frame_start(HEVCContext *s)
Definition: hevcdec.c:2768
unsigned int log2_min_tb_size
Definition: hevc_ps.h:279
void ff_hevc_luma_mv_merge_mode(HEVCContext *s, int x0, int y0, int nPbW, int nPbH, int log2_cb_size, int part_idx, int merge_idx, MvField *mv)
Definition: hevc_mvs.c:479
#define src0
Definition: h264pred.c:138
enum PartMode part_mode
PartMode.
Definition: hevcdec.h:246
uint16_t lt_ref_pic_poc_lsb_sps[32]
Definition: hevc_ps.h:263
enum AVPixelFormat ff_thread_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
Wrapper around get_format() for frame-multithreaded codecs.
int ff_hevc_decode_nal_pps(GetBitContext *gb, AVCodecContext *avctx, HEVCParamSets *ps)
Definition: hevc_ps.c:1471
uint8_t intra_pred_mode_c[4]
Definition: hevcdec.h:280
#define s1
Definition: regdef.h:38
void(* put_hevc_qpel_uni[10][2][2])(uint8_t *dst, ptrdiff_t dststride, uint8_t *src, ptrdiff_t srcstride, int height, intptr_t mx, intptr_t my, int width)
Definition: hevcdsp.h:74
HEVCSEIAlternativeTransfer alternative_transfer
Definition: hevc_sei.h:118
Definition: hevcdec.h:167
int ff_hevc_decode_nal_sps(GetBitContext *gb, AVCodecContext *avctx, HEVCParamSets *ps, int apply_defdispwin)
Definition: hevc_ps.c:1222
Definition: hevcdec.h:254
void av_md5_final(AVMD5 *ctx, uint8_t *dst)
Finish hashing and output digest value.
Definition: md5.c:192
int allocate_progress
Whether to allocate progress for frame threading.
Definition: internal.h:153
void ff_hevc_reset_sei(HEVCSEIContext *s)
Reset SEI values that are stored on the Context.
Definition: hevc_sei.c:366
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
Definition: get_bits.h:347
int * tile_id
TileId.
Definition: hevc_ps.h:385
int16_t luma_weight_l1[16]
Definition: hevc_ps.h:114
HEVCSEIA53Caption a53_caption
Definition: hevc_sei.h:114
int16_t chroma_log2_weight_denom
Definition: hevc_ps.h:109
int tc_offset
tc_offset_div2 * 2
Definition: hevc_ps.h:357
HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer. ...
Definition: pixfmt.h:152
uint8_t transfer_characteristic
Definition: hevc_ps.h:143
AVRational display_primaries[3][2]
CIE 1931 xy chromaticity coords of color primaries (r, g, b order).
static enum AVPixelFormat pix_fmts[]
Definition: libkvazaar.c:266
int ff_hevc_ref_idx_lx_decode(HEVCContext *s, int num_ref_idx_lx)
Definition: hevc_cabac.c:807
int pocTid0
Definition: hevcdec.h:423
uint8_t flags
A combination of HEVC_FRAME_FLAG_*.
Definition: hevcdec.h:336
HEVCLocalContext * HEVClc
Definition: hevcdec.h:389
static void hevc_await_progress(HEVCContext *s, HEVCFrame *ref, const Mv *mv, int y0, int height)
Definition: hevcdec.c:1714
uint8_t * a53_caption
Definition: hevc_sei.h:87
static void export_stream_params(AVCodecContext *avctx, const HEVCParamSets *ps, const HEVCSPS *sps)
Definition: hevcdec.c:316
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition: frame.c:505
#define QPEL_EXTRA
Definition: hevcdec.h:66
int(* decode_slice)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size)
Callback for each slice.
Definition: avcodec.h:3944
AVCodec ff_hevc_decoder
Definition: hevcdec.c:3476
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:215
uint8_t level
Definition: svq3.c:207
int ff_hevc_cu_chroma_qp_offset_flag(HEVCContext *s)
Definition: hevc_cabac.c:665
Hardware surfaces for Direct3D11.
Definition: pixfmt.h:331
uint8_t level_idc
Definition: hevc_ps.h:180
the normal 219*2^(n-8) "MPEG" YUV ranges
Definition: pixfmt.h:513
int(* start_frame)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size)
Called at the beginning of each frame or field picture.
Definition: avcodec.h:3930
int eos
current packet contains an EOS/EOB NAL
Definition: hevcdec.h:425
static int hls_slice_header(HEVCContext *s)
Definition: hevcdec.c:471
#define BOUNDARY_LEFT_SLICE
Definition: hevcdec.h:373
static int pic_arrays_init(HEVCContext *s, const HEVCSPS *sps)
Definition: hevcdec.c:86
void ff_hevc_luma_mv_mvp_mode(HEVCContext *s, int x0, int y0, int nPbW, int nPbH, int log2_cb_size, int part_idx, int merge_idx, MvField *mv, int mvp_lx_flag, int LX)
Definition: hevc_mvs.c:582
static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
Definition: hevcdec.c:363
int max_transform_hierarchy_depth_intra
Definition: hevc_ps.h:285
Mv mv[2]
Definition: hevcdec.h:260
int
static int hls_slice_data(HEVCContext *s)
Definition: hevcdec.c:2441
uint8_t * skip_flag
Definition: hevcdec.h:445
static int hevc_update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
Definition: hevcdec.c:3315
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:66
int ff_hevc_intra_chroma_pred_mode_decode(HEVCContext *s)
Definition: hevc_cabac.c:770
int8_t ref_idx[2]
Definition: hevcdec.h:261
common internal and external API header
AVBufferPool * av_buffer_pool_init(int size, AVBufferRef *(*alloc)(int size))
Allocate and initialize a buffer pool.
Definition: buffer.c:238
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:107
uint8_t weighted_pred_flag
Definition: hevc_ps.h:337
uint8_t * horizontal_bs
Definition: hevcdec.h:439
static void hls_prediction_unit(HEVCContext *s, int x0, int y0, int nPbW, int nPbH, int log2_cb_size, int partIdx, int idx)
Definition: hevcdec.c:1769
unsigned int nb_refs[2]
Definition: hevc_ps.h:78
int32_t * tab_slice_address
Definition: hevcdec.h:442
uint8_t disable_deblocking_filter_flag
slice_header_disable_deblocking_filter_flag
Definition: hevc_ps.h:84
uint16_t num_tile_rows
num_tile_rows_minus1 + 1
Definition: hevc_ps.h:347
int16_t offset_val[3][5]
SaoOffsetVal.
Definition: hevcdsp.h:40
const char * av_color_transfer_name(enum AVColorTransferCharacteristic transfer)
Definition: pixdesc.c:2784
unsigned int * column_width
ColumnWidth.
Definition: hevc_ps.h:377
AVBufferRef * av_buffer_ref(AVBufferRef *buf)
Create a new reference to an AVBuffer.
Definition: buffer.c:93
static int hls_decode_entry(AVCodecContext *avctxt, void *isFilterThread)
Definition: hevcdec.c:2380
Stereoscopic video.
uint8_t * filter_slice_edges
Definition: hevcdec.h:454
uint8_t slice_header_extension_present_flag
Definition: hevc_ps.h:365
uint8_t collocated_list
Definition: hevc_ps.h:86
uint16_t max_content_light_level
Definition: hevc_sei.h:100
uint32_t max_luminance
Definition: hevc_sei.h:94
#define HEVC_MAX_PPS_COUNT
Definition: hevc.h:83
unsigned properties
Properties of the stream that gets decoded.
Definition: avcodec.h:3581
int nal_length_size
Number of bytes used for nal length (1, 2 or 4)
Definition: hevcdec.h:481
int den
Denominator.
Definition: rational.h:60
int slice_ctb_addr_rs
Definition: hevc_ps.h:122
AVBufferPool * tab_mvf_pool
Definition: hevcdec.h:409
int ff_hevc_sao_type_idx_decode(HEVCContext *s)
Definition: hevc_cabac.c:566
int video_full_range_flag
Definition: hevc_ps.h:140
uint8_t edge_emu_buffer2[(MAX_PB_SIZE+7) *EDGE_EMU_BUFFER_STRIDE *2]
Definition: hevcdec.h:365
GetBitContext gb
Definition: h2645_parse.h:47
HEVCSEIFramePacking frame_packing
Definition: hevc_sei.h:111
static const uint8_t tab_mode_idx[]
Definition: hevcdec.c:1988
AVRational sar
Definition: hevc_ps.h:133
uint8_t chroma_qp_offset_list_len_minus1
Definition: hevc_ps.h:370
uint8_t slice_loop_filter_across_slices_enabled_flag
Definition: hevc_ps.h:85
av_cold void ff_bswapdsp_init(BswapDSPContext *c)
Definition: bswapdsp.c:49
void * priv_data
Definition: avcodec.h:1803
const uint8_t * raw_data
Definition: h2645_parse.h:45
void ff_hevc_set_neighbour_available(HEVCContext *s, int x0, int y0, int nPbW, int nPbH)
Definition: hevc_mvs.c:42
#define av_free(p)
unsigned int collocated_ref_idx
Definition: hevc_ps.h:88
int ff_hevc_pred_mode_decode(HEVCContext *s)
Definition: hevc_cabac.c:681
CodingUnit cu
Definition: hevcdec.h:369
static const int16_t coeffs[]
int min_pu_width
Definition: hevc_ps.h:304
struct AVCodecInternal * internal
Private context used for internal data.
Definition: avcodec.h:1811
int beta_offset
Definition: hevcdec.h:301
int ff_hevc_mpm_idx_decode(HEVCContext *s)
Definition: hevc_cabac.c:752
void(* put_hevc_epel_bi[10][2][2])(uint8_t *dst, ptrdiff_t dststride, uint8_t *_src, ptrdiff_t _srcstride, int16_t *src2, int height, intptr_t mx, intptr_t my, int width)
Definition: hevcdsp.h:93
H2645NAL * nals
Definition: h2645_parse.h:70
int ff_hevc_pcm_flag_decode(HEVCContext *s)
Definition: hevc_cabac.c:742
void ff_hevc_hls_residual_coding(HEVCContext *s, int x0, int y0, int log2_trafo_size, enum ScanType scan_idx, int c_idx)
Definition: hevc_cabac.c:1024
#define HWACCEL_MAX
int key_frame
1 -> keyframe, 0-> not
Definition: frame.h:279
#define AV_ZERO32(d)
Definition: intreadwrite.h:619
unsigned int list_entry_lx[2][32]
Definition: hevc_ps.h:72
uint8_t luma_log2_weight_denom
Definition: hevc_ps.h:108
int ff_hevc_frame_nb_refs(HEVCContext *s)
Get the number of candidate references for the current frame.
Definition: hevc_refs.c:514
int16_t chroma_weight_l1[16][2]
Definition: hevc_ps.h:113
uint32_t min_luminance
Definition: hevc_sei.h:95
uint8_t long_term_ref_pics_present_flag
Definition: hevc_ps.h:262
H2645Packet pkt
Definition: hevcdec.h:472
int temporal_id
HEVC only, nuh_temporal_id_plus_1 - 1.
Definition: h2645_parse.h:57
void(* put_hevc_epel_uni_w[10][2][2])(uint8_t *_dst, ptrdiff_t _dststride, uint8_t *_src, ptrdiff_t _srcstride, int height, int denom, int wx, int ox, intptr_t mx, intptr_t my, int width)
Definition: hevcdsp.h:91
static void luma_mc_bi(HEVCContext *s, uint8_t *dst, ptrdiff_t dststride, AVFrame *ref0, const Mv *mv0, int x_off, int y_off, int block_w, int block_h, AVFrame *ref1, const Mv *mv1, struct MvField *current_mv)
8.5.3.2.2.1 Luma sample bidirectional interpolation process
Definition: hevcdec.c:1468
int boundary_flags
Definition: hevcdec.h:379
FILE * out
Definition: movenc.c:54
int diff_cu_qp_delta_depth
Definition: hevc_ps.h:332
static int hls_cross_component_pred(HEVCContext *s, int idx)
Definition: hevcdec.c:990
Public header for MD5 hash function implementation.
#define atomic_init(obj, value)
Definition: stdatomic.h:33
#define av_freep(p)
struct HEVCSPS::@70 pcm
static const AVOption options[]
Definition: hevcdec.c:3461
#define EPEL_EXTRA
Definition: hevcdec.h:63
int num_reorder_pics
Definition: hevc_ps.h:245
enum AVColorTransferCharacteristic color_trc
Definition: frame.h:450
#define av_always_inline
Definition: attributes.h:39
HW decoding through Direct3D11 via old API, Picture.data[3] contains a ID3D11VideoDecoderOutputView p...
Definition: pixfmt.h:247
void ff_hevc_set_qPy(HEVCContext *s, int xBase, int yBase, int log2_cb_size)
Definition: hevc_filter.c:121
#define av_malloc_array(a, b)
uint8_t context_initialized
Definition: hevcdec.h:476
AVBufferRef * rpl_buf
Definition: hevcdec.h:322
int is_decoded
Definition: hevcdec.h:431
int video_signal_type_present_flag
Definition: hevc_ps.h:138
#define FFSWAP(type, a, b)
Definition: common.h:99
const char int length
Definition: avisynth_c.h:768
uint8_t deblocking_filter_override_enabled_flag
Definition: hevc_ps.h:354
int bit_depth
Definition: hevc_ps.h:234
int beta_offset
beta_offset_div2 * 2
Definition: hevc_ps.h:356
#define SUBDIVIDE(x, y, idx)
int min_tb_height
Definition: hevc_ps.h:303
int ff_hevc_sao_offset_abs_decode(HEVCContext *s)
Definition: hevc_cabac.c:586
int ff_hevc_cabac_init(HEVCContext *s, int ctb_addr_ts)
Definition: hevc_cabac.c:504
static int hls_coding_quadtree(HEVCContext *s, int x0, int y0, int log2_cb_size, int cb_depth)
Definition: hevcdec.c:2246
#define HEVC_MAX_REFS
Definition: hevc.h:87
uint8_t * cbf_luma
Definition: hevcdec.h:450
int depth
Number of bits in the component.
Definition: pixdesc.h:58
SliceHeader sh
Definition: hevcdec.h:415
int no_rasl_output_flag
Definition: hevcdec.h:432
static av_cold int hevc_init_thread_copy(AVCodecContext *avctx)
Definition: hevcdec.c:3435
int(* execute)(struct AVCodecContext *c, int(*func)(struct AVCodecContext *c2, void *arg), void *arg2, int *ret, int count, int size)
The codec may call this to execute several independent things.
Definition: avcodec.h:3232
exp golomb vlc stuff
int pcm_enabled_flag
Definition: hevc_ps.h:240
uint16_t white_point[2]
Definition: hevc_sei.h:93
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
This structure stores compressed data.
Definition: avcodec.h:1656
unsigned MaxFALL
Max average light level per frame (cd/m^2).
int * offset
Definition: hevc_ps.h:102
uint8_t mvd_l1_zero_flag
Definition: hevc_ps.h:81
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
Definition: avcodec.h:1002
for(j=16;j >0;--j)
uint8_t separate_colour_plane_flag
Definition: hevc_ps.h:228
static av_always_inline int get_bitsz(GetBitContext *s, int n)
Read 0-25 bits.
Definition: get_bits.h:277
#define FFMAX3(a, b, c)
Definition: common.h:95
int end_of_tiles_y
Definition: hevcdec.h:361
int ff_hevc_cu_qp_delta_abs(HEVCContext *s)
Definition: hevc_cabac.c:633
int ff_hevc_decode_extradata(const uint8_t *data, int size, HEVCParamSets *ps, HEVCSEIContext *sei, int *is_nalff, int *nal_length_size, int err_recognition, int apply_defdispwin, void *logctx)
Definition: hevc_parse.c:77
uint16_t display_primaries[3][2]
Definition: hevc_sei.h:92
uint8_t slice_sample_adaptive_offset_flag[3]
Definition: hevc_ps.h:80
int ff_hevc_mvp_lx_flag_decode(HEVCContext *s)
Definition: hevc_cabac.c:823
uint8_t dependent_slice_segments_enabled_flag
Definition: hevc_ps.h:342
int offset_sign[3][4]
sao_offset_sign
Definition: hevcdsp.h:34
void(* put_hevc_epel_bi_w[10][2][2])(uint8_t *dst, ptrdiff_t dststride, uint8_t *_src, ptrdiff_t _srcstride, int16_t *src2, int height, int denom, int wx0, int ox0, int wx1, int ox1, intptr_t mx, intptr_t my, int width)
Definition: hevcdsp.h:96
static av_cold int hevc_decode_free(AVCodecContext *avctx)
Definition: hevcdec.c:3221