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
9 * This file is part of FFmpeg.
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.
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.
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
26 #include "libavutil/atomic.h"
27 #include "libavutil/attributes.h"
28 #include "libavutil/common.h"
29 #include "libavutil/display.h"
30 #include "libavutil/internal.h"
31 #include "libavutil/md5.h"
32 #include "libavutil/opt.h"
33 #include "libavutil/pixdesc.h"
34 #include "libavutil/stereo3d.h"
37 #include "bytestream.h"
38 #include "cabac_functions.h"
42 const uint8_t ff_hevc_pel_weight[65] = { [2] = 0, [4] = 1, [6] = 2, [8] = 3, [12] = 4, [16] = 5, [24] = 6, [32] = 7, [48] = 8, [64] = 9 };
45 * NOTE: Each function hls_foo correspond to the function foo in the
46 * specification (HLS stands for High Level Syntax).
53 /* free everything allocated by pic_arrays_init() */
54 static void pic_arrays_free(HEVCContext *s)
57 av_freep(&s->deblock);
59 av_freep(&s->skip_flag);
60 av_freep(&s->tab_ct_depth);
62 av_freep(&s->tab_ipm);
63 av_freep(&s->cbf_luma);
66 av_freep(&s->qp_y_tab);
67 av_freep(&s->tab_slice_address);
68 av_freep(&s->filter_slice_edges);
70 av_freep(&s->horizontal_bs);
71 av_freep(&s->vertical_bs);
73 av_freep(&s->sh.entry_point_offset);
74 av_freep(&s->sh.size);
75 av_freep(&s->sh.offset);
77 av_buffer_pool_uninit(&s->tab_mvf_pool);
78 av_buffer_pool_uninit(&s->rpl_tab_pool);
81 /* allocate arrays that depend on frame dimensions */
82 static int pic_arrays_init(HEVCContext *s, const HEVCSPS *sps)
84 int log2_min_cb_size = sps->log2_min_cb_size;
85 int width = sps->width;
86 int height = sps->height;
87 int pic_size_in_ctb = ((width >> log2_min_cb_size) + 1) *
88 ((height >> log2_min_cb_size) + 1);
89 int ctb_count = sps->ctb_width * sps->ctb_height;
90 int min_pu_size = sps->min_pu_width * sps->min_pu_height;
92 s->bs_width = (width >> 2) + 1;
93 s->bs_height = (height >> 2) + 1;
95 s->sao = av_mallocz_array(ctb_count, sizeof(*s->sao));
96 s->deblock = av_mallocz_array(ctb_count, sizeof(*s->deblock));
97 if (!s->sao || !s->deblock)
100 s->skip_flag = av_malloc_array(sps->min_cb_height, sps->min_cb_width);
101 s->tab_ct_depth = av_malloc_array(sps->min_cb_height, sps->min_cb_width);
102 if (!s->skip_flag || !s->tab_ct_depth)
105 s->cbf_luma = av_malloc_array(sps->min_tb_width, sps->min_tb_height);
106 s->tab_ipm = av_mallocz(min_pu_size);
107 s->is_pcm = av_malloc_array(sps->min_pu_width + 1, sps->min_pu_height + 1);
108 if (!s->tab_ipm || !s->cbf_luma || !s->is_pcm)
111 s->filter_slice_edges = av_mallocz(ctb_count);
112 s->tab_slice_address = av_malloc_array(pic_size_in_ctb,
113 sizeof(*s->tab_slice_address));
114 s->qp_y_tab = av_malloc_array(pic_size_in_ctb,
115 sizeof(*s->qp_y_tab));
116 if (!s->qp_y_tab || !s->filter_slice_edges || !s->tab_slice_address)
119 s->horizontal_bs = av_mallocz_array(s->bs_width, s->bs_height);
120 s->vertical_bs = av_mallocz_array(s->bs_width, s->bs_height);
121 if (!s->horizontal_bs || !s->vertical_bs)
124 s->tab_mvf_pool = av_buffer_pool_init(min_pu_size * sizeof(MvField),
126 s->rpl_tab_pool = av_buffer_pool_init(ctb_count * sizeof(RefPicListTab),
128 if (!s->tab_mvf_pool || !s->rpl_tab_pool)
135 return AVERROR(ENOMEM);
138 static void pred_weight_table(HEVCContext *s, GetBitContext *gb)
142 uint8_t luma_weight_l0_flag[16];
143 uint8_t chroma_weight_l0_flag[16];
144 uint8_t luma_weight_l1_flag[16];
145 uint8_t chroma_weight_l1_flag[16];
146 int luma_log2_weight_denom;
148 luma_log2_weight_denom = get_ue_golomb_long(gb);
149 if (luma_log2_weight_denom < 0 || luma_log2_weight_denom > 7)
150 av_log(s->avctx, AV_LOG_ERROR, "luma_log2_weight_denom %d is invalid\n", luma_log2_weight_denom);
151 s->sh.luma_log2_weight_denom = av_clip_c(luma_log2_weight_denom, 0, 7);
152 if (s->sps->chroma_format_idc != 0) {
153 int delta = get_se_golomb(gb);
154 s->sh.chroma_log2_weight_denom = av_clip(s->sh.luma_log2_weight_denom + delta, 0, 7);
157 for (i = 0; i < s->sh.nb_refs[L0]; i++) {
158 luma_weight_l0_flag[i] = get_bits1(gb);
159 if (!luma_weight_l0_flag[i]) {
160 s->sh.luma_weight_l0[i] = 1 << s->sh.luma_log2_weight_denom;
161 s->sh.luma_offset_l0[i] = 0;
164 if (s->sps->chroma_format_idc != 0) {
165 for (i = 0; i < s->sh.nb_refs[L0]; i++)
166 chroma_weight_l0_flag[i] = get_bits1(gb);
168 for (i = 0; i < s->sh.nb_refs[L0]; i++)
169 chroma_weight_l0_flag[i] = 0;
171 for (i = 0; i < s->sh.nb_refs[L0]; i++) {
172 if (luma_weight_l0_flag[i]) {
173 int delta_luma_weight_l0 = get_se_golomb(gb);
174 s->sh.luma_weight_l0[i] = (1 << s->sh.luma_log2_weight_denom) + delta_luma_weight_l0;
175 s->sh.luma_offset_l0[i] = get_se_golomb(gb);
177 if (chroma_weight_l0_flag[i]) {
178 for (j = 0; j < 2; j++) {
179 int delta_chroma_weight_l0 = get_se_golomb(gb);
180 int delta_chroma_offset_l0 = get_se_golomb(gb);
181 s->sh.chroma_weight_l0[i][j] = (1 << s->sh.chroma_log2_weight_denom) + delta_chroma_weight_l0;
182 s->sh.chroma_offset_l0[i][j] = av_clip((delta_chroma_offset_l0 - ((128 * s->sh.chroma_weight_l0[i][j])
183 >> s->sh.chroma_log2_weight_denom) + 128), -128, 127);
186 s->sh.chroma_weight_l0[i][0] = 1 << s->sh.chroma_log2_weight_denom;
187 s->sh.chroma_offset_l0[i][0] = 0;
188 s->sh.chroma_weight_l0[i][1] = 1 << s->sh.chroma_log2_weight_denom;
189 s->sh.chroma_offset_l0[i][1] = 0;
192 if (s->sh.slice_type == B_SLICE) {
193 for (i = 0; i < s->sh.nb_refs[L1]; i++) {
194 luma_weight_l1_flag[i] = get_bits1(gb);
195 if (!luma_weight_l1_flag[i]) {
196 s->sh.luma_weight_l1[i] = 1 << s->sh.luma_log2_weight_denom;
197 s->sh.luma_offset_l1[i] = 0;
200 if (s->sps->chroma_format_idc != 0) {
201 for (i = 0; i < s->sh.nb_refs[L1]; i++)
202 chroma_weight_l1_flag[i] = get_bits1(gb);
204 for (i = 0; i < s->sh.nb_refs[L1]; i++)
205 chroma_weight_l1_flag[i] = 0;
207 for (i = 0; i < s->sh.nb_refs[L1]; i++) {
208 if (luma_weight_l1_flag[i]) {
209 int delta_luma_weight_l1 = get_se_golomb(gb);
210 s->sh.luma_weight_l1[i] = (1 << s->sh.luma_log2_weight_denom) + delta_luma_weight_l1;
211 s->sh.luma_offset_l1[i] = get_se_golomb(gb);
213 if (chroma_weight_l1_flag[i]) {
214 for (j = 0; j < 2; j++) {
215 int delta_chroma_weight_l1 = get_se_golomb(gb);
216 int delta_chroma_offset_l1 = get_se_golomb(gb);
217 s->sh.chroma_weight_l1[i][j] = (1 << s->sh.chroma_log2_weight_denom) + delta_chroma_weight_l1;
218 s->sh.chroma_offset_l1[i][j] = av_clip((delta_chroma_offset_l1 - ((128 * s->sh.chroma_weight_l1[i][j])
219 >> s->sh.chroma_log2_weight_denom) + 128), -128, 127);
222 s->sh.chroma_weight_l1[i][0] = 1 << s->sh.chroma_log2_weight_denom;
223 s->sh.chroma_offset_l1[i][0] = 0;
224 s->sh.chroma_weight_l1[i][1] = 1 << s->sh.chroma_log2_weight_denom;
225 s->sh.chroma_offset_l1[i][1] = 0;
231 static int decode_lt_rps(HEVCContext *s, LongTermRPS *rps, GetBitContext *gb)
233 const HEVCSPS *sps = s->sps;
234 int max_poc_lsb = 1 << sps->log2_max_poc_lsb;
235 int prev_delta_msb = 0;
236 unsigned int nb_sps = 0, nb_sh;
240 if (!sps->long_term_ref_pics_present_flag)
243 if (sps->num_long_term_ref_pics_sps > 0)
244 nb_sps = get_ue_golomb_long(gb);
245 nb_sh = get_ue_golomb_long(gb);
247 if (nb_sh + (uint64_t)nb_sps > FF_ARRAY_ELEMS(rps->poc))
248 return AVERROR_INVALIDDATA;
250 rps->nb_refs = nb_sh + nb_sps;
252 for (i = 0; i < rps->nb_refs; i++) {
253 uint8_t delta_poc_msb_present;
256 uint8_t lt_idx_sps = 0;
258 if (sps->num_long_term_ref_pics_sps > 1)
259 lt_idx_sps = get_bits(gb, av_ceil_log2(sps->num_long_term_ref_pics_sps));
261 rps->poc[i] = sps->lt_ref_pic_poc_lsb_sps[lt_idx_sps];
262 rps->used[i] = sps->used_by_curr_pic_lt_sps_flag[lt_idx_sps];
264 rps->poc[i] = get_bits(gb, sps->log2_max_poc_lsb);
265 rps->used[i] = get_bits1(gb);
268 delta_poc_msb_present = get_bits1(gb);
269 if (delta_poc_msb_present) {
270 int delta = get_ue_golomb_long(gb);
272 if (i && i != nb_sps)
273 delta += prev_delta_msb;
275 rps->poc[i] += s->poc - delta * max_poc_lsb - s->sh.pic_order_cnt_lsb;
276 prev_delta_msb = delta;
283 static int get_buffer_sao(HEVCContext *s, AVFrame *frame, const HEVCSPS *sps)
287 frame->width = FFALIGN(s->avctx->coded_width + 2, FF_INPUT_BUFFER_PADDING_SIZE);
288 frame->height = s->avctx->coded_height + 3;
289 if ((ret = ff_get_buffer(s->avctx, frame, AV_GET_BUFFER_FLAG_REF)) < 0)
291 for (i = 0; frame->data[i]; i++) {
292 int offset = frame->linesize[i] + FF_INPUT_BUFFER_PADDING_SIZE;
293 frame->data[i] += offset;
295 frame->width = s->avctx->coded_width;
296 frame->height = s->avctx->coded_height;
301 static int set_sps(HEVCContext *s, const HEVCSPS *sps)
303 #define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL)
304 enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmt = pix_fmts;
306 unsigned int num = 0, den = 0;
309 ret = pic_arrays_init(s, sps);
313 s->avctx->coded_width = sps->width;
314 s->avctx->coded_height = sps->height;
315 s->avctx->width = sps->output_width;
316 s->avctx->height = sps->output_height;
317 s->avctx->has_b_frames = sps->temporal_layer[sps->max_sub_layers - 1].num_reorder_pics;
319 if (sps->pix_fmt == AV_PIX_FMT_YUV420P || sps->pix_fmt == AV_PIX_FMT_YUVJ420P) {
320 #if CONFIG_HEVC_DXVA2_HWACCEL
321 *fmt++ = AV_PIX_FMT_DXVA2_VLD;
325 *fmt++ = sps->pix_fmt;
326 *fmt = AV_PIX_FMT_NONE;
328 ret = ff_thread_get_format(s->avctx, pix_fmts);
331 s->avctx->pix_fmt = ret;
333 ff_set_sar(s->avctx, sps->vui.sar);
335 if (sps->vui.video_signal_type_present_flag)
336 s->avctx->color_range = sps->vui.video_full_range_flag ? AVCOL_RANGE_JPEG
339 s->avctx->color_range = AVCOL_RANGE_MPEG;
341 if (sps->vui.colour_description_present_flag) {
342 s->avctx->color_primaries = sps->vui.colour_primaries;
343 s->avctx->color_trc = sps->vui.transfer_characteristic;
344 s->avctx->colorspace = sps->vui.matrix_coeffs;
346 s->avctx->color_primaries = AVCOL_PRI_UNSPECIFIED;
347 s->avctx->color_trc = AVCOL_TRC_UNSPECIFIED;
348 s->avctx->colorspace = AVCOL_SPC_UNSPECIFIED;
351 ff_hevc_pred_init(&s->hpc, sps->bit_depth);
352 ff_hevc_dsp_init (&s->hevcdsp, sps->bit_depth);
353 ff_videodsp_init (&s->vdsp, sps->bit_depth);
355 if (sps->sao_enabled && !s->avctx->hwaccel) {
356 #ifdef USE_SAO_SMALL_BUFFER
358 int ctb_size = 1 << sps->log2_ctb_size;
359 int c_count = (sps->chroma_format_idc != 0) ? 3 : 1;
362 for (i = 0; i < s->threads_number ; i++) {
363 HEVCLocalContext *lc = s->HEVClcList[i];
364 lc->sao_pixel_buffer =
365 av_malloc(((ctb_size + 2) * (ctb_size + 2)) <<
368 for(c_idx = 0; c_idx < c_count; c_idx++) {
369 int w = sps->width >> sps->hshift[c_idx];
370 int h = sps->height >> sps->vshift[c_idx];
371 s->sao_pixel_buffer_h[c_idx] =
372 av_malloc((w * 2 * sps->ctb_height) <<
374 s->sao_pixel_buffer_v[c_idx] =
375 av_malloc((h * 2 * sps->ctb_width) <<
380 av_frame_unref(s->tmp_frame);
381 ret = get_buffer_sao(s, s->tmp_frame, sps);
382 s->sao_frame = s->tmp_frame;
387 s->vps = (HEVCVPS*) s->vps_list[s->sps->vps_id]->data;
389 if (s->vps->vps_timing_info_present_flag) {
390 num = s->vps->vps_num_units_in_tick;
391 den = s->vps->vps_time_scale;
392 } else if (sps->vui.vui_timing_info_present_flag) {
393 num = sps->vui.vui_num_units_in_tick;
394 den = sps->vui.vui_time_scale;
397 if (num != 0 && den != 0)
398 av_reduce(&s->avctx->framerate.den, &s->avctx->framerate.num,
409 static int hls_slice_header(HEVCContext *s)
411 GetBitContext *gb = &s->HEVClc->gb;
412 SliceHeader *sh = &s->sh;
416 sh->first_slice_in_pic_flag = get_bits1(gb);
417 if ((IS_IDR(s) || IS_BLA(s)) && sh->first_slice_in_pic_flag) {
418 s->seq_decode = (s->seq_decode + 1) & 0xff;
421 ff_hevc_clear_refs(s);
423 sh->no_output_of_prior_pics_flag = 0;
425 sh->no_output_of_prior_pics_flag = get_bits1(gb);
427 sh->pps_id = get_ue_golomb_long(gb);
428 if (sh->pps_id >= MAX_PPS_COUNT || !s->pps_list[sh->pps_id]) {
429 av_log(s->avctx, AV_LOG_ERROR, "PPS id out of range: %d\n", sh->pps_id);
430 return AVERROR_INVALIDDATA;
432 if (!sh->first_slice_in_pic_flag &&
433 s->pps != (HEVCPPS*)s->pps_list[sh->pps_id]->data) {
434 av_log(s->avctx, AV_LOG_ERROR, "PPS changed between slices.\n");
435 return AVERROR_INVALIDDATA;
437 s->pps = (HEVCPPS*)s->pps_list[sh->pps_id]->data;
438 if (s->nal_unit_type == NAL_CRA_NUT && s->last_eos == 1)
439 sh->no_output_of_prior_pics_flag = 1;
441 if (s->sps != (HEVCSPS*)s->sps_list[s->pps->sps_id]->data) {
442 const HEVCSPS* last_sps = s->sps;
443 s->sps = (HEVCSPS*)s->sps_list[s->pps->sps_id]->data;
444 if (last_sps && IS_IRAP(s) && s->nal_unit_type != NAL_CRA_NUT) {
445 if (s->sps->width != last_sps->width || s->sps->height != last_sps->height ||
446 s->sps->temporal_layer[s->sps->max_sub_layers - 1].max_dec_pic_buffering !=
447 last_sps->temporal_layer[last_sps->max_sub_layers - 1].max_dec_pic_buffering)
448 sh->no_output_of_prior_pics_flag = 0;
450 ff_hevc_clear_refs(s);
451 ret = set_sps(s, s->sps);
455 s->seq_decode = (s->seq_decode + 1) & 0xff;
459 s->avctx->profile = s->sps->ptl.general_ptl.profile_idc;
460 s->avctx->level = s->sps->ptl.general_ptl.level_idc;
462 sh->dependent_slice_segment_flag = 0;
463 if (!sh->first_slice_in_pic_flag) {
464 int slice_address_length;
466 if (s->pps->dependent_slice_segments_enabled_flag)
467 sh->dependent_slice_segment_flag = get_bits1(gb);
469 slice_address_length = av_ceil_log2(s->sps->ctb_width *
471 sh->slice_segment_addr = get_bits(gb, slice_address_length);
472 if (sh->slice_segment_addr >= s->sps->ctb_width * s->sps->ctb_height) {
473 av_log(s->avctx, AV_LOG_ERROR,
474 "Invalid slice segment address: %u.\n",
475 sh->slice_segment_addr);
476 return AVERROR_INVALIDDATA;
479 if (!sh->dependent_slice_segment_flag) {
480 sh->slice_addr = sh->slice_segment_addr;
484 sh->slice_segment_addr = sh->slice_addr = 0;
486 s->slice_initialized = 0;
489 if (!sh->dependent_slice_segment_flag) {
490 s->slice_initialized = 0;
492 for (i = 0; i < s->pps->num_extra_slice_header_bits; i++)
493 skip_bits(gb, 1); // slice_reserved_undetermined_flag[]
495 sh->slice_type = get_ue_golomb_long(gb);
496 if (!(sh->slice_type == I_SLICE ||
497 sh->slice_type == P_SLICE ||
498 sh->slice_type == B_SLICE)) {
499 av_log(s->avctx, AV_LOG_ERROR, "Unknown slice type: %d.\n",
501 return AVERROR_INVALIDDATA;
503 if (IS_IRAP(s) && sh->slice_type != I_SLICE) {
504 av_log(s->avctx, AV_LOG_ERROR, "Inter slices in an IRAP frame.\n");
505 return AVERROR_INVALIDDATA;
508 // when flag is not present, picture is inferred to be output
509 sh->pic_output_flag = 1;
510 if (s->pps->output_flag_present_flag)
511 sh->pic_output_flag = get_bits1(gb);
513 if (s->sps->separate_colour_plane_flag)
514 sh->colour_plane_id = get_bits(gb, 2);
519 sh->pic_order_cnt_lsb = get_bits(gb, s->sps->log2_max_poc_lsb);
520 poc = ff_hevc_compute_poc(s, sh->pic_order_cnt_lsb);
521 if (!sh->first_slice_in_pic_flag && poc != s->poc) {
522 av_log(s->avctx, AV_LOG_WARNING,
523 "Ignoring POC change between slices: %d -> %d\n", s->poc, poc);
524 if (s->avctx->err_recognition & AV_EF_EXPLODE)
525 return AVERROR_INVALIDDATA;
530 sh->short_term_ref_pic_set_sps_flag = get_bits1(gb);
531 if (!sh->short_term_ref_pic_set_sps_flag) {
532 int pos = get_bits_left(gb);
533 ret = ff_hevc_decode_short_term_rps(s, &sh->slice_rps, s->sps, 1);
537 sh->short_term_ref_pic_set_size = pos - get_bits_left(gb);
538 sh->short_term_rps = &sh->slice_rps;
540 int numbits, rps_idx;
542 if (!s->sps->nb_st_rps) {
543 av_log(s->avctx, AV_LOG_ERROR, "No ref lists in the SPS.\n");
544 return AVERROR_INVALIDDATA;
547 numbits = av_ceil_log2(s->sps->nb_st_rps);
548 rps_idx = numbits > 0 ? get_bits(gb, numbits) : 0;
549 sh->short_term_rps = &s->sps->st_rps[rps_idx];
552 ret = decode_lt_rps(s, &sh->long_term_rps, gb);
554 av_log(s->avctx, AV_LOG_WARNING, "Invalid long term RPS.\n");
555 if (s->avctx->err_recognition & AV_EF_EXPLODE)
556 return AVERROR_INVALIDDATA;
559 if (s->sps->sps_temporal_mvp_enabled_flag)
560 sh->slice_temporal_mvp_enabled_flag = get_bits1(gb);
562 sh->slice_temporal_mvp_enabled_flag = 0;
564 s->sh.short_term_rps = NULL;
569 if (s->temporal_id == 0 &&
570 s->nal_unit_type != NAL_TRAIL_N &&
571 s->nal_unit_type != NAL_TSA_N &&
572 s->nal_unit_type != NAL_STSA_N &&
573 s->nal_unit_type != NAL_RADL_N &&
574 s->nal_unit_type != NAL_RADL_R &&
575 s->nal_unit_type != NAL_RASL_N &&
576 s->nal_unit_type != NAL_RASL_R)
579 if (s->sps->sao_enabled) {
580 sh->slice_sample_adaptive_offset_flag[0] = get_bits1(gb);
581 if (s->sps->chroma_format_idc) {
582 sh->slice_sample_adaptive_offset_flag[1] =
583 sh->slice_sample_adaptive_offset_flag[2] = get_bits1(gb);
586 sh->slice_sample_adaptive_offset_flag[0] = 0;
587 sh->slice_sample_adaptive_offset_flag[1] = 0;
588 sh->slice_sample_adaptive_offset_flag[2] = 0;
591 sh->nb_refs[L0] = sh->nb_refs[L1] = 0;
592 if (sh->slice_type == P_SLICE || sh->slice_type == B_SLICE) {
595 sh->nb_refs[L0] = s->pps->num_ref_idx_l0_default_active;
596 if (sh->slice_type == B_SLICE)
597 sh->nb_refs[L1] = s->pps->num_ref_idx_l1_default_active;
599 if (get_bits1(gb)) { // num_ref_idx_active_override_flag
600 sh->nb_refs[L0] = get_ue_golomb_long(gb) + 1;
601 if (sh->slice_type == B_SLICE)
602 sh->nb_refs[L1] = get_ue_golomb_long(gb) + 1;
604 if (sh->nb_refs[L0] > MAX_REFS || sh->nb_refs[L1] > MAX_REFS) {
605 av_log(s->avctx, AV_LOG_ERROR, "Too many refs: %d/%d.\n",
606 sh->nb_refs[L0], sh->nb_refs[L1]);
607 return AVERROR_INVALIDDATA;
610 sh->rpl_modification_flag[0] = 0;
611 sh->rpl_modification_flag[1] = 0;
612 nb_refs = ff_hevc_frame_nb_refs(s);
614 av_log(s->avctx, AV_LOG_ERROR, "Zero refs for a frame with P or B slices.\n");
615 return AVERROR_INVALIDDATA;
618 if (s->pps->lists_modification_present_flag && nb_refs > 1) {
619 sh->rpl_modification_flag[0] = get_bits1(gb);
620 if (sh->rpl_modification_flag[0]) {
621 for (i = 0; i < sh->nb_refs[L0]; i++)
622 sh->list_entry_lx[0][i] = get_bits(gb, av_ceil_log2(nb_refs));
625 if (sh->slice_type == B_SLICE) {
626 sh->rpl_modification_flag[1] = get_bits1(gb);
627 if (sh->rpl_modification_flag[1] == 1)
628 for (i = 0; i < sh->nb_refs[L1]; i++)
629 sh->list_entry_lx[1][i] = get_bits(gb, av_ceil_log2(nb_refs));
633 if (sh->slice_type == B_SLICE)
634 sh->mvd_l1_zero_flag = get_bits1(gb);
636 if (s->pps->cabac_init_present_flag)
637 sh->cabac_init_flag = get_bits1(gb);
639 sh->cabac_init_flag = 0;
641 sh->collocated_ref_idx = 0;
642 if (sh->slice_temporal_mvp_enabled_flag) {
643 sh->collocated_list = L0;
644 if (sh->slice_type == B_SLICE)
645 sh->collocated_list = !get_bits1(gb);
647 if (sh->nb_refs[sh->collocated_list] > 1) {
648 sh->collocated_ref_idx = get_ue_golomb_long(gb);
649 if (sh->collocated_ref_idx >= sh->nb_refs[sh->collocated_list]) {
650 av_log(s->avctx, AV_LOG_ERROR,
651 "Invalid collocated_ref_idx: %d.\n",
652 sh->collocated_ref_idx);
653 return AVERROR_INVALIDDATA;
658 if ((s->pps->weighted_pred_flag && sh->slice_type == P_SLICE) ||
659 (s->pps->weighted_bipred_flag && sh->slice_type == B_SLICE)) {
660 pred_weight_table(s, gb);
663 sh->max_num_merge_cand = 5 - get_ue_golomb_long(gb);
664 if (sh->max_num_merge_cand < 1 || sh->max_num_merge_cand > 5) {
665 av_log(s->avctx, AV_LOG_ERROR,
666 "Invalid number of merging MVP candidates: %d.\n",
667 sh->max_num_merge_cand);
668 return AVERROR_INVALIDDATA;
672 sh->slice_qp_delta = get_se_golomb(gb);
674 if (s->pps->pic_slice_level_chroma_qp_offsets_present_flag) {
675 sh->slice_cb_qp_offset = get_se_golomb(gb);
676 sh->slice_cr_qp_offset = get_se_golomb(gb);
678 sh->slice_cb_qp_offset = 0;
679 sh->slice_cr_qp_offset = 0;
682 if (s->pps->chroma_qp_offset_list_enabled_flag)
683 sh->cu_chroma_qp_offset_enabled_flag = get_bits1(gb);
685 sh->cu_chroma_qp_offset_enabled_flag = 0;
687 if (s->pps->deblocking_filter_control_present_flag) {
688 int deblocking_filter_override_flag = 0;
690 if (s->pps->deblocking_filter_override_enabled_flag)
691 deblocking_filter_override_flag = get_bits1(gb);
693 if (deblocking_filter_override_flag) {
694 sh->disable_deblocking_filter_flag = get_bits1(gb);
695 if (!sh->disable_deblocking_filter_flag) {
696 sh->beta_offset = get_se_golomb(gb) * 2;
697 sh->tc_offset = get_se_golomb(gb) * 2;
700 sh->disable_deblocking_filter_flag = s->pps->disable_dbf;
701 sh->beta_offset = s->pps->beta_offset;
702 sh->tc_offset = s->pps->tc_offset;
705 sh->disable_deblocking_filter_flag = 0;
710 if (s->pps->seq_loop_filter_across_slices_enabled_flag &&
711 (sh->slice_sample_adaptive_offset_flag[0] ||
712 sh->slice_sample_adaptive_offset_flag[1] ||
713 !sh->disable_deblocking_filter_flag)) {
714 sh->slice_loop_filter_across_slices_enabled_flag = get_bits1(gb);
716 sh->slice_loop_filter_across_slices_enabled_flag = s->pps->seq_loop_filter_across_slices_enabled_flag;
718 } else if (!s->slice_initialized) {
719 av_log(s->avctx, AV_LOG_ERROR, "Independent slice segment missing.\n");
720 return AVERROR_INVALIDDATA;
723 sh->num_entry_point_offsets = 0;
724 if (s->pps->tiles_enabled_flag || s->pps->entropy_coding_sync_enabled_flag) {
725 sh->num_entry_point_offsets = get_ue_golomb_long(gb);
726 if (sh->num_entry_point_offsets > 0) {
727 int offset_len = get_ue_golomb_long(gb) + 1;
728 int segments = offset_len >> 4;
729 int rest = (offset_len & 15);
730 av_freep(&sh->entry_point_offset);
731 av_freep(&sh->offset);
733 sh->entry_point_offset = av_malloc_array(sh->num_entry_point_offsets, sizeof(int));
734 sh->offset = av_malloc_array(sh->num_entry_point_offsets, sizeof(int));
735 sh->size = av_malloc_array(sh->num_entry_point_offsets, sizeof(int));
736 if (!sh->entry_point_offset || !sh->offset || !sh->size) {
737 sh->num_entry_point_offsets = 0;
738 av_log(s->avctx, AV_LOG_ERROR, "Failed to allocate memory\n");
739 return AVERROR(ENOMEM);
741 for (i = 0; i < sh->num_entry_point_offsets; i++) {
743 for (j = 0; j < segments; j++) {
745 val += get_bits(gb, 16);
749 val += get_bits(gb, rest);
751 sh->entry_point_offset[i] = val + 1; // +1; // +1 to get the size
753 if (s->threads_number > 1 && (s->pps->num_tile_rows > 1 || s->pps->num_tile_columns > 1)) {
754 s->enable_parallel_tiles = 0; // TODO: you can enable tiles in parallel here
755 s->threads_number = 1;
757 s->enable_parallel_tiles = 0;
759 s->enable_parallel_tiles = 0;
762 if (s->pps->slice_header_extension_present_flag) {
763 unsigned int length = get_ue_golomb_long(gb);
764 if (length*8LL > get_bits_left(gb)) {
765 av_log(s->avctx, AV_LOG_ERROR, "too many slice_header_extension_data_bytes\n");
766 return AVERROR_INVALIDDATA;
768 for (i = 0; i < length; i++)
769 skip_bits(gb, 8); // slice_header_extension_data_byte
772 // Inferred parameters
773 sh->slice_qp = 26U + s->pps->pic_init_qp_minus26 + sh->slice_qp_delta;
774 if (sh->slice_qp > 51 ||
775 sh->slice_qp < -s->sps->qp_bd_offset) {
776 av_log(s->avctx, AV_LOG_ERROR,
777 "The slice_qp %d is outside the valid range "
780 -s->sps->qp_bd_offset);
781 return AVERROR_INVALIDDATA;
784 sh->slice_ctb_addr_rs = sh->slice_segment_addr;
786 if (!s->sh.slice_ctb_addr_rs && s->sh.dependent_slice_segment_flag) {
787 av_log(s->avctx, AV_LOG_ERROR, "Impossible slice segment.\n");
788 return AVERROR_INVALIDDATA;
791 if (get_bits_left(gb) < 0) {
792 av_log(s->avctx, AV_LOG_ERROR,
793 "Overread slice header by %d bits\n", -get_bits_left(gb));
794 return AVERROR_INVALIDDATA;
797 s->HEVClc->first_qp_group = !s->sh.dependent_slice_segment_flag;
799 if (!s->pps->cu_qp_delta_enabled_flag)
800 s->HEVClc->qp_y = s->sh.slice_qp;
802 s->slice_initialized = 1;
803 s->HEVClc->tu.cu_qp_offset_cb = 0;
804 s->HEVClc->tu.cu_qp_offset_cr = 0;
809 #define CTB(tab, x, y) ((tab)[(y) * s->sps->ctb_width + (x)])
811 #define SET_SAO(elem, value) \
813 if (!sao_merge_up_flag && !sao_merge_left_flag) \
815 else if (sao_merge_left_flag) \
816 sao->elem = CTB(s->sao, rx-1, ry).elem; \
817 else if (sao_merge_up_flag) \
818 sao->elem = CTB(s->sao, rx, ry-1).elem; \
823 static void hls_sao_param(HEVCContext *s, int rx, int ry)
825 HEVCLocalContext *lc = s->HEVClc;
826 int sao_merge_left_flag = 0;
827 int sao_merge_up_flag = 0;
828 SAOParams *sao = &CTB(s->sao, rx, ry);
831 if (s->sh.slice_sample_adaptive_offset_flag[0] ||
832 s->sh.slice_sample_adaptive_offset_flag[1]) {
834 if (lc->ctb_left_flag)
835 sao_merge_left_flag = ff_hevc_sao_merge_flag_decode(s);
837 if (ry > 0 && !sao_merge_left_flag) {
839 sao_merge_up_flag = ff_hevc_sao_merge_flag_decode(s);
843 for (c_idx = 0; c_idx < (s->sps->chroma_format_idc ? 3 : 1); c_idx++) {
844 int log2_sao_offset_scale = c_idx == 0 ? s->pps->log2_sao_offset_scale_luma :
845 s->pps->log2_sao_offset_scale_chroma;
847 if (!s->sh.slice_sample_adaptive_offset_flag[c_idx]) {
848 sao->type_idx[c_idx] = SAO_NOT_APPLIED;
853 sao->type_idx[2] = sao->type_idx[1];
854 sao->eo_class[2] = sao->eo_class[1];
856 SET_SAO(type_idx[c_idx], ff_hevc_sao_type_idx_decode(s));
859 if (sao->type_idx[c_idx] == SAO_NOT_APPLIED)
862 for (i = 0; i < 4; i++)
863 SET_SAO(offset_abs[c_idx][i], ff_hevc_sao_offset_abs_decode(s));
865 if (sao->type_idx[c_idx] == SAO_BAND) {
866 for (i = 0; i < 4; i++) {
867 if (sao->offset_abs[c_idx][i]) {
868 SET_SAO(offset_sign[c_idx][i],
869 ff_hevc_sao_offset_sign_decode(s));
871 sao->offset_sign[c_idx][i] = 0;
874 SET_SAO(band_position[c_idx], ff_hevc_sao_band_position_decode(s));
875 } else if (c_idx != 2) {
876 SET_SAO(eo_class[c_idx], ff_hevc_sao_eo_class_decode(s));
879 // Inferred parameters
880 sao->offset_val[c_idx][0] = 0;
881 for (i = 0; i < 4; i++) {
882 sao->offset_val[c_idx][i + 1] = sao->offset_abs[c_idx][i];
883 if (sao->type_idx[c_idx] == SAO_EDGE) {
885 sao->offset_val[c_idx][i + 1] = -sao->offset_val[c_idx][i + 1];
886 } else if (sao->offset_sign[c_idx][i]) {
887 sao->offset_val[c_idx][i + 1] = -sao->offset_val[c_idx][i + 1];
889 sao->offset_val[c_idx][i + 1] <<= log2_sao_offset_scale;
897 static int hls_cross_component_pred(HEVCContext *s, int idx) {
898 HEVCLocalContext *lc = s->HEVClc;
899 int log2_res_scale_abs_plus1 = ff_hevc_log2_res_scale_abs(s, idx);
901 if (log2_res_scale_abs_plus1 != 0) {
902 int res_scale_sign_flag = ff_hevc_res_scale_sign_flag(s, idx);
903 lc->tu.res_scale_val = (1 << (log2_res_scale_abs_plus1 - 1)) *
904 (1 - 2 * res_scale_sign_flag);
906 lc->tu.res_scale_val = 0;
913 static int hls_transform_unit(HEVCContext *s, int x0, int y0,
914 int xBase, int yBase, int cb_xBase, int cb_yBase,
915 int log2_cb_size, int log2_trafo_size,
916 int blk_idx, int cbf_luma, int *cbf_cb, int *cbf_cr)
918 HEVCLocalContext *lc = s->HEVClc;
919 const int log2_trafo_size_c = log2_trafo_size - s->sps->hshift[1];
922 if (lc->cu.pred_mode == MODE_INTRA) {
923 int trafo_size = 1 << log2_trafo_size;
924 ff_hevc_set_neighbour_available(s, x0, y0, trafo_size, trafo_size);
926 s->hpc.intra_pred[log2_trafo_size - 2](s, x0, y0, 0);
929 if (cbf_luma || cbf_cb[0] || cbf_cr[0] ||
930 (s->sps->chroma_format_idc == 2 && (cbf_cb[1] || cbf_cr[1]))) {
931 int scan_idx = SCAN_DIAG;
932 int scan_idx_c = SCAN_DIAG;
933 int cbf_chroma = cbf_cb[0] || cbf_cr[0] ||
934 (s->sps->chroma_format_idc == 2 &&
935 (cbf_cb[1] || cbf_cr[1]));
937 if (s->pps->cu_qp_delta_enabled_flag && !lc->tu.is_cu_qp_delta_coded) {
938 lc->tu.cu_qp_delta = ff_hevc_cu_qp_delta_abs(s);
939 if (lc->tu.cu_qp_delta != 0)
940 if (ff_hevc_cu_qp_delta_sign_flag(s) == 1)
941 lc->tu.cu_qp_delta = -lc->tu.cu_qp_delta;
942 lc->tu.is_cu_qp_delta_coded = 1;
944 if (lc->tu.cu_qp_delta < -(26 + s->sps->qp_bd_offset / 2) ||
945 lc->tu.cu_qp_delta > (25 + s->sps->qp_bd_offset / 2)) {
946 av_log(s->avctx, AV_LOG_ERROR,
947 "The cu_qp_delta %d is outside the valid range "
950 -(26 + s->sps->qp_bd_offset / 2),
951 (25 + s->sps->qp_bd_offset / 2));
952 return AVERROR_INVALIDDATA;
955 ff_hevc_set_qPy(s, cb_xBase, cb_yBase, log2_cb_size);
958 if (s->sh.cu_chroma_qp_offset_enabled_flag && cbf_chroma &&
959 !lc->cu.cu_transquant_bypass_flag && !lc->tu.is_cu_chroma_qp_offset_coded) {
960 int cu_chroma_qp_offset_flag = ff_hevc_cu_chroma_qp_offset_flag(s);
961 if (cu_chroma_qp_offset_flag) {
962 int cu_chroma_qp_offset_idx = 0;
963 if (s->pps->chroma_qp_offset_list_len_minus1 > 0) {
964 cu_chroma_qp_offset_idx = ff_hevc_cu_chroma_qp_offset_idx(s);
965 av_log(s->avctx, AV_LOG_ERROR,
966 "cu_chroma_qp_offset_idx not yet tested.\n");
968 lc->tu.cu_qp_offset_cb = s->pps->cb_qp_offset_list[cu_chroma_qp_offset_idx];
969 lc->tu.cu_qp_offset_cr = s->pps->cr_qp_offset_list[cu_chroma_qp_offset_idx];
971 lc->tu.cu_qp_offset_cb = 0;
972 lc->tu.cu_qp_offset_cr = 0;
974 lc->tu.is_cu_chroma_qp_offset_coded = 1;
977 if (lc->cu.pred_mode == MODE_INTRA && log2_trafo_size < 4) {
978 if (lc->tu.intra_pred_mode >= 6 &&
979 lc->tu.intra_pred_mode <= 14) {
980 scan_idx = SCAN_VERT;
981 } else if (lc->tu.intra_pred_mode >= 22 &&
982 lc->tu.intra_pred_mode <= 30) {
983 scan_idx = SCAN_HORIZ;
986 if (lc->tu.intra_pred_mode_c >= 6 &&
987 lc->tu.intra_pred_mode_c <= 14) {
988 scan_idx_c = SCAN_VERT;
989 } else if (lc->tu.intra_pred_mode_c >= 22 &&
990 lc->tu.intra_pred_mode_c <= 30) {
991 scan_idx_c = SCAN_HORIZ;
998 ff_hevc_hls_residual_coding(s, x0, y0, log2_trafo_size, scan_idx, 0);
999 if (s->sps->chroma_format_idc && (log2_trafo_size > 2 || s->sps->chroma_format_idc == 3)) {
1000 int trafo_size_h = 1 << (log2_trafo_size_c + s->sps->hshift[1]);
1001 int trafo_size_v = 1 << (log2_trafo_size_c + s->sps->vshift[1]);
1002 lc->tu.cross_pf = (s->pps->cross_component_prediction_enabled_flag && cbf_luma &&
1003 (lc->cu.pred_mode == MODE_INTER ||
1004 (lc->tu.chroma_mode_c == 4)));
1006 if (lc->tu.cross_pf) {
1007 hls_cross_component_pred(s, 0);
1009 for (i = 0; i < (s->sps->chroma_format_idc == 2 ? 2 : 1); i++) {
1010 if (lc->cu.pred_mode == MODE_INTRA) {
1011 ff_hevc_set_neighbour_available(s, x0, y0 + (i << log2_trafo_size_c), trafo_size_h, trafo_size_v);
1012 s->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0 + (i << log2_trafo_size_c), 1);
1015 ff_hevc_hls_residual_coding(s, x0, y0 + (i << log2_trafo_size_c),
1016 log2_trafo_size_c, scan_idx_c, 1);
1018 if (lc->tu.cross_pf) {
1019 ptrdiff_t stride = s->frame->linesize[1];
1020 int hshift = s->sps->hshift[1];
1021 int vshift = s->sps->vshift[1];
1022 int16_t *coeffs_y = (int16_t*)lc->edge_emu_buffer;
1023 int16_t *coeffs = (int16_t*)lc->edge_emu_buffer2;
1024 int size = 1 << log2_trafo_size_c;
1026 uint8_t *dst = &s->frame->data[1][(y0 >> vshift) * stride +
1027 ((x0 >> hshift) << s->sps->pixel_shift)];
1028 for (i = 0; i < (size * size); i++) {
1029 coeffs[i] = ((lc->tu.res_scale_val * coeffs_y[i]) >> 3);
1031 s->hevcdsp.transform_add[log2_trafo_size_c-2](dst, coeffs, stride);
1035 if (lc->tu.cross_pf) {
1036 hls_cross_component_pred(s, 1);
1038 for (i = 0; i < (s->sps->chroma_format_idc == 2 ? 2 : 1); i++) {
1039 if (lc->cu.pred_mode == MODE_INTRA) {
1040 ff_hevc_set_neighbour_available(s, x0, y0 + (i << log2_trafo_size_c), trafo_size_h, trafo_size_v);
1041 s->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0 + (i << log2_trafo_size_c), 2);
1044 ff_hevc_hls_residual_coding(s, x0, y0 + (i << log2_trafo_size_c),
1045 log2_trafo_size_c, scan_idx_c, 2);
1047 if (lc->tu.cross_pf) {
1048 ptrdiff_t stride = s->frame->linesize[2];
1049 int hshift = s->sps->hshift[2];
1050 int vshift = s->sps->vshift[2];
1051 int16_t *coeffs_y = (int16_t*)lc->edge_emu_buffer;
1052 int16_t *coeffs = (int16_t*)lc->edge_emu_buffer2;
1053 int size = 1 << log2_trafo_size_c;
1055 uint8_t *dst = &s->frame->data[2][(y0 >> vshift) * stride +
1056 ((x0 >> hshift) << s->sps->pixel_shift)];
1057 for (i = 0; i < (size * size); i++) {
1058 coeffs[i] = ((lc->tu.res_scale_val * coeffs_y[i]) >> 3);
1060 s->hevcdsp.transform_add[log2_trafo_size_c-2](dst, coeffs, stride);
1063 } else if (s->sps->chroma_format_idc && blk_idx == 3) {
1064 int trafo_size_h = 1 << (log2_trafo_size + 1);
1065 int trafo_size_v = 1 << (log2_trafo_size + s->sps->vshift[1]);
1066 for (i = 0; i < (s->sps->chroma_format_idc == 2 ? 2 : 1); i++) {
1067 if (lc->cu.pred_mode == MODE_INTRA) {
1068 ff_hevc_set_neighbour_available(s, xBase, yBase + (i << log2_trafo_size),
1069 trafo_size_h, trafo_size_v);
1070 s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase + (i << log2_trafo_size), 1);
1073 ff_hevc_hls_residual_coding(s, xBase, yBase + (i << log2_trafo_size),
1074 log2_trafo_size, scan_idx_c, 1);
1076 for (i = 0; i < (s->sps->chroma_format_idc == 2 ? 2 : 1); i++) {
1077 if (lc->cu.pred_mode == MODE_INTRA) {
1078 ff_hevc_set_neighbour_available(s, xBase, yBase + (i << log2_trafo_size),
1079 trafo_size_h, trafo_size_v);
1080 s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase + (i << log2_trafo_size), 2);
1083 ff_hevc_hls_residual_coding(s, xBase, yBase + (i << log2_trafo_size),
1084 log2_trafo_size, scan_idx_c, 2);
1087 } else if (s->sps->chroma_format_idc && lc->cu.pred_mode == MODE_INTRA) {
1088 if (log2_trafo_size > 2 || s->sps->chroma_format_idc == 3) {
1089 int trafo_size_h = 1 << (log2_trafo_size_c + s->sps->hshift[1]);
1090 int trafo_size_v = 1 << (log2_trafo_size_c + s->sps->vshift[1]);
1091 ff_hevc_set_neighbour_available(s, x0, y0, trafo_size_h, trafo_size_v);
1092 s->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0, 1);
1093 s->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0, 2);
1094 if (s->sps->chroma_format_idc == 2) {
1095 ff_hevc_set_neighbour_available(s, x0, y0 + (1 << log2_trafo_size_c),
1096 trafo_size_h, trafo_size_v);
1097 s->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0 + (1 << log2_trafo_size_c), 1);
1098 s->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0 + (1 << log2_trafo_size_c), 2);
1100 } else if (blk_idx == 3) {
1101 int trafo_size_h = 1 << (log2_trafo_size + 1);
1102 int trafo_size_v = 1 << (log2_trafo_size + s->sps->vshift[1]);
1103 ff_hevc_set_neighbour_available(s, xBase, yBase,
1104 trafo_size_h, trafo_size_v);
1105 s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase, 1);
1106 s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase, 2);
1107 if (s->sps->chroma_format_idc == 2) {
1108 ff_hevc_set_neighbour_available(s, xBase, yBase + (1 << (log2_trafo_size)),
1109 trafo_size_h, trafo_size_v);
1110 s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase + (1 << (log2_trafo_size)), 1);
1111 s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase + (1 << (log2_trafo_size)), 2);
1119 static void set_deblocking_bypass(HEVCContext *s, int x0, int y0, int log2_cb_size)
1121 int cb_size = 1 << log2_cb_size;
1122 int log2_min_pu_size = s->sps->log2_min_pu_size;
1124 int min_pu_width = s->sps->min_pu_width;
1125 int x_end = FFMIN(x0 + cb_size, s->sps->width);
1126 int y_end = FFMIN(y0 + cb_size, s->sps->height);
1129 for (j = (y0 >> log2_min_pu_size); j < (y_end >> log2_min_pu_size); j++)
1130 for (i = (x0 >> log2_min_pu_size); i < (x_end >> log2_min_pu_size); i++)
1131 s->is_pcm[i + j * min_pu_width] = 2;
1134 static int hls_transform_tree(HEVCContext *s, int x0, int y0,
1135 int xBase, int yBase, int cb_xBase, int cb_yBase,
1136 int log2_cb_size, int log2_trafo_size,
1137 int trafo_depth, int blk_idx,
1138 const int *base_cbf_cb, const int *base_cbf_cr)
1140 HEVCLocalContext *lc = s->HEVClc;
1141 uint8_t split_transform_flag;
1146 cbf_cb[0] = base_cbf_cb[0];
1147 cbf_cb[1] = base_cbf_cb[1];
1148 cbf_cr[0] = base_cbf_cr[0];
1149 cbf_cr[1] = base_cbf_cr[1];
1151 if (lc->cu.intra_split_flag) {
1152 if (trafo_depth == 1) {
1153 lc->tu.intra_pred_mode = lc->pu.intra_pred_mode[blk_idx];
1154 if (s->sps->chroma_format_idc == 3) {
1155 lc->tu.intra_pred_mode_c = lc->pu.intra_pred_mode_c[blk_idx];
1156 lc->tu.chroma_mode_c = lc->pu.chroma_mode_c[blk_idx];
1158 lc->tu.intra_pred_mode_c = lc->pu.intra_pred_mode_c[0];
1159 lc->tu.chroma_mode_c = lc->pu.chroma_mode_c[0];
1163 lc->tu.intra_pred_mode = lc->pu.intra_pred_mode[0];
1164 lc->tu.intra_pred_mode_c = lc->pu.intra_pred_mode_c[0];
1165 lc->tu.chroma_mode_c = lc->pu.chroma_mode_c[0];
1168 if (log2_trafo_size <= s->sps->log2_max_trafo_size &&
1169 log2_trafo_size > s->sps->log2_min_tb_size &&
1170 trafo_depth < lc->cu.max_trafo_depth &&
1171 !(lc->cu.intra_split_flag && trafo_depth == 0)) {
1172 split_transform_flag = ff_hevc_split_transform_flag_decode(s, log2_trafo_size);
1174 int inter_split = s->sps->max_transform_hierarchy_depth_inter == 0 &&
1175 lc->cu.pred_mode == MODE_INTER &&
1176 lc->cu.part_mode != PART_2Nx2N &&
1179 split_transform_flag = log2_trafo_size > s->sps->log2_max_trafo_size ||
1180 (lc->cu.intra_split_flag && trafo_depth == 0) ||
1184 if (s->sps->chroma_format_idc && (log2_trafo_size > 2 || s->sps->chroma_format_idc == 3)) {
1185 if (trafo_depth == 0 || cbf_cb[0]) {
1186 cbf_cb[0] = ff_hevc_cbf_cb_cr_decode(s, trafo_depth);
1187 if (s->sps->chroma_format_idc == 2 && (!split_transform_flag || log2_trafo_size == 3)) {
1188 cbf_cb[1] = ff_hevc_cbf_cb_cr_decode(s, trafo_depth);
1192 if (trafo_depth == 0 || cbf_cr[0]) {
1193 cbf_cr[0] = ff_hevc_cbf_cb_cr_decode(s, trafo_depth);
1194 if (s->sps->chroma_format_idc == 2 && (!split_transform_flag || log2_trafo_size == 3)) {
1195 cbf_cr[1] = ff_hevc_cbf_cb_cr_decode(s, trafo_depth);
1200 if (split_transform_flag) {
1201 const int trafo_size_split = 1 << (log2_trafo_size - 1);
1202 const int x1 = x0 + trafo_size_split;
1203 const int y1 = y0 + trafo_size_split;
1205 #define SUBDIVIDE(x, y, idx) \
1207 ret = hls_transform_tree(s, x, y, x0, y0, cb_xBase, cb_yBase, log2_cb_size, \
1208 log2_trafo_size - 1, trafo_depth + 1, idx, \
1214 SUBDIVIDE(x0, y0, 0);
1215 SUBDIVIDE(x1, y0, 1);
1216 SUBDIVIDE(x0, y1, 2);
1217 SUBDIVIDE(x1, y1, 3);
1221 int min_tu_size = 1 << s->sps->log2_min_tb_size;
1222 int log2_min_tu_size = s->sps->log2_min_tb_size;
1223 int min_tu_width = s->sps->min_tb_width;
1226 if (lc->cu.pred_mode == MODE_INTRA || trafo_depth != 0 ||
1227 cbf_cb[0] || cbf_cr[0] ||
1228 (s->sps->chroma_format_idc == 2 && (cbf_cb[1] || cbf_cr[1]))) {
1229 cbf_luma = ff_hevc_cbf_luma_decode(s, trafo_depth);
1232 ret = hls_transform_unit(s, x0, y0, xBase, yBase, cb_xBase, cb_yBase,
1233 log2_cb_size, log2_trafo_size,
1234 blk_idx, cbf_luma, cbf_cb, cbf_cr);
1237 // TODO: store cbf_luma somewhere else
1240 for (i = 0; i < (1 << log2_trafo_size); i += min_tu_size)
1241 for (j = 0; j < (1 << log2_trafo_size); j += min_tu_size) {
1242 int x_tu = (x0 + j) >> log2_min_tu_size;
1243 int y_tu = (y0 + i) >> log2_min_tu_size;
1244 s->cbf_luma[y_tu * min_tu_width + x_tu] = 1;
1247 if (!s->sh.disable_deblocking_filter_flag) {
1248 ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_trafo_size);
1249 if (s->pps->transquant_bypass_enable_flag &&
1250 lc->cu.cu_transquant_bypass_flag)
1251 set_deblocking_bypass(s, x0, y0, log2_trafo_size);
1257 static int hls_pcm_sample(HEVCContext *s, int x0, int y0, int log2_cb_size)
1259 HEVCLocalContext *lc = s->HEVClc;
1261 int cb_size = 1 << log2_cb_size;
1262 int stride0 = s->frame->linesize[0];
1263 uint8_t *dst0 = &s->frame->data[0][y0 * stride0 + (x0 << s->sps->pixel_shift)];
1264 int stride1 = s->frame->linesize[1];
1265 uint8_t *dst1 = &s->frame->data[1][(y0 >> s->sps->vshift[1]) * stride1 + ((x0 >> s->sps->hshift[1]) << s->sps->pixel_shift)];
1266 int stride2 = s->frame->linesize[2];
1267 uint8_t *dst2 = &s->frame->data[2][(y0 >> s->sps->vshift[2]) * stride2 + ((x0 >> s->sps->hshift[2]) << s->sps->pixel_shift)];
1269 int length = cb_size * cb_size * s->sps->pcm.bit_depth +
1270 (((cb_size >> s->sps->hshift[1]) * (cb_size >> s->sps->vshift[1])) +
1271 ((cb_size >> s->sps->hshift[2]) * (cb_size >> s->sps->vshift[2]))) *
1272 s->sps->pcm.bit_depth_chroma;
1273 const uint8_t *pcm = skip_bytes(&lc->cc, (length + 7) >> 3);
1276 if (!s->sh.disable_deblocking_filter_flag)
1277 ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_cb_size);
1279 ret = init_get_bits(&gb, pcm, length);
1283 s->hevcdsp.put_pcm(dst0, stride0, cb_size, cb_size, &gb, s->sps->pcm.bit_depth);
1284 if (s->sps->chroma_format_idc) {
1285 s->hevcdsp.put_pcm(dst1, stride1,
1286 cb_size >> s->sps->hshift[1],
1287 cb_size >> s->sps->vshift[1],
1288 &gb, s->sps->pcm.bit_depth_chroma);
1289 s->hevcdsp.put_pcm(dst2, stride2,
1290 cb_size >> s->sps->hshift[2],
1291 cb_size >> s->sps->vshift[2],
1292 &gb, s->sps->pcm.bit_depth_chroma);
1299 * 8.5.3.2.2.1 Luma sample unidirectional interpolation process
1301 * @param s HEVC decoding context
1302 * @param dst target buffer for block data at block position
1303 * @param dststride stride of the dst buffer
1304 * @param ref reference picture buffer at origin (0, 0)
1305 * @param mv motion vector (relative to block position) to get pixel data from
1306 * @param x_off horizontal position of block from origin (0, 0)
1307 * @param y_off vertical position of block from origin (0, 0)
1308 * @param block_w width of block
1309 * @param block_h height of block
1310 * @param luma_weight weighting factor applied to the luma prediction
1311 * @param luma_offset additive offset applied to the luma prediction value
1314 static void luma_mc_uni(HEVCContext *s, uint8_t *dst, ptrdiff_t dststride,
1315 AVFrame *ref, const Mv *mv, int x_off, int y_off,
1316 int block_w, int block_h, int luma_weight, int luma_offset)
1318 HEVCLocalContext *lc = s->HEVClc;
1319 uint8_t *src = ref->data[0];
1320 ptrdiff_t srcstride = ref->linesize[0];
1321 int pic_width = s->sps->width;
1322 int pic_height = s->sps->height;
1325 int weight_flag = (s->sh.slice_type == P_SLICE && s->pps->weighted_pred_flag) ||
1326 (s->sh.slice_type == B_SLICE && s->pps->weighted_bipred_flag);
1327 int idx = ff_hevc_pel_weight[block_w];
1329 x_off += mv->x >> 2;
1330 y_off += mv->y >> 2;
1331 src += y_off * srcstride + (x_off << s->sps->pixel_shift);
1333 if (x_off < QPEL_EXTRA_BEFORE || y_off < QPEL_EXTRA_AFTER ||
1334 x_off >= pic_width - block_w - QPEL_EXTRA_AFTER ||
1335 y_off >= pic_height - block_h - QPEL_EXTRA_AFTER) {
1336 const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->sps->pixel_shift;
1337 int offset = QPEL_EXTRA_BEFORE * srcstride + (QPEL_EXTRA_BEFORE << s->sps->pixel_shift);
1338 int buf_offset = QPEL_EXTRA_BEFORE * edge_emu_stride + (QPEL_EXTRA_BEFORE << s->sps->pixel_shift);
1340 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src - offset,
1341 edge_emu_stride, srcstride,
1342 block_w + QPEL_EXTRA,
1343 block_h + QPEL_EXTRA,
1344 x_off - QPEL_EXTRA_BEFORE, y_off - QPEL_EXTRA_BEFORE,
1345 pic_width, pic_height);
1346 src = lc->edge_emu_buffer + buf_offset;
1347 srcstride = edge_emu_stride;
1351 s->hevcdsp.put_hevc_qpel_uni[idx][!!my][!!mx](dst, dststride, src, srcstride,
1352 block_h, mx, my, block_w);
1354 s->hevcdsp.put_hevc_qpel_uni_w[idx][!!my][!!mx](dst, dststride, src, srcstride,
1355 block_h, s->sh.luma_log2_weight_denom,
1356 luma_weight, luma_offset, mx, my, block_w);
1360 * 8.5.3.2.2.1 Luma sample bidirectional interpolation process
1362 * @param s HEVC decoding context
1363 * @param dst target buffer for block data at block position
1364 * @param dststride stride of the dst buffer
1365 * @param ref0 reference picture0 buffer at origin (0, 0)
1366 * @param mv0 motion vector0 (relative to block position) to get pixel data from
1367 * @param x_off horizontal position of block from origin (0, 0)
1368 * @param y_off vertical position of block from origin (0, 0)
1369 * @param block_w width of block
1370 * @param block_h height of block
1371 * @param ref1 reference picture1 buffer at origin (0, 0)
1372 * @param mv1 motion vector1 (relative to block position) to get pixel data from
1373 * @param current_mv current motion vector structure
1375 static void luma_mc_bi(HEVCContext *s, uint8_t *dst, ptrdiff_t dststride,
1376 AVFrame *ref0, const Mv *mv0, int x_off, int y_off,
1377 int block_w, int block_h, AVFrame *ref1, const Mv *mv1, struct MvField *current_mv)
1379 HEVCLocalContext *lc = s->HEVClc;
1380 ptrdiff_t src0stride = ref0->linesize[0];
1381 ptrdiff_t src1stride = ref1->linesize[0];
1382 int pic_width = s->sps->width;
1383 int pic_height = s->sps->height;
1384 int mx0 = mv0->x & 3;
1385 int my0 = mv0->y & 3;
1386 int mx1 = mv1->x & 3;
1387 int my1 = mv1->y & 3;
1388 int weight_flag = (s->sh.slice_type == P_SLICE && s->pps->weighted_pred_flag) ||
1389 (s->sh.slice_type == B_SLICE && s->pps->weighted_bipred_flag);
1390 int x_off0 = x_off + (mv0->x >> 2);
1391 int y_off0 = y_off + (mv0->y >> 2);
1392 int x_off1 = x_off + (mv1->x >> 2);
1393 int y_off1 = y_off + (mv1->y >> 2);
1394 int idx = ff_hevc_pel_weight[block_w];
1396 uint8_t *src0 = ref0->data[0] + y_off0 * src0stride + (int)((unsigned)x_off0 << s->sps->pixel_shift);
1397 uint8_t *src1 = ref1->data[0] + y_off1 * src1stride + (int)((unsigned)x_off1 << s->sps->pixel_shift);
1399 if (x_off0 < QPEL_EXTRA_BEFORE || y_off0 < QPEL_EXTRA_AFTER ||
1400 x_off0 >= pic_width - block_w - QPEL_EXTRA_AFTER ||
1401 y_off0 >= pic_height - block_h - QPEL_EXTRA_AFTER) {
1402 const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->sps->pixel_shift;
1403 int offset = QPEL_EXTRA_BEFORE * src0stride + (QPEL_EXTRA_BEFORE << s->sps->pixel_shift);
1404 int buf_offset = QPEL_EXTRA_BEFORE * edge_emu_stride + (QPEL_EXTRA_BEFORE << s->sps->pixel_shift);
1406 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src0 - offset,
1407 edge_emu_stride, src0stride,
1408 block_w + QPEL_EXTRA,
1409 block_h + QPEL_EXTRA,
1410 x_off0 - QPEL_EXTRA_BEFORE, y_off0 - QPEL_EXTRA_BEFORE,
1411 pic_width, pic_height);
1412 src0 = lc->edge_emu_buffer + buf_offset;
1413 src0stride = edge_emu_stride;
1416 if (x_off1 < QPEL_EXTRA_BEFORE || y_off1 < QPEL_EXTRA_AFTER ||
1417 x_off1 >= pic_width - block_w - QPEL_EXTRA_AFTER ||
1418 y_off1 >= pic_height - block_h - QPEL_EXTRA_AFTER) {
1419 const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->sps->pixel_shift;
1420 int offset = QPEL_EXTRA_BEFORE * src1stride + (QPEL_EXTRA_BEFORE << s->sps->pixel_shift);
1421 int buf_offset = QPEL_EXTRA_BEFORE * edge_emu_stride + (QPEL_EXTRA_BEFORE << s->sps->pixel_shift);
1423 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer2, src1 - offset,
1424 edge_emu_stride, src1stride,
1425 block_w + QPEL_EXTRA,
1426 block_h + QPEL_EXTRA,
1427 x_off1 - QPEL_EXTRA_BEFORE, y_off1 - QPEL_EXTRA_BEFORE,
1428 pic_width, pic_height);
1429 src1 = lc->edge_emu_buffer2 + buf_offset;
1430 src1stride = edge_emu_stride;
1433 s->hevcdsp.put_hevc_qpel[idx][!!my0][!!mx0](lc->tmp, src0, src0stride,
1434 block_h, mx0, my0, block_w);
1436 s->hevcdsp.put_hevc_qpel_bi[idx][!!my1][!!mx1](dst, dststride, src1, src1stride, lc->tmp,
1437 block_h, mx1, my1, block_w);
1439 s->hevcdsp.put_hevc_qpel_bi_w[idx][!!my1][!!mx1](dst, dststride, src1, src1stride, lc->tmp,
1440 block_h, s->sh.luma_log2_weight_denom,
1441 s->sh.luma_weight_l0[current_mv->ref_idx[0]],
1442 s->sh.luma_weight_l1[current_mv->ref_idx[1]],
1443 s->sh.luma_offset_l0[current_mv->ref_idx[0]],
1444 s->sh.luma_offset_l1[current_mv->ref_idx[1]],
1450 * 8.5.3.2.2.2 Chroma sample uniprediction interpolation process
1452 * @param s HEVC decoding context
1453 * @param dst1 target buffer for block data at block position (U plane)
1454 * @param dst2 target buffer for block data at block position (V plane)
1455 * @param dststride stride of the dst1 and dst2 buffers
1456 * @param ref reference picture buffer at origin (0, 0)
1457 * @param mv motion vector (relative to block position) to get pixel data from
1458 * @param x_off horizontal position of block from origin (0, 0)
1459 * @param y_off vertical position of block from origin (0, 0)
1460 * @param block_w width of block
1461 * @param block_h height of block
1462 * @param chroma_weight weighting factor applied to the chroma prediction
1463 * @param chroma_offset additive offset applied to the chroma prediction value
1466 static void chroma_mc_uni(HEVCContext *s, uint8_t *dst0,
1467 ptrdiff_t dststride, uint8_t *src0, ptrdiff_t srcstride, int reflist,
1468 int x_off, int y_off, int block_w, int block_h, struct MvField *current_mv, int chroma_weight, int chroma_offset)
1470 HEVCLocalContext *lc = s->HEVClc;
1471 int pic_width = s->sps->width >> s->sps->hshift[1];
1472 int pic_height = s->sps->height >> s->sps->vshift[1];
1473 const Mv *mv = ¤t_mv->mv[reflist];
1474 int weight_flag = (s->sh.slice_type == P_SLICE && s->pps->weighted_pred_flag) ||
1475 (s->sh.slice_type == B_SLICE && s->pps->weighted_bipred_flag);
1476 int idx = ff_hevc_pel_weight[block_w];
1477 int hshift = s->sps->hshift[1];
1478 int vshift = s->sps->vshift[1];
1479 intptr_t mx = mv->x & ((1 << (2 + hshift)) - 1);
1480 intptr_t my = mv->y & ((1 << (2 + vshift)) - 1);
1481 intptr_t _mx = mx << (1 - hshift);
1482 intptr_t _my = my << (1 - vshift);
1484 x_off += mv->x >> (2 + hshift);
1485 y_off += mv->y >> (2 + vshift);
1486 src0 += y_off * srcstride + (x_off << s->sps->pixel_shift);
1488 if (x_off < EPEL_EXTRA_BEFORE || y_off < EPEL_EXTRA_AFTER ||
1489 x_off >= pic_width - block_w - EPEL_EXTRA_AFTER ||
1490 y_off >= pic_height - block_h - EPEL_EXTRA_AFTER) {
1491 const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->sps->pixel_shift;
1492 int offset0 = EPEL_EXTRA_BEFORE * (srcstride + (1 << s->sps->pixel_shift));
1493 int buf_offset0 = EPEL_EXTRA_BEFORE *
1494 (edge_emu_stride + (1 << s->sps->pixel_shift));
1495 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src0 - offset0,
1496 edge_emu_stride, srcstride,
1497 block_w + EPEL_EXTRA, block_h + EPEL_EXTRA,
1498 x_off - EPEL_EXTRA_BEFORE,
1499 y_off - EPEL_EXTRA_BEFORE,
1500 pic_width, pic_height);
1502 src0 = lc->edge_emu_buffer + buf_offset0;
1503 srcstride = edge_emu_stride;
1506 s->hevcdsp.put_hevc_epel_uni[idx][!!my][!!mx](dst0, dststride, src0, srcstride,
1507 block_h, _mx, _my, block_w);
1509 s->hevcdsp.put_hevc_epel_uni_w[idx][!!my][!!mx](dst0, dststride, src0, srcstride,
1510 block_h, s->sh.chroma_log2_weight_denom,
1511 chroma_weight, chroma_offset, _mx, _my, block_w);
1515 * 8.5.3.2.2.2 Chroma sample bidirectional interpolation process
1517 * @param s HEVC decoding context
1518 * @param dst target buffer for block data at block position
1519 * @param dststride stride of the dst buffer
1520 * @param ref0 reference picture0 buffer at origin (0, 0)
1521 * @param mv0 motion vector0 (relative to block position) to get pixel data from
1522 * @param x_off horizontal position of block from origin (0, 0)
1523 * @param y_off vertical position of block from origin (0, 0)
1524 * @param block_w width of block
1525 * @param block_h height of block
1526 * @param ref1 reference picture1 buffer at origin (0, 0)
1527 * @param mv1 motion vector1 (relative to block position) to get pixel data from
1528 * @param current_mv current motion vector structure
1529 * @param cidx chroma component(cb, cr)
1531 static void chroma_mc_bi(HEVCContext *s, uint8_t *dst0, ptrdiff_t dststride, AVFrame *ref0, AVFrame *ref1,
1532 int x_off, int y_off, int block_w, int block_h, struct MvField *current_mv, int cidx)
1534 HEVCLocalContext *lc = s->HEVClc;
1535 uint8_t *src1 = ref0->data[cidx+1];
1536 uint8_t *src2 = ref1->data[cidx+1];
1537 ptrdiff_t src1stride = ref0->linesize[cidx+1];
1538 ptrdiff_t src2stride = ref1->linesize[cidx+1];
1539 int weight_flag = (s->sh.slice_type == P_SLICE && s->pps->weighted_pred_flag) ||
1540 (s->sh.slice_type == B_SLICE && s->pps->weighted_bipred_flag);
1541 int pic_width = s->sps->width >> s->sps->hshift[1];
1542 int pic_height = s->sps->height >> s->sps->vshift[1];
1543 Mv *mv0 = ¤t_mv->mv[0];
1544 Mv *mv1 = ¤t_mv->mv[1];
1545 int hshift = s->sps->hshift[1];
1546 int vshift = s->sps->vshift[1];
1548 intptr_t mx0 = mv0->x & ((1 << (2 + hshift)) - 1);
1549 intptr_t my0 = mv0->y & ((1 << (2 + vshift)) - 1);
1550 intptr_t mx1 = mv1->x & ((1 << (2 + hshift)) - 1);
1551 intptr_t my1 = mv1->y & ((1 << (2 + vshift)) - 1);
1552 intptr_t _mx0 = mx0 << (1 - hshift);
1553 intptr_t _my0 = my0 << (1 - vshift);
1554 intptr_t _mx1 = mx1 << (1 - hshift);
1555 intptr_t _my1 = my1 << (1 - vshift);
1557 int x_off0 = x_off + (mv0->x >> (2 + hshift));
1558 int y_off0 = y_off + (mv0->y >> (2 + vshift));
1559 int x_off1 = x_off + (mv1->x >> (2 + hshift));
1560 int y_off1 = y_off + (mv1->y >> (2 + vshift));
1561 int idx = ff_hevc_pel_weight[block_w];
1562 src1 += y_off0 * src1stride + (int)((unsigned)x_off0 << s->sps->pixel_shift);
1563 src2 += y_off1 * src2stride + (int)((unsigned)x_off1 << s->sps->pixel_shift);
1565 if (x_off0 < EPEL_EXTRA_BEFORE || y_off0 < EPEL_EXTRA_AFTER ||
1566 x_off0 >= pic_width - block_w - EPEL_EXTRA_AFTER ||
1567 y_off0 >= pic_height - block_h - EPEL_EXTRA_AFTER) {
1568 const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->sps->pixel_shift;
1569 int offset1 = EPEL_EXTRA_BEFORE * (src1stride + (1 << s->sps->pixel_shift));
1570 int buf_offset1 = EPEL_EXTRA_BEFORE *
1571 (edge_emu_stride + (1 << s->sps->pixel_shift));
1573 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src1 - offset1,
1574 edge_emu_stride, src1stride,
1575 block_w + EPEL_EXTRA, block_h + EPEL_EXTRA,
1576 x_off0 - EPEL_EXTRA_BEFORE,
1577 y_off0 - EPEL_EXTRA_BEFORE,
1578 pic_width, pic_height);
1580 src1 = lc->edge_emu_buffer + buf_offset1;
1581 src1stride = edge_emu_stride;
1584 if (x_off1 < EPEL_EXTRA_BEFORE || y_off1 < EPEL_EXTRA_AFTER ||
1585 x_off1 >= pic_width - block_w - EPEL_EXTRA_AFTER ||
1586 y_off1 >= pic_height - block_h - EPEL_EXTRA_AFTER) {
1587 const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->sps->pixel_shift;
1588 int offset1 = EPEL_EXTRA_BEFORE * (src2stride + (1 << s->sps->pixel_shift));
1589 int buf_offset1 = EPEL_EXTRA_BEFORE *
1590 (edge_emu_stride + (1 << s->sps->pixel_shift));
1592 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer2, src2 - offset1,
1593 edge_emu_stride, src2stride,
1594 block_w + EPEL_EXTRA, block_h + EPEL_EXTRA,
1595 x_off1 - EPEL_EXTRA_BEFORE,
1596 y_off1 - EPEL_EXTRA_BEFORE,
1597 pic_width, pic_height);
1599 src2 = lc->edge_emu_buffer2 + buf_offset1;
1600 src2stride = edge_emu_stride;
1603 s->hevcdsp.put_hevc_epel[idx][!!my0][!!mx0](lc->tmp, src1, src1stride,
1604 block_h, _mx0, _my0, block_w);
1606 s->hevcdsp.put_hevc_epel_bi[idx][!!my1][!!mx1](dst0, s->frame->linesize[cidx+1],
1607 src2, src2stride, lc->tmp,
1608 block_h, _mx1, _my1, block_w);
1610 s->hevcdsp.put_hevc_epel_bi_w[idx][!!my1][!!mx1](dst0, s->frame->linesize[cidx+1],
1611 src2, src2stride, lc->tmp,
1613 s->sh.chroma_log2_weight_denom,
1614 s->sh.chroma_weight_l0[current_mv->ref_idx[0]][cidx],
1615 s->sh.chroma_weight_l1[current_mv->ref_idx[1]][cidx],
1616 s->sh.chroma_offset_l0[current_mv->ref_idx[0]][cidx],
1617 s->sh.chroma_offset_l1[current_mv->ref_idx[1]][cidx],
1618 _mx1, _my1, block_w);
1621 static void hevc_await_progress(HEVCContext *s, HEVCFrame *ref,
1622 const Mv *mv, int y0, int height)
1624 int y = FFMAX(0, (mv->y >> 2) + y0 + height + 9);
1626 if (s->threads_type == FF_THREAD_FRAME )
1627 ff_thread_await_progress(&ref->tf, y, 0);
1630 static void hevc_luma_mv_mpv_mode(HEVCContext *s, int x0, int y0, int nPbW,
1631 int nPbH, int log2_cb_size, int part_idx,
1632 int merge_idx, MvField *mv)
1634 HEVCLocalContext *lc = s->HEVClc;
1635 enum InterPredIdc inter_pred_idc = PRED_L0;
1638 ff_hevc_set_neighbour_available(s, x0, y0, nPbW, nPbH);
1640 if (s->sh.slice_type == B_SLICE)
1641 inter_pred_idc = ff_hevc_inter_pred_idc_decode(s, nPbW, nPbH);
1643 if (inter_pred_idc != PRED_L1) {
1644 if (s->sh.nb_refs[L0])
1645 mv->ref_idx[0]= ff_hevc_ref_idx_lx_decode(s, s->sh.nb_refs[L0]);
1647 mv->pred_flag = PF_L0;
1648 ff_hevc_hls_mvd_coding(s, x0, y0, 0);
1649 mvp_flag = ff_hevc_mvp_lx_flag_decode(s);
1650 ff_hevc_luma_mv_mvp_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
1651 part_idx, merge_idx, mv, mvp_flag, 0);
1652 mv->mv[0].x += lc->pu.mvd.x;
1653 mv->mv[0].y += lc->pu.mvd.y;
1656 if (inter_pred_idc != PRED_L0) {
1657 if (s->sh.nb_refs[L1])
1658 mv->ref_idx[1]= ff_hevc_ref_idx_lx_decode(s, s->sh.nb_refs[L1]);
1660 if (s->sh.mvd_l1_zero_flag == 1 && inter_pred_idc == PRED_BI) {
1661 AV_ZERO32(&lc->pu.mvd);
1663 ff_hevc_hls_mvd_coding(s, x0, y0, 1);
1666 mv->pred_flag += PF_L1;
1667 mvp_flag = ff_hevc_mvp_lx_flag_decode(s);
1668 ff_hevc_luma_mv_mvp_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
1669 part_idx, merge_idx, mv, mvp_flag, 1);
1670 mv->mv[1].x += lc->pu.mvd.x;
1671 mv->mv[1].y += lc->pu.mvd.y;
1675 static void hls_prediction_unit(HEVCContext *s, int x0, int y0,
1677 int log2_cb_size, int partIdx, int idx)
1679 #define POS(c_idx, x, y) \
1680 &s->frame->data[c_idx][((y) >> s->sps->vshift[c_idx]) * s->frame->linesize[c_idx] + \
1681 (((x) >> s->sps->hshift[c_idx]) << s->sps->pixel_shift)]
1682 HEVCLocalContext *lc = s->HEVClc;
1684 struct MvField current_mv = {{{ 0 }}};
1686 int min_pu_width = s->sps->min_pu_width;
1688 MvField *tab_mvf = s->ref->tab_mvf;
1689 RefPicList *refPicList = s->ref->refPicList;
1690 HEVCFrame *ref0 = NULL, *ref1 = NULL;
1691 uint8_t *dst0 = POS(0, x0, y0);
1692 uint8_t *dst1 = POS(1, x0, y0);
1693 uint8_t *dst2 = POS(2, x0, y0);
1694 int log2_min_cb_size = s->sps->log2_min_cb_size;
1695 int min_cb_width = s->sps->min_cb_width;
1696 int x_cb = x0 >> log2_min_cb_size;
1697 int y_cb = y0 >> log2_min_cb_size;
1701 int skip_flag = SAMPLE_CTB(s->skip_flag, x_cb, y_cb);
1704 lc->pu.merge_flag = ff_hevc_merge_flag_decode(s);
1706 if (skip_flag || lc->pu.merge_flag) {
1707 if (s->sh.max_num_merge_cand > 1)
1708 merge_idx = ff_hevc_merge_idx_decode(s);
1712 ff_hevc_luma_mv_merge_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
1713 partIdx, merge_idx, ¤t_mv);
1715 hevc_luma_mv_mpv_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
1716 partIdx, merge_idx, ¤t_mv);
1719 x_pu = x0 >> s->sps->log2_min_pu_size;
1720 y_pu = y0 >> s->sps->log2_min_pu_size;
1722 for (j = 0; j < nPbH >> s->sps->log2_min_pu_size; j++)
1723 for (i = 0; i < nPbW >> s->sps->log2_min_pu_size; i++)
1724 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i] = current_mv;
1726 if (current_mv.pred_flag & PF_L0) {
1727 ref0 = refPicList[0].ref[current_mv.ref_idx[0]];
1730 hevc_await_progress(s, ref0, ¤t_mv.mv[0], y0, nPbH);
1732 if (current_mv.pred_flag & PF_L1) {
1733 ref1 = refPicList[1].ref[current_mv.ref_idx[1]];
1736 hevc_await_progress(s, ref1, ¤t_mv.mv[1], y0, nPbH);
1739 if (current_mv.pred_flag == PF_L0) {
1740 int x0_c = x0 >> s->sps->hshift[1];
1741 int y0_c = y0 >> s->sps->vshift[1];
1742 int nPbW_c = nPbW >> s->sps->hshift[1];
1743 int nPbH_c = nPbH >> s->sps->vshift[1];
1745 luma_mc_uni(s, dst0, s->frame->linesize[0], ref0->frame,
1746 ¤t_mv.mv[0], x0, y0, nPbW, nPbH,
1747 s->sh.luma_weight_l0[current_mv.ref_idx[0]],
1748 s->sh.luma_offset_l0[current_mv.ref_idx[0]]);
1750 if (s->sps->chroma_format_idc) {
1751 chroma_mc_uni(s, dst1, s->frame->linesize[1], ref0->frame->data[1], ref0->frame->linesize[1],
1752 0, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
1753 s->sh.chroma_weight_l0[current_mv.ref_idx[0]][0], s->sh.chroma_offset_l0[current_mv.ref_idx[0]][0]);
1754 chroma_mc_uni(s, dst2, s->frame->linesize[2], ref0->frame->data[2], ref0->frame->linesize[2],
1755 0, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
1756 s->sh.chroma_weight_l0[current_mv.ref_idx[0]][1], s->sh.chroma_offset_l0[current_mv.ref_idx[0]][1]);
1758 } else if (current_mv.pred_flag == PF_L1) {
1759 int x0_c = x0 >> s->sps->hshift[1];
1760 int y0_c = y0 >> s->sps->vshift[1];
1761 int nPbW_c = nPbW >> s->sps->hshift[1];
1762 int nPbH_c = nPbH >> s->sps->vshift[1];
1764 luma_mc_uni(s, dst0, s->frame->linesize[0], ref1->frame,
1765 ¤t_mv.mv[1], x0, y0, nPbW, nPbH,
1766 s->sh.luma_weight_l1[current_mv.ref_idx[1]],
1767 s->sh.luma_offset_l1[current_mv.ref_idx[1]]);
1769 if (s->sps->chroma_format_idc) {
1770 chroma_mc_uni(s, dst1, s->frame->linesize[1], ref1->frame->data[1], ref1->frame->linesize[1],
1771 1, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
1772 s->sh.chroma_weight_l1[current_mv.ref_idx[1]][0], s->sh.chroma_offset_l1[current_mv.ref_idx[1]][0]);
1774 chroma_mc_uni(s, dst2, s->frame->linesize[2], ref1->frame->data[2], ref1->frame->linesize[2],
1775 1, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
1776 s->sh.chroma_weight_l1[current_mv.ref_idx[1]][1], s->sh.chroma_offset_l1[current_mv.ref_idx[1]][1]);
1778 } else if (current_mv.pred_flag == PF_BI) {
1779 int x0_c = x0 >> s->sps->hshift[1];
1780 int y0_c = y0 >> s->sps->vshift[1];
1781 int nPbW_c = nPbW >> s->sps->hshift[1];
1782 int nPbH_c = nPbH >> s->sps->vshift[1];
1784 luma_mc_bi(s, dst0, s->frame->linesize[0], ref0->frame,
1785 ¤t_mv.mv[0], x0, y0, nPbW, nPbH,
1786 ref1->frame, ¤t_mv.mv[1], ¤t_mv);
1788 if (s->sps->chroma_format_idc) {
1789 chroma_mc_bi(s, dst1, s->frame->linesize[1], ref0->frame, ref1->frame,
1790 x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv, 0);
1792 chroma_mc_bi(s, dst2, s->frame->linesize[2], ref0->frame, ref1->frame,
1793 x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv, 1);
1801 static int luma_intra_pred_mode(HEVCContext *s, int x0, int y0, int pu_size,
1802 int prev_intra_luma_pred_flag)
1804 HEVCLocalContext *lc = s->HEVClc;
1805 int x_pu = x0 >> s->sps->log2_min_pu_size;
1806 int y_pu = y0 >> s->sps->log2_min_pu_size;
1807 int min_pu_width = s->sps->min_pu_width;
1808 int size_in_pus = pu_size >> s->sps->log2_min_pu_size;
1809 int x0b = x0 & ((1 << s->sps->log2_ctb_size) - 1);
1810 int y0b = y0 & ((1 << s->sps->log2_ctb_size) - 1);
1812 int cand_up = (lc->ctb_up_flag || y0b) ?
1813 s->tab_ipm[(y_pu - 1) * min_pu_width + x_pu] : INTRA_DC;
1814 int cand_left = (lc->ctb_left_flag || x0b) ?
1815 s->tab_ipm[y_pu * min_pu_width + x_pu - 1] : INTRA_DC;
1817 int y_ctb = (y0 >> (s->sps->log2_ctb_size)) << (s->sps->log2_ctb_size);
1819 MvField *tab_mvf = s->ref->tab_mvf;
1820 int intra_pred_mode;
1824 // intra_pred_mode prediction does not cross vertical CTB boundaries
1825 if ((y0 - 1) < y_ctb)
1828 if (cand_left == cand_up) {
1829 if (cand_left < 2) {
1830 candidate[0] = INTRA_PLANAR;
1831 candidate[1] = INTRA_DC;
1832 candidate[2] = INTRA_ANGULAR_26;
1834 candidate[0] = cand_left;
1835 candidate[1] = 2 + ((cand_left - 2 - 1 + 32) & 31);
1836 candidate[2] = 2 + ((cand_left - 2 + 1) & 31);
1839 candidate[0] = cand_left;
1840 candidate[1] = cand_up;
1841 if (candidate[0] != INTRA_PLANAR && candidate[1] != INTRA_PLANAR) {
1842 candidate[2] = INTRA_PLANAR;
1843 } else if (candidate[0] != INTRA_DC && candidate[1] != INTRA_DC) {
1844 candidate[2] = INTRA_DC;
1846 candidate[2] = INTRA_ANGULAR_26;
1850 if (prev_intra_luma_pred_flag) {
1851 intra_pred_mode = candidate[lc->pu.mpm_idx];
1853 if (candidate[0] > candidate[1])
1854 FFSWAP(uint8_t, candidate[0], candidate[1]);
1855 if (candidate[0] > candidate[2])
1856 FFSWAP(uint8_t, candidate[0], candidate[2]);
1857 if (candidate[1] > candidate[2])
1858 FFSWAP(uint8_t, candidate[1], candidate[2]);
1860 intra_pred_mode = lc->pu.rem_intra_luma_pred_mode;
1861 for (i = 0; i < 3; i++)
1862 if (intra_pred_mode >= candidate[i])
1866 /* write the intra prediction units into the mv array */
1869 for (i = 0; i < size_in_pus; i++) {
1870 memset(&s->tab_ipm[(y_pu + i) * min_pu_width + x_pu],
1871 intra_pred_mode, size_in_pus);
1873 for (j = 0; j < size_in_pus; j++) {
1874 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].pred_flag = PF_INTRA;
1878 return intra_pred_mode;
1881 static av_always_inline void set_ct_depth(HEVCContext *s, int x0, int y0,
1882 int log2_cb_size, int ct_depth)
1884 int length = (1 << log2_cb_size) >> s->sps->log2_min_cb_size;
1885 int x_cb = x0 >> s->sps->log2_min_cb_size;
1886 int y_cb = y0 >> s->sps->log2_min_cb_size;
1889 for (y = 0; y < length; y++)
1890 memset(&s->tab_ct_depth[(y_cb + y) * s->sps->min_cb_width + x_cb],
1894 static const uint8_t tab_mode_idx[] = {
1895 0, 1, 2, 2, 2, 2, 3, 5, 7, 8, 10, 12, 13, 15, 17, 18, 19, 20,
1896 21, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 29, 29, 30, 31};
1898 static void intra_prediction_unit(HEVCContext *s, int x0, int y0,
1901 HEVCLocalContext *lc = s->HEVClc;
1902 static const uint8_t intra_chroma_table[4] = { 0, 26, 10, 1 };
1903 uint8_t prev_intra_luma_pred_flag[4];
1904 int split = lc->cu.part_mode == PART_NxN;
1905 int pb_size = (1 << log2_cb_size) >> split;
1906 int side = split + 1;
1910 for (i = 0; i < side; i++)
1911 for (j = 0; j < side; j++)
1912 prev_intra_luma_pred_flag[2 * i + j] = ff_hevc_prev_intra_luma_pred_flag_decode(s);
1914 for (i = 0; i < side; i++) {
1915 for (j = 0; j < side; j++) {
1916 if (prev_intra_luma_pred_flag[2 * i + j])
1917 lc->pu.mpm_idx = ff_hevc_mpm_idx_decode(s);
1919 lc->pu.rem_intra_luma_pred_mode = ff_hevc_rem_intra_luma_pred_mode_decode(s);
1921 lc->pu.intra_pred_mode[2 * i + j] =
1922 luma_intra_pred_mode(s, x0 + pb_size * j, y0 + pb_size * i, pb_size,
1923 prev_intra_luma_pred_flag[2 * i + j]);
1927 if (s->sps->chroma_format_idc == 3) {
1928 for (i = 0; i < side; i++) {
1929 for (j = 0; j < side; j++) {
1930 lc->pu.chroma_mode_c[2 * i + j] = chroma_mode = ff_hevc_intra_chroma_pred_mode_decode(s);
1931 if (chroma_mode != 4) {
1932 if (lc->pu.intra_pred_mode[2 * i + j] == intra_chroma_table[chroma_mode])
1933 lc->pu.intra_pred_mode_c[2 * i + j] = 34;
1935 lc->pu.intra_pred_mode_c[2 * i + j] = intra_chroma_table[chroma_mode];
1937 lc->pu.intra_pred_mode_c[2 * i + j] = lc->pu.intra_pred_mode[2 * i + j];
1941 } else if (s->sps->chroma_format_idc == 2) {
1943 lc->pu.chroma_mode_c[0] = chroma_mode = ff_hevc_intra_chroma_pred_mode_decode(s);
1944 if (chroma_mode != 4) {
1945 if (lc->pu.intra_pred_mode[0] == intra_chroma_table[chroma_mode])
1948 mode_idx = intra_chroma_table[chroma_mode];
1950 mode_idx = lc->pu.intra_pred_mode[0];
1952 lc->pu.intra_pred_mode_c[0] = tab_mode_idx[mode_idx];
1953 } else if (s->sps->chroma_format_idc != 0) {
1954 chroma_mode = ff_hevc_intra_chroma_pred_mode_decode(s);
1955 if (chroma_mode != 4) {
1956 if (lc->pu.intra_pred_mode[0] == intra_chroma_table[chroma_mode])
1957 lc->pu.intra_pred_mode_c[0] = 34;
1959 lc->pu.intra_pred_mode_c[0] = intra_chroma_table[chroma_mode];
1961 lc->pu.intra_pred_mode_c[0] = lc->pu.intra_pred_mode[0];
1966 static void intra_prediction_unit_default_value(HEVCContext *s,
1970 HEVCLocalContext *lc = s->HEVClc;
1971 int pb_size = 1 << log2_cb_size;
1972 int size_in_pus = pb_size >> s->sps->log2_min_pu_size;
1973 int min_pu_width = s->sps->min_pu_width;
1974 MvField *tab_mvf = s->ref->tab_mvf;
1975 int x_pu = x0 >> s->sps->log2_min_pu_size;
1976 int y_pu = y0 >> s->sps->log2_min_pu_size;
1979 if (size_in_pus == 0)
1981 for (j = 0; j < size_in_pus; j++)
1982 memset(&s->tab_ipm[(y_pu + j) * min_pu_width + x_pu], INTRA_DC, size_in_pus);
1983 if (lc->cu.pred_mode == MODE_INTRA)
1984 for (j = 0; j < size_in_pus; j++)
1985 for (k = 0; k < size_in_pus; k++)
1986 tab_mvf[(y_pu + j) * min_pu_width + x_pu + k].pred_flag = PF_INTRA;
1989 static int hls_coding_unit(HEVCContext *s, int x0, int y0, int log2_cb_size)
1991 int cb_size = 1 << log2_cb_size;
1992 HEVCLocalContext *lc = s->HEVClc;
1993 int log2_min_cb_size = s->sps->log2_min_cb_size;
1994 int length = cb_size >> log2_min_cb_size;
1995 int min_cb_width = s->sps->min_cb_width;
1996 int x_cb = x0 >> log2_min_cb_size;
1997 int y_cb = y0 >> log2_min_cb_size;
1998 int idx = log2_cb_size - 2;
1999 int qp_block_mask = (1<<(s->sps->log2_ctb_size - s->pps->diff_cu_qp_delta_depth)) - 1;
2004 lc->cu.pred_mode = MODE_INTRA;
2005 lc->cu.part_mode = PART_2Nx2N;
2006 lc->cu.intra_split_flag = 0;
2008 SAMPLE_CTB(s->skip_flag, x_cb, y_cb) = 0;
2009 for (x = 0; x < 4; x++)
2010 lc->pu.intra_pred_mode[x] = 1;
2011 if (s->pps->transquant_bypass_enable_flag) {
2012 lc->cu.cu_transquant_bypass_flag = ff_hevc_cu_transquant_bypass_flag_decode(s);
2013 if (lc->cu.cu_transquant_bypass_flag)
2014 set_deblocking_bypass(s, x0, y0, log2_cb_size);
2016 lc->cu.cu_transquant_bypass_flag = 0;
2018 if (s->sh.slice_type != I_SLICE) {
2019 uint8_t skip_flag = ff_hevc_skip_flag_decode(s, x0, y0, x_cb, y_cb);
2021 x = y_cb * min_cb_width + x_cb;
2022 for (y = 0; y < length; y++) {
2023 memset(&s->skip_flag[x], skip_flag, length);
2026 lc->cu.pred_mode = skip_flag ? MODE_SKIP : MODE_INTER;
2028 x = y_cb * min_cb_width + x_cb;
2029 for (y = 0; y < length; y++) {
2030 memset(&s->skip_flag[x], 0, length);
2035 if (SAMPLE_CTB(s->skip_flag, x_cb, y_cb)) {
2036 hls_prediction_unit(s, x0, y0, cb_size, cb_size, log2_cb_size, 0, idx);
2037 intra_prediction_unit_default_value(s, x0, y0, log2_cb_size);
2039 if (!s->sh.disable_deblocking_filter_flag)
2040 ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_cb_size);
2044 if (s->sh.slice_type != I_SLICE)
2045 lc->cu.pred_mode = ff_hevc_pred_mode_decode(s);
2046 if (lc->cu.pred_mode != MODE_INTRA ||
2047 log2_cb_size == s->sps->log2_min_cb_size) {
2048 lc->cu.part_mode = ff_hevc_part_mode_decode(s, log2_cb_size);
2049 lc->cu.intra_split_flag = lc->cu.part_mode == PART_NxN &&
2050 lc->cu.pred_mode == MODE_INTRA;
2053 if (lc->cu.pred_mode == MODE_INTRA) {
2054 if (lc->cu.part_mode == PART_2Nx2N && s->sps->pcm_enabled_flag &&
2055 log2_cb_size >= s->sps->pcm.log2_min_pcm_cb_size &&
2056 log2_cb_size <= s->sps->pcm.log2_max_pcm_cb_size) {
2057 pcm_flag = ff_hevc_pcm_flag_decode(s);
2060 intra_prediction_unit_default_value(s, x0, y0, log2_cb_size);
2061 ret = hls_pcm_sample(s, x0, y0, log2_cb_size);
2062 if (s->sps->pcm.loop_filter_disable_flag)
2063 set_deblocking_bypass(s, x0, y0, log2_cb_size);
2068 intra_prediction_unit(s, x0, y0, log2_cb_size);
2071 intra_prediction_unit_default_value(s, x0, y0, log2_cb_size);
2072 switch (lc->cu.part_mode) {
2074 hls_prediction_unit(s, x0, y0, cb_size, cb_size, log2_cb_size, 0, idx);
2077 hls_prediction_unit(s, x0, y0, cb_size, cb_size / 2, log2_cb_size, 0, idx);
2078 hls_prediction_unit(s, x0, y0 + cb_size / 2, cb_size, cb_size / 2, log2_cb_size, 1, idx);
2081 hls_prediction_unit(s, x0, y0, cb_size / 2, cb_size, log2_cb_size, 0, idx - 1);
2082 hls_prediction_unit(s, x0 + cb_size / 2, y0, cb_size / 2, cb_size, log2_cb_size, 1, idx - 1);
2085 hls_prediction_unit(s, x0, y0, cb_size, cb_size / 4, log2_cb_size, 0, idx);
2086 hls_prediction_unit(s, x0, y0 + cb_size / 4, cb_size, cb_size * 3 / 4, log2_cb_size, 1, idx);
2089 hls_prediction_unit(s, x0, y0, cb_size, cb_size * 3 / 4, log2_cb_size, 0, idx);
2090 hls_prediction_unit(s, x0, y0 + cb_size * 3 / 4, cb_size, cb_size / 4, log2_cb_size, 1, idx);
2093 hls_prediction_unit(s, x0, y0, cb_size / 4, cb_size, log2_cb_size, 0, idx - 2);
2094 hls_prediction_unit(s, x0 + cb_size / 4, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 1, idx - 2);
2097 hls_prediction_unit(s, x0, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 0, idx - 2);
2098 hls_prediction_unit(s, x0 + cb_size * 3 / 4, y0, cb_size / 4, cb_size, log2_cb_size, 1, idx - 2);
2101 hls_prediction_unit(s, x0, y0, cb_size / 2, cb_size / 2, log2_cb_size, 0, idx - 1);
2102 hls_prediction_unit(s, x0 + cb_size / 2, y0, cb_size / 2, cb_size / 2, log2_cb_size, 1, idx - 1);
2103 hls_prediction_unit(s, x0, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 2, idx - 1);
2104 hls_prediction_unit(s, x0 + cb_size / 2, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 3, idx - 1);
2110 int rqt_root_cbf = 1;
2112 if (lc->cu.pred_mode != MODE_INTRA &&
2113 !(lc->cu.part_mode == PART_2Nx2N && lc->pu.merge_flag)) {
2114 rqt_root_cbf = ff_hevc_no_residual_syntax_flag_decode(s);
2117 const static int cbf[2] = { 0 };
2118 lc->cu.max_trafo_depth = lc->cu.pred_mode == MODE_INTRA ?
2119 s->sps->max_transform_hierarchy_depth_intra + lc->cu.intra_split_flag :
2120 s->sps->max_transform_hierarchy_depth_inter;
2121 ret = hls_transform_tree(s, x0, y0, x0, y0, x0, y0,
2123 log2_cb_size, 0, 0, cbf, cbf);
2127 if (!s->sh.disable_deblocking_filter_flag)
2128 ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_cb_size);
2133 if (s->pps->cu_qp_delta_enabled_flag && lc->tu.is_cu_qp_delta_coded == 0)
2134 ff_hevc_set_qPy(s, x0, y0, log2_cb_size);
2136 x = y_cb * min_cb_width + x_cb;
2137 for (y = 0; y < length; y++) {
2138 memset(&s->qp_y_tab[x], lc->qp_y, length);
2142 if(((x0 + (1<<log2_cb_size)) & qp_block_mask) == 0 &&
2143 ((y0 + (1<<log2_cb_size)) & qp_block_mask) == 0) {
2144 lc->qPy_pred = lc->qp_y;
2147 set_ct_depth(s, x0, y0, log2_cb_size, lc->ct_depth);
2152 static int hls_coding_quadtree(HEVCContext *s, int x0, int y0,
2153 int log2_cb_size, int cb_depth)
2155 HEVCLocalContext *lc = s->HEVClc;
2156 const int cb_size = 1 << log2_cb_size;
2160 lc->ct_depth = cb_depth;
2161 if (x0 + cb_size <= s->sps->width &&
2162 y0 + cb_size <= s->sps->height &&
2163 log2_cb_size > s->sps->log2_min_cb_size) {
2164 split_cu = ff_hevc_split_coding_unit_flag_decode(s, cb_depth, x0, y0);
2166 split_cu = (log2_cb_size > s->sps->log2_min_cb_size);
2168 if (s->pps->cu_qp_delta_enabled_flag &&
2169 log2_cb_size >= s->sps->log2_ctb_size - s->pps->diff_cu_qp_delta_depth) {
2170 lc->tu.is_cu_qp_delta_coded = 0;
2171 lc->tu.cu_qp_delta = 0;
2174 if (s->sh.cu_chroma_qp_offset_enabled_flag &&
2175 log2_cb_size >= s->sps->log2_ctb_size - s->pps->diff_cu_chroma_qp_offset_depth) {
2176 lc->tu.is_cu_chroma_qp_offset_coded = 0;
2180 int qp_block_mask = (1<<(s->sps->log2_ctb_size - s->pps->diff_cu_qp_delta_depth)) - 1;
2181 const int cb_size_split = cb_size >> 1;
2182 const int x1 = x0 + cb_size_split;
2183 const int y1 = y0 + cb_size_split;
2187 more_data = hls_coding_quadtree(s, x0, y0, log2_cb_size - 1, cb_depth + 1);
2191 if (more_data && x1 < s->sps->width) {
2192 more_data = hls_coding_quadtree(s, x1, y0, log2_cb_size - 1, cb_depth + 1);
2196 if (more_data && y1 < s->sps->height) {
2197 more_data = hls_coding_quadtree(s, x0, y1, log2_cb_size - 1, cb_depth + 1);
2201 if (more_data && x1 < s->sps->width &&
2202 y1 < s->sps->height) {
2203 more_data = hls_coding_quadtree(s, x1, y1, log2_cb_size - 1, cb_depth + 1);
2208 if(((x0 + (1<<log2_cb_size)) & qp_block_mask) == 0 &&
2209 ((y0 + (1<<log2_cb_size)) & qp_block_mask) == 0)
2210 lc->qPy_pred = lc->qp_y;
2213 return ((x1 + cb_size_split) < s->sps->width ||
2214 (y1 + cb_size_split) < s->sps->height);
2218 ret = hls_coding_unit(s, x0, y0, log2_cb_size);
2221 if ((!((x0 + cb_size) %
2222 (1 << (s->sps->log2_ctb_size))) ||
2223 (x0 + cb_size >= s->sps->width)) &&
2225 (1 << (s->sps->log2_ctb_size))) ||
2226 (y0 + cb_size >= s->sps->height))) {
2227 int end_of_slice_flag = ff_hevc_end_of_slice_flag_decode(s);
2228 return !end_of_slice_flag;
2237 static void hls_decode_neighbour(HEVCContext *s, int x_ctb, int y_ctb,
2240 HEVCLocalContext *lc = s->HEVClc;
2241 int ctb_size = 1 << s->sps->log2_ctb_size;
2242 int ctb_addr_rs = s->pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2243 int ctb_addr_in_slice = ctb_addr_rs - s->sh.slice_addr;
2245 s->tab_slice_address[ctb_addr_rs] = s->sh.slice_addr;
2247 if (s->pps->entropy_coding_sync_enabled_flag) {
2248 if (x_ctb == 0 && (y_ctb & (ctb_size - 1)) == 0)
2249 lc->first_qp_group = 1;
2250 lc->end_of_tiles_x = s->sps->width;
2251 } else if (s->pps->tiles_enabled_flag) {
2252 if (ctb_addr_ts && s->pps->tile_id[ctb_addr_ts] != s->pps->tile_id[ctb_addr_ts - 1]) {
2253 int idxX = s->pps->col_idxX[x_ctb >> s->sps->log2_ctb_size];
2254 lc->end_of_tiles_x = x_ctb + (s->pps->column_width[idxX] << s->sps->log2_ctb_size);
2255 lc->first_qp_group = 1;
2258 lc->end_of_tiles_x = s->sps->width;
2261 lc->end_of_tiles_y = FFMIN(y_ctb + ctb_size, s->sps->height);
2263 lc->boundary_flags = 0;
2264 if (s->pps->tiles_enabled_flag) {
2265 if (x_ctb > 0 && s->pps->tile_id[ctb_addr_ts] != s->pps->tile_id[s->pps->ctb_addr_rs_to_ts[ctb_addr_rs - 1]])
2266 lc->boundary_flags |= BOUNDARY_LEFT_TILE;
2267 if (x_ctb > 0 && s->tab_slice_address[ctb_addr_rs] != s->tab_slice_address[ctb_addr_rs - 1])
2268 lc->boundary_flags |= BOUNDARY_LEFT_SLICE;
2269 if (y_ctb > 0 && s->pps->tile_id[ctb_addr_ts] != s->pps->tile_id[s->pps->ctb_addr_rs_to_ts[ctb_addr_rs - s->sps->ctb_width]])
2270 lc->boundary_flags |= BOUNDARY_UPPER_TILE;
2271 if (y_ctb > 0 && s->tab_slice_address[ctb_addr_rs] != s->tab_slice_address[ctb_addr_rs - s->sps->ctb_width])
2272 lc->boundary_flags |= BOUNDARY_UPPER_SLICE;
2274 if (!ctb_addr_in_slice > 0)
2275 lc->boundary_flags |= BOUNDARY_LEFT_SLICE;
2276 if (ctb_addr_in_slice < s->sps->ctb_width)
2277 lc->boundary_flags |= BOUNDARY_UPPER_SLICE;
2280 lc->ctb_left_flag = ((x_ctb > 0) && (ctb_addr_in_slice > 0) && !(lc->boundary_flags & BOUNDARY_LEFT_TILE));
2281 lc->ctb_up_flag = ((y_ctb > 0) && (ctb_addr_in_slice >= s->sps->ctb_width) && !(lc->boundary_flags & BOUNDARY_UPPER_TILE));
2282 lc->ctb_up_right_flag = ((y_ctb > 0) && (ctb_addr_in_slice+1 >= s->sps->ctb_width) && (s->pps->tile_id[ctb_addr_ts] == s->pps->tile_id[s->pps->ctb_addr_rs_to_ts[ctb_addr_rs+1 - s->sps->ctb_width]]));
2283 lc->ctb_up_left_flag = ((x_ctb > 0) && (y_ctb > 0) && (ctb_addr_in_slice-1 >= s->sps->ctb_width) && (s->pps->tile_id[ctb_addr_ts] == s->pps->tile_id[s->pps->ctb_addr_rs_to_ts[ctb_addr_rs-1 - s->sps->ctb_width]]));
2286 static int hls_decode_entry(AVCodecContext *avctxt, void *isFilterThread)
2288 HEVCContext *s = avctxt->priv_data;
2289 int ctb_size = 1 << s->sps->log2_ctb_size;
2293 int ctb_addr_ts = s->pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs];
2295 if (!ctb_addr_ts && s->sh.dependent_slice_segment_flag) {
2296 av_log(s->avctx, AV_LOG_ERROR, "Impossible initial tile.\n");
2297 return AVERROR_INVALIDDATA;
2300 if (s->sh.dependent_slice_segment_flag) {
2301 int prev_rs = s->pps->ctb_addr_ts_to_rs[ctb_addr_ts - 1];
2302 if (s->tab_slice_address[prev_rs] != s->sh.slice_addr) {
2303 av_log(s->avctx, AV_LOG_ERROR, "Previous slice segment missing\n");
2304 return AVERROR_INVALIDDATA;
2308 while (more_data && ctb_addr_ts < s->sps->ctb_size) {
2309 int ctb_addr_rs = s->pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2311 x_ctb = (ctb_addr_rs % ((s->sps->width + ctb_size - 1) >> s->sps->log2_ctb_size)) << s->sps->log2_ctb_size;
2312 y_ctb = (ctb_addr_rs / ((s->sps->width + ctb_size - 1) >> s->sps->log2_ctb_size)) << s->sps->log2_ctb_size;
2313 hls_decode_neighbour(s, x_ctb, y_ctb, ctb_addr_ts);
2315 ff_hevc_cabac_init(s, ctb_addr_ts);
2317 hls_sao_param(s, x_ctb >> s->sps->log2_ctb_size, y_ctb >> s->sps->log2_ctb_size);
2319 s->deblock[ctb_addr_rs].beta_offset = s->sh.beta_offset;
2320 s->deblock[ctb_addr_rs].tc_offset = s->sh.tc_offset;
2321 s->filter_slice_edges[ctb_addr_rs] = s->sh.slice_loop_filter_across_slices_enabled_flag;
2323 more_data = hls_coding_quadtree(s, x_ctb, y_ctb, s->sps->log2_ctb_size, 0);
2324 if (more_data < 0) {
2325 s->tab_slice_address[ctb_addr_rs] = -1;
2331 ff_hevc_save_states(s, ctb_addr_ts);
2332 ff_hevc_hls_filters(s, x_ctb, y_ctb, ctb_size);
2335 if (x_ctb + ctb_size >= s->sps->width &&
2336 y_ctb + ctb_size >= s->sps->height)
2337 ff_hevc_hls_filter(s, x_ctb, y_ctb, ctb_size);
2342 static int hls_slice_data(HEVCContext *s)
2350 s->avctx->execute(s->avctx, hls_decode_entry, arg, ret , 1, sizeof(int));
2353 static int hls_decode_entry_wpp(AVCodecContext *avctxt, void *input_ctb_row, int job, int self_id)
2355 HEVCContext *s1 = avctxt->priv_data, *s;
2356 HEVCLocalContext *lc;
2357 int ctb_size = 1<< s1->sps->log2_ctb_size;
2359 int *ctb_row_p = input_ctb_row;
2360 int ctb_row = ctb_row_p[job];
2361 int ctb_addr_rs = s1->sh.slice_ctb_addr_rs + ctb_row * ((s1->sps->width + ctb_size - 1) >> s1->sps->log2_ctb_size);
2362 int ctb_addr_ts = s1->pps->ctb_addr_rs_to_ts[ctb_addr_rs];
2363 int thread = ctb_row % s1->threads_number;
2366 s = s1->sList[self_id];
2370 ret = init_get_bits8(&lc->gb, s->data + s->sh.offset[ctb_row - 1], s->sh.size[ctb_row - 1]);
2374 ff_init_cabac_decoder(&lc->cc, s->data + s->sh.offset[(ctb_row)-1], s->sh.size[ctb_row - 1]);
2377 while(more_data && ctb_addr_ts < s->sps->ctb_size) {
2378 int x_ctb = (ctb_addr_rs % s->sps->ctb_width) << s->sps->log2_ctb_size;
2379 int y_ctb = (ctb_addr_rs / s->sps->ctb_width) << s->sps->log2_ctb_size;
2381 hls_decode_neighbour(s, x_ctb, y_ctb, ctb_addr_ts);
2383 ff_thread_await_progress2(s->avctx, ctb_row, thread, SHIFT_CTB_WPP);
2385 if (avpriv_atomic_int_get(&s1->wpp_err)){
2386 ff_thread_report_progress2(s->avctx, ctb_row , thread, SHIFT_CTB_WPP);
2390 ff_hevc_cabac_init(s, ctb_addr_ts);
2391 hls_sao_param(s, x_ctb >> s->sps->log2_ctb_size, y_ctb >> s->sps->log2_ctb_size);
2392 more_data = hls_coding_quadtree(s, x_ctb, y_ctb, s->sps->log2_ctb_size, 0);
2394 if (more_data < 0) {
2395 s->tab_slice_address[ctb_addr_rs] = -1;
2401 ff_hevc_save_states(s, ctb_addr_ts);
2402 ff_thread_report_progress2(s->avctx, ctb_row, thread, 1);
2403 ff_hevc_hls_filters(s, x_ctb, y_ctb, ctb_size);
2405 if (!more_data && (x_ctb+ctb_size) < s->sps->width && ctb_row != s->sh.num_entry_point_offsets) {
2406 avpriv_atomic_int_set(&s1->wpp_err, 1);
2407 ff_thread_report_progress2(s->avctx, ctb_row ,thread, SHIFT_CTB_WPP);
2411 if ((x_ctb+ctb_size) >= s->sps->width && (y_ctb+ctb_size) >= s->sps->height ) {
2412 ff_hevc_hls_filter(s, x_ctb, y_ctb, ctb_size);
2413 ff_thread_report_progress2(s->avctx, ctb_row , thread, SHIFT_CTB_WPP);
2416 ctb_addr_rs = s->pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2419 if(x_ctb >= s->sps->width) {
2423 ff_thread_report_progress2(s->avctx, ctb_row ,thread, SHIFT_CTB_WPP);
2428 static int hls_slice_data_wpp(HEVCContext *s, const uint8_t *nal, int length)
2430 HEVCLocalContext *lc = s->HEVClc;
2431 int *ret = av_malloc_array(s->sh.num_entry_point_offsets + 1, sizeof(int));
2432 int *arg = av_malloc_array(s->sh.num_entry_point_offsets + 1, sizeof(int));
2434 int startheader, cmpt = 0;
2440 return AVERROR(ENOMEM);
2445 ff_alloc_entries(s->avctx, s->sh.num_entry_point_offsets + 1);
2448 for (i = 1; i < s->threads_number; i++) {
2449 s->sList[i] = av_malloc(sizeof(HEVCContext));
2450 memcpy(s->sList[i], s, sizeof(HEVCContext));
2451 s->HEVClcList[i] = av_mallocz(sizeof(HEVCLocalContext));
2452 s->sList[i]->HEVClc = s->HEVClcList[i];
2456 offset = (lc->gb.index >> 3);
2458 for (j = 0, cmpt = 0, startheader = offset + s->sh.entry_point_offset[0]; j < s->skipped_bytes; j++) {
2459 if (s->skipped_bytes_pos[j] >= offset && s->skipped_bytes_pos[j] < startheader) {
2465 for (i = 1; i < s->sh.num_entry_point_offsets; i++) {
2466 offset += (s->sh.entry_point_offset[i - 1] - cmpt);
2467 for (j = 0, cmpt = 0, startheader = offset
2468 + s->sh.entry_point_offset[i]; j < s->skipped_bytes; j++) {
2469 if (s->skipped_bytes_pos[j] >= offset && s->skipped_bytes_pos[j] < startheader) {
2474 s->sh.size[i - 1] = s->sh.entry_point_offset[i] - cmpt;
2475 s->sh.offset[i - 1] = offset;
2478 if (s->sh.num_entry_point_offsets != 0) {
2479 offset += s->sh.entry_point_offset[s->sh.num_entry_point_offsets - 1] - cmpt;
2480 s->sh.size[s->sh.num_entry_point_offsets - 1] = length - offset;
2481 s->sh.offset[s->sh.num_entry_point_offsets - 1] = offset;
2486 for (i = 1; i < s->threads_number; i++) {
2487 s->sList[i]->HEVClc->first_qp_group = 1;
2488 s->sList[i]->HEVClc->qp_y = s->sList[0]->HEVClc->qp_y;
2489 memcpy(s->sList[i], s, sizeof(HEVCContext));
2490 s->sList[i]->HEVClc = s->HEVClcList[i];
2493 avpriv_atomic_int_set(&s->wpp_err, 0);
2494 ff_reset_entries(s->avctx);
2496 for (i = 0; i <= s->sh.num_entry_point_offsets; i++) {
2501 if (s->pps->entropy_coding_sync_enabled_flag)
2502 s->avctx->execute2(s->avctx, (void *) hls_decode_entry_wpp, arg, ret, s->sh.num_entry_point_offsets + 1);
2504 for (i = 0; i <= s->sh.num_entry_point_offsets; i++)
2512 * @return AVERROR_INVALIDDATA if the packet is not a valid NAL unit,
2513 * 0 if the unit should be skipped, 1 otherwise
2515 static int hls_nal_unit(HEVCContext *s)
2517 GetBitContext *gb = &s->HEVClc->gb;
2520 if (get_bits1(gb) != 0)
2521 return AVERROR_INVALIDDATA;
2523 s->nal_unit_type = get_bits(gb, 6);
2525 nuh_layer_id = get_bits(gb, 6);
2526 s->temporal_id = get_bits(gb, 3) - 1;
2527 if (s->temporal_id < 0)
2528 return AVERROR_INVALIDDATA;
2530 av_log(s->avctx, AV_LOG_DEBUG,
2531 "nal_unit_type: %d, nuh_layer_id: %d, temporal_id: %d\n",
2532 s->nal_unit_type, nuh_layer_id, s->temporal_id);
2534 return nuh_layer_id == 0;
2537 static int set_side_data(HEVCContext *s)
2539 AVFrame *out = s->ref->frame;
2541 if (s->sei_frame_packing_present &&
2542 s->frame_packing_arrangement_type >= 3 &&
2543 s->frame_packing_arrangement_type <= 5 &&
2544 s->content_interpretation_type > 0 &&
2545 s->content_interpretation_type < 3) {
2546 AVStereo3D *stereo = av_stereo3d_create_side_data(out);
2548 return AVERROR(ENOMEM);
2550 switch (s->frame_packing_arrangement_type) {
2552 if (s->quincunx_subsampling)
2553 stereo->type = AV_STEREO3D_SIDEBYSIDE_QUINCUNX;
2555 stereo->type = AV_STEREO3D_SIDEBYSIDE;
2558 stereo->type = AV_STEREO3D_TOPBOTTOM;
2561 stereo->type = AV_STEREO3D_FRAMESEQUENCE;
2565 if (s->content_interpretation_type == 2)
2566 stereo->flags = AV_STEREO3D_FLAG_INVERT;
2569 if (s->sei_display_orientation_present &&
2570 (s->sei_anticlockwise_rotation || s->sei_hflip || s->sei_vflip)) {
2571 double angle = s->sei_anticlockwise_rotation * 360 / (double) (1 << 16);
2572 AVFrameSideData *rotation = av_frame_new_side_data(out,
2573 AV_FRAME_DATA_DISPLAYMATRIX,
2574 sizeof(int32_t) * 9);
2576 return AVERROR(ENOMEM);
2578 av_display_rotation_set((int32_t *)rotation->data, angle);
2579 av_display_matrix_flip((int32_t *)rotation->data,
2580 s->sei_hflip, s->sei_vflip);
2586 static int hevc_frame_start(HEVCContext *s)
2588 HEVCLocalContext *lc = s->HEVClc;
2589 int pic_size_in_ctb = ((s->sps->width >> s->sps->log2_min_cb_size) + 1) *
2590 ((s->sps->height >> s->sps->log2_min_cb_size) + 1);
2593 memset(s->horizontal_bs, 0, s->bs_width * s->bs_height);
2594 memset(s->vertical_bs, 0, s->bs_width * s->bs_height);
2595 memset(s->cbf_luma, 0, s->sps->min_tb_width * s->sps->min_tb_height);
2596 memset(s->is_pcm, 0, (s->sps->min_pu_width + 1) * (s->sps->min_pu_height + 1));
2597 memset(s->tab_slice_address, -1, pic_size_in_ctb * sizeof(*s->tab_slice_address));
2600 s->first_nal_type = s->nal_unit_type;
2602 if (s->pps->tiles_enabled_flag)
2603 lc->end_of_tiles_x = s->pps->column_width[0] << s->sps->log2_ctb_size;
2605 ret = ff_hevc_set_new_ref(s, &s->frame, s->poc);
2609 ret = ff_hevc_frame_rps(s);
2611 av_log(s->avctx, AV_LOG_ERROR, "Error constructing the frame RPS.\n");
2615 s->ref->frame->key_frame = IS_IRAP(s);
2617 ret = set_side_data(s);
2621 s->frame->pict_type = 3 - s->sh.slice_type;
2624 ff_hevc_bump_frame(s);
2626 av_frame_unref(s->output_frame);
2627 ret = ff_hevc_output_frame(s, s->output_frame, 0);
2631 ff_thread_finish_setup(s->avctx);
2637 ff_hevc_unref_frame(s, s->ref, ~0);
2642 static int decode_nal_unit(HEVCContext *s, const HEVCNAL *nal)
2644 HEVCLocalContext *lc = s->HEVClc;
2645 GetBitContext *gb = &lc->gb;
2646 int ctb_addr_ts, ret;
2648 ret = init_get_bits8(gb, nal->data, nal->size);
2652 ret = hls_nal_unit(s);
2654 av_log(s->avctx, AV_LOG_ERROR, "Invalid NAL unit %d, skipping.\n",
2660 switch (s->nal_unit_type) {
2662 ret = ff_hevc_decode_nal_vps(s);
2667 ret = ff_hevc_decode_nal_sps(s);
2672 ret = ff_hevc_decode_nal_pps(s);
2676 case NAL_SEI_PREFIX:
2677 case NAL_SEI_SUFFIX:
2678 ret = ff_hevc_decode_nal_sei(s);
2689 case NAL_BLA_W_RADL:
2691 case NAL_IDR_W_RADL:
2698 ret = hls_slice_header(s);
2702 if (s->max_ra == INT_MAX) {
2703 if (s->nal_unit_type == NAL_CRA_NUT || IS_BLA(s)) {
2707 s->max_ra = INT_MIN;
2711 if ((s->nal_unit_type == NAL_RASL_R || s->nal_unit_type == NAL_RASL_N) &&
2712 s->poc <= s->max_ra) {
2716 if (s->nal_unit_type == NAL_RASL_R && s->poc > s->max_ra)
2717 s->max_ra = INT_MIN;
2720 if (s->sh.first_slice_in_pic_flag) {
2721 ret = hevc_frame_start(s);
2724 } else if (!s->ref) {
2725 av_log(s->avctx, AV_LOG_ERROR, "First slice in a frame missing.\n");
2729 if (s->nal_unit_type != s->first_nal_type) {
2730 av_log(s->avctx, AV_LOG_ERROR,
2731 "Non-matching NAL types of the VCL NALUs: %d %d\n",
2732 s->first_nal_type, s->nal_unit_type);
2733 return AVERROR_INVALIDDATA;
2736 if (!s->sh.dependent_slice_segment_flag &&
2737 s->sh.slice_type != I_SLICE) {
2738 ret = ff_hevc_slice_rpl(s);
2740 av_log(s->avctx, AV_LOG_WARNING,
2741 "Error constructing the reference lists for the current slice.\n");
2746 if (s->sh.first_slice_in_pic_flag && s->avctx->hwaccel) {
2747 ret = s->avctx->hwaccel->start_frame(s->avctx, NULL, 0);
2752 if (s->avctx->hwaccel) {
2753 ret = s->avctx->hwaccel->decode_slice(s->avctx, nal->raw_data, nal->raw_size);
2757 if (s->threads_number > 1 && s->sh.num_entry_point_offsets > 0)
2758 ctb_addr_ts = hls_slice_data_wpp(s, nal->data, nal->size);
2760 ctb_addr_ts = hls_slice_data(s);
2761 if (ctb_addr_ts >= (s->sps->ctb_width * s->sps->ctb_height)) {
2765 if (ctb_addr_ts < 0) {
2773 s->seq_decode = (s->seq_decode + 1) & 0xff;
2774 s->max_ra = INT_MAX;
2780 av_log(s->avctx, AV_LOG_INFO,
2781 "Skipping NAL unit %d\n", s->nal_unit_type);
2786 if (s->avctx->err_recognition & AV_EF_EXPLODE)
2791 /* FIXME: This is adapted from ff_h264_decode_nal, avoiding duplication
2792 * between these functions would be nice. */
2793 int ff_hevc_extract_rbsp(HEVCContext *s, const uint8_t *src, int length,
2799 s->skipped_bytes = 0;
2800 #define STARTCODE_TEST \
2801 if (i + 2 < length && src[i + 1] == 0 && src[i + 2] <= 3) { \
2802 if (src[i + 2] != 3) { \
2803 /* startcode, so we must be past the end */ \
2808 #if HAVE_FAST_UNALIGNED
2809 #define FIND_FIRST_ZERO \
2810 if (i > 0 && !src[i]) \
2815 for (i = 0; i + 1 < length; i += 9) {
2816 if (!((~AV_RN64A(src + i) &
2817 (AV_RN64A(src + i) - 0x0100010001000101ULL)) &
2818 0x8000800080008080ULL))
2825 for (i = 0; i + 1 < length; i += 5) {
2826 if (!((~AV_RN32A(src + i) &
2827 (AV_RN32A(src + i) - 0x01000101U)) &
2834 #endif /* HAVE_FAST_64BIT */
2836 for (i = 0; i + 1 < length; i += 2) {
2839 if (i > 0 && src[i - 1] == 0)
2843 #endif /* HAVE_FAST_UNALIGNED */
2845 if (i >= length - 1) { // no escaped 0
2847 nal->raw_data = src;
2849 nal->raw_size = length;
2853 av_fast_malloc(&nal->rbsp_buffer, &nal->rbsp_buffer_size,
2854 length + FF_INPUT_BUFFER_PADDING_SIZE);
2855 if (!nal->rbsp_buffer)
2856 return AVERROR(ENOMEM);
2858 dst = nal->rbsp_buffer;
2860 memcpy(dst, src, i);
2862 while (si + 2 < length) {
2863 // remove escapes (very rare 1:2^22)
2864 if (src[si + 2] > 3) {
2865 dst[di++] = src[si++];
2866 dst[di++] = src[si++];
2867 } else if (src[si] == 0 && src[si + 1] == 0) {
2868 if (src[si + 2] == 3) { // escape
2874 if (s->skipped_bytes_pos_size < s->skipped_bytes) {
2875 s->skipped_bytes_pos_size *= 2;
2876 av_reallocp_array(&s->skipped_bytes_pos,
2877 s->skipped_bytes_pos_size,
2878 sizeof(*s->skipped_bytes_pos));
2879 if (!s->skipped_bytes_pos)
2880 return AVERROR(ENOMEM);
2882 if (s->skipped_bytes_pos)
2883 s->skipped_bytes_pos[s->skipped_bytes-1] = di - 1;
2885 } else // next start code
2889 dst[di++] = src[si++];
2892 dst[di++] = src[si++];
2895 memset(dst + di, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2899 nal->raw_data = src;
2904 static int decode_nal_units(HEVCContext *s, const uint8_t *buf, int length)
2906 int i, consumed, ret = 0;
2909 s->last_eos = s->eos;
2912 /* split the input packet into NAL units, so we know the upper bound on the
2913 * number of slices in the frame */
2915 while (length >= 4) {
2917 int extract_length = 0;
2921 for (i = 0; i < s->nal_length_size; i++)
2922 extract_length = (extract_length << 8) | buf[i];
2923 buf += s->nal_length_size;
2924 length -= s->nal_length_size;
2926 if (extract_length > length) {
2927 av_log(s->avctx, AV_LOG_ERROR, "Invalid NAL unit size.\n");
2928 ret = AVERROR_INVALIDDATA;
2932 /* search start code */
2933 while (buf[0] != 0 || buf[1] != 0 || buf[2] != 1) {
2937 av_log(s->avctx, AV_LOG_ERROR, "No start code is found.\n");
2938 ret = AVERROR_INVALIDDATA;
2948 extract_length = length;
2950 if (s->nals_allocated < s->nb_nals + 1) {
2951 int new_size = s->nals_allocated + 1;
2952 void *tmp = av_realloc_array(s->nals, new_size, sizeof(*s->nals));
2953 ret = AVERROR(ENOMEM);
2958 memset(s->nals + s->nals_allocated, 0,
2959 (new_size - s->nals_allocated) * sizeof(*s->nals));
2961 tmp = av_realloc_array(s->skipped_bytes_nal, new_size, sizeof(*s->skipped_bytes_nal));
2964 s->skipped_bytes_nal = tmp;
2966 tmp = av_realloc_array(s->skipped_bytes_pos_size_nal, new_size, sizeof(*s->skipped_bytes_pos_size_nal));
2969 s->skipped_bytes_pos_size_nal = tmp;
2971 tmp = av_realloc_array(s->skipped_bytes_pos_nal, new_size, sizeof(*s->skipped_bytes_pos_nal));
2974 s->skipped_bytes_pos_nal = tmp;
2976 s->skipped_bytes_pos_size_nal[s->nals_allocated] = 1024; // initial buffer size
2977 s->skipped_bytes_pos_nal[s->nals_allocated] = av_malloc_array(s->skipped_bytes_pos_size_nal[s->nals_allocated], sizeof(*s->skipped_bytes_pos));
2978 if (!s->skipped_bytes_pos_nal[s->nals_allocated])
2980 s->nals_allocated = new_size;
2982 s->skipped_bytes_pos_size = s->skipped_bytes_pos_size_nal[s->nb_nals];
2983 s->skipped_bytes_pos = s->skipped_bytes_pos_nal[s->nb_nals];
2984 nal = &s->nals[s->nb_nals];
2986 consumed = ff_hevc_extract_rbsp(s, buf, extract_length, nal);
2988 s->skipped_bytes_nal[s->nb_nals] = s->skipped_bytes;
2989 s->skipped_bytes_pos_size_nal[s->nb_nals] = s->skipped_bytes_pos_size;
2990 s->skipped_bytes_pos_nal[s->nb_nals++] = s->skipped_bytes_pos;
2998 ret = init_get_bits8(&s->HEVClc->gb, nal->data, nal->size);
3003 if (s->nal_unit_type == NAL_EOB_NUT ||
3004 s->nal_unit_type == NAL_EOS_NUT)
3011 /* parse the NAL units */
3012 for (i = 0; i < s->nb_nals; i++) {
3014 s->skipped_bytes = s->skipped_bytes_nal[i];
3015 s->skipped_bytes_pos = s->skipped_bytes_pos_nal[i];
3017 ret = decode_nal_unit(s, &s->nals[i]);
3019 av_log(s->avctx, AV_LOG_WARNING,
3020 "Error parsing NAL unit #%d.\n", i);
3026 if (s->ref && s->threads_type == FF_THREAD_FRAME)
3027 ff_thread_report_progress(&s->ref->tf, INT_MAX, 0);
3032 static void print_md5(void *log_ctx, int level, uint8_t md5[16])
3035 for (i = 0; i < 16; i++)
3036 av_log(log_ctx, level, "%02"PRIx8, md5[i]);
3039 static int verify_md5(HEVCContext *s, AVFrame *frame)
3041 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format);
3046 return AVERROR(EINVAL);
3048 pixel_shift = desc->comp[0].depth_minus1 > 7;
3050 av_log(s->avctx, AV_LOG_DEBUG, "Verifying checksum for frame with POC %d: ",
3053 /* the checksums are LE, so we have to byteswap for >8bpp formats
3056 if (pixel_shift && !s->checksum_buf) {
3057 av_fast_malloc(&s->checksum_buf, &s->checksum_buf_size,
3058 FFMAX3(frame->linesize[0], frame->linesize[1],
3059 frame->linesize[2]));
3060 if (!s->checksum_buf)
3061 return AVERROR(ENOMEM);
3065 for (i = 0; frame->data[i]; i++) {
3066 int width = s->avctx->coded_width;
3067 int height = s->avctx->coded_height;
3068 int w = (i == 1 || i == 2) ? (width >> desc->log2_chroma_w) : width;
3069 int h = (i == 1 || i == 2) ? (height >> desc->log2_chroma_h) : height;
3072 av_md5_init(s->md5_ctx);
3073 for (j = 0; j < h; j++) {
3074 const uint8_t *src = frame->data[i] + j * frame->linesize[i];
3077 s->bdsp.bswap16_buf((uint16_t *) s->checksum_buf,
3078 (const uint16_t *) src, w);
3079 src = s->checksum_buf;
3082 av_md5_update(s->md5_ctx, src, w << pixel_shift);
3084 av_md5_final(s->md5_ctx, md5);
3086 if (!memcmp(md5, s->md5[i], 16)) {
3087 av_log (s->avctx, AV_LOG_DEBUG, "plane %d - correct ", i);
3088 print_md5(s->avctx, AV_LOG_DEBUG, md5);
3089 av_log (s->avctx, AV_LOG_DEBUG, "; ");
3091 av_log (s->avctx, AV_LOG_ERROR, "mismatching checksum of plane %d - ", i);
3092 print_md5(s->avctx, AV_LOG_ERROR, md5);
3093 av_log (s->avctx, AV_LOG_ERROR, " != ");
3094 print_md5(s->avctx, AV_LOG_ERROR, s->md5[i]);
3095 av_log (s->avctx, AV_LOG_ERROR, "\n");
3096 return AVERROR_INVALIDDATA;
3100 av_log(s->avctx, AV_LOG_DEBUG, "\n");
3105 static int hevc_decode_frame(AVCodecContext *avctx, void *data, int *got_output,
3109 HEVCContext *s = avctx->priv_data;
3112 ret = ff_hevc_output_frame(s, data, 1);
3121 ret = decode_nal_units(s, avpkt->data, avpkt->size);
3125 if (avctx->hwaccel) {
3126 if (s->ref && avctx->hwaccel->end_frame(avctx) < 0)
3127 av_log(avctx, AV_LOG_ERROR,
3128 "hardware accelerator failed to decode picture\n");
3130 /* verify the SEI checksum */
3131 if (avctx->err_recognition & AV_EF_CRCCHECK && s->is_decoded &&
3133 ret = verify_md5(s, s->ref->frame);
3134 if (ret < 0 && avctx->err_recognition & AV_EF_EXPLODE) {
3135 ff_hevc_unref_frame(s, s->ref, ~0);
3142 if (s->is_decoded) {
3143 av_log(avctx, AV_LOG_DEBUG, "Decoded frame with POC %d.\n", s->poc);
3147 if (s->output_frame->buf[0]) {
3148 av_frame_move_ref(data, s->output_frame);
3155 static int hevc_ref_frame(HEVCContext *s, HEVCFrame *dst, HEVCFrame *src)
3159 ret = ff_thread_ref_frame(&dst->tf, &src->tf);
3163 dst->tab_mvf_buf = av_buffer_ref(src->tab_mvf_buf);
3164 if (!dst->tab_mvf_buf)
3166 dst->tab_mvf = src->tab_mvf;
3168 dst->rpl_tab_buf = av_buffer_ref(src->rpl_tab_buf);
3169 if (!dst->rpl_tab_buf)
3171 dst->rpl_tab = src->rpl_tab;
3173 dst->rpl_buf = av_buffer_ref(src->rpl_buf);
3177 dst->poc = src->poc;
3178 dst->ctb_count = src->ctb_count;
3179 dst->window = src->window;
3180 dst->flags = src->flags;
3181 dst->sequence = src->sequence;
3183 if (src->hwaccel_picture_private) {
3184 dst->hwaccel_priv_buf = av_buffer_ref(src->hwaccel_priv_buf);
3185 if (!dst->hwaccel_priv_buf)
3187 dst->hwaccel_picture_private = dst->hwaccel_priv_buf->data;
3192 ff_hevc_unref_frame(s, dst, ~0);
3193 return AVERROR(ENOMEM);
3196 static av_cold int hevc_decode_free(AVCodecContext *avctx)
3198 HEVCContext *s = avctx->priv_data;
3203 av_freep(&s->md5_ctx);
3205 for(i=0; i < s->nals_allocated; i++) {
3206 av_freep(&s->skipped_bytes_pos_nal[i]);
3208 av_freep(&s->skipped_bytes_pos_size_nal);
3209 av_freep(&s->skipped_bytes_nal);
3210 av_freep(&s->skipped_bytes_pos_nal);
3212 av_freep(&s->cabac_state);
3214 #ifdef USE_SAO_SMALL_BUFFER
3215 for (i = 0; i < s->threads_number; i++) {
3216 av_freep(&s->HEVClcList[i]->sao_pixel_buffer);
3218 for (i = 0; i < 3; i++) {
3219 av_freep(&s->sao_pixel_buffer_h[i]);
3220 av_freep(&s->sao_pixel_buffer_v[i]);
3223 av_frame_free(&s->tmp_frame);
3225 av_frame_free(&s->output_frame);
3227 for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
3228 ff_hevc_unref_frame(s, &s->DPB[i], ~0);
3229 av_frame_free(&s->DPB[i].frame);
3232 for (i = 0; i < FF_ARRAY_ELEMS(s->vps_list); i++)
3233 av_buffer_unref(&s->vps_list[i]);
3234 for (i = 0; i < FF_ARRAY_ELEMS(s->sps_list); i++)
3235 av_buffer_unref(&s->sps_list[i]);
3236 for (i = 0; i < FF_ARRAY_ELEMS(s->pps_list); i++)
3237 av_buffer_unref(&s->pps_list[i]);
3242 av_buffer_unref(&s->current_sps);
3244 av_freep(&s->sh.entry_point_offset);
3245 av_freep(&s->sh.offset);
3246 av_freep(&s->sh.size);
3248 for (i = 1; i < s->threads_number; i++) {
3249 HEVCLocalContext *lc = s->HEVClcList[i];
3251 av_freep(&s->HEVClcList[i]);
3252 av_freep(&s->sList[i]);
3255 if (s->HEVClc == s->HEVClcList[0])
3257 av_freep(&s->HEVClcList[0]);
3259 for (i = 0; i < s->nals_allocated; i++)
3260 av_freep(&s->nals[i].rbsp_buffer);
3262 s->nals_allocated = 0;
3267 static av_cold int hevc_init_context(AVCodecContext *avctx)
3269 HEVCContext *s = avctx->priv_data;
3274 s->HEVClc = av_mallocz(sizeof(HEVCLocalContext));
3277 s->HEVClcList[0] = s->HEVClc;
3280 s->cabac_state = av_malloc(HEVC_CONTEXTS);
3281 if (!s->cabac_state)
3284 #ifndef USE_SAO_SMALL_BUFFER
3285 s->tmp_frame = av_frame_alloc();
3290 s->output_frame = av_frame_alloc();
3291 if (!s->output_frame)
3294 for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
3295 s->DPB[i].frame = av_frame_alloc();
3296 if (!s->DPB[i].frame)
3298 s->DPB[i].tf.f = s->DPB[i].frame;
3301 s->max_ra = INT_MAX;
3303 s->md5_ctx = av_md5_alloc();
3307 ff_bswapdsp_init(&s->bdsp);
3309 s->context_initialized = 1;
3315 hevc_decode_free(avctx);
3316 return AVERROR(ENOMEM);
3319 static int hevc_update_thread_context(AVCodecContext *dst,
3320 const AVCodecContext *src)
3322 HEVCContext *s = dst->priv_data;
3323 HEVCContext *s0 = src->priv_data;
3326 if (!s->context_initialized) {
3327 ret = hevc_init_context(dst);
3332 for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
3333 ff_hevc_unref_frame(s, &s->DPB[i], ~0);
3334 if (s0->DPB[i].frame->buf[0]) {
3335 ret = hevc_ref_frame(s, &s->DPB[i], &s0->DPB[i]);
3341 if (s->sps != s0->sps)
3343 for (i = 0; i < FF_ARRAY_ELEMS(s->vps_list); i++) {
3344 av_buffer_unref(&s->vps_list[i]);
3345 if (s0->vps_list[i]) {
3346 s->vps_list[i] = av_buffer_ref(s0->vps_list[i]);
3347 if (!s->vps_list[i])
3348 return AVERROR(ENOMEM);
3352 for (i = 0; i < FF_ARRAY_ELEMS(s->sps_list); i++) {
3353 av_buffer_unref(&s->sps_list[i]);
3354 if (s0->sps_list[i]) {
3355 s->sps_list[i] = av_buffer_ref(s0->sps_list[i]);
3356 if (!s->sps_list[i])
3357 return AVERROR(ENOMEM);
3361 for (i = 0; i < FF_ARRAY_ELEMS(s->pps_list); i++) {
3362 av_buffer_unref(&s->pps_list[i]);
3363 if (s0->pps_list[i]) {
3364 s->pps_list[i] = av_buffer_ref(s0->pps_list[i]);
3365 if (!s->pps_list[i])
3366 return AVERROR(ENOMEM);
3370 av_buffer_unref(&s->current_sps);
3371 if (s0->current_sps) {
3372 s->current_sps = av_buffer_ref(s0->current_sps);
3373 if (!s->current_sps)
3374 return AVERROR(ENOMEM);
3377 if (s->sps != s0->sps)
3378 if ((ret = set_sps(s, s0->sps)) < 0)
3381 s->seq_decode = s0->seq_decode;
3382 s->seq_output = s0->seq_output;
3383 s->pocTid0 = s0->pocTid0;
3384 s->max_ra = s0->max_ra;
3387 s->is_nalff = s0->is_nalff;
3388 s->nal_length_size = s0->nal_length_size;
3390 s->threads_number = s0->threads_number;
3391 s->threads_type = s0->threads_type;
3394 s->seq_decode = (s->seq_decode + 1) & 0xff;
3395 s->max_ra = INT_MAX;
3401 static int hevc_decode_extradata(HEVCContext *s)
3403 AVCodecContext *avctx = s->avctx;
3407 bytestream2_init(&gb, avctx->extradata, avctx->extradata_size);
3409 if (avctx->extradata_size > 3 &&
3410 (avctx->extradata[0] || avctx->extradata[1] ||
3411 avctx->extradata[2] > 1)) {
3412 /* It seems the extradata is encoded as hvcC format.
3413 * Temporarily, we support configurationVersion==0 until 14496-15 3rd
3414 * is finalized. When finalized, configurationVersion will be 1 and we
3415 * can recognize hvcC by checking if avctx->extradata[0]==1 or not. */
3416 int i, j, num_arrays, nal_len_size;
3420 bytestream2_skip(&gb, 21);
3421 nal_len_size = (bytestream2_get_byte(&gb) & 3) + 1;
3422 num_arrays = bytestream2_get_byte(&gb);
3424 /* nal units in the hvcC always have length coded with 2 bytes,
3425 * so put a fake nal_length_size = 2 while parsing them */
3426 s->nal_length_size = 2;
3428 /* Decode nal units from hvcC. */
3429 for (i = 0; i < num_arrays; i++) {
3430 int type = bytestream2_get_byte(&gb) & 0x3f;
3431 int cnt = bytestream2_get_be16(&gb);
3433 for (j = 0; j < cnt; j++) {
3434 // +2 for the nal size field
3435 int nalsize = bytestream2_peek_be16(&gb) + 2;
3436 if (bytestream2_get_bytes_left(&gb) < nalsize) {
3437 av_log(s->avctx, AV_LOG_ERROR,
3438 "Invalid NAL unit size in extradata.\n");
3439 return AVERROR_INVALIDDATA;
3442 ret = decode_nal_units(s, gb.buffer, nalsize);
3444 av_log(avctx, AV_LOG_ERROR,
3445 "Decoding nal unit %d %d from hvcC failed\n",
3449 bytestream2_skip(&gb, nalsize);
3453 /* Now store right nal length size, that will be used to parse
3455 s->nal_length_size = nal_len_size;
3458 ret = decode_nal_units(s, avctx->extradata, avctx->extradata_size);
3465 static av_cold int hevc_decode_init(AVCodecContext *avctx)
3467 HEVCContext *s = avctx->priv_data;
3470 ff_init_cabac_states();
3472 avctx->internal->allocate_progress = 1;
3474 ret = hevc_init_context(avctx);
3478 s->enable_parallel_tiles = 0;
3479 s->picture_struct = 0;
3481 if(avctx->active_thread_type & FF_THREAD_SLICE)
3482 s->threads_number = avctx->thread_count;
3484 s->threads_number = 1;
3486 if (avctx->extradata_size > 0 && avctx->extradata) {
3487 ret = hevc_decode_extradata(s);
3489 hevc_decode_free(avctx);
3494 if((avctx->active_thread_type & FF_THREAD_FRAME) && avctx->thread_count > 1)
3495 s->threads_type = FF_THREAD_FRAME;
3497 s->threads_type = FF_THREAD_SLICE;
3502 static av_cold int hevc_init_thread_copy(AVCodecContext *avctx)
3504 HEVCContext *s = avctx->priv_data;
3507 memset(s, 0, sizeof(*s));
3509 ret = hevc_init_context(avctx);
3516 static void hevc_decode_flush(AVCodecContext *avctx)
3518 HEVCContext *s = avctx->priv_data;
3519 ff_hevc_flush_dpb(s);
3520 s->max_ra = INT_MAX;
3523 #define OFFSET(x) offsetof(HEVCContext, x)
3524 #define PAR (AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
3526 static const AVProfile profiles[] = {
3527 { FF_PROFILE_HEVC_MAIN, "Main" },
3528 { FF_PROFILE_HEVC_MAIN_10, "Main 10" },
3529 { FF_PROFILE_HEVC_MAIN_STILL_PICTURE, "Main Still Picture" },
3530 { FF_PROFILE_HEVC_REXT, "Rext" },
3531 { FF_PROFILE_UNKNOWN },
3534 static const AVOption options[] = {
3535 { "apply_defdispwin", "Apply default display window from VUI", OFFSET(apply_defdispwin),
3536 AV_OPT_TYPE_INT, {.i64 = 0}, 0, 1, PAR },
3537 { "strict-displaywin", "stricly apply default display window size", OFFSET(apply_defdispwin),
3538 AV_OPT_TYPE_INT, {.i64 = 0}, 0, 1, PAR },
3542 static const AVClass hevc_decoder_class = {
3543 .class_name = "HEVC decoder",
3544 .item_name = av_default_item_name,
3546 .version = LIBAVUTIL_VERSION_INT,
3549 AVCodec ff_hevc_decoder = {
3551 .long_name = NULL_IF_CONFIG_SMALL("HEVC (High Efficiency Video Coding)"),
3552 .type = AVMEDIA_TYPE_VIDEO,
3553 .id = AV_CODEC_ID_HEVC,
3554 .priv_data_size = sizeof(HEVCContext),
3555 .priv_class = &hevc_decoder_class,
3556 .init = hevc_decode_init,
3557 .close = hevc_decode_free,
3558 .decode = hevc_decode_frame,
3559 .flush = hevc_decode_flush,
3560 .update_thread_context = hevc_update_thread_context,
3561 .init_thread_copy = hevc_init_thread_copy,
3562 .capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY |
3563 CODEC_CAP_SLICE_THREADS | CODEC_CAP_FRAME_THREADS,
3564 .profiles = NULL_IF_CONFIG_SMALL(profiles),