FFmpeg
Loading...
Searching...
No Matches
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 "config_components.h"
27
29#include "libavutil/avstring.h"
30#include "libavutil/common.h"
33#include "libavutil/internal.h"
34#include "libavutil/md5.h"
35#include "libavutil/mem.h"
36#include "libavutil/opt.h"
37#include "libavutil/pixdesc.h"
38#include "libavutil/stereo3d.h"
39#include "libavutil/tdrdi.h"
40#include "libavutil/timecode.h"
41#include "libavutil/refstruct.h"
42
44#include "libavcodec/bswapdsp.h"
47#include "libavcodec/decode.h"
48#include "libavcodec/golomb.h"
49#include "libavcodec/h274.h"
51#include "libavcodec/hwconfig.h"
52#include "libavcodec/internal.h"
53#include "libavcodec/profiles.h"
55#include "libavcodec/thread.h"
57
58#include "hevc.h"
59#include "parse.h"
60#include "hevcdec.h"
61
62static const uint8_t hevc_pel_weight[65] = { [2] = 0, [4] = 1, [6] = 2, [8] = 3, [12] = 4, [16] = 5, [24] = 6, [32] = 7, [48] = 8, [64] = 9 };
63
64/**
65 * NOTE: Each function hls_foo correspond to the function foo in the
66 * specification (HLS stands for High Level Syntax).
67 */
68
69/**
70 * Section 5.7
71 */
72
73/* free everything allocated by pic_arrays_init() */
75{
76 av_freep(&l->sao);
77 av_freep(&l->deblock);
78
81
82 av_freep(&l->tab_ipm);
83 av_freep(&l->cbf_luma);
84 av_freep(&l->is_pcm);
85
86 av_freep(&l->qp_y_tab);
89
92
93 for (int i = 0; i < 3; i++) {
96 }
97
100}
101
102/* allocate arrays that depend on frame dimensions */
104{
105 int log2_min_cb_size = sps->log2_min_cb_size;
106 int width = sps->width;
107 int height = sps->height;
108 int pic_size_in_ctb = ((width >> log2_min_cb_size) + 1) *
109 ((height >> log2_min_cb_size) + 1);
110 int ctb_count = sps->ctb_width * sps->ctb_height;
111 int min_pu_size = sps->min_pu_width * sps->min_pu_height;
112
113 l->bs_width = (width >> 2) + 1;
114 l->bs_height = (height >> 2) + 1;
115
116 l->sao = av_calloc(ctb_count, sizeof(*l->sao));
117 l->deblock = av_calloc(ctb_count, sizeof(*l->deblock));
118 if (!l->sao || !l->deblock)
119 goto fail;
120
121 l->skip_flag = av_malloc_array(sps->min_cb_height, sps->min_cb_width);
122 l->tab_ct_depth = av_malloc_array(sps->min_cb_height, sps->min_cb_width);
123 if (!l->skip_flag || !l->tab_ct_depth)
124 goto fail;
125
126 l->cbf_luma = av_malloc_array(sps->min_tb_width, sps->min_tb_height);
127 l->tab_ipm = av_mallocz(min_pu_size);
128 l->is_pcm = av_malloc_array(sps->min_pu_width + 1, sps->min_pu_height + 1);
129 if (!l->tab_ipm || !l->cbf_luma || !l->is_pcm)
130 goto fail;
131
132 l->filter_slice_edges = av_mallocz(ctb_count);
133 l->tab_slice_address = av_malloc_array(pic_size_in_ctb,
134 sizeof(*l->tab_slice_address));
135 l->qp_y_tab = av_calloc(pic_size_in_ctb,
136 sizeof(*l->qp_y_tab));
137 if (!l->qp_y_tab || !l->filter_slice_edges || !l->tab_slice_address)
138 goto fail;
139
142 if (!l->horizontal_bs || !l->vertical_bs)
143 goto fail;
144
145 l->tab_mvf_pool = av_refstruct_pool_alloc(min_pu_size * sizeof(MvField), 0);
146 l->rpl_tab_pool = av_refstruct_pool_alloc(ctb_count * sizeof(RefPicListTab), 0);
147 if (!l->tab_mvf_pool || !l->rpl_tab_pool)
148 goto fail;
149
150 if (sps->sao_enabled) {
151 int c_count = (sps->chroma_format_idc != 0) ? 3 : 1;
152
153 for (int c_idx = 0; c_idx < c_count; c_idx++) {
154 int w = sps->width >> sps->hshift[c_idx];
155 int h = sps->height >> sps->vshift[c_idx];
156 l->sao_pixel_buffer_h[c_idx] =
157 av_mallocz((w * 2 * sps->ctb_height) <<
158 sps->pixel_shift);
159 l->sao_pixel_buffer_v[c_idx] =
160 av_mallocz((h * 2 * sps->ctb_width) <<
161 sps->pixel_shift);
162 if (!l->sao_pixel_buffer_h[c_idx] ||
163 !l->sao_pixel_buffer_v[c_idx])
164 goto fail;
165 }
166 }
167
168 return 0;
169
170fail:
172 return AVERROR(ENOMEM);
173}
174
175static int pred_weight_table(SliceHeader *sh, void *logctx,
176 const HEVCSPS *sps, GetBitContext *gb)
177{
178 int i = 0;
179 int j = 0;
180 int luma_log2_weight_denom;
181 unsigned luma_weight_flags, chroma_weight_flags;
182
183 luma_log2_weight_denom = get_ue_golomb_long(gb);
184 if (luma_log2_weight_denom < 0 || luma_log2_weight_denom > 7) {
185 av_log(logctx, AV_LOG_ERROR, "luma_log2_weight_denom %d is invalid\n", luma_log2_weight_denom);
186 return AVERROR_INVALIDDATA;
187 }
188 sh->luma_log2_weight_denom = luma_log2_weight_denom;
189 if (sps->chroma_format_idc != 0) {
190 int64_t chroma_log2_weight_denom = luma_log2_weight_denom + (int64_t)get_se_golomb(gb);
191 if (chroma_log2_weight_denom < 0 || chroma_log2_weight_denom > 7) {
192 av_log(logctx, AV_LOG_ERROR, "chroma_log2_weight_denom %"PRId64" is invalid\n", chroma_log2_weight_denom);
193 return AVERROR_INVALIDDATA;
194 }
195 sh->chroma_log2_weight_denom = chroma_log2_weight_denom;
196 }
197
198 luma_weight_flags = get_bits(gb, sh->nb_refs[L0]);
199 chroma_weight_flags = sps->chroma_format_idc != 0 ? get_bits(gb, sh->nb_refs[L0]) : 0;
200 for (i = 0; i < sh->nb_refs[L0]; i++) {
201 unsigned flag_bit = 1 << (sh->nb_refs[L0] - 1 - i);
202
203 if (luma_weight_flags & flag_bit) {
204 int delta_luma_weight_l0 = get_se_golomb(gb);
205 if ((int8_t)delta_luma_weight_l0 != delta_luma_weight_l0)
206 return AVERROR_INVALIDDATA;
207 sh->luma_weight_l0[i] = (1 << sh->luma_log2_weight_denom) + delta_luma_weight_l0;
208 sh->luma_offset_l0[i] = get_se_golomb(gb);
209 } else {
211 sh->luma_offset_l0[i] = 0;
212 }
213 if (chroma_weight_flags & flag_bit) {
214 for (j = 0; j < 2; j++) {
215 int delta_chroma_weight_l0 = get_se_golomb(gb);
216 int delta_chroma_offset_l0 = get_se_golomb(gb);
217
218 if ( (int8_t)delta_chroma_weight_l0 != delta_chroma_weight_l0
219 || delta_chroma_offset_l0 < -(1<<17) || delta_chroma_offset_l0 > (1<<17)) {
220 return AVERROR_INVALIDDATA;
221 }
222
223 sh->chroma_weight_l0[i][j] = (1 << sh->chroma_log2_weight_denom) + delta_chroma_weight_l0;
224 sh->chroma_offset_l0[i][j] = av_clip((delta_chroma_offset_l0 - ((128 * sh->chroma_weight_l0[i][j])
225 >> sh->chroma_log2_weight_denom) + 128), -128, 127);
226 }
227 } else {
229 sh->chroma_offset_l0[i][0] = 0;
231 sh->chroma_offset_l0[i][1] = 0;
232 }
233 }
234 if (sh->slice_type == HEVC_SLICE_B) {
235 luma_weight_flags = get_bits(gb, sh->nb_refs[L1]);
236 chroma_weight_flags = sps->chroma_format_idc != 0 ? get_bits(gb, sh->nb_refs[L1]) : 0;
237 for (i = 0; i < sh->nb_refs[L1]; i++) {
238 unsigned flag_bit = 1 << (sh->nb_refs[L1] - 1 - i);
239
240 if (luma_weight_flags & flag_bit) {
241 int delta_luma_weight_l1 = get_se_golomb(gb);
242 if ((int8_t)delta_luma_weight_l1 != delta_luma_weight_l1)
243 return AVERROR_INVALIDDATA;
244 sh->luma_weight_l1[i] = (1 << sh->luma_log2_weight_denom) + delta_luma_weight_l1;
245 sh->luma_offset_l1[i] = get_se_golomb(gb);
246 } else {
248 sh->luma_offset_l1[i] = 0;
249 }
250 if (chroma_weight_flags & flag_bit) {
251 for (j = 0; j < 2; j++) {
252 int delta_chroma_weight_l1 = get_se_golomb(gb);
253 int delta_chroma_offset_l1 = get_se_golomb(gb);
254
255 if ( (int8_t)delta_chroma_weight_l1 != delta_chroma_weight_l1
256 || delta_chroma_offset_l1 < -(1<<17) || delta_chroma_offset_l1 > (1<<17)) {
257 return AVERROR_INVALIDDATA;
258 }
259
260 sh->chroma_weight_l1[i][j] = (1 << sh->chroma_log2_weight_denom) + delta_chroma_weight_l1;
261 sh->chroma_offset_l1[i][j] = av_clip((delta_chroma_offset_l1 - ((128 * sh->chroma_weight_l1[i][j])
262 >> sh->chroma_log2_weight_denom) + 128), -128, 127);
263 }
264 } else {
266 sh->chroma_offset_l1[i][0] = 0;
268 sh->chroma_offset_l1[i][1] = 0;
269 }
270 }
271 }
272 return 0;
273}
274
275static int decode_lt_rps(const HEVCSPS *sps, LongTermRPS *rps,
276 GetBitContext *gb, int cur_poc, int poc_lsb)
277{
278 int max_poc_lsb = 1 << sps->log2_max_poc_lsb;
279 int prev_delta_msb = 0;
280 unsigned int nb_sps = 0, nb_sh;
281 int i;
282
283 rps->nb_refs = 0;
284 if (!sps->long_term_ref_pics_present)
285 return 0;
286
287 if (sps->num_long_term_ref_pics_sps > 0)
288 nb_sps = get_ue_golomb_long(gb);
289 nb_sh = get_ue_golomb_long(gb);
290
291 if (nb_sps > sps->num_long_term_ref_pics_sps)
292 return AVERROR_INVALIDDATA;
293 if (nb_sh + (uint64_t)nb_sps > FF_ARRAY_ELEMS(rps->poc))
294 return AVERROR_INVALIDDATA;
295
296 rps->nb_refs = nb_sh + nb_sps;
297
298 for (i = 0; i < rps->nb_refs; i++) {
299
300 if (i < nb_sps) {
301 uint8_t lt_idx_sps = 0;
302
303 if (sps->num_long_term_ref_pics_sps > 1)
304 lt_idx_sps = get_bits(gb, av_ceil_log2(sps->num_long_term_ref_pics_sps));
305
306 rps->poc[i] = sps->lt_ref_pic_poc_lsb_sps[lt_idx_sps];
307 rps->used[i] = !!(sps->used_by_curr_pic_lt & (1U << lt_idx_sps));
308 } else {
309 rps->poc[i] = get_bits(gb, sps->log2_max_poc_lsb);
310 rps->used[i] = get_bits1(gb);
311 }
312
313 rps->poc_msb_present[i] = get_bits1(gb);
314 if (rps->poc_msb_present[i]) {
316 int64_t poc;
317
318 if (i && i != nb_sps)
319 delta += prev_delta_msb;
320
321 poc = rps->poc[i] + cur_poc - delta * max_poc_lsb - poc_lsb;
322 if (poc != (int32_t)poc)
323 return AVERROR_INVALIDDATA;
324 rps->poc[i] = poc;
325 prev_delta_msb = delta;
326 }
327 }
328
329 return 0;
330}
331
333{
334 AVCodecContext *avctx = s->avctx;
335 const HEVCVPS *vps = sps->vps;
336 const HEVCWindow *ow = &sps->output_window;
337 unsigned int num = 0, den = 0;
338
339 avctx->pix_fmt = sps->pix_fmt;
340 avctx->coded_width = sps->width;
341 avctx->coded_height = sps->height;
342 avctx->width = sps->width - ow->left_offset - ow->right_offset;
343 avctx->height = sps->height - ow->top_offset - ow->bottom_offset;
344 avctx->has_b_frames = sps->temporal_layer[sps->max_sub_layers - 1].num_reorder_pics;
345 avctx->profile = sps->ptl.general_ptl.profile_idc;
346 avctx->level = sps->ptl.general_ptl.level_idc;
347
348 ff_set_sar(avctx, sps->vui.common.sar);
349
350 if (sps->vui.common.video_signal_type_present_flag)
351 avctx->color_range = sps->vui.common.video_full_range_flag ? AVCOL_RANGE_JPEG
353 else
355
356 if (sps->vui.common.colour_description_present_flag) {
357 avctx->color_primaries = sps->vui.common.colour_primaries;
358 avctx->color_trc = sps->vui.common.transfer_characteristics;
359 avctx->colorspace = sps->vui.common.matrix_coeffs;
360 } else {
364 }
365
367 if (sps->chroma_format_idc == 1) {
368 if (sps->vui.common.chroma_loc_info_present_flag) {
369 if (sps->vui.common.chroma_sample_loc_type_top_field <= 5)
370 avctx->chroma_sample_location = sps->vui.common.chroma_sample_loc_type_top_field + 1;
371 } else
373 }
374
375 if (vps->vps_timing_info_present_flag) {
376 num = vps->vps_num_units_in_tick;
377 den = vps->vps_time_scale;
378 } else if (sps->vui.vui_timing_info_present_flag) {
379 num = sps->vui.vui_num_units_in_tick;
380 den = sps->vui.vui_time_scale;
381 }
382
383 if (num > 0 && den > 0)
384 av_reduce(&avctx->framerate.den, &avctx->framerate.num,
385 num, den, 1 << 30);
386}
387
389{
390 AVCodecContext *avctx = s->avctx;
391
392 if (s->sei.common.alternative_transfer.present &&
393 av_color_transfer_name(s->sei.common.alternative_transfer.preferred_transfer_characteristics) &&
394 s->sei.common.alternative_transfer.preferred_transfer_characteristics != AVCOL_TRC_UNSPECIFIED) {
395 avctx->color_trc = s->sei.common.alternative_transfer.preferred_transfer_characteristics;
396 }
397
398 return 0;
399}
400
402{
403 const HEVCSEITDRDI *tdrdi = &s->sei.tdrdi;
404
405 av_freep(&s->view_ids_available);
406 s->nb_view_ids_available = 0;
407 av_freep(&s->view_pos_available);
408 s->nb_view_pos_available = 0;
409
410 // don't export anything in the trivial case (1 layer, view id=0)
411 if (vps->nb_layers < 2 && !vps->view_id[0])
412 return 0;
413
414 s->view_ids_available = av_calloc(vps->nb_layers, sizeof(*s->view_ids_available));
415 if (!s->view_ids_available)
416 return AVERROR(ENOMEM);
417
418 if (tdrdi->num_ref_displays) {
419 s->view_pos_available = av_calloc(vps->nb_layers, sizeof(*s->view_pos_available));
420 if (!s->view_pos_available)
421 return AVERROR(ENOMEM);
422 }
423
424 for (int i = 0; i < vps->nb_layers; i++) {
425 s->view_ids_available[i] = vps->view_id[i];
426
427 if (s->view_pos_available) {
428 s->view_pos_available[i] = vps->view_id[i] == tdrdi->left_view_id[0] ?
430 vps->view_id[i] == tdrdi->right_view_id[0] ?
432 }
433 }
434 s->nb_view_ids_available = vps->nb_layers;
435 s->nb_view_pos_available = s->view_pos_available ? vps->nb_layers : 0;
436
437 return 0;
438}
439
441{
442 const HEVCVPS *vps = s->vps;
443 int ret = 0;
444
445 if (vps->nb_layers != 2 || !vps->layer_id_in_nuh[1])
446 return 0;
447
448 /* decode_vps_ext() guarantees that SCALABILITY_AUXILIARY with AuxId other
449 * than alpha cannot reach here.
450 */
451 ret = (s->vps->scalability_mask_flag & HEVC_SCALABILITY_AUXILIARY);
452
453 av_log(s->avctx, AV_LOG_DEBUG, "Multi layer video, %s alpha video\n",
454 ret ? "is" : "not");
455
456 return ret;
457}
458
460 unsigned *active_output)
461{
462 unsigned layers_active_output = 0, highest_layer;
463
464 // nothing requested - decode base layer only
465 if (!s->nb_view_ids) {
466 *active_output = 1;
467 return 1;
468 }
469
470 if (s->nb_view_ids == 1 && s->view_ids[0] == -1) {
471 layers_active_output = (1 << vps->nb_layers) - 1;
472 } else {
473 for (int i = 0; i < s->nb_view_ids; i++) {
474 int view_id = s->view_ids[i];
475 int layer_idx = -1;
476
477 if (view_id < 0) {
478 av_log(s->avctx, AV_LOG_ERROR,
479 "Invalid view ID requested: %d\n", view_id);
480 return AVERROR(EINVAL);
481 }
482
483 for (int j = 0; j < vps->nb_layers; j++) {
484 if (vps->view_id[j] == view_id) {
485 layer_idx = j;
486 break;
487 }
488 }
489 if (layer_idx < 0) {
490 av_log(s->avctx, AV_LOG_ERROR,
491 "View ID %d not present in VPS\n", view_id);
492 return AVERROR(EINVAL);
493 }
494 layers_active_output |= 1 << layer_idx;
495 }
496 }
497
498 if (!layers_active_output) {
499 av_log(s->avctx, AV_LOG_ERROR, "No layers selected\n");
500 return AVERROR_BUG;
501 }
502
503 highest_layer = ff_log2(layers_active_output);
504 if (highest_layer >= FF_ARRAY_ELEMS(s->layers)) {
505 av_log(s->avctx, AV_LOG_ERROR,
506 "Too many layers requested: %u\n", layers_active_output);
507 return AVERROR(EINVAL);
508 }
509
510 *active_output = layers_active_output;
511
512 /* Assume a higher layer depends on all the lower ones.
513 * This is enforced in VPS parsing currently, this logic will need
514 * to be changed if we want to support more complex dependency structures.
515 */
516 return highest_layer + 1;
517}
518
520{
521 unsigned layers_active_output;
522 int nb_decode_layers;
523
524 s->layers_active_output = 1;
525 s->layers_active_decode = 1;
526
528 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
529
530 if (!(desc->flags & AV_PIX_FMT_FLAG_ALPHA))
531 return 0;
532
533 s->layers_active_decode = (1 << vps->nb_layers) - 1;
534 s->layers_active_output = 1;
535
536 return 0;
537 }
538
539 nb_decode_layers = ff_hevc_requested_layers(s, vps, &layers_active_output);
540 if (nb_decode_layers < 0)
541 return nb_decode_layers;
542
543 s->layers_active_decode = (1 << nb_decode_layers) - 1;
544 s->layers_active_output = layers_active_output;
545
546 av_log(s->avctx, AV_LOG_DEBUG, "decode/output layers: %x/%x\n",
547 s->layers_active_decode, s->layers_active_output);
548
549 return 0;
550}
551
554{
555 switch (pix_fmt) {
558 return AV_PIX_FMT_YUVA420P;
562 return AV_PIX_FMT_YUVA444P;
564 return AV_PIX_FMT_YUVA422P;
573 default:
574 av_log(s->avctx, AV_LOG_WARNING, "No alpha pixel format map for %s\n",
576 return AV_PIX_FMT_NONE;
577 }
578}
579
581{
582#define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \
583 CONFIG_HEVC_D3D11VA_HWACCEL * 2 + \
584 CONFIG_HEVC_D3D12VA_HWACCEL + \
585 CONFIG_HEVC_NVDEC_HWACCEL + \
586 CONFIG_HEVC_NVDEC_CUARRAY_HWACCEL + \
587 CONFIG_HEVC_VAAPI_HWACCEL + \
588 CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \
589 CONFIG_HEVC_VDPAU_HWACCEL + \
590 CONFIG_HEVC_VULKAN_HWACCEL)
591 enum AVPixelFormat pix_fmts[HWACCEL_MAX + 3], *fmt = pix_fmts;
592 enum AVPixelFormat alpha_fmt = AV_PIX_FMT_NONE;
593 int ret;
594
596 alpha_fmt = map_to_alpha_format(s, sps->pix_fmt);
597
598 switch (sps->pix_fmt) {
601#if CONFIG_HEVC_DXVA2_HWACCEL
602 *fmt++ = AV_PIX_FMT_DXVA2_VLD;
603#endif
604#if CONFIG_HEVC_D3D11VA_HWACCEL
605 *fmt++ = AV_PIX_FMT_D3D11VA_VLD;
606 *fmt++ = AV_PIX_FMT_D3D11;
607#endif
608#if CONFIG_HEVC_D3D12VA_HWACCEL
609 *fmt++ = AV_PIX_FMT_D3D12;
610#endif
611#if CONFIG_HEVC_VAAPI_HWACCEL
612 *fmt++ = AV_PIX_FMT_VAAPI;
613#endif
614#if CONFIG_HEVC_VDPAU_HWACCEL
615 *fmt++ = AV_PIX_FMT_VDPAU;
616#endif
617#if CONFIG_HEVC_NVDEC_HWACCEL
618 *fmt++ = AV_PIX_FMT_CUDA;
619#endif
620#if CONFIG_HEVC_NVDEC_CUARRAY_HWACCEL
621 *fmt++ = AV_PIX_FMT_CUARRAY;
622#endif
623#if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
625#endif
626#if CONFIG_HEVC_VULKAN_HWACCEL
627 *fmt++ = AV_PIX_FMT_VULKAN;
628#endif
629 break;
631#if CONFIG_HEVC_DXVA2_HWACCEL
632 *fmt++ = AV_PIX_FMT_DXVA2_VLD;
633#endif
634#if CONFIG_HEVC_D3D11VA_HWACCEL
635 *fmt++ = AV_PIX_FMT_D3D11VA_VLD;
636 *fmt++ = AV_PIX_FMT_D3D11;
637#endif
638#if CONFIG_HEVC_D3D12VA_HWACCEL
639 *fmt++ = AV_PIX_FMT_D3D12;
640#endif
641#if CONFIG_HEVC_VAAPI_HWACCEL
642 *fmt++ = AV_PIX_FMT_VAAPI;
643#endif
644#if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
646#endif
647#if CONFIG_HEVC_VULKAN_HWACCEL
648 *fmt++ = AV_PIX_FMT_VULKAN;
649#endif
650#if CONFIG_HEVC_VDPAU_HWACCEL
651 *fmt++ = AV_PIX_FMT_VDPAU;
652#endif
653#if CONFIG_HEVC_NVDEC_HWACCEL
654 *fmt++ = AV_PIX_FMT_CUDA;
655#endif
656#if CONFIG_HEVC_NVDEC_CUARRAY_HWACCEL
657 *fmt++ = AV_PIX_FMT_CUARRAY;
658#endif
659 break;
661#if CONFIG_HEVC_VAAPI_HWACCEL
662 *fmt++ = AV_PIX_FMT_VAAPI;
663#endif
664#if CONFIG_HEVC_VDPAU_HWACCEL
665 *fmt++ = AV_PIX_FMT_VDPAU;
666#endif
667#if CONFIG_HEVC_NVDEC_HWACCEL
668 *fmt++ = AV_PIX_FMT_CUDA;
669#endif
670#if CONFIG_HEVC_NVDEC_CUARRAY_HWACCEL
671 *fmt++ = AV_PIX_FMT_CUARRAY;
672#endif
673#if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
675#endif
676#if CONFIG_HEVC_VULKAN_HWACCEL
677 *fmt++ = AV_PIX_FMT_VULKAN;
678#endif
679 break;
682#if CONFIG_HEVC_VAAPI_HWACCEL
683 *fmt++ = AV_PIX_FMT_VAAPI;
684#endif
685#if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
687#endif
688#if CONFIG_HEVC_VULKAN_HWACCEL
689 *fmt++ = AV_PIX_FMT_VULKAN;
690#endif
691#if CONFIG_HEVC_NVDEC_HWACCEL
692 *fmt++ = AV_PIX_FMT_CUDA;
693#endif
694#if CONFIG_HEVC_NVDEC_CUARRAY_HWACCEL
695 *fmt++ = AV_PIX_FMT_CUARRAY;
696#endif
697 break;
699#if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
701#endif
705#if CONFIG_HEVC_VAAPI_HWACCEL
706 *fmt++ = AV_PIX_FMT_VAAPI;
707#endif
708#if CONFIG_HEVC_VDPAU_HWACCEL
709 *fmt++ = AV_PIX_FMT_VDPAU;
710#endif
711#if CONFIG_HEVC_VULKAN_HWACCEL
712 *fmt++ = AV_PIX_FMT_VULKAN;
713#endif
714#if CONFIG_HEVC_NVDEC_HWACCEL
715 *fmt++ = AV_PIX_FMT_CUDA;
716#endif
717#if CONFIG_HEVC_NVDEC_CUARRAY_HWACCEL
718 *fmt++ = AV_PIX_FMT_CUARRAY;
719#endif
720 break;
722#if CONFIG_HEVC_VAAPI_HWACCEL
723 *fmt++ = AV_PIX_FMT_VAAPI;
724#endif
725#if CONFIG_HEVC_VULKAN_HWACCEL
726 *fmt++ = AV_PIX_FMT_VULKAN;
727#endif
728#if CONFIG_HEVC_NVDEC_HWACCEL
729 *fmt++ = AV_PIX_FMT_CUDA;
730#endif
731#if CONFIG_HEVC_NVDEC_CUARRAY_HWACCEL
732 *fmt++ = AV_PIX_FMT_CUARRAY;
733#endif
734 break;
735 }
736
737 if (alpha_fmt != AV_PIX_FMT_NONE)
738 *fmt++ = alpha_fmt;
739 *fmt++ = sps->pix_fmt;
740 *fmt = AV_PIX_FMT_NONE;
741
742 // export multilayer information from active VPS to the caller,
743 // so it is available in get_format()
744 ret = export_multilayer(s, sps->vps);
745 if (ret < 0)
746 return ret;
747
748 ret = ff_get_format(s->avctx, pix_fmts);
749 if (ret < 0)
750 return ret;
751 s->avctx->pix_fmt = ret;
752
753 // set up multilayer decoding, if requested by caller
754 ret = setup_multilayer(s, sps->vps);
755 if (ret < 0)
756 return ret;
757
758 return 0;
759}
760
762{
763 int ret;
764
767 av_refstruct_unref(&s->vps);
768
769 if (!sps)
770 return 0;
771
772 ret = pic_arrays_init(l, sps);
773 if (ret < 0)
774 goto fail;
775
776 ff_hevc_pred_init(&s->hpc, sps->bit_depth);
777 ff_hevc_dsp_init (&s->hevcdsp, sps->bit_depth);
778 ff_videodsp_init (&s->vdsp, sps->bit_depth);
779
781 s->vps = av_refstruct_ref_c(sps->vps);
782
783 return 0;
784
785fail:
788 return ret;
789}
790
792{
793 const HEVCPPS *pps;
794 const HEVCSPS *sps;
795 const HEVCVPS *vps;
796 unsigned pps_id, layer_idx;
797 int i, ret;
798
799 // Coded parameters
801
803 if (IS_IRAP(s))
805
806 pps_id = get_ue_golomb_long(gb);
807 if (pps_id >= HEVC_MAX_PPS_COUNT || !s->ps.pps_list[pps_id]) {
808 av_log(s->avctx, AV_LOG_ERROR, "PPS id out of range: %d\n", pps_id);
809 return AVERROR_INVALIDDATA;
810 }
811 if (!sh->first_slice_in_pic_flag && s->ps.pps_list[pps_id] != s->pps) {
812 av_log(s->avctx, AV_LOG_ERROR, "PPS changed between slices.\n");
813 return AVERROR_INVALIDDATA;
814 }
815 sh->pps_id = pps_id;
816
817 pps = s->ps.pps_list[pps_id];
818 sps = pps->sps;
819 vps = sps->vps;
820 layer_idx = vps->layer_idx[s->nuh_layer_id];
821
822 if (s->nal_unit_type == HEVC_NAL_CRA_NUT && s->last_eos == 1)
824
826 if (!sh->first_slice_in_pic_flag) {
827 int slice_address_length;
828
829 if (pps->dependent_slice_segments_enabled_flag)
831 if (sh->dependent_slice_segment_flag && !s->slice_initialized) {
832 av_log(s->avctx, AV_LOG_ERROR, "Independent slice segment missing.\n");
833 return AVERROR_INVALIDDATA;
834 }
835
836 slice_address_length = av_ceil_log2(sps->ctb_width *
837 sps->ctb_height);
838 sh->slice_segment_addr = get_bitsz(gb, slice_address_length);
839 if (sh->slice_segment_addr >= sps->ctb_width * sps->ctb_height) {
840 av_log(s->avctx, AV_LOG_ERROR,
841 "Invalid slice segment address: %u.\n",
843 return AVERROR_INVALIDDATA;
844 }
845
848 }
849 } else {
850 sh->slice_segment_addr = sh->slice_addr = 0;
851 }
852
854 for (i = 0; i < pps->num_extra_slice_header_bits; i++)
855 skip_bits(gb, 1); // slice_reserved_undetermined_flag[]
856
858 if (!(sh->slice_type == HEVC_SLICE_I ||
859 sh->slice_type == HEVC_SLICE_P ||
860 sh->slice_type == HEVC_SLICE_B)) {
861 av_log(s->avctx, AV_LOG_ERROR, "Unknown slice type: %d.\n",
862 sh->slice_type);
863 return AVERROR_INVALIDDATA;
864 }
865 if (IS_IRAP(s) && sh->slice_type != HEVC_SLICE_I &&
866 !pps->pps_curr_pic_ref_enabled_flag &&
867 s->nuh_layer_id == 0) {
868 av_log(s->avctx, AV_LOG_ERROR, "Inter slices in an IRAP frame.\n");
869 return AVERROR_INVALIDDATA;
870 }
871
872 // when flag is not present, picture is inferred to be output
873 sh->pic_output_flag = 1;
874 if (pps->output_flag_present_flag)
875 sh->pic_output_flag = get_bits1(gb);
876
877 if (sps->separate_colour_plane)
878 sh->colour_plane_id = get_bits(gb, 2);
879
880 if (!IS_IDR(s) ||
881 (s->nuh_layer_id > 0 &&
882 !(vps->poc_lsb_not_present & (1 << layer_idx)))) {
883 int poc;
884
885 sh->pic_order_cnt_lsb = get_bits(gb, sps->log2_max_poc_lsb);
886 poc = ff_hevc_compute_poc(sps, s->poc_tid0, sh->pic_order_cnt_lsb, s->nal_unit_type);
887 if (!sh->first_slice_in_pic_flag && poc != sh->poc) {
888 av_log(s->avctx, AV_LOG_WARNING,
889 "Ignoring POC change between slices: %d -> %d\n", poc, sh->poc);
890 if (s->avctx->err_recognition & AV_EF_EXPLODE)
891 return AVERROR_INVALIDDATA;
892 poc = sh->poc;
893 }
894 sh->poc = poc;
895 }
896
897 if (!IS_IDR(s)) {
898 int pos;
899
901 pos = get_bits_left(gb);
903 ret = ff_hevc_decode_short_term_rps(gb, s->avctx, &sh->slice_rps, sps, 1);
904 if (ret < 0)
905 return ret;
906
907 sh->short_term_rps = &sh->slice_rps;
908 } else {
909 int numbits, rps_idx;
910
911 if (!sps->nb_st_rps) {
912 av_log(s->avctx, AV_LOG_ERROR, "No ref lists in the SPS.\n");
913 return AVERROR_INVALIDDATA;
914 }
915
916 numbits = av_ceil_log2(sps->nb_st_rps);
917 rps_idx = numbits > 0 ? get_bits(gb, numbits) : 0;
918 sh->short_term_rps = &sps->st_rps[rps_idx];
919 }
921
922 pos = get_bits_left(gb);
923 ret = decode_lt_rps(sps, &sh->long_term_rps, gb, sh->poc, sh->pic_order_cnt_lsb);
924 if (ret < 0) {
925 av_log(s->avctx, AV_LOG_WARNING, "Invalid long term RPS.\n");
926 if (s->avctx->err_recognition & AV_EF_EXPLODE)
927 return AVERROR_INVALIDDATA;
928 }
930
931 if (sps->temporal_mvp_enabled)
933 else
935 } else {
936 sh->poc = 0;
937 sh->pic_order_cnt_lsb = 0;
940 sh->short_term_rps = NULL;
942 sh->long_term_rps.nb_refs = 0;
944 }
945
946 sh->inter_layer_pred = 0;
947 if (s->nuh_layer_id > 0) {
948 int num_direct_ref_layers = vps->num_direct_ref_layers[layer_idx];
949
950 if (vps->default_ref_layers_active)
951 sh->inter_layer_pred = !!num_direct_ref_layers;
952 else if (num_direct_ref_layers) {
953 sh->inter_layer_pred = get_bits1(gb);
954
955 if (sh->inter_layer_pred && num_direct_ref_layers > 1) {
956 av_log(s->avctx, AV_LOG_ERROR,
957 "NumDirectRefLayers>1 not supported\n");
959 }
960 }
961 }
962
963 if (sps->sao_enabled) {
965 if (sps->chroma_format_idc) {
968 }
969 } else {
973 }
974
975 sh->nb_refs[L0] = sh->nb_refs[L1] = 0;
976 if (sh->slice_type == HEVC_SLICE_P || sh->slice_type == HEVC_SLICE_B) {
977 int nb_refs;
978
979 sh->nb_refs[L0] = pps->num_ref_idx_l0_default_active;
980 if (sh->slice_type == HEVC_SLICE_B)
981 sh->nb_refs[L1] = pps->num_ref_idx_l1_default_active;
982
983 if (get_bits1(gb)) { // num_ref_idx_active_override_flag
984 sh->nb_refs[L0] = get_ue_golomb_31(gb) + 1;
985 if (sh->slice_type == HEVC_SLICE_B)
986 sh->nb_refs[L1] = get_ue_golomb_31(gb) + 1;
987 }
988 if (sh->nb_refs[L0] >= HEVC_MAX_REFS || sh->nb_refs[L1] >= HEVC_MAX_REFS) {
989 av_log(s->avctx, AV_LOG_ERROR, "Too many refs: %d/%d.\n",
990 sh->nb_refs[L0], sh->nb_refs[L1]);
991 return AVERROR_INVALIDDATA;
992 }
993
994 sh->rpl_modification_flag[0] = 0;
995 sh->rpl_modification_flag[1] = 0;
996 nb_refs = ff_hevc_frame_nb_refs(sh, pps, layer_idx);
997 if (!nb_refs) {
998 av_log(s->avctx, AV_LOG_ERROR, "Zero refs for a frame with P or B slices.\n");
999 return AVERROR_INVALIDDATA;
1000 }
1001
1002 if (pps->lists_modification_present_flag && nb_refs > 1) {
1003 sh->rpl_modification_flag[0] = get_bits1(gb);
1004 if (sh->rpl_modification_flag[0]) {
1005 for (i = 0; i < sh->nb_refs[L0]; i++)
1006 sh->list_entry_lx[0][i] = get_bits(gb, av_ceil_log2(nb_refs));
1007 }
1008
1009 if (sh->slice_type == HEVC_SLICE_B) {
1010 sh->rpl_modification_flag[1] = get_bits1(gb);
1011 if (sh->rpl_modification_flag[1] == 1)
1012 for (i = 0; i < sh->nb_refs[L1]; i++)
1013 sh->list_entry_lx[1][i] = get_bits(gb, av_ceil_log2(nb_refs));
1014 }
1015 }
1016
1017 if (sh->slice_type == HEVC_SLICE_B)
1018 sh->mvd_l1_zero_flag = get_bits1(gb);
1019
1020 if (pps->cabac_init_present_flag)
1021 sh->cabac_init_flag = get_bits1(gb);
1022 else
1023 sh->cabac_init_flag = 0;
1024
1025 sh->collocated_ref_idx = 0;
1027 sh->collocated_list = L0;
1028 if (sh->slice_type == HEVC_SLICE_B)
1029 sh->collocated_list = !get_bits1(gb);
1030
1031 if (sh->nb_refs[sh->collocated_list] > 1) {
1033 if (sh->collocated_ref_idx >= sh->nb_refs[sh->collocated_list]) {
1034 av_log(s->avctx, AV_LOG_ERROR,
1035 "Invalid collocated_ref_idx: %d.\n",
1036 sh->collocated_ref_idx);
1037 return AVERROR_INVALIDDATA;
1038 }
1039 }
1040 }
1041
1042 if ((pps->weighted_pred_flag && sh->slice_type == HEVC_SLICE_P) ||
1043 (pps->weighted_bipred_flag && sh->slice_type == HEVC_SLICE_B)) {
1044 ret = pred_weight_table(sh, s->avctx, sps, gb);
1045 if (ret < 0)
1046 return ret;
1047 }
1048
1050 if (sh->max_num_merge_cand < 1 || sh->max_num_merge_cand > 5) {
1051 av_log(s->avctx, AV_LOG_ERROR,
1052 "Invalid number of merging MVP candidates: %d.\n",
1053 sh->max_num_merge_cand);
1054 return AVERROR_INVALIDDATA;
1055 }
1056
1057 // Syntax in 7.3.6.1
1058 if (sps->motion_vector_resolution_control_idc == 2)
1060 else
1061 // Inferred to be equal to motion_vector_resolution_control_idc if not present
1062 sh->use_integer_mv_flag = sps->motion_vector_resolution_control_idc;
1063
1064 }
1065
1066 sh->slice_qp_delta = get_se_golomb(gb);
1067
1068 if (pps->pic_slice_level_chroma_qp_offsets_present_flag) {
1071 if (sh->slice_cb_qp_offset < -12 || sh->slice_cb_qp_offset > 12 ||
1072 sh->slice_cr_qp_offset < -12 || sh->slice_cr_qp_offset > 12) {
1073 av_log(s->avctx, AV_LOG_ERROR, "Invalid slice cx qp offset.\n");
1074 return AVERROR_INVALIDDATA;
1075 }
1076 } else {
1077 sh->slice_cb_qp_offset = 0;
1078 sh->slice_cr_qp_offset = 0;
1079 }
1080
1081 if (pps->pps_slice_act_qp_offsets_present_flag) {
1085 }
1086
1087 if (pps->chroma_qp_offset_list_enabled_flag)
1089 else
1091
1092 if (pps->deblocking_filter_control_present_flag) {
1093 int deblocking_filter_override_flag = 0;
1094
1095 if (pps->deblocking_filter_override_enabled_flag)
1096 deblocking_filter_override_flag = get_bits1(gb);
1097
1098 if (deblocking_filter_override_flag) {
1101 int beta_offset_div2 = get_se_golomb(gb);
1102 int tc_offset_div2 = get_se_golomb(gb) ;
1103 if (beta_offset_div2 < -6 || beta_offset_div2 > 6 ||
1104 tc_offset_div2 < -6 || tc_offset_div2 > 6) {
1105 av_log(s->avctx, AV_LOG_ERROR,
1106 "Invalid deblock filter offsets: %d, %d\n",
1107 beta_offset_div2, tc_offset_div2);
1108 return AVERROR_INVALIDDATA;
1109 }
1110 sh->beta_offset = beta_offset_div2 * 2;
1111 sh->tc_offset = tc_offset_div2 * 2;
1112 }
1113 } else {
1114 sh->disable_deblocking_filter_flag = pps->disable_dbf;
1115 sh->beta_offset = pps->beta_offset;
1116 sh->tc_offset = pps->tc_offset;
1117 }
1118 } else {
1120 sh->beta_offset = 0;
1121 sh->tc_offset = 0;
1122 }
1123
1124 if (pps->seq_loop_filter_across_slices_enabled_flag &&
1129 } else {
1130 sh->slice_loop_filter_across_slices_enabled_flag = pps->seq_loop_filter_across_slices_enabled_flag;
1131 }
1132 }
1133
1135 if (pps->tiles_enabled_flag || pps->entropy_coding_sync_enabled_flag) {
1136 unsigned num_entry_point_offsets = get_ue_golomb_long(gb);
1137 // It would be possible to bound this tighter but this here is simpler
1138 if (num_entry_point_offsets > get_bits_left(gb) || num_entry_point_offsets > UINT16_MAX) {
1139 av_log(s->avctx, AV_LOG_ERROR, "num_entry_point_offsets %d is invalid\n", num_entry_point_offsets);
1140 return AVERROR_INVALIDDATA;
1141 }
1142
1143 sh->num_entry_point_offsets = num_entry_point_offsets;
1144 if (sh->num_entry_point_offsets > 0) {
1145 int offset_len = get_ue_golomb_long(gb) + 1;
1146
1147 if (offset_len < 1 || offset_len > 32) {
1149 av_log(s->avctx, AV_LOG_ERROR, "offset_len %d is invalid\n", offset_len);
1150 return AVERROR_INVALIDDATA;
1151 }
1152
1154 av_freep(&sh->offset);
1155 av_freep(&sh->size);
1156 sh->entry_point_offset = av_malloc_array(sh->num_entry_point_offsets, sizeof(unsigned));
1157 sh->offset = av_malloc_array(sh->num_entry_point_offsets + 1, sizeof(int));
1158 sh->size = av_malloc_array(sh->num_entry_point_offsets + 1, sizeof(int));
1159 if (!sh->entry_point_offset || !sh->offset || !sh->size) {
1161 av_log(s->avctx, AV_LOG_ERROR, "Failed to allocate memory\n");
1162 return AVERROR(ENOMEM);
1163 }
1164 for (i = 0; i < sh->num_entry_point_offsets; i++) {
1165 unsigned val = get_bits_long(gb, offset_len);
1166 sh->entry_point_offset[i] = val + 1; // +1; // +1 to get the size
1167 }
1168 }
1169 }
1170
1171 if (pps->slice_header_extension_present_flag) {
1172 unsigned int length = get_ue_golomb_long(gb);
1173 if (length*8LL > get_bits_left(gb)) {
1174 av_log(s->avctx, AV_LOG_ERROR, "too many slice_header_extension_data_bytes\n");
1175 return AVERROR_INVALIDDATA;
1176 }
1177 for (i = 0; i < length; i++)
1178 skip_bits(gb, 8); // slice_header_extension_data_byte
1179 }
1180
1181 ret = get_bits1(gb);
1182 if (!ret && get_bits_left(gb) >= 0) {
1183 av_log(s->avctx, AV_LOG_ERROR, "alignment_bit_equal_to_one=0\n");
1184 return AVERROR_INVALIDDATA;
1185 }
1186 sh->data_offset = align_get_bits(gb) - gb->buffer;
1187
1188 if (get_bits_left(gb) < 0) {
1189 av_log(s->avctx, AV_LOG_ERROR,
1190 "Overread slice header by %d bits\n", -get_bits_left(gb));
1191 return AVERROR_INVALIDDATA;
1192 }
1193
1194 // Inferred parameters
1195 sh->slice_qp = 26U + pps->pic_init_qp_minus26 + sh->slice_qp_delta;
1196 if (sh->slice_qp > 51 ||
1197 sh->slice_qp < -sps->qp_bd_offset) {
1198 av_log(s->avctx, AV_LOG_ERROR,
1199 "The slice_qp %d is outside the valid range "
1200 "[%d, 51].\n",
1201 sh->slice_qp,
1202 -sps->qp_bd_offset);
1203 return AVERROR_INVALIDDATA;
1204 }
1205
1207
1209 (!sh->slice_ctb_addr_rs || !pps->ctb_addr_rs_to_ts[sh->slice_ctb_addr_rs])) {
1210 av_log(s->avctx, AV_LOG_ERROR, "Impossible slice segment.\n");
1211 return AVERROR_INVALIDDATA;
1212 }
1213
1214 return 0;
1215}
1216
1217#define CTB(tab, x, y) ((tab)[(y) * sps->ctb_width + (x)])
1218
1219#define SET_SAO(elem, value) \
1220do { \
1221 if (!sao_merge_up_flag && !sao_merge_left_flag) \
1222 sao->elem = value; \
1223 else if (sao_merge_left_flag) \
1224 sao->elem = CTB(l->sao, rx-1, ry).elem; \
1225 else if (sao_merge_up_flag) \
1226 sao->elem = CTB(l->sao, rx, ry-1).elem; \
1227 else \
1228 sao->elem = 0; \
1229} while (0)
1230
1232 const HEVCPPS *pps, const HEVCSPS *sps,
1233 int rx, int ry)
1234{
1235 const HEVCContext *const s = lc->parent;
1236 int sao_merge_left_flag = 0;
1237 int sao_merge_up_flag = 0;
1238 SAOParams *sao = &CTB(l->sao, rx, ry);
1239 int c_idx, i;
1240
1241 if (s->sh.slice_sample_adaptive_offset_flag[0] ||
1242 s->sh.slice_sample_adaptive_offset_flag[1]) {
1243 if (rx > 0) {
1244 if (lc->ctb_left_flag)
1245 sao_merge_left_flag = ff_hevc_sao_merge_flag_decode(lc);
1246 }
1247 if (ry > 0 && !sao_merge_left_flag) {
1248 if (lc->ctb_up_flag)
1249 sao_merge_up_flag = ff_hevc_sao_merge_flag_decode(lc);
1250 }
1251 }
1252
1253 for (c_idx = 0; c_idx < (sps->chroma_format_idc ? 3 : 1); c_idx++) {
1254 int log2_sao_offset_scale = c_idx == 0 ? pps->log2_sao_offset_scale_luma :
1255 pps->log2_sao_offset_scale_chroma;
1256
1257 if (!s->sh.slice_sample_adaptive_offset_flag[c_idx]) {
1258 sao->type_idx[c_idx] = SAO_NOT_APPLIED;
1259 continue;
1260 }
1261
1262 if (c_idx == 2) {
1263 sao->type_idx[2] = sao->type_idx[1];
1264 sao->eo_class[2] = sao->eo_class[1];
1265 } else {
1266 SET_SAO(type_idx[c_idx], ff_hevc_sao_type_idx_decode(lc));
1267 }
1268
1269 if (sao->type_idx[c_idx] == SAO_NOT_APPLIED)
1270 continue;
1271
1272 for (i = 0; i < 4; i++)
1273 SET_SAO(offset_abs[c_idx][i], ff_hevc_sao_offset_abs_decode(lc, sps->bit_depth));
1274
1275 if (sao->type_idx[c_idx] == SAO_BAND) {
1276 for (i = 0; i < 4; i++) {
1277 if (sao->offset_abs[c_idx][i]) {
1278 SET_SAO(offset_sign[c_idx][i],
1280 } else {
1281 sao->offset_sign[c_idx][i] = 0;
1282 }
1283 }
1284 SET_SAO(band_position[c_idx], ff_hevc_sao_band_position_decode(lc));
1285 } else if (c_idx != 2) {
1286 SET_SAO(eo_class[c_idx], ff_hevc_sao_eo_class_decode(lc));
1287 }
1288
1289 // Inferred parameters
1290 sao->offset_val[c_idx][0] = 0;
1291 for (i = 0; i < 4; i++) {
1292 sao->offset_val[c_idx][i + 1] = sao->offset_abs[c_idx][i];
1293 if (sao->type_idx[c_idx] == SAO_EDGE) {
1294 if (i > 1)
1295 sao->offset_val[c_idx][i + 1] = -sao->offset_val[c_idx][i + 1];
1296 } else if (sao->offset_sign[c_idx][i]) {
1297 sao->offset_val[c_idx][i + 1] = -sao->offset_val[c_idx][i + 1];
1298 }
1299 sao->offset_val[c_idx][i + 1] *= 1 << log2_sao_offset_scale;
1300 }
1301 }
1302}
1303
1304#undef SET_SAO
1305#undef CTB
1306
1308{
1309 int log2_res_scale_abs_plus1 = ff_hevc_log2_res_scale_abs(lc, idx);
1310
1311 if (log2_res_scale_abs_plus1 != 0) {
1312 int res_scale_sign_flag = ff_hevc_res_scale_sign_flag(lc, idx);
1313 lc->tu.res_scale_val = (1 << (log2_res_scale_abs_plus1 - 1)) *
1314 (1 - 2 * res_scale_sign_flag);
1315 } else {
1316 lc->tu.res_scale_val = 0;
1317 }
1318
1319
1320 return 0;
1321}
1322
1324 const HEVCLayerContext *l,
1325 const HEVCPPS *pps, const HEVCSPS *sps,
1326 int x0, int y0,
1327 int xBase, int yBase, int cb_xBase, int cb_yBase,
1328 int log2_cb_size, int log2_trafo_size,
1329 int blk_idx, int cbf_luma, int *cbf_cb, int *cbf_cr)
1330{
1331 const HEVCContext *const s = lc->parent;
1332 const int log2_trafo_size_c = log2_trafo_size - sps->hshift[1];
1333 int i;
1334
1335 if (lc->cu.pred_mode == MODE_INTRA) {
1336 int trafo_size = 1 << log2_trafo_size;
1337 ff_hevc_set_neighbour_available(lc, x0, y0, trafo_size, trafo_size, sps->log2_ctb_size);
1338
1339 s->hpc.intra_pred[log2_trafo_size - 2](lc, pps, x0, y0, 0);
1340 }
1341
1342 if (cbf_luma || cbf_cb[0] || cbf_cr[0] ||
1343 (sps->chroma_format_idc == 2 && (cbf_cb[1] || cbf_cr[1]))) {
1344 int scan_idx = SCAN_DIAG;
1345 int scan_idx_c = SCAN_DIAG;
1346 int cbf_chroma = cbf_cb[0] || cbf_cr[0] ||
1347 (sps->chroma_format_idc == 2 &&
1348 (cbf_cb[1] || cbf_cr[1]));
1349
1350 if (pps->cu_qp_delta_enabled_flag && !lc->tu.is_cu_qp_delta_coded) {
1352 if (lc->tu.cu_qp_delta != 0)
1353 if (ff_hevc_cu_qp_delta_sign_flag(lc) == 1)
1354 lc->tu.cu_qp_delta = -lc->tu.cu_qp_delta;
1355 lc->tu.is_cu_qp_delta_coded = 1;
1356
1357 if (lc->tu.cu_qp_delta < -(26 + sps->qp_bd_offset / 2) ||
1358 lc->tu.cu_qp_delta > (25 + sps->qp_bd_offset / 2)) {
1359 av_log(s->avctx, AV_LOG_ERROR,
1360 "The cu_qp_delta %d is outside the valid range "
1361 "[%d, %d].\n",
1362 lc->tu.cu_qp_delta,
1363 -(26 + sps->qp_bd_offset / 2),
1364 (25 + sps->qp_bd_offset / 2));
1365 return AVERROR_INVALIDDATA;
1366 }
1367
1368 ff_hevc_set_qPy(lc, l, pps, cb_xBase, cb_yBase, log2_cb_size);
1369 }
1370
1371 if (s->sh.cu_chroma_qp_offset_enabled_flag && cbf_chroma &&
1373 int cu_chroma_qp_offset_flag = ff_hevc_cu_chroma_qp_offset_flag(lc);
1374 if (cu_chroma_qp_offset_flag) {
1375 int cu_chroma_qp_offset_idx = 0;
1376 if (pps->chroma_qp_offset_list_len_minus1 > 0) {
1377 cu_chroma_qp_offset_idx = ff_hevc_cu_chroma_qp_offset_idx(lc, pps->chroma_qp_offset_list_len_minus1);
1378 av_log(s->avctx, AV_LOG_ERROR,
1379 "cu_chroma_qp_offset_idx not yet tested.\n");
1380 }
1381 lc->tu.cu_qp_offset_cb = pps->cb_qp_offset_list[cu_chroma_qp_offset_idx];
1382 lc->tu.cu_qp_offset_cr = pps->cr_qp_offset_list[cu_chroma_qp_offset_idx];
1383 } else {
1384 lc->tu.cu_qp_offset_cb = 0;
1385 lc->tu.cu_qp_offset_cr = 0;
1386 }
1388 }
1389
1390 if (lc->cu.pred_mode == MODE_INTRA && log2_trafo_size < 4) {
1391 if (lc->tu.intra_pred_mode >= 6 &&
1392 lc->tu.intra_pred_mode <= 14) {
1393 scan_idx = SCAN_VERT;
1394 } else if (lc->tu.intra_pred_mode >= 22 &&
1395 lc->tu.intra_pred_mode <= 30) {
1396 scan_idx = SCAN_HORIZ;
1397 }
1398
1399 if (lc->tu.intra_pred_mode_c >= 6 &&
1400 lc->tu.intra_pred_mode_c <= 14) {
1401 scan_idx_c = SCAN_VERT;
1402 } else if (lc->tu.intra_pred_mode_c >= 22 &&
1403 lc->tu.intra_pred_mode_c <= 30) {
1404 scan_idx_c = SCAN_HORIZ;
1405 }
1406 }
1407
1408 lc->tu.cross_pf = 0;
1409
1410 if (cbf_luma)
1411 ff_hevc_hls_residual_coding(lc, pps, x0, y0, log2_trafo_size, scan_idx, 0);
1412 if (sps->chroma_format_idc && (log2_trafo_size > 2 || sps->chroma_format_idc == 3)) {
1413 int trafo_size_h = 1 << (log2_trafo_size_c + sps->hshift[1]);
1414 int trafo_size_v = 1 << (log2_trafo_size_c + sps->vshift[1]);
1415 lc->tu.cross_pf = (pps->cross_component_prediction_enabled_flag && cbf_luma &&
1416 (lc->cu.pred_mode == MODE_INTER ||
1417 (lc->tu.chroma_mode_c == 4)));
1418
1419 if (lc->tu.cross_pf) {
1421 }
1422 for (i = 0; i < (sps->chroma_format_idc == 2 ? 2 : 1); i++) {
1423 if (lc->cu.pred_mode == MODE_INTRA) {
1424 ff_hevc_set_neighbour_available(lc, x0, y0 + (i << log2_trafo_size_c),
1425 trafo_size_h, trafo_size_v, sps->log2_ctb_size);
1426 s->hpc.intra_pred[log2_trafo_size_c - 2](lc, pps, x0, y0 + (i << log2_trafo_size_c), 1);
1427 }
1428 if (cbf_cb[i])
1429 ff_hevc_hls_residual_coding(lc, pps, x0, y0 + (i << log2_trafo_size_c),
1430 log2_trafo_size_c, scan_idx_c, 1);
1431 else
1432 if (lc->tu.cross_pf) {
1433 ptrdiff_t stride = s->cur_frame->f->linesize[1];
1434 int hshift = sps->hshift[1];
1435 int vshift = sps->vshift[1];
1436 const int16_t *coeffs_y = (int16_t*)lc->edge_emu_buffer;
1437 int16_t *coeffs = (int16_t*)lc->edge_emu_buffer2;
1438 int size = 1 << log2_trafo_size_c;
1439
1440 uint8_t *dst = &s->cur_frame->f->data[1][(y0 >> vshift) * stride +
1441 ((x0 >> hshift) << sps->pixel_shift)];
1442 for (i = 0; i < (size * size); i++) {
1443 coeffs[i] = ((lc->tu.res_scale_val * coeffs_y[i]) >> 3);
1444 }
1445 s->hevcdsp.add_residual[log2_trafo_size_c-2](dst, coeffs, stride);
1446 }
1447 }
1448
1449 if (lc->tu.cross_pf) {
1451 }
1452 for (i = 0; i < (sps->chroma_format_idc == 2 ? 2 : 1); i++) {
1453 if (lc->cu.pred_mode == MODE_INTRA) {
1454 ff_hevc_set_neighbour_available(lc, x0, y0 + (i << log2_trafo_size_c),
1455 trafo_size_h, trafo_size_v, sps->log2_ctb_size);
1456 s->hpc.intra_pred[log2_trafo_size_c - 2](lc, pps, x0, y0 + (i << log2_trafo_size_c), 2);
1457 }
1458 if (cbf_cr[i])
1459 ff_hevc_hls_residual_coding(lc, pps, x0, y0 + (i << log2_trafo_size_c),
1460 log2_trafo_size_c, scan_idx_c, 2);
1461 else
1462 if (lc->tu.cross_pf) {
1463 ptrdiff_t stride = s->cur_frame->f->linesize[2];
1464 int hshift = sps->hshift[2];
1465 int vshift = sps->vshift[2];
1466 const int16_t *coeffs_y = (int16_t*)lc->edge_emu_buffer;
1467 int16_t *coeffs = (int16_t*)lc->edge_emu_buffer2;
1468 int size = 1 << log2_trafo_size_c;
1469
1470 uint8_t *dst = &s->cur_frame->f->data[2][(y0 >> vshift) * stride +
1471 ((x0 >> hshift) << sps->pixel_shift)];
1472 for (i = 0; i < (size * size); i++) {
1473 coeffs[i] = ((lc->tu.res_scale_val * coeffs_y[i]) >> 3);
1474 }
1475 s->hevcdsp.add_residual[log2_trafo_size_c-2](dst, coeffs, stride);
1476 }
1477 }
1478 } else if (sps->chroma_format_idc && blk_idx == 3) {
1479 int trafo_size_h = 1 << (log2_trafo_size + 1);
1480 int trafo_size_v = 1 << (log2_trafo_size + sps->vshift[1]);
1481 for (i = 0; i < (sps->chroma_format_idc == 2 ? 2 : 1); i++) {
1482 if (lc->cu.pred_mode == MODE_INTRA) {
1483 ff_hevc_set_neighbour_available(lc, xBase, yBase + (i << log2_trafo_size),
1484 trafo_size_h, trafo_size_v, sps->log2_ctb_size);
1485 s->hpc.intra_pred[log2_trafo_size - 2](lc, pps, xBase, yBase + (i << log2_trafo_size), 1);
1486 }
1487 if (cbf_cb[i])
1488 ff_hevc_hls_residual_coding(lc, pps, xBase, yBase + (i << log2_trafo_size),
1489 log2_trafo_size, scan_idx_c, 1);
1490 }
1491 for (i = 0; i < (sps->chroma_format_idc == 2 ? 2 : 1); i++) {
1492 if (lc->cu.pred_mode == MODE_INTRA) {
1493 ff_hevc_set_neighbour_available(lc, xBase, yBase + (i << log2_trafo_size),
1494 trafo_size_h, trafo_size_v, sps->log2_ctb_size);
1495 s->hpc.intra_pred[log2_trafo_size - 2](lc, pps, xBase, yBase + (i << log2_trafo_size), 2);
1496 }
1497 if (cbf_cr[i])
1498 ff_hevc_hls_residual_coding(lc, pps, xBase, yBase + (i << log2_trafo_size),
1499 log2_trafo_size, scan_idx_c, 2);
1500 }
1501 }
1502 } else if (sps->chroma_format_idc && lc->cu.pred_mode == MODE_INTRA) {
1503 if (log2_trafo_size > 2 || sps->chroma_format_idc == 3) {
1504 int trafo_size_h = 1 << (log2_trafo_size_c + sps->hshift[1]);
1505 int trafo_size_v = 1 << (log2_trafo_size_c + sps->vshift[1]);
1506 ff_hevc_set_neighbour_available(lc, x0, y0, trafo_size_h, trafo_size_v,
1507 sps->log2_ctb_size);
1508 s->hpc.intra_pred[log2_trafo_size_c - 2](lc, pps, x0, y0, 1);
1509 s->hpc.intra_pred[log2_trafo_size_c - 2](lc, pps, x0, y0, 2);
1510 if (sps->chroma_format_idc == 2) {
1511 ff_hevc_set_neighbour_available(lc, x0, y0 + (1 << log2_trafo_size_c),
1512 trafo_size_h, trafo_size_v, sps->log2_ctb_size);
1513 s->hpc.intra_pred[log2_trafo_size_c - 2](lc, pps, x0, y0 + (1 << log2_trafo_size_c), 1);
1514 s->hpc.intra_pred[log2_trafo_size_c - 2](lc, pps, x0, y0 + (1 << log2_trafo_size_c), 2);
1515 }
1516 } else if (blk_idx == 3) {
1517 int trafo_size_h = 1 << (log2_trafo_size + 1);
1518 int trafo_size_v = 1 << (log2_trafo_size + sps->vshift[1]);
1519 ff_hevc_set_neighbour_available(lc, xBase, yBase,
1520 trafo_size_h, trafo_size_v, sps->log2_ctb_size);
1521 s->hpc.intra_pred[log2_trafo_size - 2](lc, pps, xBase, yBase, 1);
1522 s->hpc.intra_pred[log2_trafo_size - 2](lc, pps, xBase, yBase, 2);
1523 if (sps->chroma_format_idc == 2) {
1524 ff_hevc_set_neighbour_available(lc, xBase, yBase + (1 << log2_trafo_size),
1525 trafo_size_h, trafo_size_v, sps->log2_ctb_size);
1526 s->hpc.intra_pred[log2_trafo_size - 2](lc, pps, xBase, yBase + (1 << log2_trafo_size), 1);
1527 s->hpc.intra_pred[log2_trafo_size - 2](lc, pps, xBase, yBase + (1 << log2_trafo_size), 2);
1528 }
1529 }
1530 }
1531
1532 return 0;
1533}
1534
1535static void set_deblocking_bypass(uint8_t *is_pcm, const HEVCSPS *sps,
1536 int x0, int y0, int log2_cb_size)
1537{
1538 int cb_size = 1 << log2_cb_size;
1539 int log2_min_pu_size = sps->log2_min_pu_size;
1540
1541 int min_pu_width = sps->min_pu_width;
1542 int x_end = FFMIN(x0 + cb_size, sps->width);
1543 int y_end = FFMIN(y0 + cb_size, sps->height);
1544 int i, j;
1545
1546 for (j = (y0 >> log2_min_pu_size); j < (y_end >> log2_min_pu_size); j++)
1547 for (i = (x0 >> log2_min_pu_size); i < (x_end >> log2_min_pu_size); i++)
1548 is_pcm[i + j * min_pu_width] = 2;
1549}
1550
1552 const HEVCLayerContext *l,
1553 const HEVCPPS *pps, const HEVCSPS *sps,
1554 int x0, int y0,
1555 int xBase, int yBase, int cb_xBase, int cb_yBase,
1556 int log2_cb_size, int log2_trafo_size,
1557 int trafo_depth, int blk_idx,
1558 const int *base_cbf_cb, const int *base_cbf_cr)
1559{
1560 const HEVCContext *const s = lc->parent;
1561 uint8_t split_transform_flag;
1562 int cbf_cb[2];
1563 int cbf_cr[2];
1564 int ret;
1565
1566 cbf_cb[0] = base_cbf_cb[0];
1567 cbf_cb[1] = base_cbf_cb[1];
1568 cbf_cr[0] = base_cbf_cr[0];
1569 cbf_cr[1] = base_cbf_cr[1];
1570
1571 if (lc->cu.intra_split_flag) {
1572 if (trafo_depth == 1) {
1573 lc->tu.intra_pred_mode = lc->pu.intra_pred_mode[blk_idx];
1574 if (sps->chroma_format_idc == 3) {
1575 lc->tu.intra_pred_mode_c = lc->pu.intra_pred_mode_c[blk_idx];
1576 lc->tu.chroma_mode_c = lc->pu.chroma_mode_c[blk_idx];
1577 } else {
1579 lc->tu.chroma_mode_c = lc->pu.chroma_mode_c[0];
1580 }
1581 }
1582 } else {
1583 lc->tu.intra_pred_mode = lc->pu.intra_pred_mode[0];
1585 lc->tu.chroma_mode_c = lc->pu.chroma_mode_c[0];
1586 }
1587
1588 if (log2_trafo_size <= sps->log2_max_trafo_size &&
1589 log2_trafo_size > sps->log2_min_tb_size &&
1590 trafo_depth < lc->cu.max_trafo_depth &&
1591 !(lc->cu.intra_split_flag && trafo_depth == 0)) {
1592 split_transform_flag = ff_hevc_split_transform_flag_decode(lc, log2_trafo_size);
1593 } else {
1594 int inter_split = sps->max_transform_hierarchy_depth_inter == 0 &&
1595 lc->cu.pred_mode == MODE_INTER &&
1596 lc->cu.part_mode != PART_2Nx2N &&
1597 trafo_depth == 0;
1598
1599 split_transform_flag = log2_trafo_size > sps->log2_max_trafo_size ||
1600 (lc->cu.intra_split_flag && trafo_depth == 0) ||
1601 inter_split;
1602 }
1603
1604 if (sps->chroma_format_idc && (log2_trafo_size > 2 || sps->chroma_format_idc == 3)) {
1605 if (trafo_depth == 0 || cbf_cb[0]) {
1606 cbf_cb[0] = ff_hevc_cbf_cb_cr_decode(lc, trafo_depth);
1607 if (sps->chroma_format_idc == 2 && (!split_transform_flag || log2_trafo_size == 3)) {
1608 cbf_cb[1] = ff_hevc_cbf_cb_cr_decode(lc, trafo_depth);
1609 }
1610 }
1611
1612 if (trafo_depth == 0 || cbf_cr[0]) {
1613 cbf_cr[0] = ff_hevc_cbf_cb_cr_decode(lc, trafo_depth);
1614 if (sps->chroma_format_idc == 2 && (!split_transform_flag || log2_trafo_size == 3)) {
1615 cbf_cr[1] = ff_hevc_cbf_cb_cr_decode(lc, trafo_depth);
1616 }
1617 }
1618 }
1619
1620 if (split_transform_flag) {
1621 const int trafo_size_split = 1 << (log2_trafo_size - 1);
1622 const int x1 = x0 + trafo_size_split;
1623 const int y1 = y0 + trafo_size_split;
1624
1625#define SUBDIVIDE(x, y, idx) \
1626do { \
1627 ret = hls_transform_tree(lc, l, pps, sps, \
1628 x, y, x0, y0, cb_xBase, cb_yBase, log2_cb_size, \
1629 log2_trafo_size - 1, trafo_depth + 1, idx, \
1630 cbf_cb, cbf_cr); \
1631 if (ret < 0) \
1632 return ret; \
1633} while (0)
1634
1635 SUBDIVIDE(x0, y0, 0);
1636 SUBDIVIDE(x1, y0, 1);
1637 SUBDIVIDE(x0, y1, 2);
1638 SUBDIVIDE(x1, y1, 3);
1639
1640#undef SUBDIVIDE
1641 } else {
1642 int min_tu_size = 1 << sps->log2_min_tb_size;
1643 int log2_min_tu_size = sps->log2_min_tb_size;
1644 int min_tu_width = sps->min_tb_width;
1645 int cbf_luma = 1;
1646
1647 if (lc->cu.pred_mode == MODE_INTRA || trafo_depth != 0 ||
1648 cbf_cb[0] || cbf_cr[0] ||
1649 (sps->chroma_format_idc == 2 && (cbf_cb[1] || cbf_cr[1]))) {
1650 cbf_luma = ff_hevc_cbf_luma_decode(lc, trafo_depth);
1651 }
1652
1653 ret = hls_transform_unit(lc, l, pps, sps,
1654 x0, y0, xBase, yBase, cb_xBase, cb_yBase,
1655 log2_cb_size, log2_trafo_size,
1656 blk_idx, cbf_luma, cbf_cb, cbf_cr);
1657 if (ret < 0)
1658 return ret;
1659 // TODO: store cbf_luma somewhere else
1660 if (cbf_luma) {
1661 int i, j;
1662 for (i = 0; i < (1 << log2_trafo_size); i += min_tu_size)
1663 for (j = 0; j < (1 << log2_trafo_size); j += min_tu_size) {
1664 int x_tu = (x0 + j) >> log2_min_tu_size;
1665 int y_tu = (y0 + i) >> log2_min_tu_size;
1666 l->cbf_luma[y_tu * min_tu_width + x_tu] = 1;
1667 }
1668 }
1669 if (!s->sh.disable_deblocking_filter_flag) {
1670 ff_hevc_deblocking_boundary_strengths(lc, l, pps, x0, y0, log2_trafo_size);
1671 if (pps->transquant_bypass_enable_flag &&
1673 set_deblocking_bypass(l->is_pcm, sps, x0, y0, log2_trafo_size);
1674 }
1675 }
1676 return 0;
1677}
1678
1680 const HEVCPPS *pps, int x0, int y0, int log2_cb_size)
1681{
1682 const HEVCContext *const s = lc->parent;
1683 const HEVCSPS *const sps = pps->sps;
1684 GetBitContext gb;
1685 int cb_size = 1 << log2_cb_size;
1686 ptrdiff_t stride0 = s->cur_frame->f->linesize[0];
1687 uint8_t *dst0 = &s->cur_frame->f->data[0][y0 * stride0 + (x0 << sps->pixel_shift)];
1688
1689 int length = cb_size * cb_size * sps->pcm.bit_depth + (sps->chroma_format_idc != 0 ?
1690 (((cb_size >> sps->hshift[1]) * (cb_size >> sps->vshift[1])) +
1691 ((cb_size >> sps->hshift[2]) * (cb_size >> sps->vshift[2]))) *
1692 sps->pcm.bit_depth_chroma : 0);
1693 const uint8_t *pcm = skip_bytes(&lc->cc, (length + 7) >> 3);
1694 int ret;
1695
1696 if (!s->sh.disable_deblocking_filter_flag)
1697 ff_hevc_deblocking_boundary_strengths(lc, l, pps, x0, y0, log2_cb_size);
1698
1699 ret = init_get_bits(&gb, pcm, length);
1700 if (ret < 0)
1701 return ret;
1702
1703 s->hevcdsp.put_pcm(dst0, stride0, cb_size, cb_size, &gb, sps->pcm.bit_depth);
1704 if (sps->chroma_format_idc) {
1705 ptrdiff_t stride1 = s->cur_frame->f->linesize[1];
1706 ptrdiff_t stride2 = s->cur_frame->f->linesize[2];
1707 uint8_t *dst1 = &s->cur_frame->f->data[1][(y0 >> sps->vshift[1]) * stride1 + ((x0 >> sps->hshift[1]) << sps->pixel_shift)];
1708 uint8_t *dst2 = &s->cur_frame->f->data[2][(y0 >> sps->vshift[2]) * stride2 + ((x0 >> sps->hshift[2]) << sps->pixel_shift)];
1709
1710 s->hevcdsp.put_pcm(dst1, stride1,
1711 cb_size >> sps->hshift[1],
1712 cb_size >> sps->vshift[1],
1713 &gb, sps->pcm.bit_depth_chroma);
1714 s->hevcdsp.put_pcm(dst2, stride2,
1715 cb_size >> sps->hshift[2],
1716 cb_size >> sps->vshift[2],
1717 &gb, sps->pcm.bit_depth_chroma);
1718 }
1719
1720 return 0;
1721}
1722
1723/**
1724 * 8.5.3.2.2.1 Luma sample unidirectional interpolation process
1725 *
1726 * @param s HEVC decoding context
1727 * @param dst target buffer for block data at block position
1728 * @param dststride stride of the dst buffer
1729 * @param ref reference picture buffer at origin (0, 0)
1730 * @param mv motion vector (relative to block position) to get pixel data from
1731 * @param x_off horizontal position of block from origin (0, 0)
1732 * @param y_off vertical position of block from origin (0, 0)
1733 * @param block_w width of block
1734 * @param block_h height of block
1735 * @param luma_weight weighting factor applied to the luma prediction
1736 * @param luma_offset additive offset applied to the luma prediction value
1737 */
1738
1740 const HEVCPPS *pps, const HEVCSPS *sps,
1741 uint8_t *dst, ptrdiff_t dststride,
1742 const AVFrame *ref, const Mv *mv, int x_off, int y_off,
1743 int block_w, int block_h, int luma_weight, int luma_offset)
1744{
1745 const HEVCContext *const s = lc->parent;
1746 const uint8_t *src = ref->data[0];
1747 ptrdiff_t srcstride = ref->linesize[0];
1748 int pic_width = sps->width;
1749 int pic_height = sps->height;
1750 int mx = mv->x & 3;
1751 int my = mv->y & 3;
1752 int weight_flag = (s->sh.slice_type == HEVC_SLICE_P && pps->weighted_pred_flag) ||
1753 (s->sh.slice_type == HEVC_SLICE_B && pps->weighted_bipred_flag);
1754 int idx = hevc_pel_weight[block_w];
1755
1756 x_off += mv->x >> 2;
1757 y_off += mv->y >> 2;
1758 src += y_off * srcstride + (x_off * (1 << sps->pixel_shift));
1759
1760 if (x_off < QPEL_EXTRA_BEFORE || y_off < QPEL_EXTRA_AFTER ||
1761 x_off >= pic_width - block_w - QPEL_EXTRA_AFTER ||
1762 y_off >= pic_height - block_h - QPEL_EXTRA_AFTER ||
1763 ref == s->cur_frame->f) {
1764 const ptrdiff_t edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << sps->pixel_shift;
1765 int offset = QPEL_EXTRA_BEFORE * srcstride + (QPEL_EXTRA_BEFORE << sps->pixel_shift);
1766 int buf_offset = QPEL_EXTRA_BEFORE * edge_emu_stride + (QPEL_EXTRA_BEFORE << sps->pixel_shift);
1767
1768 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src - offset,
1769 edge_emu_stride, srcstride,
1770 block_w + QPEL_EXTRA,
1771 block_h + QPEL_EXTRA,
1772 x_off - QPEL_EXTRA_BEFORE, y_off - QPEL_EXTRA_BEFORE,
1773 pic_width, pic_height);
1774 src = lc->edge_emu_buffer + buf_offset;
1775 srcstride = edge_emu_stride;
1776 }
1777
1778 if (!weight_flag)
1779 s->hevcdsp.put_hevc_qpel_uni[idx][!!my][!!mx](dst, dststride, src, srcstride,
1780 block_h, mx, my, block_w);
1781 else
1782 s->hevcdsp.put_hevc_qpel_uni_w[idx][!!my][!!mx](dst, dststride, src, srcstride,
1783 block_h, s->sh.luma_log2_weight_denom,
1784 luma_weight, luma_offset, mx, my, block_w);
1785}
1786
1787/**
1788 * 8.5.3.2.2.1 Luma sample bidirectional interpolation process
1789 *
1790 * @param s HEVC decoding context
1791 * @param dst target buffer for block data at block position
1792 * @param dststride stride of the dst buffer
1793 * @param ref0 reference picture0 buffer at origin (0, 0)
1794 * @param mv0 motion vector0 (relative to block position) to get pixel data from
1795 * @param x_off horizontal position of block from origin (0, 0)
1796 * @param y_off vertical position of block from origin (0, 0)
1797 * @param block_w width of block
1798 * @param block_h height of block
1799 * @param ref1 reference picture1 buffer at origin (0, 0)
1800 * @param mv1 motion vector1 (relative to block position) to get pixel data from
1801 * @param current_mv current motion vector structure
1802 */
1804 const HEVCPPS *pps, const HEVCSPS *sps,
1805 uint8_t *dst, ptrdiff_t dststride,
1806 const AVFrame *ref0, const Mv *mv0, int x_off, int y_off,
1807 int block_w, int block_h, const AVFrame *ref1,
1808 const Mv *mv1, struct MvField *current_mv)
1809{
1810 const HEVCContext *const s = lc->parent;
1811 ptrdiff_t src0stride = ref0->linesize[0];
1812 ptrdiff_t src1stride = ref1->linesize[0];
1813 int pic_width = sps->width;
1814 int pic_height = sps->height;
1815 int mx0 = mv0->x & 3;
1816 int my0 = mv0->y & 3;
1817 int mx1 = mv1->x & 3;
1818 int my1 = mv1->y & 3;
1819 int weight_flag = (s->sh.slice_type == HEVC_SLICE_P && pps->weighted_pred_flag) ||
1820 (s->sh.slice_type == HEVC_SLICE_B && pps->weighted_bipred_flag);
1821 int x_off0 = x_off + (mv0->x >> 2);
1822 int y_off0 = y_off + (mv0->y >> 2);
1823 int x_off1 = x_off + (mv1->x >> 2);
1824 int y_off1 = y_off + (mv1->y >> 2);
1825 int idx = hevc_pel_weight[block_w];
1826
1827 const uint8_t *src0 = ref0->data[0] + y_off0 * src0stride + (int)((unsigned)x_off0 << sps->pixel_shift);
1828 const uint8_t *src1 = ref1->data[0] + y_off1 * src1stride + (int)((unsigned)x_off1 << sps->pixel_shift);
1829
1830 if (x_off0 < QPEL_EXTRA_BEFORE || y_off0 < QPEL_EXTRA_AFTER ||
1831 x_off0 >= pic_width - block_w - QPEL_EXTRA_AFTER ||
1832 y_off0 >= pic_height - block_h - QPEL_EXTRA_AFTER) {
1833 const ptrdiff_t edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << sps->pixel_shift;
1834 int offset = QPEL_EXTRA_BEFORE * src0stride + (QPEL_EXTRA_BEFORE << sps->pixel_shift);
1835 int buf_offset = QPEL_EXTRA_BEFORE * edge_emu_stride + (QPEL_EXTRA_BEFORE << sps->pixel_shift);
1836
1837 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src0 - offset,
1838 edge_emu_stride, src0stride,
1839 block_w + QPEL_EXTRA,
1840 block_h + QPEL_EXTRA,
1841 x_off0 - QPEL_EXTRA_BEFORE, y_off0 - QPEL_EXTRA_BEFORE,
1842 pic_width, pic_height);
1843 src0 = lc->edge_emu_buffer + buf_offset;
1844 src0stride = edge_emu_stride;
1845 }
1846
1847 if (x_off1 < QPEL_EXTRA_BEFORE || y_off1 < QPEL_EXTRA_AFTER ||
1848 x_off1 >= pic_width - block_w - QPEL_EXTRA_AFTER ||
1849 y_off1 >= pic_height - block_h - QPEL_EXTRA_AFTER) {
1850 const ptrdiff_t edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << sps->pixel_shift;
1851 int offset = QPEL_EXTRA_BEFORE * src1stride + (QPEL_EXTRA_BEFORE << sps->pixel_shift);
1852 int buf_offset = QPEL_EXTRA_BEFORE * edge_emu_stride + (QPEL_EXTRA_BEFORE << sps->pixel_shift);
1853
1854 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer2, src1 - offset,
1855 edge_emu_stride, src1stride,
1856 block_w + QPEL_EXTRA,
1857 block_h + QPEL_EXTRA,
1858 x_off1 - QPEL_EXTRA_BEFORE, y_off1 - QPEL_EXTRA_BEFORE,
1859 pic_width, pic_height);
1860 src1 = lc->edge_emu_buffer2 + buf_offset;
1861 src1stride = edge_emu_stride;
1862 }
1863
1864 s->hevcdsp.put_hevc_qpel[idx][!!my0][!!mx0](lc->tmp, src0, src0stride,
1865 block_h, mx0, my0, block_w);
1866 if (!weight_flag)
1867 s->hevcdsp.put_hevc_qpel_bi[idx][!!my1][!!mx1](dst, dststride, src1, src1stride, lc->tmp,
1868 block_h, mx1, my1, block_w);
1869 else
1870 s->hevcdsp.put_hevc_qpel_bi_w[idx][!!my1][!!mx1](dst, dststride, src1, src1stride, lc->tmp,
1871 block_h, s->sh.luma_log2_weight_denom,
1872 s->sh.luma_weight_l0[current_mv->ref_idx[0]],
1873 s->sh.luma_weight_l1[current_mv->ref_idx[1]],
1874 s->sh.luma_offset_l0[current_mv->ref_idx[0]] +
1875 s->sh.luma_offset_l1[current_mv->ref_idx[1]],
1876 mx1, my1, block_w);
1877
1878}
1879
1880/**
1881 * 8.5.3.2.2.2 Chroma sample uniprediction interpolation process
1882 *
1883 * @param s HEVC decoding context
1884 * @param dst1 target buffer for block data at block position (U plane)
1885 * @param dst2 target buffer for block data at block position (V plane)
1886 * @param dststride stride of the dst1 and dst2 buffers
1887 * @param ref reference picture buffer at origin (0, 0)
1888 * @param mv motion vector (relative to block position) to get pixel data from
1889 * @param x_off horizontal position of block from origin (0, 0)
1890 * @param y_off vertical position of block from origin (0, 0)
1891 * @param block_w width of block
1892 * @param block_h height of block
1893 * @param chroma_weight weighting factor applied to the chroma prediction
1894 * @param chroma_offset additive offset applied to the chroma prediction value
1895 */
1896
1898 const HEVCPPS *pps, const HEVCSPS *sps,
1899 uint8_t *dst0,
1900 ptrdiff_t dststride, const uint8_t *src0, ptrdiff_t srcstride, int reflist,
1901 int x_off, int y_off, int block_w, int block_h,
1902 const struct MvField *current_mv, int chroma_weight, int chroma_offset)
1903{
1904 const HEVCContext *const s = lc->parent;
1905 int pic_width = sps->width >> sps->hshift[1];
1906 int pic_height = sps->height >> sps->vshift[1];
1907 const Mv *mv = &current_mv->mv[reflist];
1908 int weight_flag = (s->sh.slice_type == HEVC_SLICE_P && pps->weighted_pred_flag) ||
1909 (s->sh.slice_type == HEVC_SLICE_B && pps->weighted_bipred_flag);
1910 int idx = hevc_pel_weight[block_w];
1911 int hshift = sps->hshift[1];
1912 int vshift = sps->vshift[1];
1913 intptr_t mx = av_zero_extend(mv->x, 2 + hshift);
1914 intptr_t my = av_zero_extend(mv->y, 2 + vshift);
1915 intptr_t _mx = mx << (1 - hshift);
1916 intptr_t _my = my << (1 - vshift);
1917 int emu = src0 == s->cur_frame->f->data[1] || src0 == s->cur_frame->f->data[2];
1918
1919 x_off += mv->x >> (2 + hshift);
1920 y_off += mv->y >> (2 + vshift);
1921 src0 += y_off * srcstride + (x_off * (1 << sps->pixel_shift));
1922
1923 if (x_off < EPEL_EXTRA_BEFORE || y_off < EPEL_EXTRA_AFTER ||
1924 x_off >= pic_width - block_w - EPEL_EXTRA_AFTER ||
1925 y_off >= pic_height - block_h - EPEL_EXTRA_AFTER ||
1926 emu) {
1927 const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << sps->pixel_shift;
1928 int offset0 = EPEL_EXTRA_BEFORE * (srcstride + (1 << sps->pixel_shift));
1929 int buf_offset0 = EPEL_EXTRA_BEFORE *
1930 (edge_emu_stride + (1 << sps->pixel_shift));
1931 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src0 - offset0,
1932 edge_emu_stride, srcstride,
1933 block_w + EPEL_EXTRA, block_h + EPEL_EXTRA,
1934 x_off - EPEL_EXTRA_BEFORE,
1935 y_off - EPEL_EXTRA_BEFORE,
1936 pic_width, pic_height);
1937
1938 src0 = lc->edge_emu_buffer + buf_offset0;
1939 srcstride = edge_emu_stride;
1940 }
1941 if (!weight_flag)
1942 s->hevcdsp.put_hevc_epel_uni[idx][!!my][!!mx](dst0, dststride, src0, srcstride,
1943 block_h, _mx, _my, block_w);
1944 else
1945 s->hevcdsp.put_hevc_epel_uni_w[idx][!!my][!!mx](dst0, dststride, src0, srcstride,
1946 block_h, s->sh.chroma_log2_weight_denom,
1947 chroma_weight, chroma_offset, _mx, _my, block_w);
1948}
1949
1950/**
1951 * 8.5.3.2.2.2 Chroma sample bidirectional interpolation process
1952 *
1953 * @param s HEVC decoding context
1954 * @param dst target buffer for block data at block position
1955 * @param dststride stride of the dst buffer
1956 * @param ref0 reference picture0 buffer at origin (0, 0)
1957 * @param mv0 motion vector0 (relative to block position) to get pixel data from
1958 * @param x_off horizontal position of block from origin (0, 0)
1959 * @param y_off vertical position of block from origin (0, 0)
1960 * @param block_w width of block
1961 * @param block_h height of block
1962 * @param ref1 reference picture1 buffer at origin (0, 0)
1963 * @param mv1 motion vector1 (relative to block position) to get pixel data from
1964 * @param current_mv current motion vector structure
1965 * @param cidx chroma component(cb, cr)
1966 */
1968 const HEVCPPS *pps, const HEVCSPS *sps,
1969 uint8_t *dst0, ptrdiff_t dststride,
1970 const AVFrame *ref0, const AVFrame *ref1,
1971 int x_off, int y_off, int block_w, int block_h, const MvField *current_mv, int cidx)
1972{
1973 const HEVCContext *const s = lc->parent;
1974 const uint8_t *src1 = ref0->data[cidx+1];
1975 const uint8_t *src2 = ref1->data[cidx+1];
1976 ptrdiff_t src1stride = ref0->linesize[cidx+1];
1977 ptrdiff_t src2stride = ref1->linesize[cidx+1];
1978 int weight_flag = (s->sh.slice_type == HEVC_SLICE_P && pps->weighted_pred_flag) ||
1979 (s->sh.slice_type == HEVC_SLICE_B && pps->weighted_bipred_flag);
1980 int pic_width = sps->width >> sps->hshift[1];
1981 int pic_height = sps->height >> sps->vshift[1];
1982 const Mv *const mv0 = &current_mv->mv[0];
1983 const Mv *const mv1 = &current_mv->mv[1];
1984 int hshift = sps->hshift[1];
1985 int vshift = sps->vshift[1];
1986
1987 intptr_t mx0 = av_zero_extend(mv0->x, 2 + hshift);
1988 intptr_t my0 = av_zero_extend(mv0->y, 2 + vshift);
1989 intptr_t mx1 = av_zero_extend(mv1->x, 2 + hshift);
1990 intptr_t my1 = av_zero_extend(mv1->y, 2 + vshift);
1991 intptr_t _mx0 = mx0 << (1 - hshift);
1992 intptr_t _my0 = my0 << (1 - vshift);
1993 intptr_t _mx1 = mx1 << (1 - hshift);
1994 intptr_t _my1 = my1 << (1 - vshift);
1995
1996 int x_off0 = x_off + (mv0->x >> (2 + hshift));
1997 int y_off0 = y_off + (mv0->y >> (2 + vshift));
1998 int x_off1 = x_off + (mv1->x >> (2 + hshift));
1999 int y_off1 = y_off + (mv1->y >> (2 + vshift));
2000 int idx = hevc_pel_weight[block_w];
2001 src1 += y_off0 * src1stride + (int)((unsigned)x_off0 << sps->pixel_shift);
2002 src2 += y_off1 * src2stride + (int)((unsigned)x_off1 << sps->pixel_shift);
2003
2004 if (x_off0 < EPEL_EXTRA_BEFORE || y_off0 < EPEL_EXTRA_AFTER ||
2005 x_off0 >= pic_width - block_w - EPEL_EXTRA_AFTER ||
2006 y_off0 >= pic_height - block_h - EPEL_EXTRA_AFTER) {
2007 const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << sps->pixel_shift;
2008 int offset1 = EPEL_EXTRA_BEFORE * (src1stride + (1 << sps->pixel_shift));
2009 int buf_offset1 = EPEL_EXTRA_BEFORE *
2010 (edge_emu_stride + (1 << sps->pixel_shift));
2011
2012 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src1 - offset1,
2013 edge_emu_stride, src1stride,
2014 block_w + EPEL_EXTRA, block_h + EPEL_EXTRA,
2015 x_off0 - EPEL_EXTRA_BEFORE,
2016 y_off0 - EPEL_EXTRA_BEFORE,
2017 pic_width, pic_height);
2018
2019 src1 = lc->edge_emu_buffer + buf_offset1;
2020 src1stride = edge_emu_stride;
2021 }
2022
2023 if (x_off1 < EPEL_EXTRA_BEFORE || y_off1 < EPEL_EXTRA_AFTER ||
2024 x_off1 >= pic_width - block_w - EPEL_EXTRA_AFTER ||
2025 y_off1 >= pic_height - block_h - EPEL_EXTRA_AFTER) {
2026 const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << sps->pixel_shift;
2027 int offset1 = EPEL_EXTRA_BEFORE * (src2stride + (1 << sps->pixel_shift));
2028 int buf_offset1 = EPEL_EXTRA_BEFORE *
2029 (edge_emu_stride + (1 << sps->pixel_shift));
2030
2031 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer2, src2 - offset1,
2032 edge_emu_stride, src2stride,
2033 block_w + EPEL_EXTRA, block_h + EPEL_EXTRA,
2034 x_off1 - EPEL_EXTRA_BEFORE,
2035 y_off1 - EPEL_EXTRA_BEFORE,
2036 pic_width, pic_height);
2037
2038 src2 = lc->edge_emu_buffer2 + buf_offset1;
2039 src2stride = edge_emu_stride;
2040 }
2041
2042 s->hevcdsp.put_hevc_epel[idx][!!my0][!!mx0](lc->tmp, src1, src1stride,
2043 block_h, _mx0, _my0, block_w);
2044 if (!weight_flag)
2045 s->hevcdsp.put_hevc_epel_bi[idx][!!my1][!!mx1](dst0, s->cur_frame->f->linesize[cidx+1],
2046 src2, src2stride, lc->tmp,
2047 block_h, _mx1, _my1, block_w);
2048 else
2049 s->hevcdsp.put_hevc_epel_bi_w[idx][!!my1][!!mx1](dst0, s->cur_frame->f->linesize[cidx+1],
2050 src2, src2stride, lc->tmp,
2051 block_h,
2052 s->sh.chroma_log2_weight_denom,
2053 s->sh.chroma_weight_l0[current_mv->ref_idx[0]][cidx],
2054 s->sh.chroma_weight_l1[current_mv->ref_idx[1]][cidx],
2055 s->sh.chroma_offset_l0[current_mv->ref_idx[0]][cidx] +
2056 s->sh.chroma_offset_l1[current_mv->ref_idx[1]][cidx],
2057 _mx1, _my1, block_w);
2058}
2059
2060static void hevc_await_progress(const HEVCContext *s, const HEVCFrame *ref,
2061 const Mv *mv, int y0, int height)
2062{
2063 if (s->avctx->active_thread_type == FF_THREAD_FRAME ) {
2064 int y = FFMAX(0, (mv->y >> 2) + y0 + height + 9);
2065
2067 }
2068}
2069
2071 const HEVCPPS *pps, const HEVCSPS *sps,
2072 int x0, int y0, int nPbW,
2073 int nPbH, int log2_cb_size, int part_idx,
2074 int merge_idx, MvField *mv)
2075{
2076 const HEVCContext *const s = lc->parent;
2077 enum InterPredIdc inter_pred_idc = PRED_L0;
2078 int mvp_flag;
2079
2080 ff_hevc_set_neighbour_available(lc, x0, y0, nPbW, nPbH, sps->log2_ctb_size);
2081 mv->pred_flag = 0;
2082 if (s->sh.slice_type == HEVC_SLICE_B)
2083 inter_pred_idc = ff_hevc_inter_pred_idc_decode(lc, nPbW, nPbH);
2084
2085 if (inter_pred_idc != PRED_L1) {
2086 if (s->sh.nb_refs[L0])
2087 mv->ref_idx[0]= ff_hevc_ref_idx_lx_decode(lc, s->sh.nb_refs[L0]);
2088
2089 mv->pred_flag = PF_L0;
2090 ff_hevc_hls_mvd_coding(lc, x0, y0, 0);
2091 mvp_flag = ff_hevc_mvp_lx_flag_decode(lc);
2092 ff_hevc_luma_mv_mvp_mode(lc, pps, x0, y0, nPbW, nPbH, log2_cb_size,
2093 part_idx, merge_idx, mv, mvp_flag, 0);
2094 mv->mv[0].x += lc->pu.mvd.x;
2095 mv->mv[0].y += lc->pu.mvd.y;
2096 }
2097
2098 if (inter_pred_idc != PRED_L0) {
2099 if (s->sh.nb_refs[L1])
2100 mv->ref_idx[1]= ff_hevc_ref_idx_lx_decode(lc, s->sh.nb_refs[L1]);
2101
2102 if (s->sh.mvd_l1_zero_flag == 1 && inter_pred_idc == PRED_BI) {
2103 AV_ZERO32(&lc->pu.mvd);
2104 } else {
2105 ff_hevc_hls_mvd_coding(lc, x0, y0, 1);
2106 }
2107
2108 mv->pred_flag += PF_L1;
2109 mvp_flag = ff_hevc_mvp_lx_flag_decode(lc);
2110 ff_hevc_luma_mv_mvp_mode(lc, pps, x0, y0, nPbW, nPbH, log2_cb_size,
2111 part_idx, merge_idx, mv, mvp_flag, 1);
2112 mv->mv[1].x += lc->pu.mvd.x;
2113 mv->mv[1].y += lc->pu.mvd.y;
2114 }
2115}
2116
2118 const HEVCLayerContext *l,
2119 const HEVCPPS *pps, const HEVCSPS *sps,
2120 int x0, int y0, int nPbW, int nPbH,
2121 int log2_cb_size, int partIdx, int idx)
2122{
2123#define POS(c_idx, x, y) \
2124 s->cur_frame->f->data[c_idx] ? \
2125 &s->cur_frame->f->data[c_idx][((y) >> sps->vshift[c_idx]) * linesize[c_idx] + \
2126 (((x) >> sps->hshift[c_idx]) << sps->pixel_shift)] : NULL
2127 const HEVCContext *const s = lc->parent;
2128 int merge_idx = 0;
2129 struct MvField current_mv = {{{ 0 }}};
2130
2131 int min_pu_width = sps->min_pu_width;
2132
2133 MvField *tab_mvf = s->cur_frame->tab_mvf;
2134 const RefPicList *refPicList = s->cur_frame->refPicList;
2135 const HEVCFrame *ref0 = NULL, *ref1 = NULL;
2136 const int *linesize = s->cur_frame->f->linesize;
2137 uint8_t *dst0 = s->cur_frame->f->data[0] + y0 * linesize[0] + (x0 << sps->pixel_shift);
2138 uint8_t *dst1 = POS(1, x0, y0);
2139 uint8_t *dst2 = POS(2, x0, y0);
2140 int log2_min_cb_size = sps->log2_min_cb_size;
2141 int min_cb_width = sps->min_cb_width;
2142 int x_cb = x0 >> log2_min_cb_size;
2143 int y_cb = y0 >> log2_min_cb_size;
2144 int x_pu, y_pu;
2145 int i, j;
2146
2147 int skip_flag = SAMPLE_CTB(l->skip_flag, x_cb, y_cb);
2148
2149 if (!skip_flag)
2151
2152 if (skip_flag || lc->pu.merge_flag) {
2153 if (s->sh.max_num_merge_cand > 1)
2154 merge_idx = ff_hevc_merge_idx_decode(lc);
2155 else
2156 merge_idx = 0;
2157
2158 ff_hevc_luma_mv_merge_mode(lc, pps, x0, y0, nPbW, nPbH, log2_cb_size,
2159 partIdx, merge_idx, &current_mv);
2160 } else {
2161 hevc_luma_mv_mvp_mode(lc, pps, sps, x0, y0, nPbW, nPbH, log2_cb_size,
2162 partIdx, merge_idx, &current_mv);
2163 }
2164
2165 x_pu = x0 >> sps->log2_min_pu_size;
2166 y_pu = y0 >> sps->log2_min_pu_size;
2167
2168 for (j = 0; j < nPbH >> sps->log2_min_pu_size; j++)
2169 for (i = 0; i < nPbW >> sps->log2_min_pu_size; i++)
2170 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i] = current_mv;
2171
2172 if (current_mv.pred_flag & PF_L0) {
2173 ref0 = refPicList[0].ref[current_mv.ref_idx[0]];
2174 if (!ref0 || !ref0->f)
2175 return;
2176 hevc_await_progress(s, ref0, &current_mv.mv[0], y0, nPbH);
2177 }
2178 if (current_mv.pred_flag & PF_L1) {
2179 ref1 = refPicList[1].ref[current_mv.ref_idx[1]];
2180 if (!ref1 || !ref1->f)
2181 return;
2182 hevc_await_progress(s, ref1, &current_mv.mv[1], y0, nPbH);
2183 }
2184
2185 if (current_mv.pred_flag == PF_L0) {
2186 int x0_c = x0 >> sps->hshift[1];
2187 int y0_c = y0 >> sps->vshift[1];
2188 int nPbW_c = nPbW >> sps->hshift[1];
2189 int nPbH_c = nPbH >> sps->vshift[1];
2190
2191 luma_mc_uni(lc, pps, sps, dst0, linesize[0], ref0->f,
2192 &current_mv.mv[0], x0, y0, nPbW, nPbH,
2193 s->sh.luma_weight_l0[current_mv.ref_idx[0]],
2194 s->sh.luma_offset_l0[current_mv.ref_idx[0]]);
2195
2196 if (sps->chroma_format_idc) {
2197 chroma_mc_uni(lc, pps, sps, dst1, linesize[1], ref0->f->data[1], ref0->f->linesize[1],
2198 0, x0_c, y0_c, nPbW_c, nPbH_c, &current_mv,
2199 s->sh.chroma_weight_l0[current_mv.ref_idx[0]][0], s->sh.chroma_offset_l0[current_mv.ref_idx[0]][0]);
2200 chroma_mc_uni(lc, pps, sps, dst2, linesize[2], ref0->f->data[2], ref0->f->linesize[2],
2201 0, x0_c, y0_c, nPbW_c, nPbH_c, &current_mv,
2202 s->sh.chroma_weight_l0[current_mv.ref_idx[0]][1], s->sh.chroma_offset_l0[current_mv.ref_idx[0]][1]);
2203 }
2204 } else if (current_mv.pred_flag == PF_L1) {
2205 int x0_c = x0 >> sps->hshift[1];
2206 int y0_c = y0 >> sps->vshift[1];
2207 int nPbW_c = nPbW >> sps->hshift[1];
2208 int nPbH_c = nPbH >> sps->vshift[1];
2209
2210 luma_mc_uni(lc, pps, sps, dst0, linesize[0], ref1->f,
2211 &current_mv.mv[1], x0, y0, nPbW, nPbH,
2212 s->sh.luma_weight_l1[current_mv.ref_idx[1]],
2213 s->sh.luma_offset_l1[current_mv.ref_idx[1]]);
2214
2215 if (sps->chroma_format_idc) {
2216 chroma_mc_uni(lc, pps, sps, dst1, linesize[1], ref1->f->data[1], ref1->f->linesize[1],
2217 1, x0_c, y0_c, nPbW_c, nPbH_c, &current_mv,
2218 s->sh.chroma_weight_l1[current_mv.ref_idx[1]][0], s->sh.chroma_offset_l1[current_mv.ref_idx[1]][0]);
2219
2220 chroma_mc_uni(lc, pps, sps, dst2, linesize[2], ref1->f->data[2], ref1->f->linesize[2],
2221 1, x0_c, y0_c, nPbW_c, nPbH_c, &current_mv,
2222 s->sh.chroma_weight_l1[current_mv.ref_idx[1]][1], s->sh.chroma_offset_l1[current_mv.ref_idx[1]][1]);
2223 }
2224 } else if (current_mv.pred_flag == PF_BI) {
2225 int x0_c = x0 >> sps->hshift[1];
2226 int y0_c = y0 >> sps->vshift[1];
2227 int nPbW_c = nPbW >> sps->hshift[1];
2228 int nPbH_c = nPbH >> sps->vshift[1];
2229
2230 luma_mc_bi(lc, pps, sps, dst0, linesize[0], ref0->f,
2231 &current_mv.mv[0], x0, y0, nPbW, nPbH,
2232 ref1->f, &current_mv.mv[1], &current_mv);
2233
2234 if (sps->chroma_format_idc) {
2235 chroma_mc_bi(lc, pps, sps, dst1, linesize[1], ref0->f, ref1->f,
2236 x0_c, y0_c, nPbW_c, nPbH_c, &current_mv, 0);
2237
2238 chroma_mc_bi(lc, pps, sps, dst2, linesize[2], ref0->f, ref1->f,
2239 x0_c, y0_c, nPbW_c, nPbH_c, &current_mv, 1);
2240 }
2241 }
2242}
2243
2244/**
2245 * 8.4.1
2246 */
2248 const HEVCSPS *sps,
2249 int x0, int y0, int pu_size,
2250 int prev_intra_luma_pred_flag)
2251{
2252 const HEVCContext *const s = lc->parent;
2253 int x_pu = x0 >> sps->log2_min_pu_size;
2254 int y_pu = y0 >> sps->log2_min_pu_size;
2255 int min_pu_width = sps->min_pu_width;
2256 int size_in_pus = pu_size >> sps->log2_min_pu_size;
2257 int x0b = av_zero_extend(x0, sps->log2_ctb_size);
2258 int y0b = av_zero_extend(y0, sps->log2_ctb_size);
2259
2260 int cand_up = (lc->ctb_up_flag || y0b) ?
2261 l->tab_ipm[(y_pu - 1) * min_pu_width + x_pu] : INTRA_DC;
2262 int cand_left = (lc->ctb_left_flag || x0b) ?
2263 l->tab_ipm[y_pu * min_pu_width + x_pu - 1] : INTRA_DC;
2264
2265 int y_ctb = (y0 >> (sps->log2_ctb_size)) << (sps->log2_ctb_size);
2266
2267 MvField *tab_mvf = s->cur_frame->tab_mvf;
2268 int intra_pred_mode;
2269 int candidate[3];
2270 int i, j;
2271
2272 // intra_pred_mode prediction does not cross vertical CTB boundaries
2273 if ((y0 - 1) < y_ctb)
2274 cand_up = INTRA_DC;
2275
2276 if (cand_left == cand_up) {
2277 if (cand_left < 2) {
2278 candidate[0] = INTRA_PLANAR;
2279 candidate[1] = INTRA_DC;
2280 candidate[2] = INTRA_ANGULAR_26;
2281 } else {
2282 candidate[0] = cand_left;
2283 candidate[1] = 2 + ((cand_left - 2 - 1 + 32) & 31);
2284 candidate[2] = 2 + ((cand_left - 2 + 1) & 31);
2285 }
2286 } else {
2287 candidate[0] = cand_left;
2288 candidate[1] = cand_up;
2289 if (candidate[0] != INTRA_PLANAR && candidate[1] != INTRA_PLANAR) {
2290 candidate[2] = INTRA_PLANAR;
2291 } else if (candidate[0] != INTRA_DC && candidate[1] != INTRA_DC) {
2292 candidate[2] = INTRA_DC;
2293 } else {
2294 candidate[2] = INTRA_ANGULAR_26;
2295 }
2296 }
2297
2298 if (prev_intra_luma_pred_flag) {
2299 intra_pred_mode = candidate[lc->pu.mpm_idx];
2300 } else {
2301 if (candidate[0] > candidate[1])
2302 FFSWAP(uint8_t, candidate[0], candidate[1]);
2303 if (candidate[0] > candidate[2])
2304 FFSWAP(uint8_t, candidate[0], candidate[2]);
2305 if (candidate[1] > candidate[2])
2306 FFSWAP(uint8_t, candidate[1], candidate[2]);
2307
2308 intra_pred_mode = lc->pu.rem_intra_luma_pred_mode;
2309 for (i = 0; i < 3; i++)
2310 if (intra_pred_mode >= candidate[i])
2311 intra_pred_mode++;
2312 }
2313
2314 /* write the intra prediction units into the mv array */
2315 if (!size_in_pus)
2316 size_in_pus = 1;
2317 for (i = 0; i < size_in_pus; i++) {
2318 memset(&l->tab_ipm[(y_pu + i) * min_pu_width + x_pu],
2319 intra_pred_mode, size_in_pus);
2320
2321 for (j = 0; j < size_in_pus; j++) {
2322 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].pred_flag = PF_INTRA;
2323 }
2324 }
2325
2326 return intra_pred_mode;
2327}
2328
2329static av_always_inline void set_ct_depth(const HEVCSPS *sps, uint8_t *tab_ct_depth,
2330 int x0, int y0,
2331 int log2_cb_size, int ct_depth)
2332{
2333 int length = (1 << log2_cb_size) >> sps->log2_min_cb_size;
2334 int x_cb = x0 >> sps->log2_min_cb_size;
2335 int y_cb = y0 >> sps->log2_min_cb_size;
2336 int y;
2337
2338 for (y = 0; y < length; y++)
2339 memset(&tab_ct_depth[(y_cb + y) * sps->min_cb_width + x_cb],
2340 ct_depth, length);
2341}
2342
2343static const uint8_t tab_mode_idx[] = {
2344 0, 1, 2, 2, 2, 2, 3, 5, 7, 8, 10, 12, 13, 15, 17, 18, 19, 20,
2345 21, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 29, 29, 30, 31};
2346
2348 const HEVCLayerContext *l, const HEVCSPS *sps,
2349 int x0, int y0,
2350 int log2_cb_size)
2351{
2352 static const uint8_t intra_chroma_table[4] = { 0, 26, 10, 1 };
2353 uint8_t prev_intra_luma_pred_flag[4];
2354 int split = lc->cu.part_mode == PART_NxN;
2355 int pb_size = (1 << log2_cb_size) >> split;
2356 int side = split + 1;
2357 int chroma_mode;
2358 int i, j;
2359
2360 for (i = 0; i < side; i++)
2361 for (j = 0; j < side; j++)
2362 prev_intra_luma_pred_flag[2 * i + j] = ff_hevc_prev_intra_luma_pred_flag_decode(lc);
2363
2364 for (i = 0; i < side; i++) {
2365 for (j = 0; j < side; j++) {
2366 if (prev_intra_luma_pred_flag[2 * i + j])
2368 else
2370
2371 lc->pu.intra_pred_mode[2 * i + j] =
2373 x0 + pb_size * j, y0 + pb_size * i, pb_size,
2374 prev_intra_luma_pred_flag[2 * i + j]);
2375 }
2376 }
2377
2378 if (sps->chroma_format_idc == 3) {
2379 for (i = 0; i < side; i++) {
2380 for (j = 0; j < side; j++) {
2381 lc->pu.chroma_mode_c[2 * i + j] = chroma_mode = ff_hevc_intra_chroma_pred_mode_decode(lc);
2382 if (chroma_mode != 4) {
2383 if (lc->pu.intra_pred_mode[2 * i + j] == intra_chroma_table[chroma_mode])
2384 lc->pu.intra_pred_mode_c[2 * i + j] = 34;
2385 else
2386 lc->pu.intra_pred_mode_c[2 * i + j] = intra_chroma_table[chroma_mode];
2387 } else {
2388 lc->pu.intra_pred_mode_c[2 * i + j] = lc->pu.intra_pred_mode[2 * i + j];
2389 }
2390 }
2391 }
2392 } else if (sps->chroma_format_idc == 2) {
2393 int mode_idx;
2394 lc->pu.chroma_mode_c[0] = chroma_mode = ff_hevc_intra_chroma_pred_mode_decode(lc);
2395 if (chroma_mode != 4) {
2396 if (lc->pu.intra_pred_mode[0] == intra_chroma_table[chroma_mode])
2397 mode_idx = 34;
2398 else
2399 mode_idx = intra_chroma_table[chroma_mode];
2400 } else {
2401 mode_idx = lc->pu.intra_pred_mode[0];
2402 }
2403 lc->pu.intra_pred_mode_c[0] = tab_mode_idx[mode_idx];
2404 } else if (sps->chroma_format_idc != 0) {
2405 chroma_mode = ff_hevc_intra_chroma_pred_mode_decode(lc);
2406 if (chroma_mode != 4) {
2407 if (lc->pu.intra_pred_mode[0] == intra_chroma_table[chroma_mode])
2408 lc->pu.intra_pred_mode_c[0] = 34;
2409 else
2410 lc->pu.intra_pred_mode_c[0] = intra_chroma_table[chroma_mode];
2411 } else {
2412 lc->pu.intra_pred_mode_c[0] = lc->pu.intra_pred_mode[0];
2413 }
2414 }
2415}
2416
2418 const HEVCLayerContext *l,
2419 const HEVCSPS *sps,
2420 int x0, int y0,
2421 int log2_cb_size)
2422{
2423 const HEVCContext *const s = lc->parent;
2424 int pb_size = 1 << log2_cb_size;
2425 int size_in_pus = pb_size >> sps->log2_min_pu_size;
2426 int min_pu_width = sps->min_pu_width;
2427 MvField *tab_mvf = s->cur_frame->tab_mvf;
2428 int x_pu = x0 >> sps->log2_min_pu_size;
2429 int y_pu = y0 >> sps->log2_min_pu_size;
2430 int j, k;
2431
2432 if (size_in_pus == 0)
2433 size_in_pus = 1;
2434 for (j = 0; j < size_in_pus; j++)
2435 memset(&l->tab_ipm[(y_pu + j) * min_pu_width + x_pu], INTRA_DC, size_in_pus);
2436 if (lc->cu.pred_mode == MODE_INTRA)
2437 for (j = 0; j < size_in_pus; j++)
2438 for (k = 0; k < size_in_pus; k++)
2439 tab_mvf[(y_pu + j) * min_pu_width + x_pu + k].pred_flag = PF_INTRA;
2440}
2441
2443 const HEVCLayerContext *l,
2444 const HEVCPPS *pps, const HEVCSPS *sps,
2445 int x0, int y0, int log2_cb_size)
2446{
2447 int cb_size = 1 << log2_cb_size;
2448 int log2_min_cb_size = sps->log2_min_cb_size;
2449 int length = cb_size >> log2_min_cb_size;
2450 int min_cb_width = sps->min_cb_width;
2451 int x_cb = x0 >> log2_min_cb_size;
2452 int y_cb = y0 >> log2_min_cb_size;
2453 int idx = log2_cb_size - 2;
2454 int qp_block_mask = (1 << (sps->log2_ctb_size - pps->diff_cu_qp_delta_depth)) - 1;
2455 int x, y, ret;
2456
2457 lc->cu.x = x0;
2458 lc->cu.y = y0;
2459 lc->cu.pred_mode = MODE_INTRA;
2460 lc->cu.part_mode = PART_2Nx2N;
2461 lc->cu.intra_split_flag = 0;
2462
2463 SAMPLE_CTB(l->skip_flag, x_cb, y_cb) = 0;
2464 for (x = 0; x < 4; x++)
2465 lc->pu.intra_pred_mode[x] = 1;
2466 if (pps->transquant_bypass_enable_flag) {
2469 set_deblocking_bypass(l->is_pcm, sps, x0, y0, log2_cb_size);
2470 } else
2472
2473 if (s->sh.slice_type != HEVC_SLICE_I) {
2474 const int x0b = av_zero_extend(x0, sps->log2_ctb_size);
2475 const int y0b = av_zero_extend(y0, sps->log2_ctb_size);
2476 uint8_t skip_flag = ff_hevc_skip_flag_decode(lc, l->skip_flag,
2477 x0b, y0b, x_cb, y_cb,
2478 min_cb_width);
2479
2480 x = y_cb * min_cb_width + x_cb;
2481 for (y = 0; y < length; y++) {
2482 memset(&l->skip_flag[x], skip_flag, length);
2483 x += min_cb_width;
2484 }
2485 lc->cu.pred_mode = skip_flag ? MODE_SKIP : MODE_INTER;
2486 } else {
2487 x = y_cb * min_cb_width + x_cb;
2488 for (y = 0; y < length; y++) {
2489 memset(&l->skip_flag[x], 0, length);
2490 x += min_cb_width;
2491 }
2492 }
2493
2494 if (SAMPLE_CTB(l->skip_flag, x_cb, y_cb)) {
2495 hls_prediction_unit(lc, l, pps, sps,
2496 x0, y0, cb_size, cb_size, log2_cb_size, 0, idx);
2497 intra_prediction_unit_default_value(lc, l, sps, x0, y0, log2_cb_size);
2498
2499 if (!s->sh.disable_deblocking_filter_flag)
2500 ff_hevc_deblocking_boundary_strengths(lc, l, pps, x0, y0, log2_cb_size);
2501 } else {
2502 int pcm_flag = 0;
2503
2504 if (s->sh.slice_type != HEVC_SLICE_I)
2506 if (lc->cu.pred_mode != MODE_INTRA ||
2507 log2_cb_size == sps->log2_min_cb_size) {
2508 lc->cu.part_mode = ff_hevc_part_mode_decode(lc, sps, log2_cb_size);
2509 lc->cu.intra_split_flag = lc->cu.part_mode == PART_NxN &&
2510 lc->cu.pred_mode == MODE_INTRA;
2511 }
2512
2513 if (lc->cu.pred_mode == MODE_INTRA) {
2514 if (lc->cu.part_mode == PART_2Nx2N && sps->pcm_enabled &&
2515 log2_cb_size >= sps->pcm.log2_min_pcm_cb_size &&
2516 log2_cb_size <= sps->pcm.log2_max_pcm_cb_size) {
2517 pcm_flag = ff_hevc_pcm_flag_decode(lc);
2518 }
2519 if (pcm_flag) {
2520 intra_prediction_unit_default_value(lc, l, sps, x0, y0, log2_cb_size);
2521 ret = hls_pcm_sample(lc, l, pps, x0, y0, log2_cb_size);
2522 if (sps->pcm_loop_filter_disabled)
2523 set_deblocking_bypass(l->is_pcm, sps, x0, y0, log2_cb_size);
2524
2525 if (ret < 0)
2526 return ret;
2527 } else {
2528 intra_prediction_unit(lc, l, sps, x0, y0, log2_cb_size);
2529 }
2530 } else {
2531 intra_prediction_unit_default_value(lc, l, sps, x0, y0, log2_cb_size);
2532 switch (lc->cu.part_mode) {
2533 case PART_2Nx2N:
2534 hls_prediction_unit(lc, l, pps, sps,
2535 x0, y0, cb_size, cb_size, log2_cb_size, 0, idx);
2536 break;
2537 case PART_2NxN:
2538 hls_prediction_unit(lc, l, pps, sps,
2539 x0, y0, cb_size, cb_size / 2, log2_cb_size, 0, idx);
2540 hls_prediction_unit(lc, l, pps, sps,
2541 x0, y0 + cb_size / 2, cb_size, cb_size / 2, log2_cb_size, 1, idx);
2542 break;
2543 case PART_Nx2N:
2544 hls_prediction_unit(lc, l, pps, sps,
2545 x0, y0, cb_size / 2, cb_size, log2_cb_size, 0, idx - 1);
2546 hls_prediction_unit(lc, l, pps, sps,
2547 x0 + cb_size / 2, y0, cb_size / 2, cb_size, log2_cb_size, 1, idx - 1);
2548 break;
2549 case PART_2NxnU:
2550 hls_prediction_unit(lc, l, pps, sps,
2551 x0, y0, cb_size, cb_size / 4, log2_cb_size, 0, idx);
2552 hls_prediction_unit(lc, l, pps, sps,
2553 x0, y0 + cb_size / 4, cb_size, cb_size * 3 / 4, log2_cb_size, 1, idx);
2554 break;
2555 case PART_2NxnD:
2556 hls_prediction_unit(lc, l, pps, sps,
2557 x0, y0, cb_size, cb_size * 3 / 4, log2_cb_size, 0, idx);
2558 hls_prediction_unit(lc, l, pps, sps,
2559 x0, y0 + cb_size * 3 / 4, cb_size, cb_size / 4, log2_cb_size, 1, idx);
2560 break;
2561 case PART_nLx2N:
2562 hls_prediction_unit(lc, l, pps, sps,
2563 x0, y0, cb_size / 4, cb_size, log2_cb_size, 0, idx - 2);
2564 hls_prediction_unit(lc, l, pps, sps,
2565 x0 + cb_size / 4, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 1, idx - 2);
2566 break;
2567 case PART_nRx2N:
2568 hls_prediction_unit(lc, l, pps, sps,
2569 x0, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 0, idx - 2);
2570 hls_prediction_unit(lc, l, pps, sps,
2571 x0 + cb_size * 3 / 4, y0, cb_size / 4, cb_size, log2_cb_size, 1, idx - 2);
2572 break;
2573 case PART_NxN:
2574 hls_prediction_unit(lc, l, pps, sps,
2575 x0, y0, cb_size / 2, cb_size / 2, log2_cb_size, 0, idx - 1);
2576 hls_prediction_unit(lc, l, pps, sps,
2577 x0 + cb_size / 2, y0, cb_size / 2, cb_size / 2, log2_cb_size, 1, idx - 1);
2578 hls_prediction_unit(lc, l, pps, sps,
2579 x0, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 2, idx - 1);
2580 hls_prediction_unit(lc, l, pps, sps,
2581 x0 + cb_size / 2, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 3, idx - 1);
2582 break;
2583 }
2584 }
2585
2586 if (!pcm_flag) {
2587 int rqt_root_cbf = 1;
2588
2589 if (lc->cu.pred_mode != MODE_INTRA &&
2590 !(lc->cu.part_mode == PART_2Nx2N && lc->pu.merge_flag)) {
2591 rqt_root_cbf = ff_hevc_no_residual_syntax_flag_decode(lc);
2592 }
2593 if (rqt_root_cbf) {
2594 const static int cbf[2] = { 0 };
2596 sps->max_transform_hierarchy_depth_intra + lc->cu.intra_split_flag :
2597 sps->max_transform_hierarchy_depth_inter;
2598 ret = hls_transform_tree(lc, l, pps, sps, x0, y0, x0, y0, x0, y0,
2599 log2_cb_size,
2600 log2_cb_size, 0, 0, cbf, cbf);
2601 if (ret < 0)
2602 return ret;
2603 } else {
2604 if (!s->sh.disable_deblocking_filter_flag)
2605 ff_hevc_deblocking_boundary_strengths(lc, l, pps, x0, y0, log2_cb_size);
2606 }
2607 }
2608 }
2609
2610 if (pps->cu_qp_delta_enabled_flag && lc->tu.is_cu_qp_delta_coded == 0)
2611 ff_hevc_set_qPy(lc, l, pps, x0, y0, log2_cb_size);
2612
2613 x = y_cb * min_cb_width + x_cb;
2614 for (y = 0; y < length; y++) {
2615 memset(&l->qp_y_tab[x], lc->qp_y, length);
2616 x += min_cb_width;
2617 }
2618
2619 if(((x0 + (1<<log2_cb_size)) & qp_block_mask) == 0 &&
2620 ((y0 + (1<<log2_cb_size)) & qp_block_mask) == 0) {
2621 lc->qPy_pred = lc->qp_y;
2622 }
2623
2624 set_ct_depth(sps, l->tab_ct_depth, x0, y0, log2_cb_size, lc->ct_depth);
2625
2626 return 0;
2627}
2628
2630 const HEVCLayerContext *l,
2631 const HEVCPPS *pps, const HEVCSPS *sps,
2632 int x0, int y0,
2633 int log2_cb_size, int cb_depth)
2634{
2635 const HEVCContext *const s = lc->parent;
2636 const int cb_size = 1 << log2_cb_size;
2637 int ret;
2638 int split_cu;
2639
2640 lc->ct_depth = cb_depth;
2641 if (x0 + cb_size <= sps->width &&
2642 y0 + cb_size <= sps->height &&
2643 log2_cb_size > sps->log2_min_cb_size) {
2645 sps, cb_depth, x0, y0);
2646 } else {
2647 split_cu = (log2_cb_size > sps->log2_min_cb_size);
2648 }
2649 if (pps->cu_qp_delta_enabled_flag &&
2650 log2_cb_size >= sps->log2_ctb_size - pps->diff_cu_qp_delta_depth) {
2651 lc->tu.is_cu_qp_delta_coded = 0;
2652 lc->tu.cu_qp_delta = 0;
2653 }
2654
2655 if (s->sh.cu_chroma_qp_offset_enabled_flag &&
2656 log2_cb_size >= sps->log2_ctb_size - pps->diff_cu_chroma_qp_offset_depth) {
2658 }
2659
2660 if (split_cu) {
2661 int qp_block_mask = (1 << (sps->log2_ctb_size - pps->diff_cu_qp_delta_depth)) - 1;
2662 const int cb_size_split = cb_size >> 1;
2663 const int x1 = x0 + cb_size_split;
2664 const int y1 = y0 + cb_size_split;
2665
2666 int more_data = 0;
2667
2668 more_data = hls_coding_quadtree(lc, l, pps, sps,
2669 x0, y0, log2_cb_size - 1, cb_depth + 1);
2670 if (more_data < 0)
2671 return more_data;
2672
2673 if (more_data && x1 < sps->width) {
2674 more_data = hls_coding_quadtree(lc, l, pps, sps,
2675 x1, y0, log2_cb_size - 1, cb_depth + 1);
2676 if (more_data < 0)
2677 return more_data;
2678 }
2679 if (more_data && y1 < sps->height) {
2680 more_data = hls_coding_quadtree(lc, l, pps, sps,
2681 x0, y1, log2_cb_size - 1, cb_depth + 1);
2682 if (more_data < 0)
2683 return more_data;
2684 }
2685 if (more_data && x1 < sps->width &&
2686 y1 < sps->height) {
2687 more_data = hls_coding_quadtree(lc, l, pps, sps,
2688 x1, y1, log2_cb_size - 1, cb_depth + 1);
2689 if (more_data < 0)
2690 return more_data;
2691 }
2692
2693 if(((x0 + (1<<log2_cb_size)) & qp_block_mask) == 0 &&
2694 ((y0 + (1<<log2_cb_size)) & qp_block_mask) == 0)
2695 lc->qPy_pred = lc->qp_y;
2696
2697 if (more_data)
2698 return ((x1 + cb_size_split) < sps->width ||
2699 (y1 + cb_size_split) < sps->height);
2700 else
2701 return 0;
2702 } else {
2703 ret = hls_coding_unit(lc, s, l, pps, sps, x0, y0, log2_cb_size);
2704 if (ret < 0)
2705 return ret;
2706 if ((!((x0 + cb_size) %
2707 (1 << (sps->log2_ctb_size))) ||
2708 (x0 + cb_size >= sps->width)) &&
2709 (!((y0 + cb_size) %
2710 (1 << (sps->log2_ctb_size))) ||
2711 (y0 + cb_size >= sps->height))) {
2712 int end_of_slice_flag = ff_hevc_end_of_slice_flag_decode(lc);
2713 return !end_of_slice_flag;
2714 } else {
2715 return 1;
2716 }
2717 }
2718
2719 return 0;
2720}
2721
2723 const HEVCLayerContext *l,
2724 const HEVCPPS *pps, const HEVCSPS *sps,
2725 int x_ctb, int y_ctb, int ctb_addr_ts)
2726{
2727 const HEVCContext *const s = lc->parent;
2728 int ctb_size = 1 << sps->log2_ctb_size;
2729 int ctb_addr_rs = pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2730 int ctb_addr_in_slice = ctb_addr_rs - s->sh.slice_addr;
2731
2732 l->tab_slice_address[ctb_addr_rs] = s->sh.slice_addr;
2733
2734 if (pps->entropy_coding_sync_enabled_flag) {
2735 if (x_ctb == 0 && (y_ctb & (ctb_size - 1)) == 0)
2736 lc->first_qp_group = 1;
2737 lc->end_of_tiles_x = sps->width;
2738 } else if (pps->tiles_enabled_flag) {
2739 if (ctb_addr_ts && pps->tile_id[ctb_addr_ts] != pps->tile_id[ctb_addr_ts - 1]) {
2740 int idxX = pps->col_idxX[x_ctb >> sps->log2_ctb_size];
2741 lc->end_of_tiles_x = x_ctb + (pps->column_width[idxX] << sps->log2_ctb_size);
2742 lc->first_qp_group = 1;
2743 }
2744 } else {
2745 lc->end_of_tiles_x = sps->width;
2746 }
2747
2748 lc->end_of_tiles_y = FFMIN(y_ctb + ctb_size, sps->height);
2749
2750 lc->boundary_flags = 0;
2751 if (pps->tiles_enabled_flag) {
2752 if (x_ctb > 0 && pps->tile_id[ctb_addr_ts] != pps->tile_id[pps->ctb_addr_rs_to_ts[ctb_addr_rs - 1]])
2754 if (x_ctb > 0 && l->tab_slice_address[ctb_addr_rs] != l->tab_slice_address[ctb_addr_rs - 1])
2756 if (y_ctb > 0 && pps->tile_id[ctb_addr_ts] != pps->tile_id[pps->ctb_addr_rs_to_ts[ctb_addr_rs - sps->ctb_width]])
2758 if (y_ctb > 0 && l->tab_slice_address[ctb_addr_rs] != l->tab_slice_address[ctb_addr_rs - sps->ctb_width])
2760 } else {
2761 if (ctb_addr_in_slice <= 0)
2763 if (ctb_addr_in_slice < sps->ctb_width)
2765 }
2766
2767 lc->ctb_left_flag = ((x_ctb > 0) && (ctb_addr_in_slice > 0) && !(lc->boundary_flags & BOUNDARY_LEFT_TILE));
2768 lc->ctb_up_flag = ((y_ctb > 0) && (ctb_addr_in_slice >= sps->ctb_width) && !(lc->boundary_flags & BOUNDARY_UPPER_TILE));
2769 lc->ctb_up_right_flag = ((y_ctb > 0) && (ctb_addr_in_slice+1 >= sps->ctb_width) && (pps->tile_id[ctb_addr_ts] == pps->tile_id[pps->ctb_addr_rs_to_ts[ctb_addr_rs+1 - sps->ctb_width]]));
2770 lc->ctb_up_left_flag = ((x_ctb > 0) && (y_ctb > 0) && (ctb_addr_in_slice-1 >= sps->ctb_width) && (pps->tile_id[ctb_addr_ts] == pps->tile_id[pps->ctb_addr_rs_to_ts[ctb_addr_rs-1 - sps->ctb_width]]));
2771}
2772
2774{
2775 HEVCLocalContext *const lc = &s->local_ctx[0];
2776 const HEVCLayerContext *const l = &s->layers[s->cur_layer];
2777 const HEVCPPS *const pps = s->pps;
2778 const HEVCSPS *const sps = pps->sps;
2779 const uint8_t *slice_data = gb->buffer + s->sh.data_offset;
2780 const size_t slice_size = get_bits_bytesize(gb, 1) - s->sh.data_offset;
2781 int ctb_size = 1 << sps->log2_ctb_size;
2782 int more_data = 1;
2783 int x_ctb = 0;
2784 int y_ctb = 0;
2785 int ctb_addr_ts = pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs];
2786 int ret;
2787
2788 while (more_data && ctb_addr_ts < sps->ctb_size) {
2789 int ctb_addr_rs = pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2790
2791 x_ctb = (ctb_addr_rs % ((sps->width + ctb_size - 1) >> sps->log2_ctb_size)) << sps->log2_ctb_size;
2792 y_ctb = (ctb_addr_rs / ((sps->width + ctb_size - 1) >> sps->log2_ctb_size)) << sps->log2_ctb_size;
2793 hls_decode_neighbour(lc, l, pps, sps, x_ctb, y_ctb, ctb_addr_ts);
2794
2795 ret = ff_hevc_cabac_init(lc, pps, ctb_addr_ts, slice_data, slice_size, 0);
2796 if (ret < 0) {
2797 l->tab_slice_address[ctb_addr_rs] = -1;
2798 return ret;
2799 }
2800
2801 hls_sao_param(lc, l, pps, sps,
2802 x_ctb >> sps->log2_ctb_size, y_ctb >> sps->log2_ctb_size);
2803
2804 l->deblock[ctb_addr_rs].beta_offset = s->sh.beta_offset;
2805 l->deblock[ctb_addr_rs].tc_offset = s->sh.tc_offset;
2806 l->filter_slice_edges[ctb_addr_rs] = s->sh.slice_loop_filter_across_slices_enabled_flag;
2807
2808 more_data = hls_coding_quadtree(lc, l, pps, sps, x_ctb, y_ctb, sps->log2_ctb_size, 0);
2809 if (more_data < 0) {
2810 l->tab_slice_address[ctb_addr_rs] = -1;
2811 return more_data;
2812 }
2813
2814
2815 ctb_addr_ts++;
2816 ff_hevc_save_states(lc, pps, ctb_addr_ts);
2817 ff_hevc_hls_filters(lc, l, pps, x_ctb, y_ctb, ctb_size);
2818 }
2819
2820 if (x_ctb + ctb_size >= sps->width &&
2821 y_ctb + ctb_size >= sps->height)
2822 ff_hevc_hls_filter(lc, l, pps, x_ctb, y_ctb, ctb_size);
2823
2824 return ctb_addr_ts;
2825}
2826
2827static int hls_decode_entry_wpp(AVCodecContext *avctx, void *hevc_lclist,
2828 int job, int thread)
2829{
2830 HEVCLocalContext *lc = &((HEVCLocalContext*)hevc_lclist)[thread];
2831 const HEVCContext *const s = lc->parent;
2832 const HEVCLayerContext *const l = &s->layers[s->cur_layer];
2833 const HEVCPPS *const pps = s->pps;
2834 const HEVCSPS *const sps = pps->sps;
2835 int ctb_size = 1 << sps->log2_ctb_size;
2836 int more_data = 1;
2837 int ctb_row = job;
2838 int ctb_addr_rs = s->sh.slice_ctb_addr_rs + ctb_row * ((sps->width + ctb_size - 1) >> sps->log2_ctb_size);
2839 int ctb_addr_ts = pps->ctb_addr_rs_to_ts[ctb_addr_rs];
2840
2841 const uint8_t *data = s->data + s->sh.offset[ctb_row];
2842 const size_t data_size = s->sh.size[ctb_row];
2843
2844 int progress = 0;
2845
2846 int ret;
2847
2848 if (ctb_row)
2849 ff_init_cabac_decoder(&lc->cc, data, data_size);
2850
2851 while(more_data && ctb_addr_ts < sps->ctb_size) {
2852 int x_ctb = (ctb_addr_rs % sps->ctb_width) << sps->log2_ctb_size;
2853 int y_ctb = (ctb_addr_rs / sps->ctb_width) << sps->log2_ctb_size;
2854
2855 hls_decode_neighbour(lc, l, pps, sps, x_ctb, y_ctb, ctb_addr_ts);
2856
2857 if (ctb_row)
2858 ff_thread_progress_await(&s->wpp_progress[ctb_row - 1],
2859 progress + SHIFT_CTB_WPP + 1);
2860
2861 /* atomic_load's prototype requires a pointer to non-const atomic variable
2862 * (due to implementations via mutexes, where reads involve writes).
2863 * Of course, casting const away here is nevertheless safe. */
2864 if (atomic_load((atomic_int*)&s->wpp_err)) {
2865 ff_thread_progress_report(&s->wpp_progress[ctb_row], INT_MAX);
2866 return 0;
2867 }
2868
2869 ret = ff_hevc_cabac_init(lc, pps, ctb_addr_ts, data, data_size, 1);
2870 if (ret < 0)
2871 goto error;
2872 hls_sao_param(lc, l, pps, sps,
2873 x_ctb >> sps->log2_ctb_size, y_ctb >> sps->log2_ctb_size);
2874
2875 l->deblock[ctb_addr_rs].beta_offset = s->sh.beta_offset;
2876 l->deblock[ctb_addr_rs].tc_offset = s->sh.tc_offset;
2877 l->filter_slice_edges[ctb_addr_rs] = s->sh.slice_loop_filter_across_slices_enabled_flag;
2878
2879 more_data = hls_coding_quadtree(lc, l, pps, sps, x_ctb, y_ctb, sps->log2_ctb_size, 0);
2880
2881 if (more_data < 0) {
2882 ret = more_data;
2883 goto error;
2884 }
2885
2886 ctb_addr_ts++;
2887
2888 ff_hevc_save_states(lc, pps, ctb_addr_ts);
2889 ff_thread_progress_report(&s->wpp_progress[ctb_row], ++progress);
2890 ff_hevc_hls_filters(lc, l, pps, x_ctb, y_ctb, ctb_size);
2891
2892 if (!more_data && (x_ctb+ctb_size) < sps->width && ctb_row != s->sh.num_entry_point_offsets) {
2893 /* Casting const away here is safe, because it is an atomic operation. */
2894 atomic_store((atomic_int*)&s->wpp_err, 1);
2895 ff_thread_progress_report(&s->wpp_progress[ctb_row], INT_MAX);
2896 return 0;
2897 }
2898
2899 if ((x_ctb+ctb_size) >= sps->width && (y_ctb+ctb_size) >= sps->height ) {
2900 ff_hevc_hls_filter(lc, l, pps, x_ctb, y_ctb, ctb_size);
2901 ff_thread_progress_report(&s->wpp_progress[ctb_row], INT_MAX);
2902 return ctb_addr_ts;
2903 }
2904 ctb_addr_rs = pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2905 x_ctb+=ctb_size;
2906
2907 if(x_ctb >= sps->width) {
2908 break;
2909 }
2910 }
2911 ff_thread_progress_report(&s->wpp_progress[ctb_row], INT_MAX);
2912
2913 return 0;
2914error:
2915 l->tab_slice_address[ctb_addr_rs] = -1;
2916 /* Casting const away here is safe, because it is an atomic operation. */
2917 atomic_store((atomic_int*)&s->wpp_err, 1);
2918 ff_thread_progress_report(&s->wpp_progress[ctb_row], INT_MAX);
2919 return ret;
2920}
2921
2922static int wpp_progress_init(HEVCContext *s, unsigned count)
2923{
2924 if (s->nb_wpp_progress < count) {
2925 void *tmp = av_realloc_array(s->wpp_progress, count,
2926 sizeof(*s->wpp_progress));
2927 if (!tmp)
2928 return AVERROR(ENOMEM);
2929
2930 s->wpp_progress = tmp;
2931 memset(s->wpp_progress + s->nb_wpp_progress, 0,
2932 (count - s->nb_wpp_progress) * sizeof(*s->wpp_progress));
2933
2934 for (int i = s->nb_wpp_progress; i < count; i++) {
2935 int ret = ff_thread_progress_init(&s->wpp_progress[i], 1);
2936 if (ret < 0)
2937 return ret;
2938 s->nb_wpp_progress = i + 1;
2939 }
2940 }
2941
2942 for (int i = 0; i < count; i++)
2943 ff_thread_progress_reset(&s->wpp_progress[i]);
2944
2945 return 0;
2946}
2947
2949{
2950 const HEVCPPS *const pps = s->pps;
2951 const HEVCSPS *const sps = pps->sps;
2952 const uint8_t *data = nal->data;
2953 int length = nal->size;
2954 int *ret;
2956 int64_t startheader, cmpt = 0;
2957 int j, res = 0;
2958
2959 if (s->sh.slice_ctb_addr_rs + s->sh.num_entry_point_offsets * (int64_t)sps->ctb_width >= sps->ctb_width * (int64_t)sps->ctb_height) {
2960 av_log(s->avctx, AV_LOG_ERROR, "WPP ctb addresses are wrong (%d %d %d %d)\n",
2961 s->sh.slice_ctb_addr_rs, s->sh.num_entry_point_offsets,
2962 sps->ctb_width, sps->ctb_height
2963 );
2964 return AVERROR_INVALIDDATA;
2965 }
2966
2967 if (s->avctx->thread_count > s->nb_local_ctx) {
2968 HEVCLocalContext *tmp = av_malloc_array(s->avctx->thread_count, sizeof(*s->local_ctx));
2969
2970 if (!tmp)
2971 return AVERROR(ENOMEM);
2972
2973 memcpy(tmp, s->local_ctx, sizeof(*s->local_ctx) * s->nb_local_ctx);
2974 av_free(s->local_ctx);
2975 s->local_ctx = tmp;
2976
2977 for (unsigned i = s->nb_local_ctx; i < s->avctx->thread_count; i++) {
2978 tmp = &s->local_ctx[i];
2979
2980 memset(tmp, 0, sizeof(*tmp));
2981
2982 tmp->logctx = s->avctx;
2983 tmp->parent = s;
2984 tmp->common_cabac_state = &s->cabac;
2985 }
2986
2987 s->nb_local_ctx = s->avctx->thread_count;
2988 }
2989
2990 offset = s->sh.data_offset;
2991
2992 for (j = 0, cmpt = 0, startheader = offset + s->sh.entry_point_offset[0]; j < nal->skipped_bytes; j++) {
2993 if (nal->skipped_bytes_pos[j] >= offset && nal->skipped_bytes_pos[j] < startheader) {
2994 startheader--;
2995 cmpt++;
2996 }
2997 }
2998
2999 for (int i = 1; i < s->sh.num_entry_point_offsets; i++) {
3000 offset += (s->sh.entry_point_offset[i - 1] - cmpt);
3001 for (j = 0, cmpt = 0, startheader = offset
3002 + s->sh.entry_point_offset[i]; j < nal->skipped_bytes; j++) {
3003 if (nal->skipped_bytes_pos[j] >= offset && nal->skipped_bytes_pos[j] < startheader) {
3004 startheader--;
3005 cmpt++;
3006 }
3007 }
3008 s->sh.size[i] = s->sh.entry_point_offset[i] - cmpt;
3009 s->sh.offset[i] = offset;
3010
3011 }
3012
3013 offset += s->sh.entry_point_offset[s->sh.num_entry_point_offsets - 1] - cmpt;
3014 if (length < offset) {
3015 av_log(s->avctx, AV_LOG_ERROR, "entry_point_offset table is corrupted\n");
3016 return AVERROR_INVALIDDATA;
3017 }
3018 s->sh.size [s->sh.num_entry_point_offsets] = length - offset;
3019 s->sh.offset[s->sh.num_entry_point_offsets] = offset;
3020
3021 s->sh.offset[0] = s->sh.data_offset;
3022 s->sh.size[0] = s->sh.offset[1] - s->sh.offset[0];
3023
3024 s->data = data;
3025
3026 for (unsigned i = 1; i < s->nb_local_ctx; i++) {
3027 s->local_ctx[i].first_qp_group = 1;
3028 s->local_ctx[i].qp_y = s->local_ctx[0].qp_y;
3029 }
3030
3031 atomic_store(&s->wpp_err, 0);
3032 res = wpp_progress_init(s, s->sh.num_entry_point_offsets + 1);
3033 if (res < 0)
3034 return res;
3035
3036 ret = av_calloc(s->sh.num_entry_point_offsets + 1, sizeof(*ret));
3037 if (!ret)
3038 return AVERROR(ENOMEM);
3039
3040 if (pps->entropy_coding_sync_enabled_flag)
3041 s->avctx->execute2(s->avctx, hls_decode_entry_wpp, s->local_ctx, ret, s->sh.num_entry_point_offsets + 1);
3042
3043 for (int i = 0; i <= s->sh.num_entry_point_offsets; i++)
3044 res += ret[i];
3045
3046 av_free(ret);
3047 return res;
3048}
3049
3051 const H2645NAL *nal, GetBitContext *gb)
3052{
3053 const HEVCPPS *pps = s->pps;
3054 int ret;
3055
3056 if (!s->sh.first_slice_in_pic_flag)
3057 s->slice_idx += !s->sh.dependent_slice_segment_flag;
3058
3059 if (!s->sh.dependent_slice_segment_flag && s->sh.slice_type != HEVC_SLICE_I) {
3060 ret = ff_hevc_slice_rpl(s);
3061 if (ret < 0) {
3062 av_log(s->avctx, AV_LOG_WARNING,
3063 "Error constructing the reference lists for the current slice.\n");
3064 return ret;
3065 }
3066 }
3067
3068 s->slice_initialized = 1;
3069
3070 if (s->avctx->hwaccel)
3071 return FF_HW_CALL(s->avctx, decode_slice, nal->raw_data, nal->raw_size);
3072
3073 if (s->avctx->profile == AV_PROFILE_HEVC_SCC) {
3074 av_log(s->avctx, AV_LOG_ERROR,
3075 "SCC profile is not yet implemented in hevc native decoder.\n");
3076 return AVERROR_PATCHWELCOME;
3077 }
3078
3079 if (s->sh.dependent_slice_segment_flag) {
3080 int ctb_addr_ts = pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs];
3081 int prev_rs = pps->ctb_addr_ts_to_rs[ctb_addr_ts - 1];
3082 if (l->tab_slice_address[prev_rs] != s->sh.slice_addr) {
3083 av_log(s->avctx, AV_LOG_ERROR, "Previous slice segment missing\n");
3084 return AVERROR_INVALIDDATA;
3085 }
3086 }
3087
3088 s->local_ctx[0].first_qp_group = !s->sh.dependent_slice_segment_flag;
3089
3090 if (!pps->cu_qp_delta_enabled_flag)
3091 s->local_ctx[0].qp_y = s->sh.slice_qp;
3092
3093 s->local_ctx[0].tu.cu_qp_offset_cb = 0;
3094 s->local_ctx[0].tu.cu_qp_offset_cr = 0;
3095
3096 if (s->avctx->active_thread_type == FF_THREAD_SLICE &&
3097 s->sh.num_entry_point_offsets > 0 &&
3098 pps->num_tile_rows == 1 && pps->num_tile_columns == 1)
3099 return hls_slice_data_wpp(s, nal);
3100
3101 return hls_decode_entry(s, gb);
3102}
3103
3105{
3106 const HEVCSPS *sps = s->cur_frame->pps->sps;
3107 AVFrame *out = s->cur_frame->f;
3108 int ret;
3109
3110 // Decrement the mastering display and content light level flag when IRAP
3111 // frame has no_rasl_output_flag=1 so the side data persists for the entire
3112 // coded video sequence.
3113 if (IS_IRAP(s) && s->no_rasl_output_flag) {
3114 if (s->sei.common.mastering_display.present > 0)
3115 s->sei.common.mastering_display.present--;
3116
3117 if (s->sei.common.content_light.present > 0)
3118 s->sei.common.content_light.present--;
3119 }
3120
3121 ret = ff_h2645_sei_to_frame(out, &s->sei.common, AV_CODEC_ID_HEVC, s->avctx,
3122 &sps->vui.common,
3123 sps->bit_depth, sps->bit_depth_chroma,
3124 s->cur_frame->poc /* no poc_offset in HEVC */);
3125 if (ret < 0)
3126 return ret;
3127
3128 if (s->sei.timecode.present) {
3129 uint32_t *tc_sd;
3130 char tcbuf[AV_TIMECODE_STR_SIZE];
3131 AVFrameSideData *tcside;
3133 sizeof(uint32_t) * 4, &tcside);
3134 if (ret < 0)
3135 return ret;
3136
3137 if (tcside) {
3138 tc_sd = (uint32_t*)tcside->data;
3139 tc_sd[0] = s->sei.timecode.num_clock_ts;
3140
3141 for (int i = 0; i < tc_sd[0]; i++) {
3142 int drop = s->sei.timecode.cnt_dropped_flag[i];
3143 int hh = s->sei.timecode.hours_value[i];
3144 int mm = s->sei.timecode.minutes_value[i];
3145 int ss = s->sei.timecode.seconds_value[i];
3146 int ff = s->sei.timecode.n_frames[i];
3147
3148 tc_sd[i + 1] = av_timecode_get_smpte(s->avctx->framerate, drop, hh, mm, ss, ff);
3149 av_timecode_make_smpte_tc_string2(tcbuf, s->avctx->framerate, tc_sd[i + 1], 0, 0);
3150 av_dict_set(&out->metadata, "timecode", tcbuf, 0);
3151 }
3152 }
3153
3154 s->sei.timecode.num_clock_ts = 0;
3155 }
3156
3157 if (s->sei.common.itut_t35.hdr_plus) {
3158 AVBufferRef *info_ref = av_buffer_ref(s->sei.common.itut_t35.hdr_plus);
3159 if (!info_ref)
3160 return AVERROR(ENOMEM);
3161
3163 if (ret < 0)
3164 return ret;
3165 }
3166
3167 if (s->sei.common.itut_t35.hdr_smpte2094_app5) {
3168 AVBufferRef *info_ref = av_buffer_ref(s->sei.common.itut_t35.hdr_smpte2094_app5);
3169 if (!info_ref)
3170 return AVERROR(ENOMEM);
3171
3173 if (ret < 0)
3174 return ret;
3175 }
3176
3177 if (s->rpu_buf) {
3179 if (!rpu)
3180 return AVERROR(ENOMEM);
3181
3182 s->rpu_buf = NULL;
3183 }
3184
3185 if ((ret = ff_dovi_attach_side_data(&s->dovi_ctx, out)) < 0)
3186 return ret;
3187
3188 if (s->sei.common.itut_t35.hdr_vivid) {
3189 if (!av_frame_side_data_add(&out->side_data, &out->nb_side_data,
3191 &s->sei.common.itut_t35.hdr_vivid,
3193 return AVERROR(ENOMEM);
3194 }
3195
3196 return 0;
3197}
3198
3200{
3201 int nal_idx = 0;
3202
3203 for (int i = nal_idx; i < s->pkt.nb_nals; i++) {
3204 const H2645NAL *nal = &s->pkt.nals[i];
3205 const int layer_id = nal->nuh_layer_id;
3206 GetBitContext gb = nal->gb;
3207
3208 if (layer_id > HEVC_MAX_NUH_LAYER_ID || s->vps->layer_idx[layer_id] < 0 ||
3209 !(s->layers_active_decode & (1 << s->vps->layer_idx[layer_id])))
3210 continue;
3211
3212 switch (nal->type) {
3213 case HEVC_NAL_TRAIL_R:
3214 case HEVC_NAL_TRAIL_N:
3215 case HEVC_NAL_TSA_N:
3216 case HEVC_NAL_TSA_R:
3217 case HEVC_NAL_STSA_N:
3218 case HEVC_NAL_STSA_R:
3219 case HEVC_NAL_BLA_W_LP:
3221 case HEVC_NAL_BLA_N_LP:
3223 case HEVC_NAL_IDR_N_LP:
3224 case HEVC_NAL_CRA_NUT:
3225 case HEVC_NAL_RADL_N:
3226 case HEVC_NAL_RADL_R:
3227 case HEVC_NAL_RASL_N:
3228 case HEVC_NAL_RASL_R:
3229 if (!get_bits1(&gb)) // first_slice_segment_in_pic_flag
3230 continue;
3232 case HEVC_NAL_VPS:
3233 case HEVC_NAL_SPS:
3234 case HEVC_NAL_PPS:
3235 nal_idx = i;
3236 break;
3237 }
3238 }
3239
3240 return nal_idx;
3241}
3242
3244 unsigned nal_idx)
3245{
3246 const HEVCPPS *const pps = s->ps.pps_list[s->sh.pps_id];
3247 const HEVCSPS *const sps = pps->sps;
3248 int pic_size_in_ctb = ((sps->width >> sps->log2_min_cb_size) + 1) *
3249 ((sps->height >> sps->log2_min_cb_size) + 1);
3250 int new_sequence = (l == &s->layers[0]) &&
3251 (IS_IDR(s) || IS_BLA(s) || s->last_eos);
3252 int prev_layers_active_decode = s->layers_active_decode;
3253 int prev_layers_active_output = s->layers_active_output;
3254 int ret;
3255
3256 if (sps->vps != s->vps && l != &s->layers[0]) {
3257 av_log(s->avctx, AV_LOG_ERROR, "VPS changed in a non-base layer\n");
3258 set_sps(s, l, NULL);
3259 return AVERROR_INVALIDDATA;
3260 }
3261
3262 av_refstruct_replace(&s->pps, pps);
3263 if (l->sps != sps) {
3264 const HEVCSPS *sps_base = s->layers[0].sps;
3265 enum AVPixelFormat pix_fmt = sps->pix_fmt;
3266
3267 if (l != &s->layers[0]) {
3268 if (!sps_base) {
3269 av_log(s->avctx, AV_LOG_ERROR,
3270 "Access unit starts with a non-base layer frame\n");
3271 return AVERROR_INVALIDDATA;
3272 }
3273
3274 // Files produced by Vision Pro lack VPS extension VUI,
3275 // so the secondary layer has no range information.
3276 // This check avoids failing in such a case.
3277 if (sps_base->pix_fmt == AV_PIX_FMT_YUVJ420P &&
3278 sps->pix_fmt == AV_PIX_FMT_YUV420P &&
3279 !sps->vui.common.video_signal_type_present_flag)
3280 pix_fmt = sps_base->pix_fmt;
3281
3282 // Ignore range mismatch between base layer and alpha layer
3284 sps_base->pix_fmt == AV_PIX_FMT_YUV420P &&
3286 pix_fmt = sps_base->pix_fmt;
3287
3288 if (pix_fmt != sps_base->pix_fmt ||
3289 sps->width != sps_base->width ||
3290 sps->height != sps_base->height) {
3291 av_log(s->avctx, AV_LOG_ERROR,
3292 "Base/non-base layer SPS have unsupported parameter combination\n");
3293 return AVERROR(ENOSYS);
3294 }
3295 }
3296
3298
3299 ret = set_sps(s, l, sps);
3300 if (ret < 0)
3301 return ret;
3302
3303 if (l == &s->layers[0]) {
3305
3306 ret = get_format(s, sps);
3307 if (ret < 0) {
3308 set_sps(s, l, NULL);
3309 return ret;
3310 }
3311
3312 new_sequence = 1;
3313 }
3314 }
3315
3316 memset(l->horizontal_bs, 0, l->bs_width * l->bs_height);
3317 memset(l->vertical_bs, 0, l->bs_width * l->bs_height);
3318 memset(l->cbf_luma, 0, sps->min_tb_width * sps->min_tb_height);
3319 memset(l->is_pcm, 0, (sps->min_pu_width + 1) * (sps->min_pu_height + 1));
3320 memset(l->tab_slice_address, -1, pic_size_in_ctb * sizeof(*l->tab_slice_address));
3321
3322 if (IS_IDR(s))
3324
3325 s->slice_idx = 0;
3326 s->first_nal_type = s->nal_unit_type;
3327 s->poc = s->sh.poc;
3328
3329 if (IS_IRAP(s)) {
3330 s->no_rasl_output_flag = IS_IDR(s) || IS_BLA(s) ||
3331 (s->nal_unit_type == HEVC_NAL_CRA_NUT && s->last_eos);
3332 s->recovery_poc = HEVC_RECOVERY_END;
3333 }
3334
3335 if (s->recovery_poc != HEVC_RECOVERY_END &&
3336 s->sei.recovery_point.has_recovery_poc) {
3337 if (s->recovery_poc == HEVC_RECOVERY_UNSPECIFIED)
3338 s->recovery_poc = s->poc + s->sei.recovery_point.recovery_poc_cnt;
3339 else if (s->poc >= s->recovery_poc)
3340 s->recovery_poc = HEVC_RECOVERY_END;
3341 }
3342
3343 /* 8.3.1 */
3344 if (s->temporal_id == 0 &&
3345 s->nal_unit_type != HEVC_NAL_TRAIL_N &&
3346 s->nal_unit_type != HEVC_NAL_TSA_N &&
3347 s->nal_unit_type != HEVC_NAL_STSA_N &&
3348 s->nal_unit_type != HEVC_NAL_RADL_N &&
3349 s->nal_unit_type != HEVC_NAL_RADL_R &&
3350 s->nal_unit_type != HEVC_NAL_RASL_N &&
3351 s->nal_unit_type != HEVC_NAL_RASL_R)
3352 s->poc_tid0 = s->poc;
3353
3354 if (pps->tiles_enabled_flag)
3355 s->local_ctx[0].end_of_tiles_x = pps->column_width[0] << sps->log2_ctb_size;
3356
3357 if (new_sequence) {
3358 ret = ff_hevc_output_frames(s, prev_layers_active_decode, prev_layers_active_output,
3359 0, 0, s->sh.no_output_of_prior_pics_flag);
3360 if (ret < 0)
3361 return ret;
3362 }
3363
3365 if (ret < 0)
3366 return ret;
3367
3368 ret = ff_hevc_set_new_ref(s, l, s->poc);
3369 if (ret < 0)
3370 goto fail;
3371
3372 ret = ff_hevc_frame_rps(s, l);
3373 if (ret < 0) {
3374 av_log(s->avctx, AV_LOG_ERROR, "Error constructing the frame RPS.\n");
3375 goto fail;
3376 }
3377
3378 if (IS_IRAP(s))
3379 s->cur_frame->f->flags |= AV_FRAME_FLAG_KEY;
3380 else
3381 s->cur_frame->f->flags &= ~AV_FRAME_FLAG_KEY;
3382
3383 s->cur_frame->needs_fg = ((s->sei.common.film_grain_characteristics &&
3384 s->sei.common.film_grain_characteristics->present) ||
3385 s->sei.common.itut_t35.aom_film_grain.enable) &&
3386 !(s->avctx->export_side_data & AV_CODEC_EXPORT_DATA_FILM_GRAIN) &&
3387 !s->avctx->hwaccel;
3388
3389 ret = set_side_data(s);
3390 if (ret < 0)
3391 goto fail;
3392
3393 if (s->cur_frame->needs_fg &&
3394 (s->sei.common.film_grain_characteristics && s->sei.common.film_grain_characteristics->present &&
3395 !ff_h274_film_grain_params_supported(s->sei.common.film_grain_characteristics->model_id,
3396 s->cur_frame->f->format) ||
3397 !av_film_grain_params_select(s->cur_frame->f))) {
3398 av_log_once(s->avctx, AV_LOG_WARNING, AV_LOG_DEBUG, &s->film_grain_warning_shown,
3399 "Unsupported film grain parameters. Ignoring film grain.\n");
3400 s->cur_frame->needs_fg = 0;
3401 }
3402
3403 if (s->cur_frame->needs_fg) {
3404 s->cur_frame->frame_grain->format = s->cur_frame->f->format;
3405 s->cur_frame->frame_grain->width = s->cur_frame->f->width;
3406 s->cur_frame->frame_grain->height = s->cur_frame->f->height;
3407 if ((ret = ff_thread_get_buffer(s->avctx, s->cur_frame->frame_grain, 0)) < 0)
3408 goto fail;
3409
3410 ret = av_frame_copy_props(s->cur_frame->frame_grain, s->cur_frame->f);
3411 if (ret < 0)
3412 goto fail;
3413 }
3414
3415 s->cur_frame->f->pict_type = 3 - s->sh.slice_type;
3416
3417 ret = ff_hevc_output_frames(s, s->layers_active_decode, s->layers_active_output,
3418 sps->temporal_layer[sps->max_sub_layers - 1].num_reorder_pics,
3419 sps->temporal_layer[sps->max_sub_layers - 1].max_dec_pic_buffering, 0);
3420 if (ret < 0)
3421 goto fail;
3422
3423 if (s->avctx->hwaccel) {
3424 AVCodecInternal *avci = s->avctx->internal;
3425 AVPacket *avpkt = avci->in_pkt;
3426 ret = FF_HW_CALL(s->avctx, start_frame,
3427 avpkt->buf, NULL, 0);
3428 if (ret < 0)
3429 goto fail;
3430 }
3431
3432 // after starting the base-layer frame we know which layers will be decoded,
3433 // so we can now figure out which NALUs to wait for before we can call
3434 // ff_thread_finish_setup()
3435 if (l == &s->layers[0])
3436 s->finish_setup_nal_idx = find_finish_setup_nal(s);
3437
3438 if (nal_idx >= s->finish_setup_nal_idx)
3439 ff_thread_finish_setup(s->avctx);
3440
3441 return 0;
3442
3443fail:
3444 if (l->cur_frame)
3446 l->cur_frame = NULL;
3447 s->cur_frame = s->collocated_ref = NULL;
3448 return ret;
3449}
3450
3452{
3454 char msg_buf[4 * (50 + 2 * 2 * 16 /* MD5-size */)];
3455 int pixel_shift;
3456 int err = 0;
3457 int i, j;
3458
3459 if (!desc)
3460 return AVERROR(EINVAL);
3461
3462 pixel_shift = desc->comp[0].depth > 8;
3463
3464 /* the checksums are LE, so we have to byteswap for >8bpp formats
3465 * on BE arches */
3466#if HAVE_BIGENDIAN
3467 if (pixel_shift && !s->checksum_buf) {
3468 av_fast_malloc(&s->checksum_buf, &s->checksum_buf_size,
3469 FFMAX3(frame->linesize[0], frame->linesize[1],
3470 frame->linesize[2]));
3471 if (!s->checksum_buf)
3472 return AVERROR(ENOMEM);
3473 }
3474#endif
3475
3476 msg_buf[0] = '\0';
3477 for (i = 0; frame->data[i]; i++) {
3478 int width = s->avctx->coded_width;
3479 int height = s->avctx->coded_height;
3480 int w = (i == 1 || i == 2) ? (width >> desc->log2_chroma_w) : width;
3481 int h = (i == 1 || i == 2) ? (height >> desc->log2_chroma_h) : height;
3482 uint8_t md5[16];
3483
3484 av_md5_init(s->md5_ctx);
3485 for (j = 0; j < h; j++) {
3486 const uint8_t *src = frame->data[i] + j * frame->linesize[i];
3487#if HAVE_BIGENDIAN
3488 if (pixel_shift) {
3489 s->bdsp.bswap16_buf((uint16_t *) s->checksum_buf,
3490 (const uint16_t *) src, w);
3491 src = s->checksum_buf;
3492 }
3493#endif
3494 av_md5_update(s->md5_ctx, src, w << pixel_shift);
3495 }
3496 av_md5_final(s->md5_ctx, md5);
3497
3498#define MD5_PRI "%016" PRIx64 "%016" PRIx64
3499#define MD5_PRI_ARG(buf) AV_RB64(buf), AV_RB64((const uint8_t*)(buf) + 8)
3500
3501 if (!memcmp(md5, s->sei.picture_hash.md5[i], 16)) {
3502 av_strlcatf(msg_buf, sizeof(msg_buf),
3503 "plane %d - correct " MD5_PRI "; ",
3504 i, MD5_PRI_ARG(md5));
3505 } else {
3506 av_strlcatf(msg_buf, sizeof(msg_buf),
3507 "mismatching checksum of plane %d - " MD5_PRI " != " MD5_PRI "; ",
3508 i, MD5_PRI_ARG(md5), MD5_PRI_ARG(s->sei.picture_hash.md5[i]));
3509 err = AVERROR_INVALIDDATA;
3510 }
3511 }
3512
3513 av_log(s->avctx, err < 0 ? AV_LOG_ERROR : AV_LOG_DEBUG,
3514 "Verifying checksum for frame with POC %d: %s\n",
3515 s->poc, msg_buf);
3516
3517 return err;
3518 }
3519
3521{
3522 HEVCFrame *out = l->cur_frame;
3523 const AVFilmGrainParams *fgp;
3524 av_unused int ret;
3525
3526 if (out->needs_fg) {
3527 av_assert0(out->frame_grain->buf[0]);
3529 switch (fgp->type) {
3531 av_assert0(0);
3532 return AVERROR_BUG;
3534 ret = ff_h274_apply_film_grain(out->frame_grain, out->f, fgp);
3535 break;
3537 ret = ff_aom_apply_film_grain(out->frame_grain, out->f, fgp);
3538 break;
3539 }
3540 av_assert1(ret >= 0);
3541 }
3542
3543 if (s->avctx->hwaccel) {
3544 ret = FF_HW_SIMPLE_CALL(s->avctx, end_frame);
3545 if (ret < 0) {
3546 av_log(s->avctx, AV_LOG_ERROR,
3547 "hardware accelerator failed to decode picture\n");
3548 return ret;
3549 }
3550 } else {
3551 if (s->avctx->err_recognition & AV_EF_CRCCHECK &&
3552 s->sei.picture_hash.is_md5) {
3553 ret = verify_md5(s, out->f);
3554 if (ret < 0 && s->avctx->err_recognition & AV_EF_EXPLODE)
3555 return ret;
3556 }
3557 }
3558 s->sei.picture_hash.is_md5 = 0;
3559
3560 av_log(s->avctx, AV_LOG_DEBUG, "Decoded frame with POC %zu/%d.\n",
3561 l - s->layers, s->poc);
3562
3563 return 0;
3564}
3565
3566static int decode_slice(HEVCContext *s, unsigned nal_idx, GetBitContext *gb)
3567{
3568 const int layer_idx = s->vps ? s->vps->layer_idx[s->nuh_layer_id] : 0;
3570 int ret;
3571
3572 // skip layers not requested to be decoded
3573 // layers_active_decode can only change while decoding a base-layer frame,
3574 // so we can check it for non-base layers
3575 if (layer_idx < 0 ||
3576 (s->nuh_layer_id > 0 && !(s->layers_active_decode & (1 << layer_idx))))
3577 return 0;
3578
3579 // the first slice of this picture was skipped, so drop the remaining
3580 // slices before parsing, the context is stale for them
3581 if (s->skipping_frame && !show_bits1(gb))
3582 return 0;
3583
3584 ret = hls_slice_header(&s->sh, s, gb);
3585 // Once hls_slice_header has been called, the context is inconsistent with the slice header
3586 // until the context is reinitialized according to the contents of the new slice header
3587 // at the start of decode_slice_data.
3588 s->slice_initialized = 0;
3589 if (ret < 0) {
3590 return ret;
3591 }
3592
3593 if ((s->avctx->skip_frame >= AVDISCARD_BIDIR && s->sh.slice_type == HEVC_SLICE_B) ||
3594 (s->avctx->skip_frame >= AVDISCARD_NONINTRA && s->sh.slice_type != HEVC_SLICE_I) ||
3595 (s->avctx->skip_frame >= AVDISCARD_NONKEY && !IS_IRAP(s)) ||
3596 ((s->nal_unit_type == HEVC_NAL_RASL_R || s->nal_unit_type == HEVC_NAL_RASL_N) &&
3597 s->no_rasl_output_flag)) {
3598 if (s->sh.first_slice_in_pic_flag)
3599 s->skipping_frame = 1;
3600 return 0;
3601 }
3602 if (s->sh.first_slice_in_pic_flag)
3603 s->skipping_frame = 0;
3604
3605 // switching to a new layer, mark previous layer's frame (if any) as done
3606 if (s->cur_layer != layer_idx &&
3607 s->layers[s->cur_layer].cur_frame &&
3608 s->avctx->active_thread_type == FF_THREAD_FRAME)
3609 ff_progress_frame_report(&s->layers[s->cur_layer].cur_frame->tf, INT_MAX);
3610
3611 s->cur_layer = layer_idx;
3612 l = &s->layers[s->cur_layer];
3613
3614 if (s->sh.first_slice_in_pic_flag) {
3615 if (l->cur_frame) {
3616 av_log(s->avctx, AV_LOG_ERROR, "Two slices reporting being the first in the same frame.\n");
3617 return AVERROR_INVALIDDATA;
3618 }
3619
3620 ret = hevc_frame_start(s, l, nal_idx);
3621 if (ret < 0)
3622 return ret;
3623 } else if (!l->cur_frame) {
3624 av_log(s->avctx, AV_LOG_ERROR, "First slice in a frame missing.\n");
3625 return AVERROR_INVALIDDATA;
3626 }
3627
3628 if (s->nal_unit_type != s->first_nal_type) {
3629 av_log(s->avctx, AV_LOG_ERROR,
3630 "Non-matching NAL types of the VCL NALUs: %d %d\n",
3631 s->first_nal_type, s->nal_unit_type);
3632 return AVERROR_INVALIDDATA;
3633 }
3634
3635 ret = decode_slice_data(s, l, &s->pkt.nals[nal_idx], gb);
3636 if (ret < 0)
3637 return ret;
3638
3639 return 0;
3640}
3641
3642static int decode_nal_unit(HEVCContext *s, unsigned nal_idx)
3643{
3644 H2645NAL *nal = &s->pkt.nals[nal_idx];
3645 GetBitContext gb = nal->gb;
3646 int ret;
3647
3648 s->nal_unit_type = nal->type;
3649 s->nuh_layer_id = nal->nuh_layer_id;
3650 s->temporal_id = nal->temporal_id;
3651
3652 if (FF_HW_HAS_CB(s->avctx, decode_params) &&
3653 (s->nal_unit_type == HEVC_NAL_VPS ||
3654 s->nal_unit_type == HEVC_NAL_SPS ||
3655 s->nal_unit_type == HEVC_NAL_PPS ||
3656 s->nal_unit_type == HEVC_NAL_SEI_PREFIX ||
3657 s->nal_unit_type == HEVC_NAL_SEI_SUFFIX)) {
3658 ret = FF_HW_CALL(s->avctx, decode_params,
3659 nal->type, nal->raw_data, nal->raw_size);
3660 if (ret < 0)
3661 goto fail;
3662 }
3663
3664 switch (s->nal_unit_type) {
3665 case HEVC_NAL_VPS:
3666 ret = ff_hevc_decode_nal_vps(&gb, s->avctx, &s->ps);
3667 if (ret < 0)
3668 goto fail;
3669 break;
3670 case HEVC_NAL_SPS:
3671 ret = ff_hevc_decode_nal_sps(&gb, s->avctx, &s->ps,
3672 nal->nuh_layer_id, s->apply_defdispwin);
3673 if (ret < 0)
3674 goto fail;
3675 break;
3676 case HEVC_NAL_PPS:
3677 ret = ff_hevc_decode_nal_pps(&gb, s->avctx, &s->ps);
3678 if (ret < 0)
3679 goto fail;
3680 break;
3683 ret = ff_hevc_decode_nal_sei(&gb, s->avctx, &s->sei, &s->ps, s->nal_unit_type);
3684 if (ret < 0)
3685 goto fail;
3686 break;
3687 case HEVC_NAL_TRAIL_R:
3688 case HEVC_NAL_TRAIL_N:
3689 case HEVC_NAL_TSA_N:
3690 case HEVC_NAL_TSA_R:
3691 case HEVC_NAL_STSA_N:
3692 case HEVC_NAL_STSA_R:
3693 case HEVC_NAL_BLA_W_LP:
3695 case HEVC_NAL_BLA_N_LP:
3697 case HEVC_NAL_IDR_N_LP:
3698 case HEVC_NAL_CRA_NUT:
3699 case HEVC_NAL_RADL_N:
3700 case HEVC_NAL_RADL_R:
3701 case HEVC_NAL_RASL_N:
3702 case HEVC_NAL_RASL_R:
3703 ret = decode_slice(s, nal_idx, &gb);
3704 if (ret < 0)
3705 goto fail;
3706 break;
3707 case HEVC_NAL_EOS_NUT:
3708 case HEVC_NAL_EOB_NUT:
3709 case HEVC_NAL_AUD:
3710 case HEVC_NAL_FD_NUT:
3711 case HEVC_NAL_UNSPEC62: // Dolby Vision RPU
3712 case HEVC_NAL_UNSPEC63: // Dolby Vision EL
3713 break;
3714 default:
3715 av_log(s->avctx, AV_LOG_VERBOSE,
3716 "Skipping NAL unit %d\n", s->nal_unit_type);
3717 }
3718
3719 return 0;
3720fail:
3721 if (ret == AVERROR_INVALIDDATA &&
3722 !(s->avctx->err_recognition & AV_EF_EXPLODE)) {
3723 av_log(s->avctx, AV_LOG_WARNING,
3724 "Skipping invalid undecodable NALU: %d\n", s->nal_unit_type);
3725 return 0;
3726 }
3727 return ret;
3728}
3729
3731{
3732 s->recovery_poc = HEVC_RECOVERY_UNSPECIFIED;
3733 s->sei.recovery_point.has_recovery_poc = 0;
3734}
3735
3736static int decode_nal_units(HEVCContext *s, const uint8_t *buf, int length)
3737{
3738 int ret = 0;
3739 int eos_at_start = 1;
3740 int flags = (H2645_FLAG_IS_NALFF * !!s->is_nalff) | H2645_FLAG_SMALL_PADDING;
3741
3742 s->cur_frame = s->collocated_ref = NULL;
3743 s->last_eos = s->eos;
3744 s->eos = 0;
3745 s->slice_initialized = 0;
3746 if (s->last_eos)
3748
3749 for (int i = 0; i < FF_ARRAY_ELEMS(s->layers); i++) {
3750 HEVCLayerContext *l = &s->layers[i];
3751 l->cur_frame = NULL;
3752 }
3753
3754 /* split the input packet into NAL units, so we know the upper bound on the
3755 * number of slices in the frame */
3756 ret = ff_h2645_packet_split(&s->pkt, buf, length, s->avctx,
3757 s->nal_length_size, s->avctx->codec_id, flags);
3758 if (ret < 0) {
3759 av_log(s->avctx, AV_LOG_ERROR,
3760 "Error splitting the input into NAL units.\n");
3761 return ret;
3762 }
3763
3764 for (int i = 0; i < s->pkt.nb_nals; i++) {
3765 if (s->pkt.nals[i].type == HEVC_NAL_EOB_NUT ||
3766 s->pkt.nals[i].type == HEVC_NAL_EOS_NUT) {
3767 if (eos_at_start) {
3768 s->last_eos = 1;
3770 } else {
3771 s->eos = 1;
3772 }
3773 } else {
3774 eos_at_start = 0;
3775 }
3776 }
3777
3778 /*
3779 * Check for RPU delimiter.
3780 *
3781 * Dolby Vision RPUs masquerade as unregistered NALs of type 62.
3782 *
3783 * We have to do this check here an create the rpu buffer, since RPUs are appended
3784 * to the end of an AU; they are normally the last non-EOB/EOS NAL in the AU.
3785 */
3786 H2645NAL *rpu_nal = NULL;
3787 for (int i = s->pkt.nb_nals - 1; i > 0 ; i--) {
3788 if (s->pkt.nals[i].type == HEVC_NAL_UNSPEC62 && s->pkt.nals[i].size > 2
3789 && !s->pkt.nals[i].nuh_layer_id && !s->pkt.nals[i].temporal_id) {
3790 rpu_nal = &s->pkt.nals[i];
3791 break;
3792 }
3793 }
3794
3795 if (rpu_nal) {
3796 if (s->rpu_buf) {
3797 av_buffer_unref(&s->rpu_buf);
3798 av_log(s->avctx, AV_LOG_WARNING, "Multiple Dolby Vision RPUs found in one AU. Skipping previous.\n");
3799 }
3800
3801 s->rpu_buf = av_buffer_alloc(rpu_nal->raw_size - 2);
3802 if (!s->rpu_buf) {
3803 ret = AVERROR(ENOMEM);
3804 goto fail;
3805 }
3806 memcpy(s->rpu_buf->data, rpu_nal->raw_data + 2, rpu_nal->raw_size - 2);
3807
3808 ret = ff_dovi_rpu_parse(&s->dovi_ctx, rpu_nal->data + 2, rpu_nal->size - 2,
3809 s->avctx->err_recognition);
3810 if (ret < 0) {
3811 av_buffer_unref(&s->rpu_buf);
3812 av_log(s->avctx, AV_LOG_WARNING, "Error parsing DOVI NAL unit.\n");
3813 /* ignore */
3814 }
3815 }
3816
3817 /* decode the NAL units */
3818 for (int i = 0; i < s->pkt.nb_nals; i++) {
3819 H2645NAL *nal = &s->pkt.nals[i];
3820
3821 if (s->avctx->skip_frame >= AVDISCARD_ALL ||
3822 (s->avctx->skip_frame >= AVDISCARD_NONREF && ff_hevc_nal_is_nonref(nal->type)))
3823 continue;
3824
3825 ret = decode_nal_unit(s, i);
3826 if (ret < 0) {
3827 av_log(s->avctx, AV_LOG_WARNING,
3828 "Error parsing NAL unit #%d.\n", i);
3829 goto fail;
3830 }
3831 }
3832
3833fail:
3834 for (int i = 0; i < FF_ARRAY_ELEMS(s->layers); i++) {
3835 HEVCLayerContext *l = &s->layers[i];
3836
3837 if (!l->cur_frame)
3838 continue;
3839
3840 if (ret >= 0)
3841 ret = hevc_frame_end(s, l);
3842
3843 if (s->avctx->active_thread_type == FF_THREAD_FRAME)
3844 ff_progress_frame_report(&l->cur_frame->tf, INT_MAX);
3845 }
3846
3847 return ret;
3848}
3849
3850static int hevc_decode_extradata(HEVCContext *s, uint8_t *buf, int length, int first)
3851{
3852 int ret, i;
3853
3854 ret = ff_hevc_decode_extradata(buf, length, &s->ps, &s->sei, &s->is_nalff,
3855 &s->nal_length_size, s->avctx->err_recognition,
3856 s->apply_defdispwin, s->avctx);
3857 if (ret < 0)
3858 return ret;
3859
3860 /* export stream parameters from the first SPS */
3861 for (i = 0; i < FF_ARRAY_ELEMS(s->ps.sps_list); i++) {
3862 if (first && s->ps.sps_list[i]) {
3863 const HEVCSPS *sps = s->ps.sps_list[i];
3865
3866 ret = export_multilayer(s, sps->vps);
3867 if (ret < 0)
3868 return ret;
3869
3870 break;
3871 }
3872 }
3873
3874 /* export stream parameters from SEI */
3876 if (ret < 0)
3877 return ret;
3878
3879 return 0;
3880}
3881
3883{
3884 HEVCContext *s = avctx->priv_data;
3885 AVCodecInternal *avci = avctx->internal;
3886 AVPacket *avpkt = avci->in_pkt;
3887
3888 int ret;
3889 uint8_t *sd;
3890 size_t sd_size;
3891
3892 s->pkt_dts = AV_NOPTS_VALUE;
3893
3894 if (av_container_fifo_can_read(s->output_fifo))
3895 goto do_output;
3896
3897 av_packet_unref(avpkt);
3898 ret = ff_decode_get_packet(avctx, avpkt);
3899 if (ret == AVERROR_EOF) {
3900 ret = ff_hevc_output_frames(s, s->layers_active_decode,
3901 s->layers_active_output, 0, 0, 0);
3902 if (ret < 0)
3903 return ret;
3904 goto do_output;
3905 } else if (ret < 0)
3906 return ret;
3907
3908 s->pkt_dts = avpkt->dts;
3909
3911 if (sd && sd_size > 0) {
3912 ret = hevc_decode_extradata(s, sd, sd_size, 0);
3913 if (ret < 0)
3914 return ret;
3915 }
3916
3917 sd = av_packet_get_side_data(avpkt, AV_PKT_DATA_DOVI_CONF, &sd_size);
3918 if (sd && sd_size >= sizeof(s->dovi_ctx.cfg)) {
3919 int old = s->dovi_ctx.cfg.dv_profile;
3920 s->dovi_ctx.cfg = *(AVDOVIDecoderConfigurationRecord *) sd;
3921 if (old)
3922 av_log(avctx, AV_LOG_DEBUG,
3923 "New DOVI configuration record from input packet (profile %d -> %u).\n",
3924 old, s->dovi_ctx.cfg.dv_profile);
3925 }
3926
3927 ret = decode_nal_units(s, avpkt->data, avpkt->size);
3928 if (ret < 0)
3929 return ret;
3930
3931do_output:
3932 if (av_container_fifo_read(s->output_fifo, frame, 0) >= 0) {
3935
3936 return 0;
3937 }
3938
3939 return avci->draining ? AVERROR_EOF : AVERROR(EAGAIN);
3940}
3941
3943{
3944 int ret;
3945
3946 ff_progress_frame_ref(&dst->tf, &src->tf);
3947
3948 if (src->needs_fg) {
3949 ret = av_frame_ref(dst->frame_grain, src->frame_grain);
3950 if (ret < 0) {
3952 return ret;
3953 }
3954 dst->needs_fg = 1;
3955 }
3956
3957 dst->pps = av_refstruct_ref_c(src->pps);
3958 dst->tab_mvf = av_refstruct_ref(src->tab_mvf);
3959 dst->rpl_tab = av_refstruct_ref(src->rpl_tab);
3960 dst->rpl = av_refstruct_ref(src->rpl);
3961 dst->nb_rpl_elems = src->nb_rpl_elems;
3962
3963 dst->poc = src->poc;
3964 dst->ctb_count = src->ctb_count;
3965 dst->flags = src->flags;
3966
3967 dst->base_layer_frame = src->base_layer_frame;
3968
3969 av_refstruct_replace(&dst->hwaccel_picture_private,
3970 src->hwaccel_picture_private);
3971
3972 return 0;
3973}
3974
3976{
3977 HEVCContext *s = avctx->priv_data;
3978
3979 for (int i = 0; i < FF_ARRAY_ELEMS(s->layers); i++) {
3980 pic_arrays_free(&s->layers[i]);
3981 av_refstruct_unref(&s->layers[i].sps);
3982 }
3983
3984 av_refstruct_unref(&s->vps);
3985 av_refstruct_unref(&s->pps);
3986
3987 ff_dovi_ctx_unref(&s->dovi_ctx);
3988 av_buffer_unref(&s->rpu_buf);
3989
3990 av_freep(&s->md5_ctx);
3991
3992 av_container_fifo_free(&s->output_fifo);
3993
3994 for (int layer = 0; layer < FF_ARRAY_ELEMS(s->layers); layer++) {
3995 HEVCLayerContext *l = &s->layers[layer];
3996 for (int i = 0; i < FF_ARRAY_ELEMS(l->DPB); i++) {
3997 ff_hevc_unref_frame(&l->DPB[i], ~0);
3999 }
4000 }
4001
4002 ff_hevc_ps_uninit(&s->ps);
4003
4004 for (int i = 0; i < s->nb_wpp_progress; i++)
4005 ff_thread_progress_destroy(&s->wpp_progress[i]);
4006 av_freep(&s->wpp_progress);
4007
4008 av_freep(&s->sh.entry_point_offset);
4009 av_freep(&s->sh.offset);
4010 av_freep(&s->sh.size);
4011
4012 av_freep(&s->local_ctx);
4013
4015
4016 ff_hevc_reset_sei(&s->sei);
4017
4018 return 0;
4019}
4020
4022{
4023 HEVCContext *s = avctx->priv_data;
4024
4025 s->avctx = avctx;
4026
4027 s->local_ctx = av_mallocz(sizeof(*s->local_ctx));
4028 if (!s->local_ctx)
4029 return AVERROR(ENOMEM);
4030 s->nb_local_ctx = 1;
4031
4032 s->local_ctx[0].parent = s;
4033 s->local_ctx[0].logctx = avctx;
4034 s->local_ctx[0].common_cabac_state = &s->cabac;
4035
4036 s->output_fifo = av_container_fifo_alloc_avframe(0);
4037 if (!s->output_fifo)
4038 return AVERROR(ENOMEM);
4039
4040 for (int layer = 0; layer < FF_ARRAY_ELEMS(s->layers); layer++) {
4041 HEVCLayerContext *l = &s->layers[layer];
4042 for (int i = 0; i < FF_ARRAY_ELEMS(l->DPB); i++) {
4044 if (!l->DPB[i].frame_grain)
4045 return AVERROR(ENOMEM);
4046 }
4047 }
4048
4049 s->md5_ctx = av_md5_alloc();
4050 if (!s->md5_ctx)
4051 return AVERROR(ENOMEM);
4052
4053 ff_bswapdsp_init(&s->bdsp);
4054
4055 s->dovi_ctx.logctx = avctx;
4056 s->eos = 0;
4057
4058 ff_hevc_reset_sei(&s->sei);
4059
4060 return 0;
4061}
4062
4063#if HAVE_THREADS
4064static int hevc_update_thread_context(AVCodecContext *dst,
4065 const AVCodecContext *src)
4066{
4067 HEVCContext *s = dst->priv_data;
4068 HEVCContext *s0 = src->priv_data;
4069 int ret;
4070
4071 for (int layer = 0; layer < FF_ARRAY_ELEMS(s->layers); layer++) {
4072 HEVCLayerContext *l = &s->layers[layer];
4073 const HEVCLayerContext *l0 = &s0->layers[layer];
4074 for (int i = 0; i < FF_ARRAY_ELEMS(l->DPB); i++) {
4075 ff_hevc_unref_frame(&l->DPB[i], ~0);
4076 if (l0->DPB[i].f) {
4077 ret = hevc_ref_frame(&l->DPB[i], &l0->DPB[i]);
4078 if (ret < 0)
4079 return ret;
4080 }
4081 }
4082
4083 if (l->sps != l0->sps) {
4084 ret = set_sps(s, l, l0->sps);
4085 if (ret < 0)
4086 return ret;
4087 }
4088 }
4089
4090 for (int i = 0; i < FF_ARRAY_ELEMS(s->ps.vps_list); i++)
4091 av_refstruct_replace(&s->ps.vps_list[i], s0->ps.vps_list[i]);
4092
4093 for (int i = 0; i < FF_ARRAY_ELEMS(s->ps.sps_list); i++)
4094 av_refstruct_replace(&s->ps.sps_list[i], s0->ps.sps_list[i]);
4095
4096 for (int i = 0; i < FF_ARRAY_ELEMS(s->ps.pps_list); i++)
4097 av_refstruct_replace(&s->ps.pps_list[i], s0->ps.pps_list[i]);
4098
4099 // PPS do not persist between frames
4100 av_refstruct_unref(&s->pps);
4101
4102 s->poc_tid0 = s0->poc_tid0;
4103 s->eos = s0->eos;
4104 s->no_rasl_output_flag = s0->no_rasl_output_flag;
4105 s->skipping_frame = s0->skipping_frame;
4106
4107 s->is_nalff = s0->is_nalff;
4108 s->nal_length_size = s0->nal_length_size;
4109 s->layers_active_decode = s0->layers_active_decode;
4110 s->layers_active_output = s0->layers_active_output;
4111
4112 s->film_grain_warning_shown = s0->film_grain_warning_shown;
4113
4114 if (s->nb_view_ids != s0->nb_view_ids ||
4115 memcmp(s->view_ids, s0->view_ids, sizeof(*s->view_ids) * s->nb_view_ids)) {
4116 av_freep(&s->view_ids);
4117 s->nb_view_ids = 0;
4118
4119 if (s0->nb_view_ids) {
4120 s->view_ids = av_memdup(s0->view_ids, s0->nb_view_ids * sizeof(*s0->view_ids));
4121 if (!s->view_ids)
4122 return AVERROR(ENOMEM);
4123 s->nb_view_ids = s0->nb_view_ids;
4124 }
4125 }
4126
4127 ret = ff_h2645_sei_ctx_replace(&s->sei.common, &s0->sei.common);
4128 if (ret < 0)
4129 return ret;
4130
4131 ret = av_buffer_replace(&s->sei.common.itut_t35.hdr_plus,
4133 if (ret < 0)
4134 return ret;
4135
4136 ret = av_buffer_replace(&s->rpu_buf, s0->rpu_buf);
4137 if (ret < 0)
4138 return ret;
4139
4140 ff_dovi_ctx_replace(&s->dovi_ctx, &s0->dovi_ctx);
4141
4142 ret = av_buffer_replace(&s->sei.common.itut_t35.hdr_vivid,
4144 if (ret < 0)
4145 return ret;
4146
4147 s->sei.common.frame_packing = s0->sei.common.frame_packing;
4148 s->sei.common.display_orientation = s0->sei.common.display_orientation;
4149 s->sei.common.alternative_transfer = s0->sei.common.alternative_transfer;
4150 s->sei.tdrdi = s0->sei.tdrdi;
4151 s->sei.recovery_point = s0->sei.recovery_point;
4152 s->recovery_poc = s0->recovery_poc;
4153
4154 return 0;
4155}
4156#endif
4157
4159{
4160 int ret;
4161
4162 if (sei->tdrdi.present) {
4163 AVBufferRef *buf;
4164 size_t size;
4165 AV3DReferenceDisplaysInfo *tdrdi = av_tdrdi_alloc(sei->tdrdi.num_ref_displays, &size);
4166
4167 if (!tdrdi)
4168 return AVERROR(ENOMEM);
4169
4170 buf = av_buffer_create((uint8_t *)tdrdi, size, NULL, NULL, 0);
4171 if (!buf) {
4172 av_free(tdrdi);
4173 return AVERROR(ENOMEM);
4174 }
4175
4176 tdrdi->prec_ref_display_width = sei->tdrdi.prec_ref_display_width;
4177 tdrdi->ref_viewing_distance_flag = sei->tdrdi.ref_viewing_distance_flag;
4178 tdrdi->prec_ref_viewing_dist = sei->tdrdi.prec_ref_viewing_dist;
4179 tdrdi->num_ref_displays = sei->tdrdi.num_ref_displays;
4180 for (int i = 0; i < sei->tdrdi.num_ref_displays; i++) {
4181 AV3DReferenceDisplay *display = av_tdrdi_get_display(tdrdi, i);
4182
4183 display->left_view_id = sei->tdrdi.left_view_id[i];
4184 display->right_view_id = sei->tdrdi.right_view_id[i];
4185 display->exponent_ref_display_width = sei->tdrdi.exponent_ref_display_width[i];
4186 display->mantissa_ref_display_width = sei->tdrdi.mantissa_ref_display_width[i];
4187 display->exponent_ref_viewing_distance = sei->tdrdi.exponent_ref_viewing_distance[i];
4188 display->mantissa_ref_viewing_distance = sei->tdrdi.mantissa_ref_viewing_distance[i];
4189 display->additional_shift_present_flag = sei->tdrdi.additional_shift_present_flag[i];
4190 display->num_sample_shift = sei->tdrdi.num_sample_shift[i];
4191 }
4194 if (ret < 0) {
4195 av_buffer_unref(&buf);
4196 return ret;
4197 }
4198 }
4199
4200 ret = ff_h2645_sei_to_context(avctx, &sei->common);
4201 if (ret < 0)
4202 return ret;
4203
4204 return 0;
4205}
4206
4208{
4209 HEVCContext *s = avctx->priv_data;
4210 int ret;
4211
4212 ret = hevc_init_context(avctx);
4213 if (ret < 0)
4214 return ret;
4215
4216 s->sei.picture_timing.picture_struct = 0;
4217 s->eos = 1;
4218
4219 atomic_init(&s->wpp_err, 0);
4220
4221 if (!avctx->internal->is_copy) {
4222 const AVPacketSideData *sd;
4223
4224 if (avctx->extradata_size > 0 && avctx->extradata) {
4225 ret = hevc_decode_extradata(s, avctx->extradata, avctx->extradata_size, 1);
4226 if (ret < 0) {
4227 return ret;
4228 }
4229
4230 ret = hevc_sei_to_context(avctx, &s->sei);
4231 if (ret < 0)
4232 return ret;
4233 }
4234
4236 if (sd && sd->size >= sizeof(s->dovi_ctx.cfg))
4237 s->dovi_ctx.cfg = *(AVDOVIDecoderConfigurationRecord *) sd->data;
4238 }
4239
4240 return 0;
4241}
4242
4244{
4245 HEVCContext *s = avctx->priv_data;
4247 ff_hevc_reset_sei(&s->sei);
4248 ff_dovi_ctx_flush(&s->dovi_ctx);
4249 av_buffer_unref(&s->rpu_buf);
4250 s->eos = 1;
4251 s->skipping_frame = 0;
4252
4253 if (FF_HW_HAS_CB(avctx, flush))
4254 FF_HW_SIMPLE_CALL(avctx, flush);
4255}
4256
4257#define OFFSET(x) offsetof(HEVCContext, x)
4258#define PAR (AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
4259
4260static const AVOption options[] = {
4261 { "apply_defdispwin", "Apply default display window from VUI", OFFSET(apply_defdispwin),
4262 AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, PAR },
4263 { "strict-displaywin", "strictly apply default display window size", OFFSET(apply_defdispwin),
4264 AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, PAR },
4265 { "view_ids", "Array of view IDs that should be decoded and output; a single -1 to decode all views",
4266 .offset = OFFSET(view_ids), .type = AV_OPT_TYPE_INT | AV_OPT_TYPE_FLAG_ARRAY,
4267 .min = -1, .max = INT_MAX, .flags = PAR },
4268 { "view_ids_available", "Array of available view IDs is exported here",
4269 .offset = OFFSET(view_ids_available), .type = AV_OPT_TYPE_UINT | AV_OPT_TYPE_FLAG_ARRAY,
4271 { "view_pos_available", "Array of view positions for view_ids_available is exported here, as AVStereo3DView",
4272 .offset = OFFSET(view_pos_available), .type = AV_OPT_TYPE_UINT | AV_OPT_TYPE_FLAG_ARRAY,
4273 .flags = PAR | AV_OPT_FLAG_EXPORT | AV_OPT_FLAG_READONLY, .unit = "view_pos" },
4274 { "unspecified", .type = AV_OPT_TYPE_CONST, .default_val = { .i64 = AV_STEREO3D_VIEW_UNSPEC }, .unit = "view_pos" },
4275 { "left", .type = AV_OPT_TYPE_CONST, .default_val = { .i64 = AV_STEREO3D_VIEW_LEFT }, .unit = "view_pos" },
4276 { "right", .type = AV_OPT_TYPE_CONST, .default_val = { .i64 = AV_STEREO3D_VIEW_RIGHT }, .unit = "view_pos" },
4277
4278 { NULL },
4279};
4280
4282 .class_name = "HEVC decoder",
4283 .item_name = av_default_item_name,
4284 .option = options,
4285 .version = LIBAVUTIL_VERSION_INT,
4286};
4287
4289 .p.name = "hevc",
4290 CODEC_LONG_NAME("HEVC (High Efficiency Video Coding)"),
4291 .p.type = AVMEDIA_TYPE_VIDEO,
4292 .p.id = AV_CODEC_ID_HEVC,
4293 .priv_data_size = sizeof(HEVCContext),
4294 .p.priv_class = &hevc_decoder_class,
4295 .init = hevc_decode_init,
4296 .close = hevc_decode_free,
4298 .flush = hevc_decode_flush,
4299 UPDATE_THREAD_CONTEXT(hevc_update_thread_context),
4300 .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY |
4302 .caps_internal = FF_CODEC_CAP_EXPORTS_CROPPING |
4306 .hw_configs = (const AVCodecHWConfigInternal *const []) {
4307#if CONFIG_HEVC_DXVA2_HWACCEL
4308 HWACCEL_DXVA2(hevc),
4309#endif
4310#if CONFIG_HEVC_D3D11VA_HWACCEL
4311 HWACCEL_D3D11VA(hevc),
4312#endif
4313#if CONFIG_HEVC_D3D11VA2_HWACCEL
4314 HWACCEL_D3D11VA2(hevc),
4315#endif
4316#if CONFIG_HEVC_D3D12VA_HWACCEL
4317 HWACCEL_D3D12VA(hevc),
4318#endif
4319#if CONFIG_HEVC_NVDEC_HWACCEL
4320 HWACCEL_NVDEC(hevc),
4321#endif
4322#if CONFIG_HEVC_NVDEC_CUARRAY_HWACCEL
4324#endif
4325#if CONFIG_HEVC_VAAPI_HWACCEL
4326 HWACCEL_VAAPI(hevc),
4327#endif
4328#if CONFIG_HEVC_VDPAU_HWACCEL
4329 HWACCEL_VDPAU(hevc),
4330#endif
4331#if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
4333#endif
4334#if CONFIG_HEVC_VULKAN_HWACCEL
4335 HWACCEL_VULKAN(hevc),
4336#endif
4337 NULL
4338 },
4339};
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t const uint8_t ptrdiff_t srcstride
Definition dsp.h:88
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t my
Definition dsp.h:57
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t mx
Definition dsp.h:57
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition dsp.h:87
static double val(void *priv, double ch)
Definition aeval.c:77
static char * split(char *message, char delim)
const FFCodec ff_hevc_decoder
Definition hevcdec.c:4288
int ff_aom_apply_film_grain(AVFrame *out, const AVFrame *in, const AVFilmGrainParams *params)
AOM film grain synthesis.
#define PAR
Definition apedec.c:1740
static FILE * out
static struct AVMD5 * md5
int32_t
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition avassert.h:58
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition avassert.h:42
#define FF_THREAD_FRAME
Decode more than one frame at once.
Definition avcodec.h:1595
#define FF_THREAD_SLICE
Decode more than one part of a single frame at once.
Definition avcodec.h:1596
size_t av_strlcatf(char *dst, size_t size, const char *fmt,...)
Definition avstring.c:103
int ff_init_cabac_decoder(CABACContext *c, const uint8_t *buf, int buf_size)
Definition cabac.c:162
Context Adaptive Binary Arithmetic Coder inline functions.
static av_unused const uint8_t * skip_bytes(CABACContext *c, int n)
Skip n bytes and reset the decoder.
#define flags(name, subs,...)
Definition cbs_h264.c:74
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
static int FUNC sei(CodedBitstreamContext *ctx, RWContext *rw, H264RawSEI *current)
static int FUNC sps(CodedBitstreamContext *ctx, RWContext *rw, H264RawSPS *current)
static int FUNC vps(CodedBitstreamContext *ctx, RWContext *rw, H265RawVPS *current)
static int FUNC nal(CodedBitstreamContext *ctx, RWContext *rw, LCEVCRawNAL *current, int nal_unit_type)
#define ss(width, name, subs,...)
Definition cbs_vp9.c:202
#define s(width, name)
Definition cbs_vp9.c:198
#define UPDATE_THREAD_CONTEXT(func)
#define FF_CODEC_RECEIVE_FRAME_CB(func)
#define FF_CODEC_CAP_EXPORTS_CROPPING
The decoder sets the cropping fields in the output frames manually.
#define FF_CODEC_CAP_USES_PROGRESSFRAMES
The decoder might make use of the ProgressFrame API.
#define CODEC_LONG_NAME(str)
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
common internal and external API header
#define av_clip
Definition common.h:100
#define av_zero_extend
Definition common.h:151
#define av_ceil_log2
Definition common.h:97
void av_container_fifo_free(AVContainerFifo **pcf)
Free a AVContainerFifo and everything in it.
int av_container_fifo_read(AVContainerFifo *cf, void *obj, unsigned flags)
Read the next available object from the FIFO into obj.
size_t av_container_fifo_can_read(const AVContainerFifo *cf)
AVContainerFifo * av_container_fifo_alloc_avframe(unsigned flags)
Allocate an AVContainerFifo instance for AVFrames.
#define NULL
Definition coverity.c:32
long long int64_t
Definition coverity.c:34
void ff_progress_frame_ref(ProgressFrame *dst, const ProgressFrame *src)
Set dst->f to src->f and make dst a co-owner of src->f.
Definition decode.c:1954
int ff_frame_new_side_data_from_buf(const AVCodecContext *avctx, AVFrame *frame, enum AVFrameSideDataType type, AVBufferRef **buf)
Similar to ff_frame_new_side_data, but using an existing buffer ref.
Definition decode.c:2222
void ff_progress_frame_await(const ProgressFrame *f, int n)
Wait for earlier decoding threads to finish reference frames.
Definition decode.c:1984
void ff_progress_frame_report(ProgressFrame *f, int n)
Notify later decoding threads when part of their reference frame is ready.
Definition decode.c:1979
int ff_frame_new_side_data_from_buf_ext(const AVCodecContext *avctx, AVFrameSideData ***sd, int *nb_sd, enum AVFrameSideDataType type, AVBufferRef **buf)
Same as ff_frame_new_side_data_from_buf, but taking a AVFrameSideData array directly instead of an AV...
Definition decode.c:2203
const AVPacketSideData * ff_get_coded_side_data(const AVCodecContext *avctx, enum AVPacketSideDataType type)
Get side data of the given type from a decoding context.
Definition decode.c:1378
int ff_decode_get_packet(AVCodecContext *avctx, AVPacket *pkt)
Called by decoders to get the next packet for decoding.
Definition decode.c:254
int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
Select the (possibly hardware accelerated) pixel format.
Definition decode.c:1229
int ff_frame_new_side_data(const AVCodecContext *avctx, AVFrame *frame, enum AVFrameSideDataType type, size_t size, AVFrameSideData **psd)
Wrapper around av_frame_new_side_data, which rejects side data overridden by the demuxer.
Definition decode.c:2184
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:106
#define AV_EF_CRCCHECK
Verify checksums embedded in the bitstream (could be of either encoded or decoded data,...
Definition defs.h:48
#define AV_EF_EXPLODE
abort decoding on minor error detection
Definition defs.h:51
#define AV_PROFILE_HEVC_SCC
Definition defs.h:173
static enum AVPixelFormat pix_fmt
static AVFrame * frame
void ff_dovi_ctx_replace(DOVIContext *s, const DOVIContext *s0)
Definition dovi_rpu.c:59
av_cold void ff_dovi_ctx_flush(DOVIContext *s)
Partially reset the internal state.
Definition dovi_rpu.c:43
void ff_dovi_ctx_unref(DOVIContext *s)
Completely reset a DOVIContext, preserving only logctx.
Definition dovi_rpu.c:30
int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size, int err_recognition)
Parse the contents of a Dolby Vision RPU and update the parsed values in the DOVIContext struct.
int ff_dovi_attach_side_data(DOVIContext *s, AVFrame *frame)
Attach the decoded AVDOVIMetadata as side data to an AVFrame.
Definition dovi_rpudec.c:64
uint64_t pps
Definition dovi_rpuenc.c:36
void(* flush)(AVBSFContext *ctx)
Definition dts2pts.c:610
static int decode_slice(AVCodecContext *c, void *arg)
Definition ffv1dec.c:449
const AVFilmGrainParams * av_film_grain_params_select(const AVFrame *frame)
Select the most appropriate film grain parameters set for the frame, taking into account the frame's ...
@ AV_FILM_GRAIN_PARAMS_H274
The union is valid when interpreted as AVFilmGrainH274Params (codec.h274)
@ AV_FILM_GRAIN_PARAMS_AV1
The union is valid when interpreted as AVFilmGrainAOMParams (codec.aom)
@ AV_FILM_GRAIN_PARAMS_NONE
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
Definition get_bits.h:424
static int get_bits_left(GetBitContext *gb)
Definition get_bits.h:688
static unsigned int get_bits1(GetBitContext *s)
Definition get_bits.h:391
static void skip_bits(GetBitContext *s, int n)
Definition get_bits.h:383
static const uint8_t * align_get_bits(GetBitContext *s)
Definition get_bits.h:560
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition get_bits.h:337
static av_always_inline int get_bitsz(GetBitContext *s, int n)
Read 0-25 bits.
Definition get_bits.h:353
static int get_bits_bytesize(const GetBitContext *s, int round_up)
Get the size of the GetBitContext's buffer in bytes.
Definition get_bits.h:268
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition get_bits.h:517
static unsigned int show_bits1(GetBitContext *s)
Definition get_bits.h:411
exp golomb vlc stuff
static int get_se_golomb(GetBitContext *gb)
read signed exp golomb code.
Definition golomb.h:239
static int get_ue_golomb_31(GetBitContext *gb)
read unsigned exp golomb code, constraint to a max of 31.
Definition golomb.h:120
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:104
#define fail
Definition test.h:479
#define AV_OPT_FLAG_READONLY
The option may not be set through the AVOptions API, only read.
Definition opt.h:367
#define AV_OPT_FLAG_EXPORT
The option is intended for exporting values to the caller.
Definition opt.h:362
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition opt.h:298
@ AV_OPT_TYPE_FLAG_ARRAY
May be combined with another regular option type to declare an array option.
Definition opt.h:345
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition opt.h:258
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
Definition opt.h:326
@ AV_OPT_TYPE_UINT
Underlying C type is unsigned int.
Definition opt.h:334
#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 codec.h:79
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition codec.h:49
#define AV_CODEC_CAP_SLICE_THREADS
Codec supports slice-based (or partition-based) multithreading.
Definition codec.h:102
#define AV_CODEC_EXPORT_DATA_FILM_GRAIN
Decoding only.
Definition avcodec.h:404
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
Definition codec.h:98
@ AV_CODEC_ID_HEVC
Definition codec_id.h:223
@ AVDISCARD_ALL
discard all
Definition defs.h:241
@ AVDISCARD_NONKEY
discard all frames except keyframes
Definition defs.h:240
@ AVDISCARD_BIDIR
discard all bidirectional frames
Definition defs.h:238
@ AVDISCARD_NONINTRA
discard all non intra frames
Definition defs.h:239
@ AVDISCARD_NONREF
discard all non reference
Definition defs.h:237
@ AV_PKT_DATA_NEW_EXTRADATA
The AV_PKT_DATA_NEW_EXTRADATA is used to notify the codec or the format that the extradata buffer was...
Definition packet.h:56
@ AV_PKT_DATA_DOVI_CONF
DOVI configuration ref: dolby-vision-bitstreams-within-the-iso-base-media-file-format-v2....
Definition packet.h:280
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition packet.c:434
uint8_t * av_packet_get_side_data(const AVPacket *pkt, enum AVPacketSideDataType type, size_t *size)
Get side information from packet.
Definition packet.c:252
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:139
int av_buffer_replace(AVBufferRef **pdst, const AVBufferRef *src)
Ensure dst refers to the same data as src.
Definition buffer.c:233
AVBufferRef * av_buffer_ref(const AVBufferRef *buf)
Create a new reference to an AVBuffer.
Definition buffer.c:103
AVBufferRef * av_buffer_alloc(size_t size)
Allocate an AVBuffer of the given size using av_malloc().
Definition buffer.c:77
AVBufferRef * av_buffer_create(uint8_t *data, size_t size, void(*free)(void *opaque, uint8_t *data), void *opaque, int flags)
Create an AVBuffer from an existing array.
Definition buffer.c:55
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
Definition dict.c:86
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition error.h:64
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
Definition error.h:52
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition error.h:61
#define AVERROR_EOF
End of file.
Definition error.h:57
#define AVERROR(e)
Definition error.h:45
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
Definition frame.h:687
void av_frame_remove_side_data(AVFrame *frame, enum AVFrameSideDataType type)
Remove and free all side data instances of the given type.
Definition frame.c:725
#define AV_FRAME_SIDE_DATA_FLAG_NEW_REF
Create a new reference to the passed in buffer instead of taking ownership of it.
Definition frame.h:1103
AVFrameSideData * av_frame_side_data_add(AVFrameSideData ***sd, int *nb_sd, enum AVFrameSideDataType type, AVBufferRef **buf, unsigned int flags)
Add a new side data entry to an array from an existing AVBufferRef.
Definition side_data.c:229
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
Definition frame.c:278
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition frame.c:64
AVFrameSideData * av_frame_new_side_data_from_buf(AVFrame *frame, enum AVFrameSideDataType type, AVBufferRef *buf)
Add a new side data to a frame from an existing AVBufferRef.
Definition frame.c:638
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
Definition frame.c:599
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition frame.c:52
@ AV_FRAME_DATA_DYNAMIC_HDR_VIVID
HDR Vivid dynamic metadata associated with a video frame.
Definition frame.h:215
@ AV_FRAME_DATA_DYNAMIC_HDR_PLUS
HDR dynamic metadata associated with a video frame.
Definition frame.h:159
@ AV_FRAME_DATA_3D_REFERENCE_DISPLAYS
This side data contains information about the reference display width(s) and reference viewing distan...
Definition frame.h:256
@ AV_FRAME_DATA_DYNAMIC_HDR_SMPTE_2094_APP5
HDR dynamic metadata associated with a video frame.
Definition frame.h:270
@ AV_FRAME_DATA_FILM_GRAIN_PARAMS
Film grain parameters for a frame, described by AVFilmGrainParams.
Definition frame.h:188
@ AV_FRAME_DATA_S12M_TIMECODE
Timecode which conforms to SMPTE ST 12-1.
Definition frame.h:152
@ AV_FRAME_DATA_DOVI_RPU_BUFFER
Dolby Vision RPU raw data, suitable for passing to x265 or other libraries.
Definition frame.h:201
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition log.h:231
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition log.h:216
#define AV_LOG_VERBOSE
Detailed information.
Definition log.h:226
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
const char * av_default_item_name(void *ptr)
Return the context name.
Definition log.c:241
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
void av_md5_init(AVMD5 *ctx)
Initialize MD5 hashing.
Definition md5.c:143
void av_md5_final(AVMD5 *ctx, uint8_t *dst)
Finish hashing and output digest value.
Definition md5.c:188
struct AVMD5 * av_md5_alloc(void)
Allocate an AVMD5 context.
Definition md5.c:50
void av_md5_update(AVMD5 *ctx, const uint8_t *src, size_t len)
Update hash value.
Definition md5.c:153
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:555
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
Definition mem.c:217
void * av_memdup(const void *p, size_t size)
Duplicate a buffer with av_malloc().
Definition mem.c:302
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition avutil.h:247
#define LIBAVUTIL_VERSION_INT
Definition version.h:85
AV3DReferenceDisplaysInfo * av_tdrdi_alloc(unsigned int nb_displays, size_t *out_size)
Allocate a AV3DReferenceDisplaysInfo structure and initialize its fields to default values.
Definition tdrdi.c:25
static av_always_inline AV3DReferenceDisplay * av_tdrdi_get_display(AV3DReferenceDisplaysInfo *tdrdi, unsigned int idx)
Definition tdrdi.h:145
@ AV_STEREO3D_VIEW_RIGHT
Frame contains only the right view.
Definition stereo3d.h:163
@ AV_STEREO3D_VIEW_LEFT
Frame contains only the left view.
Definition stereo3d.h:158
@ AV_STEREO3D_VIEW_UNSPEC
Content is unspecified.
Definition stereo3d.h:168
@ H2645_FLAG_SMALL_PADDING
Definition h2645_parse.h:98
@ H2645_FLAG_IS_NALFF
Definition h2645_parse.h:97
int ff_h2645_sei_to_frame(AVFrame *frame, H2645SEI *sei, enum AVCodecID codec_id, AVCodecContext *avctx, const H2645VUI *vui, unsigned bit_depth_luma, unsigned bit_depth_chroma, int seed)
Definition h2645_sei.c:518
int ff_h2645_sei_ctx_replace(H2645SEI *dst, const H2645SEI *src)
Definition h2645_sei.c:320
int ff_h2645_sei_to_context(AVCodecContext *avctx, H2645SEI *sei)
Definition h2645_sei.c:697
const pixel * src2
int ff_h274_apply_film_grain(AVFrame *out_frame, const AVFrame *in_frame, const AVFilmGrainParams *params)
Definition h274.c:245
H.274 film grain synthesis.
static int ff_h274_film_grain_params_supported(int model_id, enum AVPixelFormat pix_fmt)
Check whether ff_h274_apply_film_grain() supports the given parameter combination.
Definition h274.h:39
int ff_hevc_end_of_slice_flag_decode(HEVCLocalContext *lc)
Definition cabac.c:563
int ff_hevc_cu_transquant_bypass_flag_decode(HEVCLocalContext *lc)
Definition cabac.c:568
int ff_hevc_sao_type_idx_decode(HEVCLocalContext *lc)
Definition cabac.c:521
int ff_hevc_no_residual_syntax_flag_decode(HEVCLocalContext *lc)
Definition cabac.c:783
int ff_hevc_sao_merge_flag_decode(HEVCLocalContext *lc)
Definition cabac.c:516
int ff_hevc_merge_flag_decode(HEVCLocalContext *lc)
Definition cabac.c:747
int ff_hevc_cu_chroma_qp_offset_flag(HEVCLocalContext *lc)
Definition cabac.c:618
int ff_hevc_cu_chroma_qp_offset_idx(HEVCLocalContext *lc, int chroma_qp_offset_list_len_minus1)
Definition cabac.c:623
int ff_hevc_sao_offset_abs_decode(HEVCLocalContext *lc, int bit_depth)
Definition cabac.c:541
int ff_hevc_res_scale_sign_flag(HEVCLocalContext *lc, int idx)
Definition cabac.c:861
int ff_hevc_cu_qp_delta_abs(HEVCLocalContext *lc)
Definition cabac.c:586
int ff_hevc_mvp_lx_flag_decode(HEVCLocalContext *lc)
Definition cabac.c:778
void ff_hevc_save_states(HEVCLocalContext *lc, const HEVCPPS *pps, int ctb_addr_ts)
Definition cabac.c:402
int ff_hevc_split_transform_flag_decode(HEVCLocalContext *lc, int log2_trafo_size)
Definition cabac.c:821
int ff_hevc_cabac_init(HEVCLocalContext *lc, const HEVCPPS *pps, int ctb_addr_ts, const uint8_t *data, size_t size, int is_wpp)
Definition cabac.c:454
int ff_hevc_log2_res_scale_abs(HEVCLocalContext *lc, int idx)
Definition cabac.c:851
int ff_hevc_sao_eo_class_decode(HEVCLocalContext *lc)
Definition cabac.c:556
void ff_hevc_hls_mvd_coding(HEVCLocalContext *lc, int x0, int y0, int log2_cb_size)
Definition cabac.c:1595
int ff_hevc_mpm_idx_decode(HEVCLocalContext *lc)
Definition cabac.c:707
int ff_hevc_sao_band_position_decode(HEVCLocalContext *lc)
Definition cabac.c:531
int ff_hevc_inter_pred_idc_decode(HEVCLocalContext *lc, int nPbW, int nPbH)
Definition cabac.c:752
int ff_hevc_cbf_cb_cr_decode(HEVCLocalContext *lc, int trafo_depth)
Definition cabac.c:826
int ff_hevc_rem_intra_luma_pred_mode_decode(HEVCLocalContext *lc)
Definition cabac.c:715
int ff_hevc_sao_offset_sign_decode(HEVCLocalContext *lc)
Definition cabac.c:551
int ff_hevc_intra_chroma_pred_mode_decode(HEVCLocalContext *lc)
Definition cabac.c:725
int ff_hevc_cbf_luma_decode(HEVCLocalContext *lc, int trafo_depth)
Definition cabac.c:831
int ff_hevc_merge_idx_decode(HEVCLocalContext *lc)
Definition cabac.c:736
void ff_hevc_hls_residual_coding(HEVCLocalContext *lc, const HEVCPPS *pps, int x0, int y0, int log2_trafo_size, enum ScanType scan_idx, int c_idx)
Definition cabac.c:1061
int ff_hevc_split_coding_unit_flag_decode(HEVCLocalContext *lc, uint8_t *tab_ct_depth, const HEVCSPS *sps, int ct_depth, int x0, int y0)
Definition cabac.c:639
int ff_hevc_pcm_flag_decode(HEVCLocalContext *lc)
Definition cabac.c:697
int ff_hevc_part_mode_decode(HEVCLocalContext *lc, const HEVCSPS *sps, int log2_cb_size)
Definition cabac.c:660
int ff_hevc_skip_flag_decode(HEVCLocalContext *lc, uint8_t *skip_flag, int x0, int y0, int x_cb, int y_cb, int min_cb_width)
Definition cabac.c:573
int ff_hevc_cu_qp_delta_sign_flag(HEVCLocalContext *lc)
Definition cabac.c:613
int ff_hevc_prev_intra_luma_pred_flag_decode(HEVCLocalContext *lc)
Definition cabac.c:702
int ff_hevc_pred_mode_decode(HEVCLocalContext *lc)
Definition cabac.c:634
int ff_hevc_ref_idx_lx_decode(HEVCLocalContext *lc, int num_ref_idx_lx)
Definition cabac.c:762
void ff_hevc_dsp_init(HEVCDSPContext *hevcdsp, int bit_depth)
Definition dsp.c:128
void ff_hevc_set_qPy(HEVCLocalContext *lc, const HEVCLayerContext *l, const HEVCPPS *pps, int xBase, int yBase, int log2_cb_size)
Definition filter.c:122
void ff_hevc_deblocking_boundary_strengths(HEVCLocalContext *lc, const HEVCLayerContext *l, const HEVCPPS *pps, int x0, int y0, int log2_trafo_size)
Definition filter.c:742
void ff_hevc_hls_filters(HEVCLocalContext *lc, const HEVCLayerContext *l, const HEVCPPS *pps, int x_ctb, int y_ctb, int ctb_size)
Definition filter.c:912
void ff_hevc_hls_filter(HEVCLocalContext *lc, const HEVCLayerContext *l, const HEVCPPS *pps, int x, int y, int ctb_size)
Definition filter.c:872
int ff_hevc_decode_extradata(const uint8_t *data, int size, HEVCParamSets *ps, HEVCSEI *sei, int *is_nalff, int *nal_length_size, int err_recognition, int apply_defdispwin, void *logctx)
Definition parse.c:79
H.265 parser code.
int ff_hevc_decode_nal_pps(GetBitContext *gb, AVCodecContext *avctx, HEVCParamSets *ps)
Definition ps.c:2201
void ff_hevc_ps_uninit(HEVCParamSets *ps)
Definition ps.c:2473
int ff_hevc_decode_nal_vps(GetBitContext *gb, AVCodecContext *avctx, HEVCParamSets *ps)
Definition ps.c:786
int ff_hevc_decode_short_term_rps(GetBitContext *gb, AVCodecContext *avctx, ShortTermRPS *rps, const HEVCSPS *sps, int is_slice_header)
Definition ps.c:113
int ff_hevc_decode_nal_sps(GetBitContext *gb, AVCodecContext *avctx, HEVCParamSets *ps, unsigned nuh_layer_id, int apply_defdispwin)
Definition ps.c:1735
static int ff_hevc_compute_poc(const HEVCSPS *sps, int pocTid0, int poc_lsb, int nal_unit_type)
Definition ps.h:548
int ff_hevc_decode_nal_sei(GetBitContext *gb, void *logctx, HEVCSEI *s, const HEVCParamSets *ps, enum HEVCNALUnitType type)
Definition sei.c:303
static void ff_hevc_reset_sei(HEVCSEI *sei)
Reset SEI values that are stored on the Context.
Definition sei.h:128
#define BOUNDARY_UPPER_SLICE
Definition hevcdec.h:441
int ff_hevc_output_frames(HEVCContext *s, unsigned layers_active_decode, unsigned layers_active_output, unsigned max_output, unsigned max_dpb, int discard)
Find frames in the DPB that are ready for output and either write them to the output FIFO or drop the...
Definition refs.c:267
#define EPEL_EXTRA_AFTER
Definition hevcdec.h:60
#define IS_IDR(s)
Definition hevcdec.h:74
#define L1
Definition hevcdec.h:57
#define BOUNDARY_LEFT_TILE
Definition hevcdec.h:440
void ff_hevc_flush_dpb(HEVCContext *s)
Drop all frames currently in DPB.
Definition refs.c:76
@ MODE_INTER
Definition hevcdec.h:106
@ MODE_SKIP
Definition hevcdec.h:108
@ PART_2Nx2N
Definition hevcdec.h:95
@ PART_Nx2N
Definition hevcdec.h:97
@ PART_NxN
Definition hevcdec.h:98
@ PART_2NxnD
Definition hevcdec.h:100
@ PART_nLx2N
Definition hevcdec.h:101
@ PART_2NxN
Definition hevcdec.h:96
@ PART_2NxnU
Definition hevcdec.h:99
@ PART_nRx2N
Definition hevcdec.h:102
@ PF_L1
Definition hevcdec.h:120
@ PF_BI
Definition hevcdec.h:121
@ PF_L0
Definition hevcdec.h:119
@ PF_INTRA
Definition hevcdec.h:118
int ff_hevc_frame_nb_refs(const SliceHeader *sh, const HEVCPPS *pps, unsigned layer_idx)
Get the number of candidate references for the current frame.
Definition refs.c:617
#define HEVC_RECOVERY_END
Definition hevcdec.h:80
@ INTRA_ANGULAR_26
Definition hevcdec.h:151
@ INTRA_DC
Definition hevcdec.h:126
@ INTRA_PLANAR
Definition hevcdec.h:125
#define SHIFT_CTB_WPP
Definition hevcdec.h:45
InterPredIdc
Definition hevcdec.h:111
@ PRED_L0
Definition hevcdec.h:112
@ PRED_BI
Definition hevcdec.h:114
@ PRED_L1
Definition hevcdec.h:113
#define HEVC_RECOVERY_UNSPECIFIED
Definition hevcdec.h:79
void ff_hevc_clear_refs(HEVCLayerContext *l)
Mark all frames in DPB as unused for reference.
Definition refs.c:67
int ff_hevc_set_new_ref(HEVCContext *s, HEVCLayerContext *l, int poc)
Definition refs.c:211
int ff_hevc_frame_rps(HEVCContext *s, HEVCLayerContext *l)
Construct the reference picture sets for the current frame.
Definition refs.c:537
@ SAO_BAND
Definition hevcdec.h:164
@ SAO_NOT_APPLIED
Definition hevcdec.h:163
@ SAO_EDGE
Definition hevcdec.h:165
void ff_hevc_luma_mv_mvp_mode(HEVCLocalContext *lc, const HEVCPPS *pps, 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 mvs.c:589
#define QPEL_EXTRA
Definition hevcdec.h:64
#define QPEL_EXTRA_BEFORE
Definition hevcdec.h:62
static av_always_inline int ff_hevc_nal_is_nonref(enum HEVCNALUnitType type)
Definition hevcdec.h:657
void ff_hevc_set_neighbour_available(HEVCLocalContext *lc, int x0, int y0, int nPbW, int nPbH, int log2_ctb_size)
Definition mvs.c:43
void ff_hevc_luma_mv_merge_mode(HEVCLocalContext *lc, const HEVCPPS *pps, int x0, int y0, int nPbW, int nPbH, int log2_cb_size, int part_idx, int merge_idx, MvField *mv)
Definition mvs.c:482
#define EPEL_EXTRA_BEFORE
Definition hevcdec.h:59
void ff_hevc_unref_frame(HEVCFrame *frame, int flags)
Definition refs.c:35
#define EPEL_EXTRA
Definition hevcdec.h:61
#define SAMPLE_CTB(tab, x, y)
Definition hevcdec.h:72
#define L0
Definition hevcdec.h:56
#define QPEL_EXTRA_AFTER
Definition hevcdec.h:63
int ff_hevc_slice_rpl(HEVCContext *s)
Construct the reference picture list(s) for the current slice.
Definition refs.c:345
#define BOUNDARY_UPPER_TILE
Definition hevcdec.h:442
@ SCAN_HORIZ
Definition hevcdec.h:178
@ SCAN_DIAG
Definition hevcdec.h:177
@ SCAN_VERT
Definition hevcdec.h:179
#define EDGE_EMU_BUFFER_STRIDE
Definition hevcdec.h:66
#define BOUNDARY_LEFT_SLICE
Definition hevcdec.h:439
#define IS_IRAP(s)
Definition hevcdec.h:77
#define IS_BLA(s)
Definition hevcdec.h:75
#define FF_HW_HAS_CB(avctx, function)
#define FF_HW_SIMPLE_CALL(avctx, function)
#define FF_HW_CALL(avctx, function,...)
#define HWACCEL_NVDEC_CUARRAY(codec)
Definition hwconfig.h:70
#define HWACCEL_DXVA2(codec)
Definition hwconfig.h:64
#define HWACCEL_VDPAU(codec)
Definition hwconfig.h:74
#define HWACCEL_D3D12VA(codec)
Definition hwconfig.h:82
#define HWACCEL_VULKAN(codec)
Definition hwconfig.h:78
#define HWACCEL_NVDEC(codec)
Definition hwconfig.h:68
#define HWACCEL_VAAPI(codec)
Definition hwconfig.h:72
#define HWACCEL_D3D11VA(codec)
Definition hwconfig.h:80
#define HWACCEL_VIDEOTOOLBOX(codec)
Definition hwconfig.h:76
#define HWACCEL_D3D11VA2(codec)
Definition hwconfig.h:66
#define ff_log2
Definition intmath.h:51
#define AV_ZERO32(d)
unsigned offset
Definition libaomenc.c:763
static const int8_t mv[256][2]
Definition 4xm.c:81
#define HWACCEL_MAX
av_cold void ff_bswapdsp_init(BswapDSPContext *c)
Definition bswapdsp.c:37
void ff_h2645_packet_uninit(H2645Packet *pkt)
Free all the allocated memory in the packet.
int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length, void *logctx, int nal_length_size, enum AVCodecID codec_id, int flags)
Split an input packet into NAL units.
@ HEVC_NAL_RASL_N
Definition hevc.h:37
@ HEVC_NAL_CRA_NUT
Definition hevc.h:50
@ HEVC_NAL_TRAIL_N
Definition hevc.h:29
@ HEVC_NAL_BLA_W_LP
Definition hevc.h:45
@ HEVC_NAL_BLA_N_LP
Definition hevc.h:47
@ HEVC_NAL_BLA_W_RADL
Definition hevc.h:46
@ HEVC_NAL_TSA_R
Definition hevc.h:32
@ HEVC_NAL_AUD
Definition hevc.h:64
@ HEVC_NAL_IDR_W_RADL
Definition hevc.h:48
@ HEVC_NAL_IDR_N_LP
Definition hevc.h:49
@ HEVC_NAL_SEI_SUFFIX
Definition hevc.h:69
@ HEVC_NAL_UNSPEC62
Definition hevc.h:91
@ HEVC_NAL_TSA_N
Definition hevc.h:31
@ HEVC_NAL_SEI_PREFIX
Definition hevc.h:68
@ HEVC_NAL_EOS_NUT
Definition hevc.h:65
@ HEVC_NAL_PPS
Definition hevc.h:63
@ HEVC_NAL_VPS
Definition hevc.h:61
@ HEVC_NAL_FD_NUT
Definition hevc.h:67
@ HEVC_NAL_TRAIL_R
Definition hevc.h:30
@ HEVC_NAL_STSA_N
Definition hevc.h:33
@ HEVC_NAL_STSA_R
Definition hevc.h:34
@ HEVC_NAL_UNSPEC63
Definition hevc.h:92
@ HEVC_NAL_EOB_NUT
Definition hevc.h:66
@ HEVC_NAL_RASL_R
Definition hevc.h:38
@ HEVC_NAL_RADL_R
Definition hevc.h:36
@ HEVC_NAL_SPS
Definition hevc.h:62
@ HEVC_NAL_RADL_N
Definition hevc.h:35
@ HEVC_SLICE_P
Definition hevc.h:97
@ HEVC_SLICE_I
Definition hevc.h:98
@ HEVC_SLICE_B
Definition hevc.h:96
@ HEVC_SCALABILITY_AUXILIARY
Definition hevc.h:169
@ HEVC_MAX_PPS_COUNT
Definition hevc.h:117
@ HEVC_MAX_REFS
Definition hevc.h:122
@ HEVC_MAX_NUH_LAYER_ID
Definition hevc.h:110
static av_cold int hevc_init_context(AVCodecContext *avctx)
Definition hevcdec.c:4021
static int set_sps(HEVCContext *s, HEVCLayerContext *l, const HEVCSPS *sps)
Definition hevcdec.c:761
static void hls_prediction_unit(HEVCLocalContext *lc, const HEVCLayerContext *l, const HEVCPPS *pps, const HEVCSPS *sps, int x0, int y0, int nPbW, int nPbH, int log2_cb_size, int partIdx, int idx)
Definition hevcdec.c:2117
static int hevc_receive_frame(AVCodecContext *avctx, AVFrame *frame)
Definition hevcdec.c:3882
static int luma_intra_pred_mode(HEVCLocalContext *lc, const HEVCLayerContext *l, const HEVCSPS *sps, int x0, int y0, int pu_size, int prev_intra_luma_pred_flag)
8.4.1
Definition hevcdec.c:2247
static int setup_multilayer(HEVCContext *s, const HEVCVPS *vps)
Definition hevcdec.c:519
static int hls_transform_tree(HEVCLocalContext *lc, const HEVCLayerContext *l, const HEVCPPS *pps, const HEVCSPS *sps, 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:1551
static void intra_prediction_unit(HEVCLocalContext *lc, const HEVCLayerContext *l, const HEVCSPS *sps, int x0, int y0, int log2_cb_size)
Definition hevcdec.c:2347
static int decode_nal_units(HEVCContext *s, const uint8_t *buf, int length)
Definition hevcdec.c:3736
static av_cold int hevc_decode_init(AVCodecContext *avctx)
Definition hevcdec.c:4207
static void luma_mc_uni(HEVCLocalContext *lc, const HEVCPPS *pps, const HEVCSPS *sps, uint8_t *dst, ptrdiff_t dststride, const 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:1739
static int export_multilayer(HEVCContext *s, const HEVCVPS *vps)
Definition hevcdec.c:401
#define POS(c_idx, x, y)
static const AVClass hevc_decoder_class
Definition hevcdec.c:4281
static enum AVPixelFormat map_to_alpha_format(HEVCContext *s, enum AVPixelFormat pix_fmt)
Definition hevcdec.c:552
static int hevc_sei_to_context(AVCodecContext *avctx, HEVCSEI *sei)
Definition hevcdec.c:4158
static av_cold int hevc_decode_free(AVCodecContext *avctx)
Definition hevcdec.c:3975
static int decode_slice_data(HEVCContext *s, const HEVCLayerContext *l, const H2645NAL *nal, GetBitContext *gb)
Definition hevcdec.c:3050
static void luma_mc_bi(HEVCLocalContext *lc, const HEVCPPS *pps, const HEVCSPS *sps, uint8_t *dst, ptrdiff_t dststride, const AVFrame *ref0, const Mv *mv0, int x_off, int y_off, int block_w, int block_h, const AVFrame *ref1, const Mv *mv1, struct MvField *current_mv)
8.5.3.2.2.1 Luma sample bidirectional interpolation process
Definition hevcdec.c:1803
static int hls_coding_quadtree(HEVCLocalContext *lc, const HEVCLayerContext *l, const HEVCPPS *pps, const HEVCSPS *sps, int x0, int y0, int log2_cb_size, int cb_depth)
Definition hevcdec.c:2629
static void hls_decode_neighbour(HEVCLocalContext *lc, const HEVCLayerContext *l, const HEVCPPS *pps, const HEVCSPS *sps, int x_ctb, int y_ctb, int ctb_addr_ts)
Definition hevcdec.c:2722
static int pred_weight_table(SliceHeader *sh, void *logctx, const HEVCSPS *sps, GetBitContext *gb)
Definition hevcdec.c:175
static int hevc_decode_extradata(HEVCContext *s, uint8_t *buf, int length, int first)
Definition hevcdec.c:3850
static int export_stream_params_from_sei(HEVCContext *s)
Definition hevcdec.c:388
static int hls_slice_header(SliceHeader *sh, const HEVCContext *s, GetBitContext *gb)
Definition hevcdec.c:791
static int hls_cross_component_pred(HEVCLocalContext *lc, int idx)
Definition hevcdec.c:1307
static void chroma_mc_bi(HEVCLocalContext *lc, const HEVCPPS *pps, const HEVCSPS *sps, uint8_t *dst0, ptrdiff_t dststride, const AVFrame *ref0, const AVFrame *ref1, int x_off, int y_off, int block_w, int block_h, const MvField *current_mv, int cidx)
8.5.3.2.2.2 Chroma sample bidirectional interpolation process
Definition hevcdec.c:1967
#define SET_SAO(elem, value)
Definition hevcdec.c:1219
int ff_hevc_is_alpha_video(const HEVCContext *s)
Definition hevcdec.c:440
static int pic_arrays_init(HEVCLayerContext *l, const HEVCSPS *sps)
Definition hevcdec.c:103
static int hls_decode_entry_wpp(AVCodecContext *avctx, void *hevc_lclist, int job, int thread)
Definition hevcdec.c:2827
static void intra_prediction_unit_default_value(HEVCLocalContext *lc, const HEVCLayerContext *l, const HEVCSPS *sps, int x0, int y0, int log2_cb_size)
Definition hevcdec.c:2417
static int hevc_ref_frame(HEVCFrame *dst, const HEVCFrame *src)
Definition hevcdec.c:3942
static int hls_pcm_sample(HEVCLocalContext *lc, const HEVCLayerContext *l, const HEVCPPS *pps, int x0, int y0, int log2_cb_size)
Definition hevcdec.c:1679
static int hls_decode_entry(HEVCContext *s, GetBitContext *gb)
Definition hevcdec.c:2773
static int verify_md5(HEVCContext *s, AVFrame *frame)
Definition hevcdec.c:3451
int ff_hevc_requested_layers(const HEVCContext *s, const HEVCVPS *vps, unsigned *active_output)
Resolve the caller's view selection into layers.
Definition hevcdec.c:459
static int decode_lt_rps(const HEVCSPS *sps, LongTermRPS *rps, GetBitContext *gb, int cur_poc, int poc_lsb)
Definition hevcdec.c:275
static const uint8_t hevc_pel_weight[65]
Definition hevcdec.c:62
#define CTB(tab, x, y)
Definition hevcdec.c:1217
static int set_side_data(HEVCContext *s)
Definition hevcdec.c:3104
static int find_finish_setup_nal(const HEVCContext *s)
Definition hevcdec.c:3199
static void decode_reset_recovery_point(HEVCContext *s)
Definition hevcdec.c:3730
#define SUBDIVIDE(x, y, idx)
static void pic_arrays_free(HEVCLayerContext *l)
NOTE: Each function hls_foo correspond to the function foo in the specification (HLS stands for High ...
Definition hevcdec.c:74
static int hevc_frame_start(HEVCContext *s, HEVCLayerContext *l, unsigned nal_idx)
Definition hevcdec.c:3243
static void hevc_luma_mv_mvp_mode(HEVCLocalContext *lc, const HEVCPPS *pps, const HEVCSPS *sps, int x0, int y0, int nPbW, int nPbH, int log2_cb_size, int part_idx, int merge_idx, MvField *mv)
Definition hevcdec.c:2070
static int wpp_progress_init(HEVCContext *s, unsigned count)
Definition hevcdec.c:2922
#define OFFSET(x)
Definition hevcdec.c:4257
static int decode_nal_unit(HEVCContext *s, unsigned nal_idx)
Definition hevcdec.c:3642
static int decode_slice(HEVCContext *s, unsigned nal_idx, GetBitContext *gb)
Definition hevcdec.c:3566
static void chroma_mc_uni(HEVCLocalContext *lc, const HEVCPPS *pps, const HEVCSPS *sps, uint8_t *dst0, ptrdiff_t dststride, const uint8_t *src0, ptrdiff_t srcstride, int reflist, int x_off, int y_off, int block_w, int block_h, const struct MvField *current_mv, int chroma_weight, int chroma_offset)
8.5.3.2.2.2 Chroma sample uniprediction interpolation process
Definition hevcdec.c:1897
static const uint8_t tab_mode_idx[]
Definition hevcdec.c:2343
static int hls_slice_data_wpp(HEVCContext *s, const H2645NAL *nal)
Definition hevcdec.c:2948
#define MD5_PRI
static av_cold void hevc_decode_flush(AVCodecContext *avctx)
Definition hevcdec.c:4243
static void hevc_await_progress(const HEVCContext *s, const HEVCFrame *ref, const Mv *mv, int y0, int height)
Definition hevcdec.c:2060
static int hls_transform_unit(HEVCLocalContext *lc, const HEVCLayerContext *l, const HEVCPPS *pps, const HEVCSPS *sps, 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:1323
static void set_deblocking_bypass(uint8_t *is_pcm, const HEVCSPS *sps, int x0, int y0, int log2_cb_size)
Definition hevcdec.c:1535
static int hls_coding_unit(HEVCLocalContext *lc, const HEVCContext *s, const HEVCLayerContext *l, const HEVCPPS *pps, const HEVCSPS *sps, int x0, int y0, int log2_cb_size)
Definition hevcdec.c:2442
static int hevc_frame_end(HEVCContext *s, HEVCLayerContext *l)
Definition hevcdec.c:3520
static av_always_inline void set_ct_depth(const HEVCSPS *sps, uint8_t *tab_ct_depth, int x0, int y0, int log2_cb_size, int ct_depth)
Definition hevcdec.c:2329
#define MD5_PRI_ARG(buf)
static void export_stream_params(HEVCContext *s, const HEVCSPS *sps)
Definition hevcdec.c:332
static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
Definition hevcdec.c:580
static void hls_sao_param(HEVCLocalContext *lc, const HEVCLayerContext *l, const HEVCPPS *pps, const HEVCSPS *sps, int rx, int ry)
Definition hevcdec.c:1231
common internal api header.
Multithreading API for decoders.
av_cold void ff_videodsp_init(VideoDSPContext *ctx, int bpc)
Definition videodsp.c:39
Macro definitions for various function/variable attributes.
#define av_always_inline
Definition attributes.h:72
#define av_fallthrough
Definition attributes.h:67
#define av_unused
Definition attributes.h:164
#define av_cold
Definition attributes.h:117
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition internal.h:97
Stereoscopic video.
static enum AVPixelFormat pix_fmts[]
Definition libkvazaar.c:296
const char * desc
Definition libsvtav1.c:83
uint8_t w
Definition llvidencdsp.c:39
void av_log_once(void *avcl, int initial_level, int subsequent_level, int *state, const char *fmt,...)
Definition log.c:450
#define FFMAX3(a, b, c)
Definition macros.h:48
#define FFSWAP(type, a, b)
Definition macros.h:52
#define FFMIN(a, b)
Definition macros.h:49
#define FFMAX(a, b)
Definition macros.h:47
Public header for MD5 hash function implementation.
void * av_calloc(size_t nmemb, size_t size)
Definition mem.c:264
Memory handling functions.
const char data[16]
Definition mxf.c:149
static int is_pcm(enum AVCodecID codec_id)
Definition mxfdec.c:2553
AVOptions.
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
Definition pixdesc.c:3380
const char * av_color_transfer_name(enum AVColorTransferCharacteristic transfer)
Definition pixdesc.c:3827
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition pixdesc.c:3460
#define AV_PIX_FMT_FLAG_ALPHA
The pixel format has an alpha channel.
Definition pixdesc.h:147
#define AV_PIX_FMT_YUV444P12
Definition pixfmt.h:552
@ AVCHROMA_LOC_LEFT
MPEG-2/4 4:2:0, H.264 default for 4:2:0.
Definition pixfmt.h:804
@ AVCHROMA_LOC_UNSPECIFIED
Definition pixfmt.h:803
#define AV_PIX_FMT_YUV420P10
Definition pixfmt.h:545
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition pixfmt.h:766
@ AVCOL_RANGE_JPEG
Full range content.
Definition pixfmt.h:783
#define AV_PIX_FMT_YUVA444P10
Definition pixfmt.h:598
#define AV_PIX_FMT_YUV420P12
Definition pixfmt.h:549
#define AV_PIX_FMT_YUVA420P10
Definition pixfmt.h:596
#define AV_PIX_FMT_YUV422P12
Definition pixfmt.h:550
AVPixelFormat
Pixel format.
Definition pixfmt.h:71
@ AV_PIX_FMT_NONE
Definition pixfmt.h:72
@ AV_PIX_FMT_VULKAN
Vulkan hardware images.
Definition pixfmt.h:379
@ AV_PIX_FMT_VIDEOTOOLBOX
hardware decoding through Videotoolbox
Definition pixfmt.h:305
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition pixfmt.h:73
@ AV_PIX_FMT_D3D12
Hardware surfaces for Direct3D 12.
Definition pixfmt.h:440
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition pixfmt.h:77
@ AV_PIX_FMT_DXVA2_VLD
HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer.
Definition pixfmt.h:134
@ AV_PIX_FMT_YUVA420P
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
Definition pixfmt.h:108
@ AV_PIX_FMT_YUVA422P10LE
planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian)
Definition pixfmt.h:184
@ AV_PIX_FMT_CUDA
HW acceleration through CUDA.
Definition pixfmt.h:260
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition pixfmt.h:78
@ AV_PIX_FMT_YUVA444P
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
Definition pixfmt.h:174
@ AV_PIX_FMT_D3D11
Hardware surfaces for Direct3D11.
Definition pixfmt.h:336
@ AV_PIX_FMT_CUARRAY
hardware decoding through openharmony
Definition pixfmt.h:506
@ AV_PIX_FMT_D3D11VA_VLD
HW decoding through Direct3D11 via old API, Picture.data[3] contains a ID3D11VideoDecoderOutputView p...
Definition pixfmt.h:254
@ AV_PIX_FMT_YUV422P10LE
planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian
Definition pixfmt.h:158
@ AV_PIX_FMT_YUVA422P
planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples)
Definition pixfmt.h:173
@ AV_PIX_FMT_VAAPI
Hardware acceleration through VA-API, data[3] contains a VASurfaceID.
Definition pixfmt.h:126
@ AV_PIX_FMT_YUVJ420P
planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting col...
Definition pixfmt.h:85
@ AV_PIX_FMT_VDPAU
HW acceleration through VDPAU, Picture.data[3] contains a VdpVideoSurface.
Definition pixfmt.h:194
#define AV_PIX_FMT_YUVA422P12
Definition pixfmt.h:599
@ AVCOL_PRI_UNSPECIFIED
Definition pixfmt.h:645
@ AVCOL_TRC_UNSPECIFIED
Definition pixfmt.h:675
#define AV_PIX_FMT_YUVA444P12
Definition pixfmt.h:600
#define AV_PIX_FMT_YUV444P10
Definition pixfmt.h:548
@ AVCOL_SPC_UNSPECIFIED
Definition pixfmt.h:709
void ff_hevc_pred_init(HEVCPredContext *hpc, int bit_depth)
Definition pred.c:43
const AVProfile ff_hevc_profiles[]
Definition profiles.c:97
int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f, int flags)
Wrapper around get_buffer() for frame-multithreaded codecs.
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...
AVRefStructPool * av_refstruct_pool_alloc(size_t size, unsigned flags)
Equivalent to av_refstruct_pool_alloc(size, flags, NULL, NULL, NULL, NULL, NULL)
Definition refstruct.c:335
void av_refstruct_unref(void *objp)
Decrement the reference count of the underlying object and automatically free the object if there are...
Definition refstruct.c:120
void av_refstruct_replace(void *dstp, const void *src)
Ensure *dstp refers to the same object as src.
Definition refstruct.c:160
const void * av_refstruct_ref_c(const void *obj)
Analog of av_refstruct_ref(), but for constant objects.
Definition refstruct.c:149
void * av_refstruct_ref(void *obj)
Create a new reference to an object managed via this API, i.e.
Definition refstruct.c:140
static void av_refstruct_pool_uninit(AVRefStructPool **poolp)
Mark the pool as being available for freeing.
Definition refstruct.h:292
#define FF_ARRAY_ELEMS(a)
unsigned int pos
Definition spdifenc.c:431
#define atomic_store(object, desired)
Definition stdatomic.h:256
int atomic_int
Definition stdatomic.h:63
#define atomic_load(object)
Definition stdatomic.h:250
#define atomic_init(obj, value)
Definition stdatomic.h:119
Data structure for single deference display information.
Definition tdrdi.h:100
uint8_t additional_shift_present_flag
An array of flags to indicates that the information about additional horizontal shift of the left and...
Definition tdrdi.h:135
uint8_t mantissa_ref_viewing_distance
The mantissa part of the reference viewing distance of the n-th reference display.
Definition tdrdi.h:129
uint16_t left_view_id
The ViewId of the left view of a stereo pair corresponding to the n-th reference display.
Definition tdrdi.h:104
int16_t num_sample_shift
The recommended additional horizontal shift for a stereo pair corresponding to the n-th reference bas...
Definition tdrdi.h:141
uint8_t mantissa_ref_display_width
The mantissa part of the reference display width of the n-th reference display.
Definition tdrdi.h:119
uint8_t exponent_ref_display_width
The exponent part of the reference display width of the n-th reference display.
Definition tdrdi.h:114
uint16_t right_view_id
The ViewId of the left view of a stereo pair corresponding to the n-th reference display.
Definition tdrdi.h:109
uint8_t exponent_ref_viewing_distance
The exponent part of the reference viewing distance of the n-th reference display.
Definition tdrdi.h:124
This structure describes information about the reference display width(s) and reference viewing dista...
Definition tdrdi.h:53
uint8_t prec_ref_viewing_dist
The exponent of the maximum allowable truncation error for {exponent,mantissa}_ref_viewing_distance a...
Definition tdrdi.h:72
uint8_t prec_ref_display_width
The exponent of the maximum allowable truncation error for {exponent,mantissa}_ref_display_width as g...
Definition tdrdi.h:58
uint8_t ref_viewing_distance_flag
A flag to indicate the presence of reference viewing distance.
Definition tdrdi.h:65
uint8_t num_ref_displays
The number of reference displays that are signalled in this struct.
Definition tdrdi.h:78
A reference to a data buffer.
Definition buffer.h:82
Describe the class of an AVClass context structure.
Definition log.h:76
main external API structure.
Definition avcodec.h:443
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition avcodec.h:643
int width
picture width / height.
Definition avcodec.h:604
enum AVColorRange color_range
MPEG vs JPEG YUV range.
Definition avcodec.h:681
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
Definition avcodec.h:657
AVRational framerate
Definition avcodec.h:563
int has_b_frames
Size of the frame reordering buffer in the decoder.
Definition avcodec.h:709
int level
Encoding level descriptor.
Definition avcodec.h:1651
int profile
profile
Definition avcodec.h:1641
int nb_decoded_side_data
Definition avcodec.h:1935
int export_side_data
Bit set of AV_CODEC_EXPORT_DATA_* flags, which affects the kind of metadata exported in frame,...
Definition avcodec.h:1784
enum AVColorSpace colorspace
YUV colorspace type.
Definition avcodec.h:671
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
Definition avcodec.h:664
AVFrameSideData ** decoded_side_data
Array containing static side data, such as HDR10 CLL / MDCV structures.
Definition avcodec.h:1934
uint8_t * extradata
Out-of-band global headers that may be used by some codecs.
Definition avcodec.h:526
enum AVChromaLocation chroma_sample_location
This defines the location of chroma samples.
Definition avcodec.h:688
int extradata_size
Definition avcodec.h:527
int coded_width
Bitstream width / height, may be different from width/height e.g.
Definition avcodec.h:619
struct AVCodecInternal * internal
Private context used for internal data.
Definition avcodec.h:478
void * priv_data
Definition avcodec.h:470
int is_copy
When using frame-threaded decoding, this field is set for the first worker thread (e....
Definition internal.h:54
AVPacket * in_pkt
This packet is used to hold the packet given to decoders implementing the .decode API; it is unused b...
Definition internal.h:83
int draining
decoding: AVERROR_EOF has been returned from ff_decode_get_packet(); must not be used by decoders tha...
Definition internal.h:139
This structure describes how to handle film grain synthesis in video for specific codecs.
enum AVFilmGrainParamsType type
Specifies the codec for which this structure is valid.
Structure to hold side data for an AVFrame.
Definition frame.h:327
uint8_t * data
Definition frame.h:329
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition frame.h:493
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
Definition frame.h:517
AVOption.
Definition opt.h:428
This structure stores auxiliary information for decoding, presenting, or otherwise processing the cod...
Definition packet.h:424
uint8_t * data
Definition packet.h:425
This structure stores compressed data.
Definition packet.h:580
AVBufferRef * buf
A reference to the reference-counted buffer where the packet data is stored.
Definition packet.h:586
int size
Definition packet.h:604
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition packet.h:602
uint8_t * data
Definition packet.h:603
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition pixdesc.h:69
int num
Numerator.
Definition rational.h:59
int den
Denominator.
Definition rational.h:60
enum PredMode pred_mode
PredMode.
Definition hevcdec.h:294
uint8_t intra_split_flag
IntraSplitFlag.
Definition hevcdec.h:298
uint8_t max_trafo_depth
MaxTrafoDepth.
Definition hevcdec.h:299
enum PartMode part_mode
PartMode.
Definition hevcdec.h:295
uint8_t cu_transquant_bypass_flag
Definition hevcdec.h:300
int beta_offset
Definition hevcdec.h:350
int tc_offset
Definition hevcdec.h:351
AVBufferRef * hdr_vivid
Definition itut35.h:66
AVBufferRef * hdr_plus
Definition itut35.h:64
const uint8_t * buffer
Definition get_bits.h:110
const uint8_t * data
Definition h2645_parse.h:35
int raw_size
Definition h2645_parse.h:44
const uint8_t * raw_data
Definition h2645_parse.h:45
H2645SEIFramePacking frame_packing
Definition h2645_sei.h:131
H2645SEIDisplayOrientation display_orientation
Definition h2645_sei.h:132
FFITUTT35Meta itut_t35
Definition h2645_sei.h:129
H2645SEIAlternativeTransfer alternative_transfer
Definition h2645_sei.h:133
int is_nalff
this flag is != 0 if bitstream is encapsulated as a format defined in 14496-15
Definition hevcdec.h:564
int film_grain_warning_shown
Definition hevcdec.h:581
int * view_ids
Definition hevcdec.h:569
AVBufferRef * rpu_buf
0 or 1 Dolby Vision RPUs.
Definition hevcdec.h:586
int nal_length_size
Number of bytes used for nal length (1, 2 or 4)
Definition hevcdec.h:578
HEVCLayerContext layers[HEVC_VPS_MAX_LAYERS]
Definition hevcdec.h:498
HEVCSEI sei
Definition hevcdec.h:511
int recovery_poc
Definition hevcdec.h:529
int skipping_frame
Definition hevcdec.h:536
int eos
current packet contains an EOS/EOB NAL
Definition hevcdec.h:527
unsigned layers_active_output
Definition hevcdec.h:503
HEVCParamSets ps
Definition hevcdec.h:510
DOVIContext dovi_ctx
Dolby Vision decoding context.
Definition hevcdec.h:587
int poc_tid0
Definition hevcdec.h:525
unsigned layers_active_decode
Definition hevcdec.h:502
int no_rasl_output_flag
Definition hevcdec.h:532
unsigned nb_view_ids
Definition hevcdec.h:570
ProgressFrame tf
Definition hevcdec.h:365
AVFrame * f
Definition hevcdec.h:363
AVFrame * frame_grain
Definition hevcdec.h:367
uint8_t * skip_flag
Definition hevcdec.h:465
HEVCFrame DPB[32]
Definition hevcdec.h:453
HEVCFrame * cur_frame
Definition hevcdec.h:454
uint8_t * filter_slice_edges
Definition hevcdec.h:474
const HEVCSPS * sps
Definition hevcdec.h:456
struct AVRefStructPool * rpl_tab_pool
Definition hevcdec.h:487
int32_t * tab_slice_address
Definition hevcdec.h:476
uint8_t * sao_pixel_buffer_h[3]
Definition hevcdec.h:483
uint8_t * tab_ct_depth
Definition hevcdec.h:466
int8_t * qp_y_tab
Definition hevcdec.h:478
DBParams * deblock
Definition hevcdec.h:462
uint8_t * cbf_luma
Definition hevcdec.h:469
uint8_t * tab_ipm
Definition hevcdec.h:470
uint8_t * is_pcm
Definition hevcdec.h:471
SAOParams * sao
Definition hevcdec.h:461
struct AVRefStructPool * tab_mvf_pool
Definition hevcdec.h:486
uint8_t * sao_pixel_buffer_v[3]
Definition hevcdec.h:484
uint8_t * vertical_bs
Definition hevcdec.h:481
uint8_t * horizontal_bs
Definition hevcdec.h:480
uint8_t ctb_left_flag
Definition hevcdec.h:422
PredictionUnit pu
Definition hevcdec.h:436
uint8_t ctb_up_left_flag
Definition hevcdec.h:425
uint8_t edge_emu_buffer[(MAX_PB_SIZE+7) *EDGE_EMU_BUFFER_STRIDE *2]
Definition hevcdec.h:429
TransformUnit tu
Definition hevcdec.h:420
const struct HEVCContext * parent
Definition hevcdec.h:399
int16_t tmp[MAX_PB_SIZE *MAX_PB_SIZE]
Definition hevcdec.h:432
uint8_t ctb_up_flag
Definition hevcdec.h:423
CodingUnit cu
Definition hevcdec.h:435
uint8_t first_qp_group
Definition hevcdec.h:396
uint8_t ctb_up_right_flag
Definition hevcdec.h:424
uint8_t edge_emu_buffer2[(MAX_PB_SIZE+7) *EDGE_EMU_BUFFER_STRIDE *2]
Definition hevcdec.h:431
CABACContext cc
Definition hevcdec.h:401
Definition ps.h:371
const HEVCVPS * vps_list[HEVC_MAX_VPS_COUNT]
RefStruct references.
Definition ps.h:509
const HEVCPPS * pps_list[HEVC_MAX_PPS_COUNT]
RefStruct references.
Definition ps.h:511
const HEVCSPS * sps_list[HEVC_MAX_SPS_COUNT]
RefStruct references.
Definition ps.h:510
uint8_t num_ref_displays
Definition sei.h:86
uint16_t left_view_id[32]
Definition sei.h:87
uint16_t right_view_id[32]
Definition sei.h:88
Definition sei.h:106
HEVCSEIRecoveryPoint recovery_point
Definition sei.h:113
H2645SEI common
Definition sei.h:107
HEVCSEITDRDI tdrdi
Definition sei.h:112
Definition ps.h:252
int height
Definition ps.h:348
int width
coded frame dimension in various units
Definition ps.h:347
enum AVPixelFormat pix_fmt
Definition ps.h:265
Definition ps.h:168
unsigned int top_offset
Definition ps.h:94
unsigned int right_offset
Definition ps.h:93
unsigned int bottom_offset
Definition ps.h:95
unsigned int left_offset
Definition ps.h:92
uint8_t used[32]
Definition hevcdec.h:190
uint8_t nb_refs
Definition hevcdec.h:191
int poc[32]
Definition hevcdec.h:188
uint8_t poc_msb_present[32]
Definition hevcdec.h:189
int8_t ref_idx[2]
refIdxL0, refIdxL1
Definition hevcdec.h:310
int8_t pred_flag
Definition hevcdec.h:311
Mv mv[2]
mvL0, vvL1
Definition hevcdec.h:309
Definition hevcdec.h:303
int16_t x
horizontal component of motion vector
Definition hevcdec.h:304
int16_t y
vertical component of motion vector
Definition hevcdec.h:305
uint8_t intra_pred_mode_c[4]
Definition hevcdec.h:329
uint8_t intra_pred_mode[4]
Definition hevcdec.h:326
int rem_intra_luma_pred_mode
Definition hevcdec.h:325
uint8_t merge_flag
Definition hevcdec.h:328
uint8_t chroma_mode_c[4]
Definition hevcdec.h:330
struct HEVCFrame * ref[HEVC_MAX_REFS]
Definition hevcdec.h:195
int offset_sign[3][4]
sao_offset_sign
Definition dsp.h:36
int16_t offset_val[3][5]
SaoOffsetVal.
Definition dsp.h:42
int eo_class[3]
sao_eo_class
Definition dsp.h:40
int offset_abs[3][4]
sao_offset_abs
Definition dsp.h:35
uint8_t type_idx[3]
sao_type_idx
Definition dsp.h:44
int16_t chroma_weight_l1[16][2]
Definition hevcdec.h:277
uint8_t cu_chroma_qp_offset_enabled_flag
Definition hevcdec.h:257
const ShortTermRPS * short_term_rps
Definition hevcdec.h:228
unsigned int slice_addr
address (in raster order) of the first block in the current slice
Definition hevcdec.h:211
int16_t luma_weight_l0[16]
Definition hevcdec.h:275
uint8_t disable_deblocking_filter_flag
slice_header_disable_deblocking_filter_flag
Definition hevcdec.h:243
uint8_t max_num_merge_cand
5 - 5_minus_max_num_merge_cand
Definition hevcdec.h:262
uint8_t mvd_l1_zero_flag
Definition hevcdec.h:240
uint8_t slice_temporal_mvp_enabled_flag
Definition hevcdec.h:235
int tc_offset
tc_offset_div2 * 2
Definition hevcdec.h:260
uint8_t luma_log2_weight_denom
Definition hevcdec.h:272
int8_t slice_qp
Definition hevcdec.h:270
uint8_t no_output_of_prior_pics_flag
Definition hevcdec.h:234
unsigned int pps_id
Definition hevcdec.h:206
int16_t luma_weight_l1[16]
Definition hevcdec.h:278
uint8_t colour_plane_id
Definition hevcdec.h:221
int short_term_ref_pic_set_sps_flag
RPS coded in the slice header itself is stored here.
Definition hevcdec.h:225
unsigned data_offset
Definition hevcdec.h:287
uint8_t use_integer_mv_flag
Definition hevcdec.h:263
int slice_cb_qp_offset
Definition hevcdec.h:250
int16_t luma_offset_l1[16]
Definition hevcdec.h:283
int16_t chroma_offset_l1[16][2]
Definition hevcdec.h:284
enum HEVCSliceType slice_type
Definition hevcdec.h:213
int * size
Definition hevcdec.h:267
unsigned int list_entry_lx[2][32]
Definition hevcdec.h:231
uint8_t inter_layer_pred
Definition hevcdec.h:222
unsigned * entry_point_offset
Definition hevcdec.h:265
int16_t chroma_offset_l0[16][2]
Definition hevcdec.h:281
unsigned int slice_segment_addr
address (in raster order) of the first block in the current slice segment
Definition hevcdec.h:209
int slice_ctb_addr_rs
Definition hevcdec.h:286
unsigned int nb_refs[2]
Definition hevcdec.h:237
int slice_act_y_qp_offset
Definition hevcdec.h:253
int slice_qp_delta
Definition hevcdec.h:249
uint8_t cabac_init_flag
Definition hevcdec.h:242
int16_t chroma_log2_weight_denom
Definition hevcdec.h:273
int16_t chroma_weight_l0[16][2]
Definition hevcdec.h:276
int slice_act_cb_qp_offset
Definition hevcdec.h:254
uint8_t dependent_slice_segment_flag
Definition hevcdec.h:219
int * offset
Definition hevcdec.h:266
ShortTermRPS slice_rps
Definition hevcdec.h:227
uint8_t rpl_modification_flag[2]
Definition hevcdec.h:233
int short_term_ref_pic_set_size
Definition hevcdec.h:226
uint8_t first_slice_in_pic_flag
Definition hevcdec.h:218
LongTermRPS long_term_rps
Definition hevcdec.h:230
int num_entry_point_offsets
Definition hevcdec.h:268
uint8_t slice_sample_adaptive_offset_flag[3]
Definition hevcdec.h:239
unsigned int collocated_ref_idx
Definition hevcdec.h:247
int16_t luma_offset_l0[16]
Definition hevcdec.h:280
int beta_offset
beta_offset_div2 * 2
Definition hevcdec.h:259
int slice_act_cr_qp_offset
Definition hevcdec.h:255
uint8_t slice_loop_filter_across_slices_enabled_flag
Definition hevcdec.h:244
uint8_t collocated_list
Definition hevcdec.h:245
uint8_t pic_output_flag
Definition hevcdec.h:220
int slice_cr_qp_offset
Definition hevcdec.h:251
int long_term_ref_pic_set_size
Definition hevcdec.h:229
int pic_order_cnt_lsb
Definition hevcdec.h:215
uint8_t is_cu_chroma_qp_offset_coded
Definition hevcdec.h:343
uint8_t cross_pf
Definition hevcdec.h:346
int cu_qp_delta
Definition hevcdec.h:334
int8_t cu_qp_offset_cr
Definition hevcdec.h:345
int intra_pred_mode_c
Definition hevcdec.h:340
int8_t cu_qp_offset_cb
Definition hevcdec.h:344
int chroma_mode_c
Definition hevcdec.h:341
uint8_t is_cu_qp_delta_coded
Definition hevcdec.h:342
int res_scale_val
Definition hevcdec.h:336
int intra_pred_mode
Definition hevcdec.h:339
#define stride
#define av_free(p)
#define av_malloc_array(a, b)
#define av_mallocz(s)
#define av_freep(p)
#define av_log(a,...)
static void error(const char *err)
Spherical video.
static uint8_t tmp[40]
Definition aes_ctr.c:52
#define src1
Definition h264pred.c:141
#define src0
Definition h264pred.c:140
#define src
Definition vp8dsp.c:248
static int ref[MAX_W *MAX_W]
#define height
Definition dsp.h:89
#define width
Definition dsp.h:89
av_cold void ff_thread_progress_destroy(ThreadProgress *pro)
Destroy a ThreadProgress.
av_cold int ff_thread_progress_init(ThreadProgress *pro, int init_mode)
Initialize a ThreadProgress.
void ff_thread_progress_report(ThreadProgress *pro, int n)
This function is a no-op in no-op mode; otherwise it notifies other threads that a certain level of p...
void ff_thread_progress_await(const ThreadProgress *pro_c, int n)
This function is a no-op in no-op mode; otherwise it waits until other threads have reached a certain...
static void ff_thread_progress_reset(ThreadProgress *pro)
Reset the ThreadProgress.progress counter; must only be called if the ThreadProgress is not in use in...
uint32_t av_timecode_get_smpte(AVRational rate, int drop, int hh, int mm, int ss, int ff)
Convert sei info to SMPTE 12M binary representation.
Definition timecode.c:70
char * av_timecode_make_smpte_tc_string2(char *buf, AVRational rate, uint32_t tcsmpte, int prevent_df, int skip_field)
Get the timecode string from the SMPTE timecode format.
Definition timecode.c:131
Timecode helpers header.
#define AV_TIMECODE_STR_SIZE
Definition timecode.h:33
int size
static void do_output(BM3DContext *s, uint8_t *dst, int dst_linesize, int plane, int nb_jobs)
Definition vf_bm3d.c:630
float delta
#define MODE_INTRA
Definition vp3.c:83