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 Libav.
11 * Libav 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 * Libav 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 Libav; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
26 #include "libavutil/attributes.h"
27 #include "libavutil/common.h"
28 #include "libavutil/display.h"
29 #include "libavutil/internal.h"
30 #include "libavutil/md5.h"
31 #include "libavutil/opt.h"
32 #include "libavutil/pixdesc.h"
33 #include "libavutil/stereo3d.h"
36 #include "bytestream.h"
37 #include "cabac_functions.h"
38 #include "golomb_legacy.h"
40 #include "hevc_data.h"
45 const uint8_t ff_hevc_qpel_extra_before[4] = { 0, 3, 3, 3 };
46 const uint8_t ff_hevc_qpel_extra_after[4] = { 0, 4, 4, 4 };
47 const uint8_t ff_hevc_qpel_extra[4] = { 0, 7, 7, 7 };
49 static const uint8_t scan_1x1[1] = { 0 };
51 static const uint8_t horiz_scan2x2_x[4] = { 0, 1, 0, 1 };
53 static const uint8_t horiz_scan2x2_y[4] = { 0, 0, 1, 1 };
55 static const uint8_t horiz_scan4x4_x[16] = {
62 static const uint8_t horiz_scan4x4_y[16] = {
69 static const uint8_t horiz_scan8x8_inv[8][8] = {
70 { 0, 1, 2, 3, 16, 17, 18, 19, },
71 { 4, 5, 6, 7, 20, 21, 22, 23, },
72 { 8, 9, 10, 11, 24, 25, 26, 27, },
73 { 12, 13, 14, 15, 28, 29, 30, 31, },
74 { 32, 33, 34, 35, 48, 49, 50, 51, },
75 { 36, 37, 38, 39, 52, 53, 54, 55, },
76 { 40, 41, 42, 43, 56, 57, 58, 59, },
77 { 44, 45, 46, 47, 60, 61, 62, 63, },
80 static const uint8_t diag_scan2x2_x[4] = { 0, 0, 1, 1 };
82 static const uint8_t diag_scan2x2_y[4] = { 0, 1, 0, 1 };
84 static const uint8_t diag_scan2x2_inv[2][2] = {
89 static const uint8_t diag_scan4x4_inv[4][4] = {
96 static const uint8_t diag_scan8x8_inv[8][8] = {
97 { 0, 2, 5, 9, 14, 20, 27, 35, },
98 { 1, 4, 8, 13, 19, 26, 34, 42, },
99 { 3, 7, 12, 18, 25, 33, 41, 48, },
100 { 6, 11, 17, 24, 32, 40, 47, 53, },
101 { 10, 16, 23, 31, 39, 46, 52, 57, },
102 { 15, 22, 30, 38, 45, 51, 56, 60, },
103 { 21, 29, 37, 44, 50, 55, 59, 62, },
104 { 28, 36, 43, 49, 54, 58, 61, 63, },
108 * NOTE: Each function hls_foo correspond to the function foo in the
109 * specification (HLS stands for High Level Syntax).
116 /* free everything allocated by pic_arrays_init() */
117 static void pic_arrays_free(HEVCContext *s)
120 av_freep(&s->deblock);
122 av_freep(&s->skip_flag);
123 av_freep(&s->tab_ct_depth);
125 av_freep(&s->tab_ipm);
126 av_freep(&s->cbf_luma);
127 av_freep(&s->is_pcm);
129 av_freep(&s->qp_y_tab);
130 av_freep(&s->tab_slice_address);
131 av_freep(&s->filter_slice_edges);
133 av_freep(&s->horizontal_bs);
134 av_freep(&s->vertical_bs);
136 av_buffer_pool_uninit(&s->tab_mvf_pool);
137 av_buffer_pool_uninit(&s->rpl_tab_pool);
140 /* allocate arrays that depend on frame dimensions */
141 static int pic_arrays_init(HEVCContext *s, const HEVCSPS *sps)
143 int log2_min_cb_size = sps->log2_min_cb_size;
144 int width = sps->width;
145 int height = sps->height;
146 int pic_size_in_ctb = ((width >> log2_min_cb_size) + 1) *
147 ((height >> log2_min_cb_size) + 1);
148 int ctb_count = sps->ctb_width * sps->ctb_height;
149 int min_pu_size = sps->min_pu_width * sps->min_pu_height;
151 s->bs_width = width >> 3;
152 s->bs_height = height >> 3;
154 s->sao = av_mallocz_array(ctb_count, sizeof(*s->sao));
155 s->deblock = av_mallocz_array(ctb_count, sizeof(*s->deblock));
156 if (!s->sao || !s->deblock)
159 s->skip_flag = av_malloc(pic_size_in_ctb);
160 s->tab_ct_depth = av_malloc(sps->min_cb_height * sps->min_cb_width);
161 if (!s->skip_flag || !s->tab_ct_depth)
164 s->cbf_luma = av_malloc(sps->min_tb_width * sps->min_tb_height);
165 s->tab_ipm = av_mallocz(min_pu_size);
166 s->is_pcm = av_malloc(min_pu_size);
167 if (!s->tab_ipm || !s->cbf_luma || !s->is_pcm)
170 s->filter_slice_edges = av_malloc(ctb_count);
171 s->tab_slice_address = av_malloc(pic_size_in_ctb *
172 sizeof(*s->tab_slice_address));
173 s->qp_y_tab = av_malloc(pic_size_in_ctb *
174 sizeof(*s->qp_y_tab));
175 if (!s->qp_y_tab || !s->filter_slice_edges || !s->tab_slice_address)
178 s->horizontal_bs = av_mallocz(2 * s->bs_width * (s->bs_height + 1));
179 s->vertical_bs = av_mallocz(2 * s->bs_width * (s->bs_height + 1));
180 if (!s->horizontal_bs || !s->vertical_bs)
183 s->tab_mvf_pool = av_buffer_pool_init(min_pu_size * sizeof(MvField),
185 s->rpl_tab_pool = av_buffer_pool_init(ctb_count * sizeof(RefPicListTab),
187 if (!s->tab_mvf_pool || !s->rpl_tab_pool)
194 return AVERROR(ENOMEM);
197 static void pred_weight_table(HEVCContext *s, GetBitContext *gb)
201 uint8_t luma_weight_l0_flag[16];
202 uint8_t chroma_weight_l0_flag[16];
203 uint8_t luma_weight_l1_flag[16];
204 uint8_t chroma_weight_l1_flag[16];
206 s->sh.luma_log2_weight_denom = av_clip(get_ue_golomb_long(gb), 0, 7);
207 if (s->ps.sps->chroma_format_idc != 0) {
208 int delta = get_se_golomb(gb);
209 s->sh.chroma_log2_weight_denom = av_clip(s->sh.luma_log2_weight_denom + delta, 0, 7);
212 for (i = 0; i < s->sh.nb_refs[L0]; i++) {
213 luma_weight_l0_flag[i] = get_bits1(gb);
214 if (!luma_weight_l0_flag[i]) {
215 s->sh.luma_weight_l0[i] = 1 << s->sh.luma_log2_weight_denom;
216 s->sh.luma_offset_l0[i] = 0;
219 if (s->ps.sps->chroma_format_idc != 0) { // FIXME: invert "if" and "for"
220 for (i = 0; i < s->sh.nb_refs[L0]; i++)
221 chroma_weight_l0_flag[i] = get_bits1(gb);
223 for (i = 0; i < s->sh.nb_refs[L0]; i++)
224 chroma_weight_l0_flag[i] = 0;
226 for (i = 0; i < s->sh.nb_refs[L0]; i++) {
227 if (luma_weight_l0_flag[i]) {
228 int delta_luma_weight_l0 = get_se_golomb(gb);
229 s->sh.luma_weight_l0[i] = (1 << s->sh.luma_log2_weight_denom) + delta_luma_weight_l0;
230 s->sh.luma_offset_l0[i] = get_se_golomb(gb);
232 if (chroma_weight_l0_flag[i]) {
233 for (j = 0; j < 2; j++) {
234 int delta_chroma_weight_l0 = get_se_golomb(gb);
235 int delta_chroma_offset_l0 = get_se_golomb(gb);
236 s->sh.chroma_weight_l0[i][j] = (1 << s->sh.chroma_log2_weight_denom) + delta_chroma_weight_l0;
237 s->sh.chroma_offset_l0[i][j] = av_clip((delta_chroma_offset_l0 - ((128 * s->sh.chroma_weight_l0[i][j])
238 >> s->sh.chroma_log2_weight_denom) + 128), -128, 127);
241 s->sh.chroma_weight_l0[i][0] = 1 << s->sh.chroma_log2_weight_denom;
242 s->sh.chroma_offset_l0[i][0] = 0;
243 s->sh.chroma_weight_l0[i][1] = 1 << s->sh.chroma_log2_weight_denom;
244 s->sh.chroma_offset_l0[i][1] = 0;
247 if (s->sh.slice_type == HEVC_SLICE_B) {
248 for (i = 0; i < s->sh.nb_refs[L1]; i++) {
249 luma_weight_l1_flag[i] = get_bits1(gb);
250 if (!luma_weight_l1_flag[i]) {
251 s->sh.luma_weight_l1[i] = 1 << s->sh.luma_log2_weight_denom;
252 s->sh.luma_offset_l1[i] = 0;
255 if (s->ps.sps->chroma_format_idc != 0) {
256 for (i = 0; i < s->sh.nb_refs[L1]; i++)
257 chroma_weight_l1_flag[i] = get_bits1(gb);
259 for (i = 0; i < s->sh.nb_refs[L1]; i++)
260 chroma_weight_l1_flag[i] = 0;
262 for (i = 0; i < s->sh.nb_refs[L1]; i++) {
263 if (luma_weight_l1_flag[i]) {
264 int delta_luma_weight_l1 = get_se_golomb(gb);
265 s->sh.luma_weight_l1[i] = (1 << s->sh.luma_log2_weight_denom) + delta_luma_weight_l1;
266 s->sh.luma_offset_l1[i] = get_se_golomb(gb);
268 if (chroma_weight_l1_flag[i]) {
269 for (j = 0; j < 2; j++) {
270 int delta_chroma_weight_l1 = get_se_golomb(gb);
271 int delta_chroma_offset_l1 = get_se_golomb(gb);
272 s->sh.chroma_weight_l1[i][j] = (1 << s->sh.chroma_log2_weight_denom) + delta_chroma_weight_l1;
273 s->sh.chroma_offset_l1[i][j] = av_clip((delta_chroma_offset_l1 - ((128 * s->sh.chroma_weight_l1[i][j])
274 >> s->sh.chroma_log2_weight_denom) + 128), -128, 127);
277 s->sh.chroma_weight_l1[i][0] = 1 << s->sh.chroma_log2_weight_denom;
278 s->sh.chroma_offset_l1[i][0] = 0;
279 s->sh.chroma_weight_l1[i][1] = 1 << s->sh.chroma_log2_weight_denom;
280 s->sh.chroma_offset_l1[i][1] = 0;
286 static int decode_lt_rps(HEVCContext *s, LongTermRPS *rps, GetBitContext *gb)
288 const HEVCSPS *sps = s->ps.sps;
289 int max_poc_lsb = 1 << sps->log2_max_poc_lsb;
290 int prev_delta_msb = 0;
291 unsigned int nb_sps = 0, nb_sh;
295 if (!sps->long_term_ref_pics_present_flag)
298 if (sps->num_long_term_ref_pics_sps > 0)
299 nb_sps = get_ue_golomb_long(gb);
300 nb_sh = get_ue_golomb_long(gb);
302 if (nb_sh + nb_sps > FF_ARRAY_ELEMS(rps->poc))
303 return AVERROR_INVALIDDATA;
305 rps->nb_refs = nb_sh + nb_sps;
307 for (i = 0; i < rps->nb_refs; i++) {
308 uint8_t delta_poc_msb_present;
311 uint8_t lt_idx_sps = 0;
313 if (sps->num_long_term_ref_pics_sps > 1)
314 lt_idx_sps = get_bits(gb, av_ceil_log2(sps->num_long_term_ref_pics_sps));
316 rps->poc[i] = sps->lt_ref_pic_poc_lsb_sps[lt_idx_sps];
317 rps->used[i] = sps->used_by_curr_pic_lt_sps_flag[lt_idx_sps];
319 rps->poc[i] = get_bits(gb, sps->log2_max_poc_lsb);
320 rps->used[i] = get_bits1(gb);
323 delta_poc_msb_present = get_bits1(gb);
324 if (delta_poc_msb_present) {
325 int delta = get_ue_golomb_long(gb);
327 if (i && i != nb_sps)
328 delta += prev_delta_msb;
330 rps->poc[i] += s->poc - delta * max_poc_lsb - s->sh.pic_order_cnt_lsb;
331 prev_delta_msb = delta;
338 static void export_stream_params(AVCodecContext *avctx, const HEVCParamSets *ps,
341 const HEVCVPS *vps = (const HEVCVPS*)ps->vps_list[sps->vps_id]->data;
342 const HEVCWindow *ow = &sps->output_window;
343 unsigned int num = 0, den = 0;
345 avctx->pix_fmt = sps->pix_fmt;
346 avctx->coded_width = sps->width;
347 avctx->coded_height = sps->height;
348 avctx->width = sps->width - ow->left_offset - ow->right_offset;
349 avctx->height = sps->height - ow->top_offset - ow->bottom_offset;
350 avctx->has_b_frames = sps->temporal_layer[sps->max_sub_layers - 1].num_reorder_pics;
351 avctx->profile = sps->ptl.general_ptl.profile_idc;
352 avctx->level = sps->ptl.general_ptl.level_idc;
354 ff_set_sar(avctx, sps->vui.sar);
356 if (sps->vui.video_signal_type_present_flag)
357 avctx->color_range = sps->vui.video_full_range_flag ? AVCOL_RANGE_JPEG
360 avctx->color_range = AVCOL_RANGE_MPEG;
362 if (sps->vui.colour_description_present_flag) {
363 avctx->color_primaries = sps->vui.colour_primaries;
364 avctx->color_trc = sps->vui.transfer_characteristic;
365 avctx->colorspace = sps->vui.matrix_coeffs;
367 avctx->color_primaries = AVCOL_PRI_UNSPECIFIED;
368 avctx->color_trc = AVCOL_TRC_UNSPECIFIED;
369 avctx->colorspace = AVCOL_SPC_UNSPECIFIED;
372 if (vps->vps_timing_info_present_flag) {
373 num = vps->vps_num_units_in_tick;
374 den = vps->vps_time_scale;
375 } else if (sps->vui.vui_timing_info_present_flag) {
376 num = sps->vui.vui_num_units_in_tick;
377 den = sps->vui.vui_time_scale;
380 if (num != 0 && den != 0)
381 av_reduce(&avctx->framerate.den, &avctx->framerate.num,
385 static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
387 #define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + CONFIG_HEVC_D3D11VA_HWACCEL * 2 + \
388 CONFIG_HEVC_VAAPI_HWACCEL + CONFIG_HEVC_VDPAU_HWACCEL + \
389 CONFIG_HEVC_CUVID_HWACCEL)
390 enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmt = pix_fmts;
392 if (sps->pix_fmt == AV_PIX_FMT_YUV420P || sps->pix_fmt == AV_PIX_FMT_YUVJ420P ||
393 sps->pix_fmt == AV_PIX_FMT_YUV420P10) {
394 #if CONFIG_HEVC_D3D11VA_HWACCEL
395 *fmt++ = AV_PIX_FMT_D3D11VA_VLD;
396 *fmt++ = AV_PIX_FMT_D3D11;
398 #if CONFIG_HEVC_DXVA2_HWACCEL
399 *fmt++ = AV_PIX_FMT_DXVA2_VLD;
401 #if CONFIG_HEVC_VAAPI_HWACCEL
402 *fmt++ = AV_PIX_FMT_VAAPI;
404 #if CONFIG_HEVC_CUVID_HWACCEL && HAVE_CUVIDDECODECREATEINFO_BITDEPTHMINUS8
405 *fmt++ = AV_PIX_FMT_CUDA;
408 if (sps->pix_fmt == AV_PIX_FMT_YUV420P || sps->pix_fmt == AV_PIX_FMT_YUVJ420P) {
409 #if CONFIG_HEVC_CUVID_HWACCEL && !HAVE_CUVIDDECODECREATEINFO_BITDEPTHMINUS8
410 *fmt++ = AV_PIX_FMT_CUDA;
412 #if CONFIG_HEVC_VDPAU_HWACCEL
413 *fmt++ = AV_PIX_FMT_VDPAU;
417 *fmt++ = sps->pix_fmt;
418 *fmt = AV_PIX_FMT_NONE;
420 return ff_get_format(s->avctx, pix_fmts);
423 static int set_sps(HEVCContext *s, const HEVCSPS *sps,
424 enum AVPixelFormat pix_fmt)
435 ret = pic_arrays_init(s, sps);
439 export_stream_params(s->avctx, &s->ps, sps);
441 s->avctx->pix_fmt = pix_fmt;
443 ff_hevc_pred_init(&s->hpc, sps->bit_depth);
444 ff_hevc_dsp_init (&s->hevcdsp, sps->bit_depth);
445 ff_videodsp_init (&s->vdsp, sps->bit_depth);
447 if (sps->sao_enabled && !s->avctx->hwaccel) {
448 av_frame_unref(s->tmp_frame);
449 ret = ff_get_buffer(s->avctx, s->tmp_frame, AV_GET_BUFFER_FLAG_REF);
452 s->frame = s->tmp_frame;
456 s->ps.vps = (HEVCVPS*) s->ps.vps_list[s->ps.sps->vps_id]->data;
466 static int hls_slice_header(HEVCContext *s)
468 GetBitContext *gb = &s->HEVClc.gb;
469 SliceHeader *sh = &s->sh;
473 sh->first_slice_in_pic_flag = get_bits1(gb);
474 if ((IS_IDR(s) || IS_BLA(s)) && sh->first_slice_in_pic_flag) {
475 s->seq_decode = (s->seq_decode + 1) & 0xff;
478 ff_hevc_clear_refs(s);
481 sh->no_output_of_prior_pics_flag = get_bits1(gb);
483 sh->pps_id = get_ue_golomb_long(gb);
484 if (sh->pps_id >= HEVC_MAX_PPS_COUNT || !s->ps.pps_list[sh->pps_id]) {
485 av_log(s->avctx, AV_LOG_ERROR, "PPS id out of range: %d\n", sh->pps_id);
486 return AVERROR_INVALIDDATA;
488 if (!sh->first_slice_in_pic_flag &&
489 s->ps.pps != (HEVCPPS*)s->ps.pps_list[sh->pps_id]->data) {
490 av_log(s->avctx, AV_LOG_ERROR, "PPS changed between slices.\n");
491 return AVERROR_INVALIDDATA;
493 s->ps.pps = (HEVCPPS*)s->ps.pps_list[sh->pps_id]->data;
495 if (s->ps.sps != (HEVCSPS*)s->ps.sps_list[s->ps.pps->sps_id]->data) {
496 const HEVCSPS *sps = (HEVCSPS*)s->ps.sps_list[s->ps.pps->sps_id]->data;
497 enum AVPixelFormat pix_fmt;
499 ff_hevc_clear_refs(s);
501 ret = set_sps(s, sps, sps->pix_fmt);
505 pix_fmt = get_format(s, sps);
508 s->avctx->pix_fmt = pix_fmt;
510 s->seq_decode = (s->seq_decode + 1) & 0xff;
514 sh->dependent_slice_segment_flag = 0;
515 if (!sh->first_slice_in_pic_flag) {
516 int slice_address_length;
518 if (s->ps.pps->dependent_slice_segments_enabled_flag)
519 sh->dependent_slice_segment_flag = get_bits1(gb);
521 slice_address_length = av_ceil_log2(s->ps.sps->ctb_width *
522 s->ps.sps->ctb_height);
523 sh->slice_segment_addr = slice_address_length ? get_bits(gb, slice_address_length) : 0;
524 if (sh->slice_segment_addr >= s->ps.sps->ctb_width * s->ps.sps->ctb_height) {
525 av_log(s->avctx, AV_LOG_ERROR,
526 "Invalid slice segment address: %u.\n",
527 sh->slice_segment_addr);
528 return AVERROR_INVALIDDATA;
531 if (!sh->dependent_slice_segment_flag) {
532 sh->slice_addr = sh->slice_segment_addr;
536 sh->slice_segment_addr = sh->slice_addr = 0;
538 s->slice_initialized = 0;
541 if (!sh->dependent_slice_segment_flag) {
542 s->slice_initialized = 0;
544 for (i = 0; i < s->ps.pps->num_extra_slice_header_bits; i++)
545 skip_bits(gb, 1); // slice_reserved_undetermined_flag[]
547 sh->slice_type = get_ue_golomb_long(gb);
548 if (!(sh->slice_type == HEVC_SLICE_I ||
549 sh->slice_type == HEVC_SLICE_P ||
550 sh->slice_type == HEVC_SLICE_B)) {
551 av_log(s->avctx, AV_LOG_ERROR, "Unknown slice type: %d.\n",
553 return AVERROR_INVALIDDATA;
555 if (IS_IRAP(s) && sh->slice_type != HEVC_SLICE_I) {
556 av_log(s->avctx, AV_LOG_ERROR, "Inter slices in an IRAP frame.\n");
557 return AVERROR_INVALIDDATA;
560 // when flag is not present, picture is inferred to be output
561 sh->pic_output_flag = 1;
562 if (s->ps.pps->output_flag_present_flag)
563 sh->pic_output_flag = get_bits1(gb);
565 if (s->ps.sps->separate_colour_plane_flag)
566 sh->colour_plane_id = get_bits(gb, 2);
571 sh->pic_order_cnt_lsb = get_bits(gb, s->ps.sps->log2_max_poc_lsb);
572 poc = ff_hevc_compute_poc(s, sh->pic_order_cnt_lsb);
573 if (!sh->first_slice_in_pic_flag && poc != s->poc) {
574 av_log(s->avctx, AV_LOG_WARNING,
575 "Ignoring POC change between slices: %d -> %d\n", s->poc, poc);
576 if (s->avctx->err_recognition & AV_EF_EXPLODE)
577 return AVERROR_INVALIDDATA;
582 sh->short_term_ref_pic_set_sps_flag = get_bits1(gb);
583 pos = get_bits_left(gb);
584 if (!sh->short_term_ref_pic_set_sps_flag) {
585 ret = ff_hevc_decode_short_term_rps(gb, s->avctx, &sh->slice_rps, s->ps.sps, 1);
589 sh->short_term_rps = &sh->slice_rps;
591 int numbits, rps_idx;
593 if (!s->ps.sps->nb_st_rps) {
594 av_log(s->avctx, AV_LOG_ERROR, "No ref lists in the SPS.\n");
595 return AVERROR_INVALIDDATA;
598 numbits = av_ceil_log2(s->ps.sps->nb_st_rps);
599 rps_idx = numbits > 0 ? get_bits(gb, numbits) : 0;
600 sh->short_term_rps = &s->ps.sps->st_rps[rps_idx];
602 sh->short_term_ref_pic_set_size = pos - get_bits_left(gb);
604 pos = get_bits_left(gb);
605 ret = decode_lt_rps(s, &sh->long_term_rps, gb);
607 av_log(s->avctx, AV_LOG_WARNING, "Invalid long term RPS.\n");
608 if (s->avctx->err_recognition & AV_EF_EXPLODE)
609 return AVERROR_INVALIDDATA;
611 sh->long_term_ref_pic_set_size = pos - get_bits_left(gb);
613 if (s->ps.sps->sps_temporal_mvp_enabled_flag)
614 sh->slice_temporal_mvp_enabled_flag = get_bits1(gb);
616 sh->slice_temporal_mvp_enabled_flag = 0;
618 s->sh.short_term_rps = NULL;
623 if (s->temporal_id == 0 &&
624 s->nal_unit_type != HEVC_NAL_TRAIL_N &&
625 s->nal_unit_type != HEVC_NAL_TSA_N &&
626 s->nal_unit_type != HEVC_NAL_STSA_N &&
627 s->nal_unit_type != HEVC_NAL_RADL_N &&
628 s->nal_unit_type != HEVC_NAL_RADL_R &&
629 s->nal_unit_type != HEVC_NAL_RASL_N &&
630 s->nal_unit_type != HEVC_NAL_RASL_R)
633 if (s->ps.sps->sao_enabled) {
634 sh->slice_sample_adaptive_offset_flag[0] = get_bits1(gb);
635 sh->slice_sample_adaptive_offset_flag[1] =
636 sh->slice_sample_adaptive_offset_flag[2] = get_bits1(gb);
638 sh->slice_sample_adaptive_offset_flag[0] = 0;
639 sh->slice_sample_adaptive_offset_flag[1] = 0;
640 sh->slice_sample_adaptive_offset_flag[2] = 0;
643 sh->nb_refs[L0] = sh->nb_refs[L1] = 0;
644 if (sh->slice_type == HEVC_SLICE_P || sh->slice_type == HEVC_SLICE_B) {
647 sh->nb_refs[L0] = s->ps.pps->num_ref_idx_l0_default_active;
648 if (sh->slice_type == HEVC_SLICE_B)
649 sh->nb_refs[L1] = s->ps.pps->num_ref_idx_l1_default_active;
651 if (get_bits1(gb)) { // num_ref_idx_active_override_flag
652 sh->nb_refs[L0] = get_ue_golomb_long(gb) + 1;
653 if (sh->slice_type == HEVC_SLICE_B)
654 sh->nb_refs[L1] = get_ue_golomb_long(gb) + 1;
656 if (sh->nb_refs[L0] > HEVC_MAX_REFS || sh->nb_refs[L1] > HEVC_MAX_REFS) {
657 av_log(s->avctx, AV_LOG_ERROR, "Too many refs: %d/%d.\n",
658 sh->nb_refs[L0], sh->nb_refs[L1]);
659 return AVERROR_INVALIDDATA;
662 sh->rpl_modification_flag[0] = 0;
663 sh->rpl_modification_flag[1] = 0;
664 nb_refs = ff_hevc_frame_nb_refs(s);
666 av_log(s->avctx, AV_LOG_ERROR, "Zero refs for a frame with P or B slices.\n");
667 return AVERROR_INVALIDDATA;
670 if (s->ps.pps->lists_modification_present_flag && nb_refs > 1) {
671 sh->rpl_modification_flag[0] = get_bits1(gb);
672 if (sh->rpl_modification_flag[0]) {
673 for (i = 0; i < sh->nb_refs[L0]; i++)
674 sh->list_entry_lx[0][i] = get_bits(gb, av_ceil_log2(nb_refs));
677 if (sh->slice_type == HEVC_SLICE_B) {
678 sh->rpl_modification_flag[1] = get_bits1(gb);
679 if (sh->rpl_modification_flag[1] == 1)
680 for (i = 0; i < sh->nb_refs[L1]; i++)
681 sh->list_entry_lx[1][i] = get_bits(gb, av_ceil_log2(nb_refs));
685 if (sh->slice_type == HEVC_SLICE_B)
686 sh->mvd_l1_zero_flag = get_bits1(gb);
688 if (s->ps.pps->cabac_init_present_flag)
689 sh->cabac_init_flag = get_bits1(gb);
691 sh->cabac_init_flag = 0;
693 sh->collocated_ref_idx = 0;
694 if (sh->slice_temporal_mvp_enabled_flag) {
695 sh->collocated_list = L0;
696 if (sh->slice_type == HEVC_SLICE_B)
697 sh->collocated_list = !get_bits1(gb);
699 if (sh->nb_refs[sh->collocated_list] > 1) {
700 sh->collocated_ref_idx = get_ue_golomb_long(gb);
701 if (sh->collocated_ref_idx >= sh->nb_refs[sh->collocated_list]) {
702 av_log(s->avctx, AV_LOG_ERROR,
703 "Invalid collocated_ref_idx: %d.\n",
704 sh->collocated_ref_idx);
705 return AVERROR_INVALIDDATA;
710 if ((s->ps.pps->weighted_pred_flag && sh->slice_type == HEVC_SLICE_P) ||
711 (s->ps.pps->weighted_bipred_flag && sh->slice_type == HEVC_SLICE_B)) {
712 pred_weight_table(s, gb);
715 sh->max_num_merge_cand = 5 - get_ue_golomb_long(gb);
716 if (sh->max_num_merge_cand < 1 || sh->max_num_merge_cand > 5) {
717 av_log(s->avctx, AV_LOG_ERROR,
718 "Invalid number of merging MVP candidates: %d.\n",
719 sh->max_num_merge_cand);
720 return AVERROR_INVALIDDATA;
724 sh->slice_qp_delta = get_se_golomb(gb);
726 if (s->ps.pps->pic_slice_level_chroma_qp_offsets_present_flag) {
727 sh->slice_cb_qp_offset = get_se_golomb(gb);
728 sh->slice_cr_qp_offset = get_se_golomb(gb);
730 sh->slice_cb_qp_offset = 0;
731 sh->slice_cr_qp_offset = 0;
734 if (s->ps.pps->deblocking_filter_control_present_flag) {
735 int deblocking_filter_override_flag = 0;
737 if (s->ps.pps->deblocking_filter_override_enabled_flag)
738 deblocking_filter_override_flag = get_bits1(gb);
740 if (deblocking_filter_override_flag) {
741 sh->disable_deblocking_filter_flag = get_bits1(gb);
742 if (!sh->disable_deblocking_filter_flag) {
743 sh->beta_offset = get_se_golomb(gb) * 2;
744 sh->tc_offset = get_se_golomb(gb) * 2;
747 sh->disable_deblocking_filter_flag = s->ps.pps->disable_dbf;
748 sh->beta_offset = s->ps.pps->beta_offset;
749 sh->tc_offset = s->ps.pps->tc_offset;
752 sh->disable_deblocking_filter_flag = 0;
757 if (s->ps.pps->seq_loop_filter_across_slices_enabled_flag &&
758 (sh->slice_sample_adaptive_offset_flag[0] ||
759 sh->slice_sample_adaptive_offset_flag[1] ||
760 !sh->disable_deblocking_filter_flag)) {
761 sh->slice_loop_filter_across_slices_enabled_flag = get_bits1(gb);
763 sh->slice_loop_filter_across_slices_enabled_flag = s->ps.pps->seq_loop_filter_across_slices_enabled_flag;
765 } else if (!s->slice_initialized) {
766 av_log(s->avctx, AV_LOG_ERROR, "Independent slice segment missing.\n");
767 return AVERROR_INVALIDDATA;
770 sh->num_entry_point_offsets = 0;
771 if (s->ps.pps->tiles_enabled_flag || s->ps.pps->entropy_coding_sync_enabled_flag) {
772 sh->num_entry_point_offsets = get_ue_golomb_long(gb);
773 if (sh->num_entry_point_offsets > 0) {
774 int offset_len = get_ue_golomb_long(gb) + 1;
776 for (i = 0; i < sh->num_entry_point_offsets; i++)
777 skip_bits(gb, offset_len);
781 if (s->ps.pps->slice_header_extension_present_flag) {
782 unsigned int length = get_ue_golomb_long(gb);
783 for (i = 0; i < length; i++)
784 skip_bits(gb, 8); // slice_header_extension_data_byte
787 // Inferred parameters
788 sh->slice_qp = 26 + s->ps.pps->pic_init_qp_minus26 + sh->slice_qp_delta;
789 if (sh->slice_qp > 51 ||
790 sh->slice_qp < -s->ps.sps->qp_bd_offset) {
791 av_log(s->avctx, AV_LOG_ERROR,
792 "The slice_qp %d is outside the valid range "
795 -s->ps.sps->qp_bd_offset);
796 return AVERROR_INVALIDDATA;
799 sh->slice_ctb_addr_rs = sh->slice_segment_addr;
801 if (!s->sh.slice_ctb_addr_rs && s->sh.dependent_slice_segment_flag) {
802 av_log(s->avctx, AV_LOG_ERROR, "Impossible slice segment.\n");
803 return AVERROR_INVALIDDATA;
806 s->HEVClc.first_qp_group = !s->sh.dependent_slice_segment_flag;
808 if (!s->ps.pps->cu_qp_delta_enabled_flag)
809 s->HEVClc.qp_y = FFUMOD(s->sh.slice_qp + 52 + 2 * s->ps.sps->qp_bd_offset,
810 52 + s->ps.sps->qp_bd_offset) - s->ps.sps->qp_bd_offset;
812 s->slice_initialized = 1;
817 #define CTB(tab, x, y) ((tab)[(y) * s->ps.sps->ctb_width + (x)])
819 #define SET_SAO(elem, value) \
821 if (!sao_merge_up_flag && !sao_merge_left_flag) \
823 else if (sao_merge_left_flag) \
824 sao->elem = CTB(s->sao, rx-1, ry).elem; \
825 else if (sao_merge_up_flag) \
826 sao->elem = CTB(s->sao, rx, ry-1).elem; \
831 static void hls_sao_param(HEVCContext *s, int rx, int ry)
833 HEVCLocalContext *lc = &s->HEVClc;
834 int sao_merge_left_flag = 0;
835 int sao_merge_up_flag = 0;
836 int shift = s->ps.sps->bit_depth - FFMIN(s->ps.sps->bit_depth, 10);
837 SAOParams *sao = &CTB(s->sao, rx, ry);
840 if (s->sh.slice_sample_adaptive_offset_flag[0] ||
841 s->sh.slice_sample_adaptive_offset_flag[1]) {
843 if (lc->ctb_left_flag)
844 sao_merge_left_flag = ff_hevc_sao_merge_flag_decode(s);
846 if (ry > 0 && !sao_merge_left_flag) {
848 sao_merge_up_flag = ff_hevc_sao_merge_flag_decode(s);
852 for (c_idx = 0; c_idx < 3; c_idx++) {
853 if (!s->sh.slice_sample_adaptive_offset_flag[c_idx]) {
854 sao->type_idx[c_idx] = SAO_NOT_APPLIED;
859 sao->type_idx[2] = sao->type_idx[1];
860 sao->eo_class[2] = sao->eo_class[1];
862 SET_SAO(type_idx[c_idx], ff_hevc_sao_type_idx_decode(s));
865 if (sao->type_idx[c_idx] == SAO_NOT_APPLIED)
868 for (i = 0; i < 4; i++)
869 SET_SAO(offset_abs[c_idx][i], ff_hevc_sao_offset_abs_decode(s));
871 if (sao->type_idx[c_idx] == SAO_BAND) {
872 for (i = 0; i < 4; i++) {
873 if (sao->offset_abs[c_idx][i]) {
874 SET_SAO(offset_sign[c_idx][i],
875 ff_hevc_sao_offset_sign_decode(s));
877 sao->offset_sign[c_idx][i] = 0;
880 SET_SAO(band_position[c_idx], ff_hevc_sao_band_position_decode(s));
881 } else if (c_idx != 2) {
882 SET_SAO(eo_class[c_idx], ff_hevc_sao_eo_class_decode(s));
885 // Inferred parameters
886 sao->offset_val[c_idx][0] = 0;
887 for (i = 0; i < 4; i++) {
888 sao->offset_val[c_idx][i + 1] = sao->offset_abs[c_idx][i] << shift;
889 if (sao->type_idx[c_idx] == SAO_EDGE) {
891 sao->offset_val[c_idx][i + 1] = -sao->offset_val[c_idx][i + 1];
892 } else if (sao->offset_sign[c_idx][i]) {
893 sao->offset_val[c_idx][i + 1] = -sao->offset_val[c_idx][i + 1];
902 static void hls_residual_coding(HEVCContext *s, int x0, int y0,
903 int log2_trafo_size, enum ScanType scan_idx,
906 #define GET_COORD(offset, n) \
908 x_c = (scan_x_cg[offset >> 4] << 2) + scan_x_off[n]; \
909 y_c = (scan_y_cg[offset >> 4] << 2) + scan_y_off[n]; \
911 HEVCLocalContext *lc = &s->HEVClc;
912 int transform_skip_flag = 0;
914 int last_significant_coeff_x, last_significant_coeff_y;
918 int greater1_ctx = 1;
921 int x_cg_last_sig, y_cg_last_sig;
923 const uint8_t *scan_x_cg, *scan_y_cg, *scan_x_off, *scan_y_off;
925 ptrdiff_t stride = s->frame->linesize[c_idx];
926 int hshift = s->ps.sps->hshift[c_idx];
927 int vshift = s->ps.sps->vshift[c_idx];
928 uint8_t *dst = &s->frame->data[c_idx][(y0 >> vshift) * stride +
929 ((x0 >> hshift) << s->ps.sps->pixel_shift)];
930 LOCAL_ALIGNED_32(int16_t, coeffs, [MAX_TB_SIZE * MAX_TB_SIZE]);
931 LOCAL_ALIGNED_8(uint8_t, significant_coeff_group_flag, [8], [8]);
933 int trafo_size = 1 << log2_trafo_size;
934 int i, qp, shift, add, scale, scale_m;
935 static const uint8_t level_scale[] = { 40, 45, 51, 57, 64, 72 };
936 const uint8_t *scale_matrix;
939 memset(coeffs, 0, sizeof(int16_t) * MAX_TB_SIZE * MAX_TB_SIZE);
940 memset(significant_coeff_group_flag, 0, sizeof(uint8_t) * 8 * 8);
941 // Derive QP for dequant
942 if (!lc->cu.cu_transquant_bypass_flag) {
943 static const int qp_c[] = {
944 29, 30, 31, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37
947 static const uint8_t rem6[51 + 2 * 6 + 1] = {
948 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2,
949 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5,
950 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3,
953 static const uint8_t div6[51 + 2 * 6 + 1] = {
954 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3,
955 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6,
956 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10,
961 qp = qp_y + s->ps.sps->qp_bd_offset;
966 offset = s->ps.pps->cb_qp_offset + s->sh.slice_cb_qp_offset;
968 offset = s->ps.pps->cr_qp_offset + s->sh.slice_cr_qp_offset;
970 qp_i = av_clip(qp_y + offset, -s->ps.sps->qp_bd_offset, 57);
976 qp = qp_c[qp_i - 30];
978 qp += s->ps.sps->qp_bd_offset;
981 shift = s->ps.sps->bit_depth + log2_trafo_size - 5;
982 add = 1 << (shift - 1);
983 scale = level_scale[rem6[qp]] << (div6[qp]);
984 scale_m = 16; // default when no custom scaling lists.
987 if (s->ps.sps->scaling_list_enable_flag) {
988 const ScalingList *sl = s->ps.pps->scaling_list_data_present_flag ?
989 &s->ps.pps->scaling_list : &s->ps.sps->scaling_list;
990 int matrix_id = lc->cu.pred_mode != MODE_INTRA;
992 if (log2_trafo_size != 5)
993 matrix_id = 3 * matrix_id + c_idx;
995 scale_matrix = sl->sl[log2_trafo_size - 2][matrix_id];
996 if (log2_trafo_size >= 4)
997 dc_scale = sl->sl_dc[log2_trafo_size - 4][matrix_id];
1001 if (s->ps.pps->transform_skip_enabled_flag &&
1002 !lc->cu.cu_transquant_bypass_flag &&
1003 log2_trafo_size == 2) {
1004 transform_skip_flag = ff_hevc_transform_skip_flag_decode(s, c_idx);
1007 last_significant_coeff_x =
1008 ff_hevc_last_significant_coeff_x_prefix_decode(s, c_idx, log2_trafo_size);
1009 last_significant_coeff_y =
1010 ff_hevc_last_significant_coeff_y_prefix_decode(s, c_idx, log2_trafo_size);
1012 if (last_significant_coeff_x > 3) {
1013 int suffix = ff_hevc_last_significant_coeff_suffix_decode(s, last_significant_coeff_x);
1014 last_significant_coeff_x = (1 << ((last_significant_coeff_x >> 1) - 1)) *
1015 (2 + (last_significant_coeff_x & 1)) +
1019 if (last_significant_coeff_y > 3) {
1020 int suffix = ff_hevc_last_significant_coeff_suffix_decode(s, last_significant_coeff_y);
1021 last_significant_coeff_y = (1 << ((last_significant_coeff_y >> 1) - 1)) *
1022 (2 + (last_significant_coeff_y & 1)) +
1026 if (scan_idx == SCAN_VERT)
1027 FFSWAP(int, last_significant_coeff_x, last_significant_coeff_y);
1029 x_cg_last_sig = last_significant_coeff_x >> 2;
1030 y_cg_last_sig = last_significant_coeff_y >> 2;
1034 int last_x_c = last_significant_coeff_x & 3;
1035 int last_y_c = last_significant_coeff_y & 3;
1037 scan_x_off = ff_hevc_diag_scan4x4_x;
1038 scan_y_off = ff_hevc_diag_scan4x4_y;
1039 num_coeff = diag_scan4x4_inv[last_y_c][last_x_c];
1040 if (trafo_size == 4) {
1041 scan_x_cg = scan_1x1;
1042 scan_y_cg = scan_1x1;
1043 } else if (trafo_size == 8) {
1044 num_coeff += diag_scan2x2_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1045 scan_x_cg = diag_scan2x2_x;
1046 scan_y_cg = diag_scan2x2_y;
1047 } else if (trafo_size == 16) {
1048 num_coeff += diag_scan4x4_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1049 scan_x_cg = ff_hevc_diag_scan4x4_x;
1050 scan_y_cg = ff_hevc_diag_scan4x4_y;
1051 } else { // trafo_size == 32
1052 num_coeff += diag_scan8x8_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1053 scan_x_cg = ff_hevc_diag_scan8x8_x;
1054 scan_y_cg = ff_hevc_diag_scan8x8_y;
1059 scan_x_cg = horiz_scan2x2_x;
1060 scan_y_cg = horiz_scan2x2_y;
1061 scan_x_off = horiz_scan4x4_x;
1062 scan_y_off = horiz_scan4x4_y;
1063 num_coeff = horiz_scan8x8_inv[last_significant_coeff_y][last_significant_coeff_x];
1065 default: //SCAN_VERT
1066 scan_x_cg = horiz_scan2x2_y;
1067 scan_y_cg = horiz_scan2x2_x;
1068 scan_x_off = horiz_scan4x4_y;
1069 scan_y_off = horiz_scan4x4_x;
1070 num_coeff = horiz_scan8x8_inv[last_significant_coeff_x][last_significant_coeff_y];
1074 num_last_subset = (num_coeff - 1) >> 4;
1076 for (i = num_last_subset; i >= 0; i--) {
1078 int x_cg, y_cg, x_c, y_c;
1079 int implicit_non_zero_coeff = 0;
1080 int64_t trans_coeff_level;
1082 int offset = i << 4;
1084 uint8_t significant_coeff_flag_idx[16];
1085 uint8_t nb_significant_coeff_flag = 0;
1087 x_cg = scan_x_cg[i];
1088 y_cg = scan_y_cg[i];
1090 if (i < num_last_subset && i > 0) {
1092 if (x_cg < (1 << (log2_trafo_size - 2)) - 1)
1093 ctx_cg += significant_coeff_group_flag[x_cg + 1][y_cg];
1094 if (y_cg < (1 << (log2_trafo_size - 2)) - 1)
1095 ctx_cg += significant_coeff_group_flag[x_cg][y_cg + 1];
1097 significant_coeff_group_flag[x_cg][y_cg] =
1098 ff_hevc_significant_coeff_group_flag_decode(s, c_idx, ctx_cg);
1099 implicit_non_zero_coeff = 1;
1101 significant_coeff_group_flag[x_cg][y_cg] =
1102 ((x_cg == x_cg_last_sig && y_cg == y_cg_last_sig) ||
1103 (x_cg == 0 && y_cg == 0));
1106 last_scan_pos = num_coeff - offset - 1;
1108 if (i == num_last_subset) {
1109 n_end = last_scan_pos - 1;
1110 significant_coeff_flag_idx[0] = last_scan_pos;
1111 nb_significant_coeff_flag = 1;
1116 if (x_cg < ((1 << log2_trafo_size) - 1) >> 2)
1117 prev_sig = significant_coeff_group_flag[x_cg + 1][y_cg];
1118 if (y_cg < ((1 << log2_trafo_size) - 1) >> 2)
1119 prev_sig += significant_coeff_group_flag[x_cg][y_cg + 1] << 1;
1121 for (n = n_end; n >= 0; n--) {
1122 GET_COORD(offset, n);
1124 if (significant_coeff_group_flag[x_cg][y_cg] &&
1125 (n > 0 || implicit_non_zero_coeff == 0)) {
1126 if (ff_hevc_significant_coeff_flag_decode(s, c_idx, x_c, y_c,
1130 significant_coeff_flag_idx[nb_significant_coeff_flag] = n;
1131 nb_significant_coeff_flag++;
1132 implicit_non_zero_coeff = 0;
1135 int last_cg = (x_c == (x_cg << 2) && y_c == (y_cg << 2));
1136 if (last_cg && implicit_non_zero_coeff && significant_coeff_group_flag[x_cg][y_cg]) {
1137 significant_coeff_flag_idx[nb_significant_coeff_flag] = n;
1138 nb_significant_coeff_flag++;
1143 n_end = nb_significant_coeff_flag;
1146 int first_nz_pos_in_cg = 16;
1147 int last_nz_pos_in_cg = -1;
1148 int c_rice_param = 0;
1149 int first_greater1_coeff_idx = -1;
1150 uint8_t coeff_abs_level_greater1_flag[16] = { 0 };
1151 uint16_t coeff_sign_flag;
1153 int sign_hidden = 0;
1155 // initialize first elem of coeff_bas_level_greater1_flag
1156 int ctx_set = (i > 0 && c_idx == 0) ? 2 : 0;
1158 if (!(i == num_last_subset) && greater1_ctx == 0)
1161 last_nz_pos_in_cg = significant_coeff_flag_idx[0];
1163 for (m = 0; m < (n_end > 8 ? 8 : n_end); m++) {
1164 int n_idx = significant_coeff_flag_idx[m];
1165 int inc = (ctx_set << 2) + greater1_ctx;
1166 coeff_abs_level_greater1_flag[n_idx] =
1167 ff_hevc_coeff_abs_level_greater1_flag_decode(s, c_idx, inc);
1168 if (coeff_abs_level_greater1_flag[n_idx]) {
1170 } else if (greater1_ctx > 0 && greater1_ctx < 3) {
1174 if (coeff_abs_level_greater1_flag[n_idx] &&
1175 first_greater1_coeff_idx == -1)
1176 first_greater1_coeff_idx = n_idx;
1178 first_nz_pos_in_cg = significant_coeff_flag_idx[n_end - 1];
1179 sign_hidden = last_nz_pos_in_cg - first_nz_pos_in_cg >= 4 &&
1180 !lc->cu.cu_transquant_bypass_flag;
1182 if (first_greater1_coeff_idx != -1) {
1183 coeff_abs_level_greater1_flag[first_greater1_coeff_idx] += ff_hevc_coeff_abs_level_greater2_flag_decode(s, c_idx, ctx_set);
1185 if (!s->ps.pps->sign_data_hiding_flag || !sign_hidden) {
1186 coeff_sign_flag = ff_hevc_coeff_sign_flag(s, nb_significant_coeff_flag) << (16 - nb_significant_coeff_flag);
1188 coeff_sign_flag = ff_hevc_coeff_sign_flag(s, nb_significant_coeff_flag - 1) << (16 - (nb_significant_coeff_flag - 1));
1191 for (m = 0; m < n_end; m++) {
1192 n = significant_coeff_flag_idx[m];
1193 GET_COORD(offset, n);
1194 trans_coeff_level = 1 + coeff_abs_level_greater1_flag[n];
1195 if (trans_coeff_level == ((m < 8) ?
1196 ((n == first_greater1_coeff_idx) ? 3 : 2) : 1)) {
1197 trans_coeff_level += ff_hevc_coeff_abs_level_remaining(s, trans_coeff_level, c_rice_param);
1198 if ((trans_coeff_level) > (3 * (1 << c_rice_param)))
1199 c_rice_param = FFMIN(c_rice_param + 1, 4);
1201 if (s->ps.pps->sign_data_hiding_flag && sign_hidden) {
1202 sum_abs += trans_coeff_level;
1203 if (n == first_nz_pos_in_cg && ((sum_abs & 1) == 1))
1204 trans_coeff_level = -trans_coeff_level;
1206 if (coeff_sign_flag >> 15)
1207 trans_coeff_level = -trans_coeff_level;
1208 coeff_sign_flag <<= 1;
1209 if (!lc->cu.cu_transquant_bypass_flag) {
1210 if (s->ps.sps->scaling_list_enable_flag) {
1211 if (y_c || x_c || log2_trafo_size < 4) {
1213 switch (log2_trafo_size) {
1214 case 3: pos = (y_c << 3) + x_c; break;
1215 case 4: pos = ((y_c >> 1) << 3) + (x_c >> 1); break;
1216 case 5: pos = ((y_c >> 2) << 3) + (x_c >> 2); break;
1217 default: pos = (y_c << 2) + x_c;
1219 scale_m = scale_matrix[pos];
1224 trans_coeff_level = (trans_coeff_level * (int64_t)scale * (int64_t)scale_m + add) >> shift;
1225 if(trans_coeff_level < 0) {
1226 if((~trans_coeff_level) & 0xFffffffffff8000)
1227 trans_coeff_level = -32768;
1229 if (trans_coeff_level & 0xffffffffffff8000)
1230 trans_coeff_level = 32767;
1233 coeffs[y_c * trafo_size + x_c] = trans_coeff_level;
1238 if (!lc->cu.cu_transquant_bypass_flag) {
1239 if (transform_skip_flag)
1240 s->hevcdsp.dequant(coeffs);
1241 else if (lc->cu.pred_mode == MODE_INTRA && c_idx == 0 &&
1242 log2_trafo_size == 2)
1243 s->hevcdsp.transform_4x4_luma(coeffs);
1245 int max_xy = FFMAX(last_significant_coeff_x, last_significant_coeff_y);
1247 s->hevcdsp.idct_dc[log2_trafo_size - 2](coeffs);
1249 int col_limit = last_significant_coeff_x + last_significant_coeff_y + 4;
1251 col_limit = FFMIN(4, col_limit);
1252 else if (max_xy < 8)
1253 col_limit = FFMIN(8, col_limit);
1254 else if (max_xy < 12)
1255 col_limit = FFMIN(24, col_limit);
1256 s->hevcdsp.idct[log2_trafo_size - 2](coeffs, col_limit);
1260 s->hevcdsp.add_residual[log2_trafo_size - 2](dst, coeffs, stride);
1263 static int hls_transform_unit(HEVCContext *s, int x0, int y0,
1264 int xBase, int yBase, int cb_xBase, int cb_yBase,
1265 int log2_cb_size, int log2_trafo_size,
1266 int blk_idx, int cbf_luma, int cbf_cb, int cbf_cr)
1268 HEVCLocalContext *lc = &s->HEVClc;
1270 if (lc->cu.pred_mode == MODE_INTRA) {
1271 int trafo_size = 1 << log2_trafo_size;
1272 ff_hevc_set_neighbour_available(s, x0, y0, trafo_size, trafo_size);
1274 s->hpc.intra_pred[log2_trafo_size - 2](s, x0, y0, 0);
1275 if (log2_trafo_size > 2) {
1276 trafo_size = trafo_size << (s->ps.sps->hshift[1] - 1);
1277 ff_hevc_set_neighbour_available(s, x0, y0, trafo_size, trafo_size);
1278 s->hpc.intra_pred[log2_trafo_size - 3](s, x0, y0, 1);
1279 s->hpc.intra_pred[log2_trafo_size - 3](s, x0, y0, 2);
1280 } else if (blk_idx == 3) {
1281 trafo_size = trafo_size << s->ps.sps->hshift[1];
1282 ff_hevc_set_neighbour_available(s, xBase, yBase,
1283 trafo_size, trafo_size);
1284 s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase, 1);
1285 s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase, 2);
1289 if (cbf_luma || cbf_cb || cbf_cr) {
1290 int scan_idx = SCAN_DIAG;
1291 int scan_idx_c = SCAN_DIAG;
1293 if (s->ps.pps->cu_qp_delta_enabled_flag && !lc->tu.is_cu_qp_delta_coded) {
1294 lc->tu.cu_qp_delta = ff_hevc_cu_qp_delta_abs(s);
1295 if (lc->tu.cu_qp_delta != 0)
1296 if (ff_hevc_cu_qp_delta_sign_flag(s) == 1)
1297 lc->tu.cu_qp_delta = -lc->tu.cu_qp_delta;
1298 lc->tu.is_cu_qp_delta_coded = 1;
1300 if (lc->tu.cu_qp_delta < -(26 + s->ps.sps->qp_bd_offset / 2) ||
1301 lc->tu.cu_qp_delta > (25 + s->ps.sps->qp_bd_offset / 2)) {
1302 av_log(s->avctx, AV_LOG_ERROR,
1303 "The cu_qp_delta %d is outside the valid range "
1306 -(26 + s->ps.sps->qp_bd_offset / 2),
1307 (25 + s->ps.sps->qp_bd_offset / 2));
1308 return AVERROR_INVALIDDATA;
1311 ff_hevc_set_qPy(s, x0, y0, cb_xBase, cb_yBase, log2_cb_size);
1314 if (lc->cu.pred_mode == MODE_INTRA && log2_trafo_size < 4) {
1315 if (lc->tu.cur_intra_pred_mode >= 6 &&
1316 lc->tu.cur_intra_pred_mode <= 14) {
1317 scan_idx = SCAN_VERT;
1318 } else if (lc->tu.cur_intra_pred_mode >= 22 &&
1319 lc->tu.cur_intra_pred_mode <= 30) {
1320 scan_idx = SCAN_HORIZ;
1323 if (lc->pu.intra_pred_mode_c >= 6 &&
1324 lc->pu.intra_pred_mode_c <= 14) {
1325 scan_idx_c = SCAN_VERT;
1326 } else if (lc->pu.intra_pred_mode_c >= 22 &&
1327 lc->pu.intra_pred_mode_c <= 30) {
1328 scan_idx_c = SCAN_HORIZ;
1333 hls_residual_coding(s, x0, y0, log2_trafo_size, scan_idx, 0);
1334 if (log2_trafo_size > 2) {
1336 hls_residual_coding(s, x0, y0, log2_trafo_size - 1, scan_idx_c, 1);
1338 hls_residual_coding(s, x0, y0, log2_trafo_size - 1, scan_idx_c, 2);
1339 } else if (blk_idx == 3) {
1341 hls_residual_coding(s, xBase, yBase, log2_trafo_size, scan_idx_c, 1);
1343 hls_residual_coding(s, xBase, yBase, log2_trafo_size, scan_idx_c, 2);
1349 static void set_deblocking_bypass(HEVCContext *s, int x0, int y0, int log2_cb_size)
1351 int cb_size = 1 << log2_cb_size;
1352 int log2_min_pu_size = s->ps.sps->log2_min_pu_size;
1354 int min_pu_width = s->ps.sps->min_pu_width;
1355 int x_end = FFMIN(x0 + cb_size, s->ps.sps->width);
1356 int y_end = FFMIN(y0 + cb_size, s->ps.sps->height);
1359 for (j = (y0 >> log2_min_pu_size); j < (y_end >> log2_min_pu_size); j++)
1360 for (i = (x0 >> log2_min_pu_size); i < (x_end >> log2_min_pu_size); i++)
1361 s->is_pcm[i + j * min_pu_width] = 2;
1364 static int hls_transform_tree(HEVCContext *s, int x0, int y0,
1365 int xBase, int yBase, int cb_xBase, int cb_yBase,
1366 int log2_cb_size, int log2_trafo_size,
1367 int trafo_depth, int blk_idx,
1368 int cbf_cb, int cbf_cr)
1370 HEVCLocalContext *lc = &s->HEVClc;
1371 uint8_t split_transform_flag;
1374 if (lc->cu.intra_split_flag) {
1375 if (trafo_depth == 1)
1376 lc->tu.cur_intra_pred_mode = lc->pu.intra_pred_mode[blk_idx];
1378 lc->tu.cur_intra_pred_mode = lc->pu.intra_pred_mode[0];
1381 if (log2_trafo_size <= s->ps.sps->log2_max_trafo_size &&
1382 log2_trafo_size > s->ps.sps->log2_min_tb_size &&
1383 trafo_depth < lc->cu.max_trafo_depth &&
1384 !(lc->cu.intra_split_flag && trafo_depth == 0)) {
1385 split_transform_flag = ff_hevc_split_transform_flag_decode(s, log2_trafo_size);
1387 int inter_split = s->ps.sps->max_transform_hierarchy_depth_inter == 0 &&
1388 lc->cu.pred_mode == MODE_INTER &&
1389 lc->cu.part_mode != PART_2Nx2N &&
1392 split_transform_flag = log2_trafo_size > s->ps.sps->log2_max_trafo_size ||
1393 (lc->cu.intra_split_flag && trafo_depth == 0) ||
1397 if (log2_trafo_size > 2 && (trafo_depth == 0 || cbf_cb))
1398 cbf_cb = ff_hevc_cbf_cb_cr_decode(s, trafo_depth);
1399 else if (log2_trafo_size > 2 || trafo_depth == 0)
1401 if (log2_trafo_size > 2 && (trafo_depth == 0 || cbf_cr))
1402 cbf_cr = ff_hevc_cbf_cb_cr_decode(s, trafo_depth);
1403 else if (log2_trafo_size > 2 || trafo_depth == 0)
1406 if (split_transform_flag) {
1407 const int trafo_size_split = 1 << (log2_trafo_size - 1);
1408 const int x1 = x0 + trafo_size_split;
1409 const int y1 = y0 + trafo_size_split;
1411 #define SUBDIVIDE(x, y, idx) \
1413 ret = hls_transform_tree(s, x, y, x0, y0, cb_xBase, cb_yBase, log2_cb_size, \
1414 log2_trafo_size - 1, trafo_depth + 1, idx, \
1420 SUBDIVIDE(x0, y0, 0);
1421 SUBDIVIDE(x1, y0, 1);
1422 SUBDIVIDE(x0, y1, 2);
1423 SUBDIVIDE(x1, y1, 3);
1427 int min_tu_size = 1 << s->ps.sps->log2_min_tb_size;
1428 int log2_min_tu_size = s->ps.sps->log2_min_tb_size;
1429 int min_tu_width = s->ps.sps->min_tb_width;
1432 if (lc->cu.pred_mode == MODE_INTRA || trafo_depth != 0 ||
1434 cbf_luma = ff_hevc_cbf_luma_decode(s, trafo_depth);
1436 ret = hls_transform_unit(s, x0, y0, xBase, yBase, cb_xBase, cb_yBase,
1437 log2_cb_size, log2_trafo_size,
1438 blk_idx, cbf_luma, cbf_cb, cbf_cr);
1441 // TODO: store cbf_luma somewhere else
1444 for (i = 0; i < (1 << log2_trafo_size); i += min_tu_size)
1445 for (j = 0; j < (1 << log2_trafo_size); j += min_tu_size) {
1446 int x_tu = (x0 + j) >> log2_min_tu_size;
1447 int y_tu = (y0 + i) >> log2_min_tu_size;
1448 s->cbf_luma[y_tu * min_tu_width + x_tu] = 1;
1451 if (!s->sh.disable_deblocking_filter_flag) {
1452 ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_trafo_size);
1453 if (s->ps.pps->transquant_bypass_enable_flag &&
1454 lc->cu.cu_transquant_bypass_flag)
1455 set_deblocking_bypass(s, x0, y0, log2_trafo_size);
1461 static int hls_pcm_sample(HEVCContext *s, int x0, int y0, int log2_cb_size)
1463 //TODO: non-4:2:0 support
1464 HEVCLocalContext *lc = &s->HEVClc;
1466 int cb_size = 1 << log2_cb_size;
1467 ptrdiff_t stride0 = s->frame->linesize[0];
1468 ptrdiff_t stride1 = s->frame->linesize[1];
1469 ptrdiff_t stride2 = s->frame->linesize[2];
1470 uint8_t *dst0 = &s->frame->data[0][y0 * stride0 + (x0 << s->ps.sps->pixel_shift)];
1471 uint8_t *dst1 = &s->frame->data[1][(y0 >> s->ps.sps->vshift[1]) * stride1 + ((x0 >> s->ps.sps->hshift[1]) << s->ps.sps->pixel_shift)];
1472 uint8_t *dst2 = &s->frame->data[2][(y0 >> s->ps.sps->vshift[2]) * stride2 + ((x0 >> s->ps.sps->hshift[2]) << s->ps.sps->pixel_shift)];
1474 int length = cb_size * cb_size * s->ps.sps->pcm.bit_depth + ((cb_size * cb_size) >> 1) * s->ps.sps->pcm.bit_depth_chroma;
1475 const uint8_t *pcm = skip_bytes(&lc->cc, (length + 7) >> 3);
1478 if (!s->sh.disable_deblocking_filter_flag)
1479 ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_cb_size);
1481 ret = init_get_bits(&gb, pcm, length);
1485 s->hevcdsp.put_pcm(dst0, stride0, cb_size, &gb, s->ps.sps->pcm.bit_depth);
1486 s->hevcdsp.put_pcm(dst1, stride1, cb_size / 2, &gb, s->ps.sps->pcm.bit_depth_chroma);
1487 s->hevcdsp.put_pcm(dst2, stride2, cb_size / 2, &gb, s->ps.sps->pcm.bit_depth_chroma);
1491 static void hls_mvd_coding(HEVCContext *s, int x0, int y0, int log2_cb_size)
1493 HEVCLocalContext *lc = &s->HEVClc;
1494 int x = ff_hevc_abs_mvd_greater0_flag_decode(s);
1495 int y = ff_hevc_abs_mvd_greater0_flag_decode(s);
1498 x += ff_hevc_abs_mvd_greater1_flag_decode(s);
1500 y += ff_hevc_abs_mvd_greater1_flag_decode(s);
1503 case 2: lc->pu.mvd.x = ff_hevc_mvd_decode(s); break;
1504 case 1: lc->pu.mvd.x = ff_hevc_mvd_sign_flag_decode(s); break;
1505 case 0: lc->pu.mvd.x = 0; break;
1509 case 2: lc->pu.mvd.y = ff_hevc_mvd_decode(s); break;
1510 case 1: lc->pu.mvd.y = ff_hevc_mvd_sign_flag_decode(s); break;
1511 case 0: lc->pu.mvd.y = 0; break;
1516 * 8.5.3.2.2.1 Luma sample interpolation process
1518 * @param s HEVC decoding context
1519 * @param dst target buffer for block data at block position
1520 * @param dststride stride of the dst buffer
1521 * @param ref reference picture buffer at origin (0, 0)
1522 * @param mv motion vector (relative to block position) to get pixel data from
1523 * @param x_off horizontal position of block from origin (0, 0)
1524 * @param y_off vertical position of block from origin (0, 0)
1525 * @param block_w width of block
1526 * @param block_h height of block
1528 static void luma_mc(HEVCContext *s, int16_t *dst, ptrdiff_t dststride,
1529 AVFrame *ref, const Mv *mv, int x_off, int y_off,
1530 int block_w, int block_h, int pred_idx)
1532 HEVCLocalContext *lc = &s->HEVClc;
1533 uint8_t *src = ref->data[0];
1534 ptrdiff_t srcstride = ref->linesize[0];
1535 int pic_width = s->ps.sps->width;
1536 int pic_height = s->ps.sps->height;
1540 int extra_left = ff_hevc_qpel_extra_before[mx];
1541 int extra_top = ff_hevc_qpel_extra_before[my];
1543 x_off += mv->x >> 2;
1544 y_off += mv->y >> 2;
1545 src += y_off * srcstride + (x_off * (1 << s->ps.sps->pixel_shift));
1547 if (x_off < extra_left || y_off < extra_top ||
1548 x_off >= pic_width - block_w - ff_hevc_qpel_extra_after[mx] ||
1549 y_off >= pic_height - block_h - ff_hevc_qpel_extra_after[my]) {
1550 const ptrdiff_t edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->ps.sps->pixel_shift;
1551 int offset = extra_top * srcstride + (extra_left << s->ps.sps->pixel_shift);
1552 int buf_offset = extra_top *
1553 edge_emu_stride + (extra_left << s->ps.sps->pixel_shift);
1555 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src - offset,
1556 edge_emu_stride, srcstride,
1557 block_w + ff_hevc_qpel_extra[mx],
1558 block_h + ff_hevc_qpel_extra[my],
1559 x_off - extra_left, y_off - extra_top,
1560 pic_width, pic_height);
1561 src = lc->edge_emu_buffer + buf_offset;
1562 srcstride = edge_emu_stride;
1564 s->hevcdsp.put_hevc_qpel[!!my][!!mx][pred_idx](dst, dststride, src, srcstride,
1565 block_h, mx, my, lc->mc_buffer);
1569 * 8.5.3.2.2.2 Chroma sample interpolation process
1571 * @param s HEVC decoding context
1572 * @param dst1 target buffer for block data at block position (U plane)
1573 * @param dst2 target buffer for block data at block position (V plane)
1574 * @param dststride stride of the dst1 and dst2 buffers
1575 * @param ref reference picture buffer at origin (0, 0)
1576 * @param mv motion vector (relative to block position) to get pixel data from
1577 * @param x_off horizontal position of block from origin (0, 0)
1578 * @param y_off vertical position of block from origin (0, 0)
1579 * @param block_w width of block
1580 * @param block_h height of block
1582 static void chroma_mc(HEVCContext *s, int16_t *dst1, int16_t *dst2,
1583 ptrdiff_t dststride, AVFrame *ref, const Mv *mv,
1584 int x_off, int y_off, int block_w, int block_h, int pred_idx)
1586 HEVCLocalContext *lc = &s->HEVClc;
1587 uint8_t *src1 = ref->data[1];
1588 uint8_t *src2 = ref->data[2];
1589 ptrdiff_t src1stride = ref->linesize[1];
1590 ptrdiff_t src2stride = ref->linesize[2];
1591 int pic_width = s->ps.sps->width >> 1;
1592 int pic_height = s->ps.sps->height >> 1;
1597 x_off += mv->x >> 3;
1598 y_off += mv->y >> 3;
1599 src1 += y_off * src1stride + (x_off * (1 << s->ps.sps->pixel_shift));
1600 src2 += y_off * src2stride + (x_off * (1 << s->ps.sps->pixel_shift));
1602 if (x_off < EPEL_EXTRA_BEFORE || y_off < EPEL_EXTRA_AFTER ||
1603 x_off >= pic_width - block_w - EPEL_EXTRA_AFTER ||
1604 y_off >= pic_height - block_h - EPEL_EXTRA_AFTER) {
1605 const ptrdiff_t edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->ps.sps->pixel_shift;
1606 int offset1 = EPEL_EXTRA_BEFORE * (src1stride + (1 << s->ps.sps->pixel_shift));
1607 int buf_offset1 = EPEL_EXTRA_BEFORE *
1608 (edge_emu_stride + (1 << s->ps.sps->pixel_shift));
1609 int offset2 = EPEL_EXTRA_BEFORE * (src2stride + (1 << s->ps.sps->pixel_shift));
1610 int buf_offset2 = EPEL_EXTRA_BEFORE *
1611 (edge_emu_stride + (1 << s->ps.sps->pixel_shift));
1613 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src1 - offset1,
1614 edge_emu_stride, src1stride,
1615 block_w + EPEL_EXTRA, block_h + EPEL_EXTRA,
1616 x_off - EPEL_EXTRA_BEFORE,
1617 y_off - EPEL_EXTRA_BEFORE,
1618 pic_width, pic_height);
1620 src1 = lc->edge_emu_buffer + buf_offset1;
1621 src1stride = edge_emu_stride;
1622 s->hevcdsp.put_hevc_epel[!!my][!!mx][pred_idx](dst1, dststride, src1, src1stride,
1623 block_h, mx, my, lc->mc_buffer);
1625 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src2 - offset2,
1626 edge_emu_stride, src2stride,
1627 block_w + EPEL_EXTRA, block_h + EPEL_EXTRA,
1628 x_off - EPEL_EXTRA_BEFORE,
1629 y_off - EPEL_EXTRA_BEFORE,
1630 pic_width, pic_height);
1631 src2 = lc->edge_emu_buffer + buf_offset2;
1632 src2stride = edge_emu_stride;
1634 s->hevcdsp.put_hevc_epel[!!my][!!mx][pred_idx](dst2, dststride, src2, src2stride,
1635 block_h, mx, my, lc->mc_buffer);
1637 s->hevcdsp.put_hevc_epel[!!my][!!mx][pred_idx](dst1, dststride, src1, src1stride,
1638 block_h, mx, my, lc->mc_buffer);
1639 s->hevcdsp.put_hevc_epel[!!my][!!mx][pred_idx](dst2, dststride, src2, src2stride,
1640 block_h, mx, my, lc->mc_buffer);
1644 static void hevc_await_progress(HEVCContext *s, HEVCFrame *ref,
1645 const Mv *mv, int y0, int height)
1647 int y = (mv->y >> 2) + y0 + height + 9;
1648 ff_thread_await_progress(&ref->tf, y, 0);
1651 static void hevc_luma_mv_mpv_mode(HEVCContext *s, int x0, int y0, int nPbW,
1652 int nPbH, int log2_cb_size, int part_idx,
1653 int merge_idx, MvField *mv)
1655 HEVCLocalContext *lc = &s->HEVClc;
1656 enum InterPredIdc inter_pred_idc = PRED_L0;
1659 ff_hevc_set_neighbour_available(s, x0, y0, nPbW, nPbH);
1660 if (s->sh.slice_type == HEVC_SLICE_B)
1661 inter_pred_idc = ff_hevc_inter_pred_idc_decode(s, nPbW, nPbH);
1663 if (inter_pred_idc != PRED_L1) {
1664 if (s->sh.nb_refs[L0])
1665 mv->ref_idx[0]= ff_hevc_ref_idx_lx_decode(s, s->sh.nb_refs[L0]);
1667 mv->pred_flag[0] = 1;
1668 hls_mvd_coding(s, x0, y0, 0);
1669 mvp_flag = ff_hevc_mvp_lx_flag_decode(s);
1670 ff_hevc_luma_mv_mvp_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
1671 part_idx, merge_idx, mv, mvp_flag, 0);
1672 mv->mv[0].x += lc->pu.mvd.x;
1673 mv->mv[0].y += lc->pu.mvd.y;
1676 if (inter_pred_idc != PRED_L0) {
1677 if (s->sh.nb_refs[L1])
1678 mv->ref_idx[1]= ff_hevc_ref_idx_lx_decode(s, s->sh.nb_refs[L1]);
1680 if (s->sh.mvd_l1_zero_flag == 1 && inter_pred_idc == PRED_BI) {
1681 AV_ZERO32(&lc->pu.mvd);
1683 hls_mvd_coding(s, x0, y0, 1);
1686 mv->pred_flag[1] = 1;
1687 mvp_flag = ff_hevc_mvp_lx_flag_decode(s);
1688 ff_hevc_luma_mv_mvp_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
1689 part_idx, merge_idx, mv, mvp_flag, 1);
1690 mv->mv[1].x += lc->pu.mvd.x;
1691 mv->mv[1].y += lc->pu.mvd.y;
1695 static void hls_prediction_unit(HEVCContext *s, int x0, int y0,
1697 int log2_cb_size, int partIdx)
1699 static const int pred_indices[] = {
1700 [4] = 0, [8] = 1, [12] = 2, [16] = 3, [24] = 4, [32] = 5, [48] = 6, [64] = 7,
1702 const int pred_idx = pred_indices[nPbW];
1704 #define POS(c_idx, x, y) \
1705 &s->frame->data[c_idx][((y) >> s->ps.sps->vshift[c_idx]) * s->frame->linesize[c_idx] + \
1706 (((x) >> s->ps.sps->hshift[c_idx]) << s->ps.sps->pixel_shift)]
1707 HEVCLocalContext *lc = &s->HEVClc;
1709 struct MvField current_mv = {{{ 0 }}};
1711 int min_pu_width = s->ps.sps->min_pu_width;
1712 int weighted_pred = (s->sh.slice_type == HEVC_SLICE_P && s->ps.pps->weighted_pred_flag) ||
1713 (s->sh.slice_type == HEVC_SLICE_B && s->ps.pps->weighted_bipred_flag);
1715 MvField *tab_mvf = s->ref->tab_mvf;
1716 RefPicList *refPicList = s->ref->refPicList;
1717 HEVCFrame *ref0, *ref1;
1719 ptrdiff_t tmpstride = MAX_PB_SIZE * sizeof(int16_t);
1721 uint8_t *dst0 = POS(0, x0, y0);
1722 uint8_t *dst1 = POS(1, x0, y0);
1723 uint8_t *dst2 = POS(2, x0, y0);
1724 int log2_min_cb_size = s->ps.sps->log2_min_cb_size;
1725 int min_cb_width = s->ps.sps->min_cb_width;
1726 int x_cb = x0 >> log2_min_cb_size;
1727 int y_cb = y0 >> log2_min_cb_size;
1731 int skip_flag = SAMPLE_CTB(s->skip_flag, x_cb, y_cb);
1734 lc->pu.merge_flag = ff_hevc_merge_flag_decode(s);
1736 if (skip_flag || lc->pu.merge_flag) {
1737 if (s->sh.max_num_merge_cand > 1)
1738 merge_idx = ff_hevc_merge_idx_decode(s);
1742 ff_hevc_luma_mv_merge_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
1743 partIdx, merge_idx, ¤t_mv);
1745 hevc_luma_mv_mpv_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
1746 partIdx, merge_idx, ¤t_mv);
1749 x_pu = x0 >> s->ps.sps->log2_min_pu_size;
1750 y_pu = y0 >> s->ps.sps->log2_min_pu_size;
1752 for (j = 0; j < nPbH >> s->ps.sps->log2_min_pu_size; j++)
1753 for (i = 0; i < nPbW >> s->ps.sps->log2_min_pu_size; i++)
1754 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i] = current_mv;
1756 if (current_mv.pred_flag[0]) {
1757 ref0 = refPicList[0].ref[current_mv.ref_idx[0]];
1760 hevc_await_progress(s, ref0, ¤t_mv.mv[0], y0, nPbH);
1762 if (current_mv.pred_flag[1]) {
1763 ref1 = refPicList[1].ref[current_mv.ref_idx[1]];
1766 hevc_await_progress(s, ref1, ¤t_mv.mv[1], y0, nPbH);
1769 if (current_mv.pred_flag[0] && !current_mv.pred_flag[1]) {
1770 LOCAL_ALIGNED_16(int16_t, tmp, [MAX_PB_SIZE * MAX_PB_SIZE]);
1771 LOCAL_ALIGNED_16(int16_t, tmp2, [MAX_PB_SIZE * MAX_PB_SIZE]);
1773 luma_mc(s, tmp, tmpstride, ref0->frame,
1774 ¤t_mv.mv[0], x0, y0, nPbW, nPbH, pred_idx);
1776 if (weighted_pred) {
1777 s->hevcdsp.weighted_pred[pred_idx](s->sh.luma_log2_weight_denom,
1778 s->sh.luma_weight_l0[current_mv.ref_idx[0]],
1779 s->sh.luma_offset_l0[current_mv.ref_idx[0]],
1780 dst0, s->frame->linesize[0], tmp,
1783 s->hevcdsp.put_unweighted_pred[pred_idx](dst0, s->frame->linesize[0], tmp, tmpstride, nPbH);
1785 chroma_mc(s, tmp, tmp2, tmpstride, ref0->frame,
1786 ¤t_mv.mv[0], x0 / 2, y0 / 2, nPbW / 2, nPbH / 2, pred_idx);
1788 if (weighted_pred) {
1789 s->hevcdsp.weighted_pred_chroma[pred_idx](s->sh.chroma_log2_weight_denom,
1790 s->sh.chroma_weight_l0[current_mv.ref_idx[0]][0],
1791 s->sh.chroma_offset_l0[current_mv.ref_idx[0]][0],
1792 dst1, s->frame->linesize[1], tmp, tmpstride,
1794 s->hevcdsp.weighted_pred_chroma[pred_idx](s->sh.chroma_log2_weight_denom,
1795 s->sh.chroma_weight_l0[current_mv.ref_idx[0]][1],
1796 s->sh.chroma_offset_l0[current_mv.ref_idx[0]][1],
1797 dst2, s->frame->linesize[2], tmp2, tmpstride,
1800 s->hevcdsp.put_unweighted_pred_chroma[pred_idx](dst1, s->frame->linesize[1], tmp, tmpstride, nPbH / 2);
1801 s->hevcdsp.put_unweighted_pred_chroma[pred_idx](dst2, s->frame->linesize[2], tmp2, tmpstride, nPbH / 2);
1803 } else if (!current_mv.pred_flag[0] && current_mv.pred_flag[1]) {
1804 LOCAL_ALIGNED_16(int16_t, tmp, [MAX_PB_SIZE * MAX_PB_SIZE]);
1805 LOCAL_ALIGNED_16(int16_t, tmp2, [MAX_PB_SIZE * MAX_PB_SIZE]);
1807 luma_mc(s, tmp, tmpstride, ref1->frame,
1808 ¤t_mv.mv[1], x0, y0, nPbW, nPbH, pred_idx);
1810 if (weighted_pred) {
1811 s->hevcdsp.weighted_pred[pred_idx](s->sh.luma_log2_weight_denom,
1812 s->sh.luma_weight_l1[current_mv.ref_idx[1]],
1813 s->sh.luma_offset_l1[current_mv.ref_idx[1]],
1814 dst0, s->frame->linesize[0], tmp, tmpstride,
1817 s->hevcdsp.put_unweighted_pred[pred_idx](dst0, s->frame->linesize[0], tmp, tmpstride, nPbH);
1820 chroma_mc(s, tmp, tmp2, tmpstride, ref1->frame,
1821 ¤t_mv.mv[1], x0 / 2, y0 / 2, nPbW / 2, nPbH / 2, pred_idx);
1823 if (weighted_pred) {
1824 s->hevcdsp.weighted_pred_chroma[pred_idx](s->sh.chroma_log2_weight_denom,
1825 s->sh.chroma_weight_l1[current_mv.ref_idx[1]][0],
1826 s->sh.chroma_offset_l1[current_mv.ref_idx[1]][0],
1827 dst1, s->frame->linesize[1], tmp, tmpstride, nPbH/2);
1828 s->hevcdsp.weighted_pred_chroma[pred_idx](s->sh.chroma_log2_weight_denom,
1829 s->sh.chroma_weight_l1[current_mv.ref_idx[1]][1],
1830 s->sh.chroma_offset_l1[current_mv.ref_idx[1]][1],
1831 dst2, s->frame->linesize[2], tmp2, tmpstride, nPbH/2);
1833 s->hevcdsp.put_unweighted_pred_chroma[pred_idx](dst1, s->frame->linesize[1], tmp, tmpstride, nPbH / 2);
1834 s->hevcdsp.put_unweighted_pred_chroma[pred_idx](dst2, s->frame->linesize[2], tmp2, tmpstride, nPbH / 2);
1836 } else if (current_mv.pred_flag[0] && current_mv.pred_flag[1]) {
1837 LOCAL_ALIGNED_16(int16_t, tmp, [MAX_PB_SIZE * MAX_PB_SIZE]);
1838 LOCAL_ALIGNED_16(int16_t, tmp2, [MAX_PB_SIZE * MAX_PB_SIZE]);
1839 LOCAL_ALIGNED_16(int16_t, tmp3, [MAX_PB_SIZE * MAX_PB_SIZE]);
1840 LOCAL_ALIGNED_16(int16_t, tmp4, [MAX_PB_SIZE * MAX_PB_SIZE]);
1842 luma_mc(s, tmp, tmpstride, ref0->frame,
1843 ¤t_mv.mv[0], x0, y0, nPbW, nPbH, pred_idx);
1844 luma_mc(s, tmp2, tmpstride, ref1->frame,
1845 ¤t_mv.mv[1], x0, y0, nPbW, nPbH, pred_idx);
1847 if (weighted_pred) {
1848 s->hevcdsp.weighted_pred_avg[pred_idx](s->sh.luma_log2_weight_denom,
1849 s->sh.luma_weight_l0[current_mv.ref_idx[0]],
1850 s->sh.luma_weight_l1[current_mv.ref_idx[1]],
1851 s->sh.luma_offset_l0[current_mv.ref_idx[0]],
1852 s->sh.luma_offset_l1[current_mv.ref_idx[1]],
1853 dst0, s->frame->linesize[0],
1854 tmp, tmp2, tmpstride, nPbH);
1856 s->hevcdsp.put_unweighted_pred_avg[pred_idx](dst0, s->frame->linesize[0],
1857 tmp, tmp2, tmpstride, nPbH);
1860 chroma_mc(s, tmp, tmp2, tmpstride, ref0->frame,
1861 ¤t_mv.mv[0], x0 / 2, y0 / 2, nPbW / 2, nPbH / 2, pred_idx);
1862 chroma_mc(s, tmp3, tmp4, tmpstride, ref1->frame,
1863 ¤t_mv.mv[1], x0 / 2, y0 / 2, nPbW / 2, nPbH / 2, pred_idx);
1865 if (weighted_pred) {
1866 s->hevcdsp.weighted_pred_avg_chroma[pred_idx](s->sh.chroma_log2_weight_denom,
1867 s->sh.chroma_weight_l0[current_mv.ref_idx[0]][0],
1868 s->sh.chroma_weight_l1[current_mv.ref_idx[1]][0],
1869 s->sh.chroma_offset_l0[current_mv.ref_idx[0]][0],
1870 s->sh.chroma_offset_l1[current_mv.ref_idx[1]][0],
1871 dst1, s->frame->linesize[1], tmp, tmp3,
1872 tmpstride, nPbH / 2);
1873 s->hevcdsp.weighted_pred_avg_chroma[pred_idx](s->sh.chroma_log2_weight_denom,
1874 s->sh.chroma_weight_l0[current_mv.ref_idx[0]][1],
1875 s->sh.chroma_weight_l1[current_mv.ref_idx[1]][1],
1876 s->sh.chroma_offset_l0[current_mv.ref_idx[0]][1],
1877 s->sh.chroma_offset_l1[current_mv.ref_idx[1]][1],
1878 dst2, s->frame->linesize[2], tmp2, tmp4,
1879 tmpstride, nPbH / 2);
1881 s->hevcdsp.put_unweighted_pred_avg_chroma[pred_idx](dst1, s->frame->linesize[1], tmp, tmp3, tmpstride, nPbH/2);
1882 s->hevcdsp.put_unweighted_pred_avg_chroma[pred_idx](dst2, s->frame->linesize[2], tmp2, tmp4, tmpstride, nPbH/2);
1890 static int luma_intra_pred_mode(HEVCContext *s, int x0, int y0, int pu_size,
1891 int prev_intra_luma_pred_flag)
1893 HEVCLocalContext *lc = &s->HEVClc;
1894 int x_pu = x0 >> s->ps.sps->log2_min_pu_size;
1895 int y_pu = y0 >> s->ps.sps->log2_min_pu_size;
1896 int min_pu_width = s->ps.sps->min_pu_width;
1897 int size_in_pus = pu_size >> s->ps.sps->log2_min_pu_size;
1898 int x0b = x0 & ((1 << s->ps.sps->log2_ctb_size) - 1);
1899 int y0b = y0 & ((1 << s->ps.sps->log2_ctb_size) - 1);
1901 int cand_up = (lc->ctb_up_flag || y0b) ?
1902 s->tab_ipm[(y_pu - 1) * min_pu_width + x_pu] : INTRA_DC;
1903 int cand_left = (lc->ctb_left_flag || x0b) ?
1904 s->tab_ipm[y_pu * min_pu_width + x_pu - 1] : INTRA_DC;
1906 int y_ctb = (y0 >> (s->ps.sps->log2_ctb_size)) << (s->ps.sps->log2_ctb_size);
1908 MvField *tab_mvf = s->ref->tab_mvf;
1909 int intra_pred_mode;
1913 // intra_pred_mode prediction does not cross vertical CTB boundaries
1914 if ((y0 - 1) < y_ctb)
1917 if (cand_left == cand_up) {
1918 if (cand_left < 2) {
1919 candidate[0] = INTRA_PLANAR;
1920 candidate[1] = INTRA_DC;
1921 candidate[2] = INTRA_ANGULAR_26;
1923 candidate[0] = cand_left;
1924 candidate[1] = 2 + ((cand_left - 2 - 1 + 32) & 31);
1925 candidate[2] = 2 + ((cand_left - 2 + 1) & 31);
1928 candidate[0] = cand_left;
1929 candidate[1] = cand_up;
1930 if (candidate[0] != INTRA_PLANAR && candidate[1] != INTRA_PLANAR) {
1931 candidate[2] = INTRA_PLANAR;
1932 } else if (candidate[0] != INTRA_DC && candidate[1] != INTRA_DC) {
1933 candidate[2] = INTRA_DC;
1935 candidate[2] = INTRA_ANGULAR_26;
1939 if (prev_intra_luma_pred_flag) {
1940 intra_pred_mode = candidate[lc->pu.mpm_idx];
1942 if (candidate[0] > candidate[1])
1943 FFSWAP(uint8_t, candidate[0], candidate[1]);
1944 if (candidate[0] > candidate[2])
1945 FFSWAP(uint8_t, candidate[0], candidate[2]);
1946 if (candidate[1] > candidate[2])
1947 FFSWAP(uint8_t, candidate[1], candidate[2]);
1949 intra_pred_mode = lc->pu.rem_intra_luma_pred_mode;
1950 for (i = 0; i < 3; i++)
1951 if (intra_pred_mode >= candidate[i])
1955 /* write the intra prediction units into the mv array */
1958 for (i = 0; i < size_in_pus; i++) {
1959 memset(&s->tab_ipm[(y_pu + i) * min_pu_width + x_pu],
1960 intra_pred_mode, size_in_pus);
1962 for (j = 0; j < size_in_pus; j++) {
1963 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].is_intra = 1;
1964 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].pred_flag[0] = 0;
1965 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].pred_flag[1] = 0;
1966 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].ref_idx[0] = 0;
1967 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].ref_idx[1] = 0;
1968 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].mv[0].x = 0;
1969 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].mv[0].y = 0;
1970 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].mv[1].x = 0;
1971 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].mv[1].y = 0;
1975 return intra_pred_mode;
1978 static av_always_inline void set_ct_depth(HEVCContext *s, int x0, int y0,
1979 int log2_cb_size, int ct_depth)
1981 int length = (1 << log2_cb_size) >> s->ps.sps->log2_min_cb_size;
1982 int x_cb = x0 >> s->ps.sps->log2_min_cb_size;
1983 int y_cb = y0 >> s->ps.sps->log2_min_cb_size;
1986 for (y = 0; y < length; y++)
1987 memset(&s->tab_ct_depth[(y_cb + y) * s->ps.sps->min_cb_width + x_cb],
1991 static void intra_prediction_unit(HEVCContext *s, int x0, int y0,
1994 HEVCLocalContext *lc = &s->HEVClc;
1995 static const uint8_t intra_chroma_table[4] = { 0, 26, 10, 1 };
1996 uint8_t prev_intra_luma_pred_flag[4];
1997 int split = lc->cu.part_mode == PART_NxN;
1998 int pb_size = (1 << log2_cb_size) >> split;
1999 int side = split + 1;
2003 for (i = 0; i < side; i++)
2004 for (j = 0; j < side; j++)
2005 prev_intra_luma_pred_flag[2 * i + j] = ff_hevc_prev_intra_luma_pred_flag_decode(s);
2007 for (i = 0; i < side; i++) {
2008 for (j = 0; j < side; j++) {
2009 if (prev_intra_luma_pred_flag[2 * i + j])
2010 lc->pu.mpm_idx = ff_hevc_mpm_idx_decode(s);
2012 lc->pu.rem_intra_luma_pred_mode = ff_hevc_rem_intra_luma_pred_mode_decode(s);
2014 lc->pu.intra_pred_mode[2 * i + j] =
2015 luma_intra_pred_mode(s, x0 + pb_size * j, y0 + pb_size * i, pb_size,
2016 prev_intra_luma_pred_flag[2 * i + j]);
2020 chroma_mode = ff_hevc_intra_chroma_pred_mode_decode(s);
2021 if (chroma_mode != 4) {
2022 if (lc->pu.intra_pred_mode[0] == intra_chroma_table[chroma_mode])
2023 lc->pu.intra_pred_mode_c = 34;
2025 lc->pu.intra_pred_mode_c = intra_chroma_table[chroma_mode];
2027 lc->pu.intra_pred_mode_c = lc->pu.intra_pred_mode[0];
2031 static void intra_prediction_unit_default_value(HEVCContext *s,
2035 HEVCLocalContext *lc = &s->HEVClc;
2036 int pb_size = 1 << log2_cb_size;
2037 int size_in_pus = pb_size >> s->ps.sps->log2_min_pu_size;
2038 int min_pu_width = s->ps.sps->min_pu_width;
2039 MvField *tab_mvf = s->ref->tab_mvf;
2040 int x_pu = x0 >> s->ps.sps->log2_min_pu_size;
2041 int y_pu = y0 >> s->ps.sps->log2_min_pu_size;
2044 if (size_in_pus == 0)
2046 for (j = 0; j < size_in_pus; j++) {
2047 memset(&s->tab_ipm[(y_pu + j) * min_pu_width + x_pu], INTRA_DC, size_in_pus);
2048 for (k = 0; k < size_in_pus; k++)
2049 tab_mvf[(y_pu + j) * min_pu_width + x_pu + k].is_intra = lc->cu.pred_mode == MODE_INTRA;
2053 static int hls_coding_unit(HEVCContext *s, int x0, int y0, int log2_cb_size)
2055 int cb_size = 1 << log2_cb_size;
2056 HEVCLocalContext *lc = &s->HEVClc;
2057 int log2_min_cb_size = s->ps.sps->log2_min_cb_size;
2058 int length = cb_size >> log2_min_cb_size;
2059 int min_cb_width = s->ps.sps->min_cb_width;
2060 int x_cb = x0 >> log2_min_cb_size;
2061 int y_cb = y0 >> log2_min_cb_size;
2066 lc->cu.pred_mode = MODE_INTRA;
2067 lc->cu.part_mode = PART_2Nx2N;
2068 lc->cu.intra_split_flag = 0;
2070 SAMPLE_CTB(s->skip_flag, x_cb, y_cb) = 0;
2071 for (x = 0; x < 4; x++)
2072 lc->pu.intra_pred_mode[x] = 1;
2073 if (s->ps.pps->transquant_bypass_enable_flag) {
2074 lc->cu.cu_transquant_bypass_flag = ff_hevc_cu_transquant_bypass_flag_decode(s);
2075 if (lc->cu.cu_transquant_bypass_flag)
2076 set_deblocking_bypass(s, x0, y0, log2_cb_size);
2078 lc->cu.cu_transquant_bypass_flag = 0;
2080 if (s->sh.slice_type != HEVC_SLICE_I) {
2081 uint8_t skip_flag = ff_hevc_skip_flag_decode(s, x0, y0, x_cb, y_cb);
2083 x = y_cb * min_cb_width + x_cb;
2084 for (y = 0; y < length; y++) {
2085 memset(&s->skip_flag[x], skip_flag, length);
2088 lc->cu.pred_mode = skip_flag ? MODE_SKIP : MODE_INTER;
2091 if (SAMPLE_CTB(s->skip_flag, x_cb, y_cb)) {
2092 hls_prediction_unit(s, x0, y0, cb_size, cb_size, log2_cb_size, 0);
2093 intra_prediction_unit_default_value(s, x0, y0, log2_cb_size);
2095 if (!s->sh.disable_deblocking_filter_flag)
2096 ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_cb_size);
2100 if (s->sh.slice_type != HEVC_SLICE_I)
2101 lc->cu.pred_mode = ff_hevc_pred_mode_decode(s);
2102 if (lc->cu.pred_mode != MODE_INTRA ||
2103 log2_cb_size == s->ps.sps->log2_min_cb_size) {
2104 lc->cu.part_mode = ff_hevc_part_mode_decode(s, log2_cb_size);
2105 lc->cu.intra_split_flag = lc->cu.part_mode == PART_NxN &&
2106 lc->cu.pred_mode == MODE_INTRA;
2109 if (lc->cu.pred_mode == MODE_INTRA) {
2110 if (lc->cu.part_mode == PART_2Nx2N && s->ps.sps->pcm_enabled_flag &&
2111 log2_cb_size >= s->ps.sps->pcm.log2_min_pcm_cb_size &&
2112 log2_cb_size <= s->ps.sps->pcm.log2_max_pcm_cb_size) {
2113 pcm_flag = ff_hevc_pcm_flag_decode(s);
2116 intra_prediction_unit_default_value(s, x0, y0, log2_cb_size);
2117 ret = hls_pcm_sample(s, x0, y0, log2_cb_size);
2118 if (s->ps.sps->pcm.loop_filter_disable_flag)
2119 set_deblocking_bypass(s, x0, y0, log2_cb_size);
2124 intra_prediction_unit(s, x0, y0, log2_cb_size);
2127 intra_prediction_unit_default_value(s, x0, y0, log2_cb_size);
2128 switch (lc->cu.part_mode) {
2130 hls_prediction_unit(s, x0, y0, cb_size, cb_size, log2_cb_size, 0);
2133 hls_prediction_unit(s, x0, y0, cb_size, cb_size / 2, log2_cb_size, 0);
2134 hls_prediction_unit(s, x0, y0 + cb_size / 2, cb_size, cb_size / 2, log2_cb_size, 1);
2137 hls_prediction_unit(s, x0, y0, cb_size / 2, cb_size, log2_cb_size, 0);
2138 hls_prediction_unit(s, x0 + cb_size / 2, y0, cb_size / 2, cb_size, log2_cb_size, 1);
2141 hls_prediction_unit(s, x0, y0, cb_size, cb_size / 4, log2_cb_size, 0);
2142 hls_prediction_unit(s, x0, y0 + cb_size / 4, cb_size, cb_size * 3 / 4, log2_cb_size, 1);
2145 hls_prediction_unit(s, x0, y0, cb_size, cb_size * 3 / 4, log2_cb_size, 0);
2146 hls_prediction_unit(s, x0, y0 + cb_size * 3 / 4, cb_size, cb_size / 4, log2_cb_size, 1);
2149 hls_prediction_unit(s, x0, y0, cb_size / 4, cb_size, log2_cb_size, 0);
2150 hls_prediction_unit(s, x0 + cb_size / 4, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 1);
2153 hls_prediction_unit(s, x0, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 0);
2154 hls_prediction_unit(s, x0 + cb_size * 3 / 4, y0, cb_size / 4, cb_size, log2_cb_size, 1);
2157 hls_prediction_unit(s, x0, y0, cb_size / 2, cb_size / 2, log2_cb_size, 0);
2158 hls_prediction_unit(s, x0 + cb_size / 2, y0, cb_size / 2, cb_size / 2, log2_cb_size, 1);
2159 hls_prediction_unit(s, x0, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 2);
2160 hls_prediction_unit(s, x0 + cb_size / 2, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 3);
2166 int rqt_root_cbf = 1;
2168 if (lc->cu.pred_mode != MODE_INTRA &&
2169 !(lc->cu.part_mode == PART_2Nx2N && lc->pu.merge_flag)) {
2170 rqt_root_cbf = ff_hevc_no_residual_syntax_flag_decode(s);
2173 lc->cu.max_trafo_depth = lc->cu.pred_mode == MODE_INTRA ?
2174 s->ps.sps->max_transform_hierarchy_depth_intra + lc->cu.intra_split_flag :
2175 s->ps.sps->max_transform_hierarchy_depth_inter;
2176 ret = hls_transform_tree(s, x0, y0, x0, y0, x0, y0,
2178 log2_cb_size, 0, 0, 0, 0);
2182 if (!s->sh.disable_deblocking_filter_flag)
2183 ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_cb_size);
2188 if (s->ps.pps->cu_qp_delta_enabled_flag && lc->tu.is_cu_qp_delta_coded == 0)
2189 ff_hevc_set_qPy(s, x0, y0, x0, y0, log2_cb_size);
2191 x = y_cb * min_cb_width + x_cb;
2192 for (y = 0; y < length; y++) {
2193 memset(&s->qp_y_tab[x], lc->qp_y, length);
2197 set_ct_depth(s, x0, y0, log2_cb_size, lc->ct.depth);
2202 static int hls_coding_quadtree(HEVCContext *s, int x0, int y0,
2203 int log2_cb_size, int cb_depth)
2205 HEVCLocalContext *lc = &s->HEVClc;
2206 const int cb_size = 1 << log2_cb_size;
2209 lc->ct.depth = cb_depth;
2210 if (x0 + cb_size <= s->ps.sps->width &&
2211 y0 + cb_size <= s->ps.sps->height &&
2212 log2_cb_size > s->ps.sps->log2_min_cb_size) {
2213 split_cu = ff_hevc_split_coding_unit_flag_decode(s, cb_depth, x0, y0);
2215 split_cu = (log2_cb_size > s->ps.sps->log2_min_cb_size);
2217 if (s->ps.pps->cu_qp_delta_enabled_flag &&
2218 log2_cb_size >= s->ps.sps->log2_ctb_size - s->ps.pps->diff_cu_qp_delta_depth) {
2219 lc->tu.is_cu_qp_delta_coded = 0;
2220 lc->tu.cu_qp_delta = 0;
2224 const int cb_size_split = cb_size >> 1;
2225 const int x1 = x0 + cb_size_split;
2226 const int y1 = y0 + cb_size_split;
2231 #define SUBDIVIDE(x, y) \
2233 if (x < s->ps.sps->width && y < s->ps.sps->height) { \
2234 int ret = hls_coding_quadtree(s, x, y, log2_cb_size, cb_depth);\
2245 int ret = hls_coding_unit(s, x0, y0, log2_cb_size);
2253 static void hls_decode_neighbour(HEVCContext *s, int x_ctb, int y_ctb,
2256 HEVCLocalContext *lc = &s->HEVClc;
2257 int ctb_size = 1 << s->ps.sps->log2_ctb_size;
2258 int ctb_addr_rs = s->ps.pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2259 int ctb_addr_in_slice = ctb_addr_rs - s->sh.slice_addr;
2261 s->tab_slice_address[ctb_addr_rs] = s->sh.slice_addr;
2263 if (s->ps.pps->entropy_coding_sync_enabled_flag) {
2264 if (x_ctb == 0 && (y_ctb & (ctb_size - 1)) == 0)
2265 lc->first_qp_group = 1;
2266 lc->end_of_tiles_x = s->ps.sps->width;
2267 } else if (s->ps.pps->tiles_enabled_flag) {
2268 if (ctb_addr_ts && s->ps.pps->tile_id[ctb_addr_ts] != s->ps.pps->tile_id[ctb_addr_ts - 1]) {
2269 int idxX = s->ps.pps->col_idxX[x_ctb >> s->ps.sps->log2_ctb_size];
2270 lc->start_of_tiles_x = x_ctb;
2271 lc->end_of_tiles_x = x_ctb + (s->ps.pps->column_width[idxX] << s->ps.sps->log2_ctb_size);
2272 lc->first_qp_group = 1;
2275 lc->end_of_tiles_x = s->ps.sps->width;
2278 lc->end_of_tiles_y = FFMIN(y_ctb + ctb_size, s->ps.sps->height);
2280 lc->boundary_flags = 0;
2281 if (s->ps.pps->tiles_enabled_flag) {
2282 if (x_ctb > 0 && s->ps.pps->tile_id[ctb_addr_ts] != s->ps.pps->tile_id[s->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs - 1]])
2283 lc->boundary_flags |= BOUNDARY_LEFT_TILE;
2284 if (x_ctb > 0 && s->tab_slice_address[ctb_addr_rs] != s->tab_slice_address[ctb_addr_rs - 1])
2285 lc->boundary_flags |= BOUNDARY_LEFT_SLICE;
2286 if (y_ctb > 0 && s->ps.pps->tile_id[ctb_addr_ts] != s->ps.pps->tile_id[s->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs - s->ps.sps->ctb_width]])
2287 lc->boundary_flags |= BOUNDARY_UPPER_TILE;
2288 if (y_ctb > 0 && s->tab_slice_address[ctb_addr_rs] != s->tab_slice_address[ctb_addr_rs - s->ps.sps->ctb_width])
2289 lc->boundary_flags |= BOUNDARY_UPPER_SLICE;
2291 if (!ctb_addr_in_slice)
2292 lc->boundary_flags |= BOUNDARY_LEFT_SLICE;
2293 if (ctb_addr_in_slice < s->ps.sps->ctb_width)
2294 lc->boundary_flags |= BOUNDARY_UPPER_SLICE;
2297 lc->ctb_left_flag = ((x_ctb > 0) && (ctb_addr_in_slice > 0) && !(lc->boundary_flags & BOUNDARY_LEFT_TILE));
2298 lc->ctb_up_flag = ((y_ctb > 0) && (ctb_addr_in_slice >= s->ps.sps->ctb_width) && !(lc->boundary_flags & BOUNDARY_UPPER_TILE));
2299 lc->ctb_up_right_flag = ((y_ctb > 0) && (ctb_addr_in_slice+1 >= s->ps.sps->ctb_width) && (s->ps.pps->tile_id[ctb_addr_ts] == s->ps.pps->tile_id[s->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs+1 - s->ps.sps->ctb_width]]));
2300 lc->ctb_up_left_flag = ((x_ctb > 0) && (y_ctb > 0) && (ctb_addr_in_slice-1 >= s->ps.sps->ctb_width) && (s->ps.pps->tile_id[ctb_addr_ts] == s->ps.pps->tile_id[s->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs-1 - s->ps.sps->ctb_width]]));
2303 static int hls_slice_data(HEVCContext *s)
2305 int ctb_size = 1 << s->ps.sps->log2_ctb_size;
2309 int ctb_addr_ts = s->ps.pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs];
2312 while (more_data && ctb_addr_ts < s->ps.sps->ctb_size) {
2313 int ctb_addr_rs = s->ps.pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2315 x_ctb = (ctb_addr_rs % ((s->ps.sps->width + ctb_size - 1) >> s->ps.sps->log2_ctb_size)) << s->ps.sps->log2_ctb_size;
2316 y_ctb = (ctb_addr_rs / ((s->ps.sps->width + ctb_size - 1) >> s->ps.sps->log2_ctb_size)) << s->ps.sps->log2_ctb_size;
2317 hls_decode_neighbour(s, x_ctb, y_ctb, ctb_addr_ts);
2319 ff_hevc_cabac_init(s, ctb_addr_ts);
2321 hls_sao_param(s, x_ctb >> s->ps.sps->log2_ctb_size, y_ctb >> s->ps.sps->log2_ctb_size);
2323 s->deblock[ctb_addr_rs].beta_offset = s->sh.beta_offset;
2324 s->deblock[ctb_addr_rs].tc_offset = s->sh.tc_offset;
2325 s->filter_slice_edges[ctb_addr_rs] = s->sh.slice_loop_filter_across_slices_enabled_flag;
2327 ret = hls_coding_quadtree(s, x_ctb, y_ctb, s->ps.sps->log2_ctb_size, 0);
2330 more_data = !ff_hevc_end_of_slice_flag_decode(s);
2333 ff_hevc_save_states(s, ctb_addr_ts);
2334 ff_hevc_hls_filters(s, x_ctb, y_ctb, ctb_size);
2337 if (x_ctb + ctb_size >= s->ps.sps->width &&
2338 y_ctb + ctb_size >= s->ps.sps->height)
2339 ff_hevc_hls_filter(s, x_ctb, y_ctb);
2344 static void restore_tqb_pixels(HEVCContext *s)
2346 int min_pu_size = 1 << s->ps.sps->log2_min_pu_size;
2349 for (c_idx = 0; c_idx < 3; c_idx++) {
2350 ptrdiff_t stride = s->frame->linesize[c_idx];
2351 int hshift = s->ps.sps->hshift[c_idx];
2352 int vshift = s->ps.sps->vshift[c_idx];
2353 for (y = 0; y < s->ps.sps->min_pu_height; y++) {
2354 for (x = 0; x < s->ps.sps->min_pu_width; x++) {
2355 if (s->is_pcm[y * s->ps.sps->min_pu_width + x]) {
2357 int len = min_pu_size >> hshift;
2358 uint8_t *src = &s->frame->data[c_idx][((y << s->ps.sps->log2_min_pu_size) >> vshift) * stride + (((x << s->ps.sps->log2_min_pu_size) >> hshift) << s->ps.sps->pixel_shift)];
2359 uint8_t *dst = &s->sao_frame->data[c_idx][((y << s->ps.sps->log2_min_pu_size) >> vshift) * stride + (((x << s->ps.sps->log2_min_pu_size) >> hshift) << s->ps.sps->pixel_shift)];
2360 for (n = 0; n < (min_pu_size >> vshift); n++) {
2361 memcpy(dst, src, len);
2371 static int set_side_data(HEVCContext *s)
2373 AVFrame *out = s->ref->frame;
2375 if (s->sei.frame_packing.present &&
2376 s->sei.frame_packing.arrangement_type >= 3 &&
2377 s->sei.frame_packing.arrangement_type <= 5 &&
2378 s->sei.frame_packing.content_interpretation_type > 0 &&
2379 s->sei.frame_packing.content_interpretation_type < 3) {
2380 AVStereo3D *stereo = av_stereo3d_create_side_data(out);
2382 return AVERROR(ENOMEM);
2384 switch (s->sei.frame_packing.arrangement_type) {
2386 if (s->sei.frame_packing.quincunx_subsampling)
2387 stereo->type = AV_STEREO3D_SIDEBYSIDE_QUINCUNX;
2389 stereo->type = AV_STEREO3D_SIDEBYSIDE;
2392 stereo->type = AV_STEREO3D_TOPBOTTOM;
2395 stereo->type = AV_STEREO3D_FRAMESEQUENCE;
2399 if (s->sei.frame_packing.content_interpretation_type == 2)
2400 stereo->flags = AV_STEREO3D_FLAG_INVERT;
2402 if (s->sei.frame_packing.arrangement_type == 5) {
2403 if (s->sei.frame_packing.current_frame_is_frame0_flag)
2404 stereo->view = AV_STEREO3D_VIEW_LEFT;
2406 stereo->view = AV_STEREO3D_VIEW_RIGHT;
2410 if (s->sei.display_orientation.present &&
2411 (s->sei.display_orientation.anticlockwise_rotation ||
2412 s->sei.display_orientation.hflip || s->sei.display_orientation.vflip)) {
2413 double angle = s->sei.display_orientation.anticlockwise_rotation * 360 / (double) (1 << 16);
2414 AVFrameSideData *rotation = av_frame_new_side_data(out,
2415 AV_FRAME_DATA_DISPLAYMATRIX,
2416 sizeof(int32_t) * 9);
2418 return AVERROR(ENOMEM);
2420 av_display_rotation_set((int32_t *)rotation->data, angle);
2421 av_display_matrix_flip((int32_t *)rotation->data,
2422 s->sei.display_orientation.hflip,
2423 s->sei.display_orientation.vflip);
2426 if (s->sei.alternative_transfer.present &&
2427 av_color_transfer_name(s->sei.alternative_transfer.preferred_transfer_characteristics) &&
2428 s->sei.alternative_transfer.preferred_transfer_characteristics != AVCOL_TRC_UNSPECIFIED) {
2429 s->avctx->color_trc = out->color_trc = s->sei.alternative_transfer.preferred_transfer_characteristics;
2435 static int hevc_frame_start(HEVCContext *s)
2437 HEVCLocalContext *lc = &s->HEVClc;
2440 memset(s->horizontal_bs, 0, 2 * s->bs_width * (s->bs_height + 1));
2441 memset(s->vertical_bs, 0, 2 * s->bs_width * (s->bs_height + 1));
2442 memset(s->cbf_luma, 0, s->ps.sps->min_tb_width * s->ps.sps->min_tb_height);
2443 memset(s->is_pcm, 0, s->ps.sps->min_pu_width * s->ps.sps->min_pu_height);
2445 lc->start_of_tiles_x = 0;
2447 s->first_nal_type = s->nal_unit_type;
2449 if (s->ps.pps->tiles_enabled_flag)
2450 lc->end_of_tiles_x = s->ps.pps->column_width[0] << s->ps.sps->log2_ctb_size;
2452 ret = ff_hevc_set_new_ref(s, s->ps.sps->sao_enabled ? &s->sao_frame : &s->frame,
2457 ret = ff_hevc_frame_rps(s);
2459 av_log(s->avctx, AV_LOG_ERROR, "Error constructing the frame RPS.\n");
2463 s->ref->frame->key_frame = IS_IRAP(s);
2465 ret = set_side_data(s);
2469 av_frame_unref(s->output_frame);
2470 ret = ff_hevc_output_frame(s, s->output_frame, 0);
2474 ff_thread_finish_setup(s->avctx);
2480 ff_hevc_unref_frame(s, s->ref, ~0);
2485 static int decode_nal_unit(HEVCContext *s, const H2645NAL *nal)
2487 HEVCLocalContext *lc = &s->HEVClc;
2488 GetBitContext *gb = &lc->gb;
2489 int ctb_addr_ts, ret;
2492 s->nal_unit_type = nal->type;
2493 s->temporal_id = nal->temporal_id;
2495 switch (s->nal_unit_type) {
2497 ret = ff_hevc_decode_nal_vps(gb, s->avctx, &s->ps);
2502 ret = ff_hevc_decode_nal_sps(gb, s->avctx, &s->ps,
2503 s->apply_defdispwin);
2508 ret = ff_hevc_decode_nal_pps(gb, s->avctx, &s->ps);
2512 case HEVC_NAL_SEI_PREFIX:
2513 case HEVC_NAL_SEI_SUFFIX:
2514 ret = ff_hevc_decode_nal_sei(gb, s->avctx, &s->sei,
2519 case HEVC_NAL_TRAIL_R:
2520 case HEVC_NAL_TRAIL_N:
2521 case HEVC_NAL_TSA_N:
2522 case HEVC_NAL_TSA_R:
2523 case HEVC_NAL_STSA_N:
2524 case HEVC_NAL_STSA_R:
2525 case HEVC_NAL_BLA_W_LP:
2526 case HEVC_NAL_BLA_W_RADL:
2527 case HEVC_NAL_BLA_N_LP:
2528 case HEVC_NAL_IDR_W_RADL:
2529 case HEVC_NAL_IDR_N_LP:
2530 case HEVC_NAL_CRA_NUT:
2531 case HEVC_NAL_RADL_N:
2532 case HEVC_NAL_RADL_R:
2533 case HEVC_NAL_RASL_N:
2534 case HEVC_NAL_RASL_R:
2535 ret = hls_slice_header(s);
2539 if (s->max_ra == INT_MAX) {
2540 if (s->nal_unit_type == HEVC_NAL_CRA_NUT || IS_BLA(s)) {
2544 s->max_ra = INT_MIN;
2548 if ((s->nal_unit_type == HEVC_NAL_RASL_R || s->nal_unit_type == HEVC_NAL_RASL_N) &&
2549 s->poc <= s->max_ra) {
2553 if (s->nal_unit_type == HEVC_NAL_RASL_R && s->poc > s->max_ra)
2554 s->max_ra = INT_MIN;
2557 if (s->sh.first_slice_in_pic_flag) {
2558 ret = hevc_frame_start(s);
2561 } else if (!s->ref) {
2562 av_log(s->avctx, AV_LOG_ERROR, "First slice in a frame missing.\n");
2566 if (s->nal_unit_type != s->first_nal_type) {
2567 av_log(s->avctx, AV_LOG_ERROR,
2568 "Non-matching NAL types of the VCL NALUs: %d %d\n",
2569 s->first_nal_type, s->nal_unit_type);
2570 return AVERROR_INVALIDDATA;
2573 if (!s->sh.dependent_slice_segment_flag &&
2574 s->sh.slice_type != HEVC_SLICE_I) {
2575 ret = ff_hevc_slice_rpl(s);
2577 av_log(s->avctx, AV_LOG_WARNING,
2578 "Error constructing the reference lists for the current slice.\n");
2583 if (s->sh.first_slice_in_pic_flag && s->avctx->hwaccel) {
2584 ret = s->avctx->hwaccel->start_frame(s->avctx, NULL, 0);
2589 if (s->avctx->hwaccel) {
2590 ret = s->avctx->hwaccel->decode_slice(s->avctx, nal->raw_data, nal->raw_size);
2594 ctb_addr_ts = hls_slice_data(s);
2595 if (ctb_addr_ts >= (s->ps.sps->ctb_width * s->ps.sps->ctb_height)) {
2597 if ((s->ps.pps->transquant_bypass_enable_flag ||
2598 (s->ps.sps->pcm.loop_filter_disable_flag && s->ps.sps->pcm_enabled_flag)) &&
2599 s->ps.sps->sao_enabled)
2600 restore_tqb_pixels(s);
2603 if (ctb_addr_ts < 0) {
2609 case HEVC_NAL_EOS_NUT:
2610 case HEVC_NAL_EOB_NUT:
2611 s->seq_decode = (s->seq_decode + 1) & 0xff;
2612 s->max_ra = INT_MAX;
2615 case HEVC_NAL_FD_NUT:
2618 av_log(s->avctx, AV_LOG_INFO,
2619 "Skipping NAL unit %d\n", s->nal_unit_type);
2624 if (s->avctx->err_recognition & AV_EF_EXPLODE)
2629 static int decode_nal_units(HEVCContext *s, const uint8_t *buf, int length)
2636 /* split the input packet into NAL units, so we know the upper bound on the
2637 * number of slices in the frame */
2638 ret = ff_h2645_packet_split(&s->pkt, buf, length, s->avctx, s->is_nalff,
2639 s->nal_length_size, s->avctx->codec_id);
2641 av_log(s->avctx, AV_LOG_ERROR,
2642 "Error splitting the input into NAL units.\n");
2646 for (i = 0; i < s->pkt.nb_nals; i++) {
2647 if (s->pkt.nals[i].type == HEVC_NAL_EOB_NUT ||
2648 s->pkt.nals[i].type == HEVC_NAL_EOS_NUT)
2652 /* decode the NAL units */
2653 for (i = 0; i < s->pkt.nb_nals; i++) {
2654 ret = decode_nal_unit(s, &s->pkt.nals[i]);
2656 av_log(s->avctx, AV_LOG_WARNING,
2657 "Error parsing NAL unit #%d.\n", i);
2664 ff_thread_report_progress(&s->ref->tf, INT_MAX, 0);
2669 static void print_md5(void *log_ctx, int level, uint8_t md5[16])
2672 for (i = 0; i < 16; i++)
2673 av_log(log_ctx, level, "%02"PRIx8, md5[i]);
2676 static int verify_md5(HEVCContext *s, AVFrame *frame)
2678 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format);
2683 return AVERROR(EINVAL);
2685 pixel_shift = desc->comp[0].depth > 8;
2687 av_log(s->avctx, AV_LOG_DEBUG, "Verifying checksum for frame with POC %d: ",
2690 /* the checksums are LE, so we have to byteswap for >8bpp formats
2693 if (pixel_shift && !s->checksum_buf) {
2694 av_fast_malloc(&s->checksum_buf, &s->checksum_buf_size,
2695 FFMAX3(frame->linesize[0], frame->linesize[1],
2696 frame->linesize[2]));
2697 if (!s->checksum_buf)
2698 return AVERROR(ENOMEM);
2702 for (i = 0; frame->data[i]; i++) {
2703 int width = s->avctx->coded_width;
2704 int height = s->avctx->coded_height;
2705 int w = (i == 1 || i == 2) ? (width >> desc->log2_chroma_w) : width;
2706 int h = (i == 1 || i == 2) ? (height >> desc->log2_chroma_h) : height;
2709 av_md5_init(s->md5_ctx);
2710 for (j = 0; j < h; j++) {
2711 const uint8_t *src = frame->data[i] + j * frame->linesize[i];
2714 s->bdsp.bswap16_buf((uint16_t *) s->checksum_buf,
2715 (const uint16_t *) src, w);
2716 src = s->checksum_buf;
2719 av_md5_update(s->md5_ctx, src, w << pixel_shift);
2721 av_md5_final(s->md5_ctx, md5);
2723 if (!memcmp(md5, s->sei.picture_hash.md5[i], 16)) {
2724 av_log (s->avctx, AV_LOG_DEBUG, "plane %d - correct ", i);
2725 print_md5(s->avctx, AV_LOG_DEBUG, md5);
2726 av_log (s->avctx, AV_LOG_DEBUG, "; ");
2728 av_log (s->avctx, AV_LOG_ERROR, "mismatching checksum of plane %d - ", i);
2729 print_md5(s->avctx, AV_LOG_ERROR, md5);
2730 av_log (s->avctx, AV_LOG_ERROR, " != ");
2731 print_md5(s->avctx, AV_LOG_ERROR, s->sei.picture_hash.md5[i]);
2732 av_log (s->avctx, AV_LOG_ERROR, "\n");
2733 return AVERROR_INVALIDDATA;
2737 av_log(s->avctx, AV_LOG_DEBUG, "\n");
2742 static int hevc_decode_extradata(HEVCContext *s, uint8_t *buf, int length)
2744 AVCodecContext *avctx = s->avctx;
2748 bytestream2_init(&gb, buf, length);
2750 if (length > 3 && (buf[0] || buf[1] || buf[2] > 1)) {
2751 /* It seems the extradata is encoded as hvcC format.
2752 * Temporarily, we support configurationVersion==0 until 14496-15 3rd
2753 * is finalized. When finalized, configurationVersion will be 1 and we
2754 * can recognize hvcC by checking if avctx->extradata[0]==1 or not. */
2755 int i, j, num_arrays, nal_len_size;
2759 bytestream2_skip(&gb, 21);
2760 nal_len_size = (bytestream2_get_byte(&gb) & 3) + 1;
2761 num_arrays = bytestream2_get_byte(&gb);
2763 /* nal units in the hvcC always have length coded with 2 bytes,
2764 * so put a fake nal_length_size = 2 while parsing them */
2765 s->nal_length_size = 2;
2767 /* Decode nal units from hvcC. */
2768 for (i = 0; i < num_arrays; i++) {
2769 int type = bytestream2_get_byte(&gb) & 0x3f;
2770 int cnt = bytestream2_get_be16(&gb);
2772 for (j = 0; j < cnt; j++) {
2773 // +2 for the nal size field
2774 int nalsize = bytestream2_peek_be16(&gb) + 2;
2775 if (bytestream2_get_bytes_left(&gb) < nalsize) {
2776 av_log(s->avctx, AV_LOG_ERROR,
2777 "Invalid NAL unit size in extradata.\n");
2778 return AVERROR_INVALIDDATA;
2781 ret = decode_nal_units(s, gb.buffer, nalsize);
2783 av_log(avctx, AV_LOG_ERROR,
2784 "Decoding nal unit %d %d from hvcC failed\n",
2788 bytestream2_skip(&gb, nalsize);
2792 /* Now store right nal length size, that will be used to parse
2794 s->nal_length_size = nal_len_size;
2797 ret = decode_nal_units(s, buf, length);
2802 /* export stream parameters from the first SPS */
2803 for (i = 0; i < FF_ARRAY_ELEMS(s->ps.sps_list); i++) {
2804 if (s->ps.sps_list[i]) {
2805 const HEVCSPS *sps = (const HEVCSPS*)s->ps.sps_list[i]->data;
2806 export_stream_params(s->avctx, &s->ps, sps);
2814 static int hevc_decode_frame(AVCodecContext *avctx, void *data, int *got_output,
2818 int new_extradata_size;
2819 uint8_t *new_extradata;
2820 HEVCContext *s = avctx->priv_data;
2823 ret = ff_hevc_output_frame(s, data, 1);
2831 new_extradata = av_packet_get_side_data(avpkt, AV_PKT_DATA_NEW_EXTRADATA,
2832 &new_extradata_size);
2833 if (new_extradata && new_extradata_size > 0) {
2834 ret = hevc_decode_extradata(s, new_extradata, new_extradata_size);
2840 ret = decode_nal_units(s, avpkt->data, avpkt->size);
2844 if (avctx->hwaccel) {
2845 if (s->ref && avctx->hwaccel->end_frame(avctx) < 0)
2846 av_log(avctx, AV_LOG_ERROR,
2847 "hardware accelerator failed to decode picture\n");
2849 /* verify the SEI checksum */
2850 if (avctx->err_recognition & AV_EF_CRCCHECK && s->is_decoded &&
2851 s->sei.picture_hash.is_md5) {
2852 ret = verify_md5(s, s->ref->frame);
2853 if (ret < 0 && avctx->err_recognition & AV_EF_EXPLODE) {
2854 ff_hevc_unref_frame(s, s->ref, ~0);
2859 s->sei.picture_hash.is_md5 = 0;
2861 if (s->is_decoded) {
2862 av_log(avctx, AV_LOG_DEBUG, "Decoded frame with POC %d.\n", s->poc);
2866 if (s->output_frame->buf[0]) {
2867 av_frame_move_ref(data, s->output_frame);
2874 static int hevc_ref_frame(HEVCContext *s, HEVCFrame *dst, HEVCFrame *src)
2876 int ret = ff_thread_ref_frame(&dst->tf, &src->tf);
2880 dst->tab_mvf_buf = av_buffer_ref(src->tab_mvf_buf);
2881 if (!dst->tab_mvf_buf)
2883 dst->tab_mvf = src->tab_mvf;
2885 dst->rpl_tab_buf = av_buffer_ref(src->rpl_tab_buf);
2886 if (!dst->rpl_tab_buf)
2888 dst->rpl_tab = src->rpl_tab;
2890 dst->rpl_buf = av_buffer_ref(src->rpl_buf);
2894 dst->poc = src->poc;
2895 dst->ctb_count = src->ctb_count;
2896 dst->flags = src->flags;
2897 dst->sequence = src->sequence;
2899 if (src->hwaccel_picture_private) {
2900 dst->hwaccel_priv_buf = av_buffer_ref(src->hwaccel_priv_buf);
2901 if (!dst->hwaccel_priv_buf)
2903 dst->hwaccel_picture_private = dst->hwaccel_priv_buf->data;
2908 ff_hevc_unref_frame(s, dst, ~0);
2909 return AVERROR(ENOMEM);
2912 static av_cold int hevc_decode_free(AVCodecContext *avctx)
2914 HEVCContext *s = avctx->priv_data;
2919 av_freep(&s->md5_ctx);
2921 av_frame_free(&s->tmp_frame);
2922 av_frame_free(&s->output_frame);
2924 for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
2925 ff_hevc_unref_frame(s, &s->DPB[i], ~0);
2926 av_frame_free(&s->DPB[i].frame);
2929 for (i = 0; i < FF_ARRAY_ELEMS(s->ps.vps_list); i++)
2930 av_buffer_unref(&s->ps.vps_list[i]);
2931 for (i = 0; i < FF_ARRAY_ELEMS(s->ps.sps_list); i++)
2932 av_buffer_unref(&s->ps.sps_list[i]);
2933 for (i = 0; i < FF_ARRAY_ELEMS(s->ps.pps_list); i++)
2934 av_buffer_unref(&s->ps.pps_list[i]);
2936 ff_h2645_packet_uninit(&s->pkt);
2941 static av_cold int hevc_init_context(AVCodecContext *avctx)
2943 HEVCContext *s = avctx->priv_data;
2948 s->tmp_frame = av_frame_alloc();
2952 s->output_frame = av_frame_alloc();
2953 if (!s->output_frame)
2956 for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
2957 s->DPB[i].frame = av_frame_alloc();
2958 if (!s->DPB[i].frame)
2960 s->DPB[i].tf.f = s->DPB[i].frame;
2963 s->max_ra = INT_MAX;
2965 s->md5_ctx = av_md5_alloc();
2969 ff_bswapdsp_init(&s->bdsp);
2971 s->context_initialized = 1;
2976 hevc_decode_free(avctx);
2977 return AVERROR(ENOMEM);
2980 static int hevc_update_thread_context(AVCodecContext *dst,
2981 const AVCodecContext *src)
2983 HEVCContext *s = dst->priv_data;
2984 HEVCContext *s0 = src->priv_data;
2987 if (!s->context_initialized) {
2988 ret = hevc_init_context(dst);
2993 for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
2994 ff_hevc_unref_frame(s, &s->DPB[i], ~0);
2995 if (s0->DPB[i].frame->buf[0]) {
2996 ret = hevc_ref_frame(s, &s->DPB[i], &s0->DPB[i]);
3002 for (i = 0; i < FF_ARRAY_ELEMS(s->ps.vps_list); i++) {
3003 av_buffer_unref(&s->ps.vps_list[i]);
3004 if (s0->ps.vps_list[i]) {
3005 s->ps.vps_list[i] = av_buffer_ref(s0->ps.vps_list[i]);
3006 if (!s->ps.vps_list[i])
3007 return AVERROR(ENOMEM);
3011 for (i = 0; i < FF_ARRAY_ELEMS(s->ps.sps_list); i++) {
3012 av_buffer_unref(&s->ps.sps_list[i]);
3013 if (s0->ps.sps_list[i]) {
3014 s->ps.sps_list[i] = av_buffer_ref(s0->ps.sps_list[i]);
3015 if (!s->ps.sps_list[i])
3016 return AVERROR(ENOMEM);
3020 for (i = 0; i < FF_ARRAY_ELEMS(s->ps.pps_list); i++) {
3021 av_buffer_unref(&s->ps.pps_list[i]);
3022 if (s0->ps.pps_list[i]) {
3023 s->ps.pps_list[i] = av_buffer_ref(s0->ps.pps_list[i]);
3024 if (!s->ps.pps_list[i])
3025 return AVERROR(ENOMEM);
3029 if (s->ps.sps != s0->ps.sps)
3030 ret = set_sps(s, s0->ps.sps, src->pix_fmt);
3032 s->seq_decode = s0->seq_decode;
3033 s->seq_output = s0->seq_output;
3034 s->pocTid0 = s0->pocTid0;
3035 s->max_ra = s0->max_ra;
3037 s->is_nalff = s0->is_nalff;
3038 s->nal_length_size = s0->nal_length_size;
3041 s->seq_decode = (s->seq_decode + 1) & 0xff;
3042 s->max_ra = INT_MAX;
3048 static av_cold int hevc_decode_init(AVCodecContext *avctx)
3050 HEVCContext *s = avctx->priv_data;
3053 avctx->internal->allocate_progress = 1;
3055 ret = hevc_init_context(avctx);
3059 if (avctx->extradata_size > 0 && avctx->extradata) {
3060 ret = hevc_decode_extradata(s, avctx->extradata, avctx->extradata_size);
3062 hevc_decode_free(avctx);
3070 static av_cold int hevc_init_thread_copy(AVCodecContext *avctx)
3072 HEVCContext *s = avctx->priv_data;
3075 memset(s, 0, sizeof(*s));
3077 ret = hevc_init_context(avctx);
3084 static void hevc_decode_flush(AVCodecContext *avctx)
3086 HEVCContext *s = avctx->priv_data;
3087 ff_hevc_flush_dpb(s);
3088 s->max_ra = INT_MAX;
3091 #define OFFSET(x) offsetof(HEVCContext, x)
3092 #define PAR (AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
3094 static const AVOption options[] = {
3095 { "apply_defdispwin", "Apply default display window from VUI", OFFSET(apply_defdispwin),
3096 AV_OPT_TYPE_INT, {.i64 = 0}, 0, 1, PAR },
3100 static const AVClass hevc_decoder_class = {
3101 .class_name = "HEVC decoder",
3102 .item_name = av_default_item_name,
3104 .version = LIBAVUTIL_VERSION_INT,
3107 AVCodec ff_hevc_decoder = {
3109 .long_name = NULL_IF_CONFIG_SMALL("HEVC (High Efficiency Video Coding)"),
3110 .type = AVMEDIA_TYPE_VIDEO,
3111 .id = AV_CODEC_ID_HEVC,
3112 .priv_data_size = sizeof(HEVCContext),
3113 .priv_class = &hevc_decoder_class,
3114 .init = hevc_decode_init,
3115 .close = hevc_decode_free,
3116 .decode = hevc_decode_frame,
3117 .flush = hevc_decode_flush,
3118 .update_thread_context = hevc_update_thread_context,
3119 .init_thread_copy = hevc_init_thread_copy,
3120 .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY |
3121 AV_CODEC_CAP_FRAME_THREADS,
3122 .profiles = NULL_IF_CONFIG_SMALL(ff_hevc_profiles),
3123 .caps_internal = FF_CODEC_CAP_EXPORTS_CROPPING | FF_CODEC_CAP_INIT_THREADSAFE,
3124 .hw_configs = (const AVCodecHWConfigInternal*[]) {
3125 #if CONFIG_HEVC_CUVID_HWACCEL
3126 HWACCEL_CUVID(hevc),
3128 #if CONFIG_HEVC_DXVA2_HWACCEL
3129 HWACCEL_DXVA2(hevc),
3131 #if CONFIG_HEVC_D3D11VA_HWACCEL
3132 HWACCEL_D3D11VA(hevc),
3134 #if CONFIG_HEVC_D3D11VA2_HWACCEL
3135 HWACCEL_D3D11VA2(hevc),
3137 #if CONFIG_HEVC_VAAPI_HWACCEL
3138 HWACCEL_VAAPI(hevc),
3140 #if CONFIG_HEVC_VDPAU_HWACCEL
3141 HWACCEL_VDPAU(hevc),