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"
41 const uint8_t ff_hevc_qpel_extra_before[4] = { 0, 3, 3, 2 };
42 const uint8_t ff_hevc_qpel_extra_after[4] = { 0, 3, 4, 4 };
43 const uint8_t ff_hevc_qpel_extra[4] = { 0, 6, 7, 6 };
45 static const uint8_t scan_1x1[1] = { 0 };
47 static const uint8_t horiz_scan2x2_x[4] = { 0, 1, 0, 1 };
49 static const uint8_t horiz_scan2x2_y[4] = { 0, 0, 1, 1 };
51 static const uint8_t horiz_scan4x4_x[16] = {
58 static const uint8_t horiz_scan4x4_y[16] = {
65 static const uint8_t horiz_scan8x8_inv[8][8] = {
66 { 0, 1, 2, 3, 16, 17, 18, 19, },
67 { 4, 5, 6, 7, 20, 21, 22, 23, },
68 { 8, 9, 10, 11, 24, 25, 26, 27, },
69 { 12, 13, 14, 15, 28, 29, 30, 31, },
70 { 32, 33, 34, 35, 48, 49, 50, 51, },
71 { 36, 37, 38, 39, 52, 53, 54, 55, },
72 { 40, 41, 42, 43, 56, 57, 58, 59, },
73 { 44, 45, 46, 47, 60, 61, 62, 63, },
76 static const uint8_t diag_scan2x2_x[4] = { 0, 0, 1, 1 };
78 static const uint8_t diag_scan2x2_y[4] = { 0, 1, 0, 1 };
80 static const uint8_t diag_scan2x2_inv[2][2] = {
85 const uint8_t ff_hevc_diag_scan4x4_x[16] = {
92 const uint8_t ff_hevc_diag_scan4x4_y[16] = {
99 static const uint8_t diag_scan4x4_inv[4][4] = {
106 const uint8_t ff_hevc_diag_scan8x8_x[64] = {
125 const uint8_t ff_hevc_diag_scan8x8_y[64] = {
144 static const uint8_t diag_scan8x8_inv[8][8] = {
145 { 0, 2, 5, 9, 14, 20, 27, 35, },
146 { 1, 4, 8, 13, 19, 26, 34, 42, },
147 { 3, 7, 12, 18, 25, 33, 41, 48, },
148 { 6, 11, 17, 24, 32, 40, 47, 53, },
149 { 10, 16, 23, 31, 39, 46, 52, 57, },
150 { 15, 22, 30, 38, 45, 51, 56, 60, },
151 { 21, 29, 37, 44, 50, 55, 59, 62, },
152 { 28, 36, 43, 49, 54, 58, 61, 63, },
156 * NOTE: Each function hls_foo correspond to the function foo in the
157 * specification (HLS stands for High Level Syntax).
164 /* free everything allocated by pic_arrays_init() */
165 static void pic_arrays_free(HEVCContext *s)
168 av_freep(&s->deblock);
170 av_freep(&s->skip_flag);
171 av_freep(&s->tab_ct_depth);
173 av_freep(&s->tab_ipm);
174 av_freep(&s->cbf_luma);
175 av_freep(&s->is_pcm);
177 av_freep(&s->qp_y_tab);
178 av_freep(&s->tab_slice_address);
179 av_freep(&s->filter_slice_edges);
181 av_freep(&s->horizontal_bs);
182 av_freep(&s->vertical_bs);
184 av_buffer_pool_uninit(&s->tab_mvf_pool);
185 av_buffer_pool_uninit(&s->rpl_tab_pool);
188 /* allocate arrays that depend on frame dimensions */
189 static int pic_arrays_init(HEVCContext *s, const HEVCSPS *sps)
191 int log2_min_cb_size = sps->log2_min_cb_size;
192 int width = sps->width;
193 int height = sps->height;
194 int pic_size_in_ctb = ((width >> log2_min_cb_size) + 1) *
195 ((height >> log2_min_cb_size) + 1);
196 int ctb_count = sps->ctb_width * sps->ctb_height;
197 int min_pu_size = sps->min_pu_width * sps->min_pu_height;
199 s->bs_width = width >> 3;
200 s->bs_height = height >> 3;
202 s->sao = av_mallocz_array(ctb_count, sizeof(*s->sao));
203 s->deblock = av_mallocz_array(ctb_count, sizeof(*s->deblock));
204 if (!s->sao || !s->deblock)
207 s->skip_flag = av_malloc(pic_size_in_ctb);
208 s->tab_ct_depth = av_malloc(sps->min_cb_height * sps->min_cb_width);
209 if (!s->skip_flag || !s->tab_ct_depth)
212 s->cbf_luma = av_malloc(sps->min_tb_width * sps->min_tb_height);
213 s->tab_ipm = av_mallocz(min_pu_size);
214 s->is_pcm = av_malloc(min_pu_size);
215 if (!s->tab_ipm || !s->cbf_luma || !s->is_pcm)
218 s->filter_slice_edges = av_malloc(ctb_count);
219 s->tab_slice_address = av_malloc(pic_size_in_ctb *
220 sizeof(*s->tab_slice_address));
221 s->qp_y_tab = av_malloc(pic_size_in_ctb *
222 sizeof(*s->qp_y_tab));
223 if (!s->qp_y_tab || !s->filter_slice_edges || !s->tab_slice_address)
226 s->horizontal_bs = av_mallocz(2 * s->bs_width * (s->bs_height + 1));
227 s->vertical_bs = av_mallocz(2 * s->bs_width * (s->bs_height + 1));
228 if (!s->horizontal_bs || !s->vertical_bs)
231 s->tab_mvf_pool = av_buffer_pool_init(min_pu_size * sizeof(MvField),
233 s->rpl_tab_pool = av_buffer_pool_init(ctb_count * sizeof(RefPicListTab),
235 if (!s->tab_mvf_pool || !s->rpl_tab_pool)
242 return AVERROR(ENOMEM);
245 static void pred_weight_table(HEVCContext *s, GetBitContext *gb)
249 uint8_t luma_weight_l0_flag[16];
250 uint8_t chroma_weight_l0_flag[16];
251 uint8_t luma_weight_l1_flag[16];
252 uint8_t chroma_weight_l1_flag[16];
254 s->sh.luma_log2_weight_denom = av_clip_c(get_ue_golomb_long(gb), 0, 7);
255 if (s->sps->chroma_format_idc != 0) {
256 int delta = get_se_golomb(gb);
257 s->sh.chroma_log2_weight_denom = av_clip_c(s->sh.luma_log2_weight_denom + delta, 0, 7);
260 for (i = 0; i < s->sh.nb_refs[L0]; i++) {
261 luma_weight_l0_flag[i] = get_bits1(gb);
262 if (!luma_weight_l0_flag[i]) {
263 s->sh.luma_weight_l0[i] = 1 << s->sh.luma_log2_weight_denom;
264 s->sh.luma_offset_l0[i] = 0;
267 if (s->sps->chroma_format_idc != 0) { // FIXME: invert "if" and "for"
268 for (i = 0; i < s->sh.nb_refs[L0]; i++)
269 chroma_weight_l0_flag[i] = get_bits1(gb);
271 for (i = 0; i < s->sh.nb_refs[L0]; i++)
272 chroma_weight_l0_flag[i] = 0;
274 for (i = 0; i < s->sh.nb_refs[L0]; i++) {
275 if (luma_weight_l0_flag[i]) {
276 int delta_luma_weight_l0 = get_se_golomb(gb);
277 s->sh.luma_weight_l0[i] = (1 << s->sh.luma_log2_weight_denom) + delta_luma_weight_l0;
278 s->sh.luma_offset_l0[i] = get_se_golomb(gb);
280 if (chroma_weight_l0_flag[i]) {
281 for (j = 0; j < 2; j++) {
282 int delta_chroma_weight_l0 = get_se_golomb(gb);
283 int delta_chroma_offset_l0 = get_se_golomb(gb);
284 s->sh.chroma_weight_l0[i][j] = (1 << s->sh.chroma_log2_weight_denom) + delta_chroma_weight_l0;
285 s->sh.chroma_offset_l0[i][j] = av_clip_c((delta_chroma_offset_l0 - ((128 * s->sh.chroma_weight_l0[i][j])
286 >> s->sh.chroma_log2_weight_denom) + 128), -128, 127);
289 s->sh.chroma_weight_l0[i][0] = 1 << s->sh.chroma_log2_weight_denom;
290 s->sh.chroma_offset_l0[i][0] = 0;
291 s->sh.chroma_weight_l0[i][1] = 1 << s->sh.chroma_log2_weight_denom;
292 s->sh.chroma_offset_l0[i][1] = 0;
295 if (s->sh.slice_type == B_SLICE) {
296 for (i = 0; i < s->sh.nb_refs[L1]; i++) {
297 luma_weight_l1_flag[i] = get_bits1(gb);
298 if (!luma_weight_l1_flag[i]) {
299 s->sh.luma_weight_l1[i] = 1 << s->sh.luma_log2_weight_denom;
300 s->sh.luma_offset_l1[i] = 0;
303 if (s->sps->chroma_format_idc != 0) {
304 for (i = 0; i < s->sh.nb_refs[L1]; i++)
305 chroma_weight_l1_flag[i] = get_bits1(gb);
307 for (i = 0; i < s->sh.nb_refs[L1]; i++)
308 chroma_weight_l1_flag[i] = 0;
310 for (i = 0; i < s->sh.nb_refs[L1]; i++) {
311 if (luma_weight_l1_flag[i]) {
312 int delta_luma_weight_l1 = get_se_golomb(gb);
313 s->sh.luma_weight_l1[i] = (1 << s->sh.luma_log2_weight_denom) + delta_luma_weight_l1;
314 s->sh.luma_offset_l1[i] = get_se_golomb(gb);
316 if (chroma_weight_l1_flag[i]) {
317 for (j = 0; j < 2; j++) {
318 int delta_chroma_weight_l1 = get_se_golomb(gb);
319 int delta_chroma_offset_l1 = get_se_golomb(gb);
320 s->sh.chroma_weight_l1[i][j] = (1 << s->sh.chroma_log2_weight_denom) + delta_chroma_weight_l1;
321 s->sh.chroma_offset_l1[i][j] = av_clip_c((delta_chroma_offset_l1 - ((128 * s->sh.chroma_weight_l1[i][j])
322 >> s->sh.chroma_log2_weight_denom) + 128), -128, 127);
325 s->sh.chroma_weight_l1[i][0] = 1 << s->sh.chroma_log2_weight_denom;
326 s->sh.chroma_offset_l1[i][0] = 0;
327 s->sh.chroma_weight_l1[i][1] = 1 << s->sh.chroma_log2_weight_denom;
328 s->sh.chroma_offset_l1[i][1] = 0;
334 static int decode_lt_rps(HEVCContext *s, LongTermRPS *rps, GetBitContext *gb)
336 const HEVCSPS *sps = s->sps;
337 int max_poc_lsb = 1 << sps->log2_max_poc_lsb;
338 int prev_delta_msb = 0;
339 unsigned int nb_sps = 0, nb_sh;
343 if (!sps->long_term_ref_pics_present_flag)
346 if (sps->num_long_term_ref_pics_sps > 0)
347 nb_sps = get_ue_golomb_long(gb);
348 nb_sh = get_ue_golomb_long(gb);
350 if (nb_sh + nb_sps > FF_ARRAY_ELEMS(rps->poc))
351 return AVERROR_INVALIDDATA;
353 rps->nb_refs = nb_sh + nb_sps;
355 for (i = 0; i < rps->nb_refs; i++) {
356 uint8_t delta_poc_msb_present;
359 uint8_t lt_idx_sps = 0;
361 if (sps->num_long_term_ref_pics_sps > 1)
362 lt_idx_sps = get_bits(gb, av_ceil_log2(sps->num_long_term_ref_pics_sps));
364 rps->poc[i] = sps->lt_ref_pic_poc_lsb_sps[lt_idx_sps];
365 rps->used[i] = sps->used_by_curr_pic_lt_sps_flag[lt_idx_sps];
367 rps->poc[i] = get_bits(gb, sps->log2_max_poc_lsb);
368 rps->used[i] = get_bits1(gb);
371 delta_poc_msb_present = get_bits1(gb);
372 if (delta_poc_msb_present) {
373 int delta = get_ue_golomb_long(gb);
375 if (i && i != nb_sps)
376 delta += prev_delta_msb;
378 rps->poc[i] += s->poc - delta * max_poc_lsb - s->sh.pic_order_cnt_lsb;
379 prev_delta_msb = delta;
386 static int set_sps(HEVCContext *s, const HEVCSPS *sps)
389 unsigned int num = 0, den = 0;
392 ret = pic_arrays_init(s, sps);
396 s->avctx->coded_width = sps->width;
397 s->avctx->coded_height = sps->height;
398 s->avctx->width = sps->output_width;
399 s->avctx->height = sps->output_height;
400 s->avctx->pix_fmt = sps->pix_fmt;
401 s->avctx->has_b_frames = sps->temporal_layer[sps->max_sub_layers - 1].num_reorder_pics;
403 ff_set_sar(s->avctx, sps->vui.sar);
405 if (sps->vui.video_signal_type_present_flag)
406 s->avctx->color_range = sps->vui.video_full_range_flag ? AVCOL_RANGE_JPEG
409 s->avctx->color_range = AVCOL_RANGE_MPEG;
411 if (sps->vui.colour_description_present_flag) {
412 s->avctx->color_primaries = sps->vui.colour_primaries;
413 s->avctx->color_trc = sps->vui.transfer_characteristic;
414 s->avctx->colorspace = sps->vui.matrix_coeffs;
416 s->avctx->color_primaries = AVCOL_PRI_UNSPECIFIED;
417 s->avctx->color_trc = AVCOL_TRC_UNSPECIFIED;
418 s->avctx->colorspace = AVCOL_SPC_UNSPECIFIED;
421 ff_hevc_pred_init(&s->hpc, sps->bit_depth);
422 ff_hevc_dsp_init (&s->hevcdsp, sps->bit_depth);
423 ff_videodsp_init (&s->vdsp, sps->bit_depth);
425 if (sps->sao_enabled) {
426 av_frame_unref(s->tmp_frame);
427 ret = ff_get_buffer(s->avctx, s->tmp_frame, AV_GET_BUFFER_FLAG_REF);
430 s->frame = s->tmp_frame;
434 s->vps = (HEVCVPS*) s->vps_list[s->sps->vps_id]->data;
436 if (s->vps->vps_timing_info_present_flag) {
437 num = s->vps->vps_num_units_in_tick;
438 den = s->vps->vps_time_scale;
439 } else if (sps->vui.vui_timing_info_present_flag) {
440 num = sps->vui.vui_num_units_in_tick;
441 den = sps->vui.vui_time_scale;
444 if (num != 0 && den != 0)
445 av_reduce(&s->avctx->framerate.den, &s->avctx->framerate.num,
456 static int hls_slice_header(HEVCContext *s)
458 GetBitContext *gb = &s->HEVClc.gb;
459 SliceHeader *sh = &s->sh;
463 sh->first_slice_in_pic_flag = get_bits1(gb);
464 if ((IS_IDR(s) || IS_BLA(s)) && sh->first_slice_in_pic_flag) {
465 s->seq_decode = (s->seq_decode + 1) & 0xff;
468 ff_hevc_clear_refs(s);
471 sh->no_output_of_prior_pics_flag = get_bits1(gb);
473 sh->pps_id = get_ue_golomb_long(gb);
474 if (sh->pps_id >= MAX_PPS_COUNT || !s->pps_list[sh->pps_id]) {
475 av_log(s->avctx, AV_LOG_ERROR, "PPS id out of range: %d\n", sh->pps_id);
476 return AVERROR_INVALIDDATA;
478 if (!sh->first_slice_in_pic_flag &&
479 s->pps != (HEVCPPS*)s->pps_list[sh->pps_id]->data) {
480 av_log(s->avctx, AV_LOG_ERROR, "PPS changed between slices.\n");
481 return AVERROR_INVALIDDATA;
483 s->pps = (HEVCPPS*)s->pps_list[sh->pps_id]->data;
485 if (s->sps != (HEVCSPS*)s->sps_list[s->pps->sps_id]->data) {
486 s->sps = (HEVCSPS*)s->sps_list[s->pps->sps_id]->data;
488 ff_hevc_clear_refs(s);
489 ret = set_sps(s, s->sps);
493 s->seq_decode = (s->seq_decode + 1) & 0xff;
497 s->avctx->profile = s->sps->ptl.general_ptl.profile_idc;
498 s->avctx->level = s->sps->ptl.general_ptl.level_idc;
500 sh->dependent_slice_segment_flag = 0;
501 if (!sh->first_slice_in_pic_flag) {
502 int slice_address_length;
504 if (s->pps->dependent_slice_segments_enabled_flag)
505 sh->dependent_slice_segment_flag = get_bits1(gb);
507 slice_address_length = av_ceil_log2(s->sps->ctb_width *
509 sh->slice_segment_addr = get_bits(gb, slice_address_length);
510 if (sh->slice_segment_addr >= s->sps->ctb_width * s->sps->ctb_height) {
511 av_log(s->avctx, AV_LOG_ERROR,
512 "Invalid slice segment address: %u.\n",
513 sh->slice_segment_addr);
514 return AVERROR_INVALIDDATA;
517 if (!sh->dependent_slice_segment_flag) {
518 sh->slice_addr = sh->slice_segment_addr;
522 sh->slice_segment_addr = sh->slice_addr = 0;
524 s->slice_initialized = 0;
527 if (!sh->dependent_slice_segment_flag) {
528 s->slice_initialized = 0;
530 for (i = 0; i < s->pps->num_extra_slice_header_bits; i++)
531 skip_bits(gb, 1); // slice_reserved_undetermined_flag[]
533 sh->slice_type = get_ue_golomb_long(gb);
534 if (!(sh->slice_type == I_SLICE ||
535 sh->slice_type == P_SLICE ||
536 sh->slice_type == B_SLICE)) {
537 av_log(s->avctx, AV_LOG_ERROR, "Unknown slice type: %d.\n",
539 return AVERROR_INVALIDDATA;
541 if (IS_IRAP(s) && sh->slice_type != I_SLICE) {
542 av_log(s->avctx, AV_LOG_ERROR, "Inter slices in an IRAP frame.\n");
543 return AVERROR_INVALIDDATA;
546 // when flag is not present, picture is inferred to be output
547 sh->pic_output_flag = 1;
548 if (s->pps->output_flag_present_flag)
549 sh->pic_output_flag = get_bits1(gb);
551 if (s->sps->separate_colour_plane_flag)
552 sh->colour_plane_id = get_bits(gb, 2);
557 sh->pic_order_cnt_lsb = get_bits(gb, s->sps->log2_max_poc_lsb);
558 poc = ff_hevc_compute_poc(s, sh->pic_order_cnt_lsb);
559 if (!sh->first_slice_in_pic_flag && poc != s->poc) {
560 av_log(s->avctx, AV_LOG_WARNING,
561 "Ignoring POC change between slices: %d -> %d\n", s->poc, poc);
562 if (s->avctx->err_recognition & AV_EF_EXPLODE)
563 return AVERROR_INVALIDDATA;
568 sh->short_term_ref_pic_set_sps_flag = get_bits1(gb);
569 if (!sh->short_term_ref_pic_set_sps_flag) {
570 int pos = get_bits_left(gb);
571 ret = ff_hevc_decode_short_term_rps(s, &sh->slice_rps, s->sps, 1);
575 sh->short_term_ref_pic_set_size = pos - get_bits_left(gb);
576 sh->short_term_rps = &sh->slice_rps;
578 int numbits, rps_idx;
580 if (!s->sps->nb_st_rps) {
581 av_log(s->avctx, AV_LOG_ERROR, "No ref lists in the SPS.\n");
582 return AVERROR_INVALIDDATA;
585 numbits = av_ceil_log2(s->sps->nb_st_rps);
586 rps_idx = numbits > 0 ? get_bits(gb, numbits) : 0;
587 sh->short_term_rps = &s->sps->st_rps[rps_idx];
590 ret = decode_lt_rps(s, &sh->long_term_rps, gb);
592 av_log(s->avctx, AV_LOG_WARNING, "Invalid long term RPS.\n");
593 if (s->avctx->err_recognition & AV_EF_EXPLODE)
594 return AVERROR_INVALIDDATA;
597 if (s->sps->sps_temporal_mvp_enabled_flag)
598 sh->slice_temporal_mvp_enabled_flag = get_bits1(gb);
600 sh->slice_temporal_mvp_enabled_flag = 0;
602 s->sh.short_term_rps = NULL;
607 if (s->temporal_id == 0 &&
608 s->nal_unit_type != NAL_TRAIL_N &&
609 s->nal_unit_type != NAL_TSA_N &&
610 s->nal_unit_type != NAL_STSA_N &&
611 s->nal_unit_type != NAL_RADL_N &&
612 s->nal_unit_type != NAL_RADL_R &&
613 s->nal_unit_type != NAL_RASL_N &&
614 s->nal_unit_type != NAL_RASL_R)
617 if (s->sps->sao_enabled) {
618 sh->slice_sample_adaptive_offset_flag[0] = get_bits1(gb);
619 sh->slice_sample_adaptive_offset_flag[1] =
620 sh->slice_sample_adaptive_offset_flag[2] = get_bits1(gb);
622 sh->slice_sample_adaptive_offset_flag[0] = 0;
623 sh->slice_sample_adaptive_offset_flag[1] = 0;
624 sh->slice_sample_adaptive_offset_flag[2] = 0;
627 sh->nb_refs[L0] = sh->nb_refs[L1] = 0;
628 if (sh->slice_type == P_SLICE || sh->slice_type == B_SLICE) {
631 sh->nb_refs[L0] = s->pps->num_ref_idx_l0_default_active;
632 if (sh->slice_type == B_SLICE)
633 sh->nb_refs[L1] = s->pps->num_ref_idx_l1_default_active;
635 if (get_bits1(gb)) { // num_ref_idx_active_override_flag
636 sh->nb_refs[L0] = get_ue_golomb_long(gb) + 1;
637 if (sh->slice_type == B_SLICE)
638 sh->nb_refs[L1] = get_ue_golomb_long(gb) + 1;
640 if (sh->nb_refs[L0] > MAX_REFS || sh->nb_refs[L1] > MAX_REFS) {
641 av_log(s->avctx, AV_LOG_ERROR, "Too many refs: %d/%d.\n",
642 sh->nb_refs[L0], sh->nb_refs[L1]);
643 return AVERROR_INVALIDDATA;
646 sh->rpl_modification_flag[0] = 0;
647 sh->rpl_modification_flag[1] = 0;
648 nb_refs = ff_hevc_frame_nb_refs(s);
650 av_log(s->avctx, AV_LOG_ERROR, "Zero refs for a frame with P or B slices.\n");
651 return AVERROR_INVALIDDATA;
654 if (s->pps->lists_modification_present_flag && nb_refs > 1) {
655 sh->rpl_modification_flag[0] = get_bits1(gb);
656 if (sh->rpl_modification_flag[0]) {
657 for (i = 0; i < sh->nb_refs[L0]; i++)
658 sh->list_entry_lx[0][i] = get_bits(gb, av_ceil_log2(nb_refs));
661 if (sh->slice_type == B_SLICE) {
662 sh->rpl_modification_flag[1] = get_bits1(gb);
663 if (sh->rpl_modification_flag[1] == 1)
664 for (i = 0; i < sh->nb_refs[L1]; i++)
665 sh->list_entry_lx[1][i] = get_bits(gb, av_ceil_log2(nb_refs));
669 if (sh->slice_type == B_SLICE)
670 sh->mvd_l1_zero_flag = get_bits1(gb);
672 if (s->pps->cabac_init_present_flag)
673 sh->cabac_init_flag = get_bits1(gb);
675 sh->cabac_init_flag = 0;
677 sh->collocated_ref_idx = 0;
678 if (sh->slice_temporal_mvp_enabled_flag) {
679 sh->collocated_list = L0;
680 if (sh->slice_type == B_SLICE)
681 sh->collocated_list = !get_bits1(gb);
683 if (sh->nb_refs[sh->collocated_list] > 1) {
684 sh->collocated_ref_idx = get_ue_golomb_long(gb);
685 if (sh->collocated_ref_idx >= sh->nb_refs[sh->collocated_list]) {
686 av_log(s->avctx, AV_LOG_ERROR,
687 "Invalid collocated_ref_idx: %d.\n",
688 sh->collocated_ref_idx);
689 return AVERROR_INVALIDDATA;
694 if ((s->pps->weighted_pred_flag && sh->slice_type == P_SLICE) ||
695 (s->pps->weighted_bipred_flag && sh->slice_type == B_SLICE)) {
696 pred_weight_table(s, gb);
699 sh->max_num_merge_cand = 5 - get_ue_golomb_long(gb);
700 if (sh->max_num_merge_cand < 1 || sh->max_num_merge_cand > 5) {
701 av_log(s->avctx, AV_LOG_ERROR,
702 "Invalid number of merging MVP candidates: %d.\n",
703 sh->max_num_merge_cand);
704 return AVERROR_INVALIDDATA;
708 sh->slice_qp_delta = get_se_golomb(gb);
710 if (s->pps->pic_slice_level_chroma_qp_offsets_present_flag) {
711 sh->slice_cb_qp_offset = get_se_golomb(gb);
712 sh->slice_cr_qp_offset = get_se_golomb(gb);
714 sh->slice_cb_qp_offset = 0;
715 sh->slice_cr_qp_offset = 0;
718 if (s->pps->deblocking_filter_control_present_flag) {
719 int deblocking_filter_override_flag = 0;
721 if (s->pps->deblocking_filter_override_enabled_flag)
722 deblocking_filter_override_flag = get_bits1(gb);
724 if (deblocking_filter_override_flag) {
725 sh->disable_deblocking_filter_flag = get_bits1(gb);
726 if (!sh->disable_deblocking_filter_flag) {
727 sh->beta_offset = get_se_golomb(gb) * 2;
728 sh->tc_offset = get_se_golomb(gb) * 2;
731 sh->disable_deblocking_filter_flag = s->pps->disable_dbf;
732 sh->beta_offset = s->pps->beta_offset;
733 sh->tc_offset = s->pps->tc_offset;
736 sh->disable_deblocking_filter_flag = 0;
741 if (s->pps->seq_loop_filter_across_slices_enabled_flag &&
742 (sh->slice_sample_adaptive_offset_flag[0] ||
743 sh->slice_sample_adaptive_offset_flag[1] ||
744 !sh->disable_deblocking_filter_flag)) {
745 sh->slice_loop_filter_across_slices_enabled_flag = get_bits1(gb);
747 sh->slice_loop_filter_across_slices_enabled_flag = s->pps->seq_loop_filter_across_slices_enabled_flag;
749 } else if (!s->slice_initialized) {
750 av_log(s->avctx, AV_LOG_ERROR, "Independent slice segment missing.\n");
751 return AVERROR_INVALIDDATA;
754 sh->num_entry_point_offsets = 0;
755 if (s->pps->tiles_enabled_flag || s->pps->entropy_coding_sync_enabled_flag) {
756 sh->num_entry_point_offsets = get_ue_golomb_long(gb);
757 if (sh->num_entry_point_offsets > 0) {
758 int offset_len = get_ue_golomb_long(gb) + 1;
760 for (i = 0; i < sh->num_entry_point_offsets; i++)
761 skip_bits(gb, offset_len);
765 if (s->pps->slice_header_extension_present_flag) {
766 unsigned int length = get_ue_golomb_long(gb);
767 for (i = 0; i < length; i++)
768 skip_bits(gb, 8); // slice_header_extension_data_byte
771 // Inferred parameters
772 sh->slice_qp = 26 + s->pps->pic_init_qp_minus26 + sh->slice_qp_delta;
773 if (sh->slice_qp > 51 ||
774 sh->slice_qp < -s->sps->qp_bd_offset) {
775 av_log(s->avctx, AV_LOG_ERROR,
776 "The slice_qp %d is outside the valid range "
779 -s->sps->qp_bd_offset);
780 return AVERROR_INVALIDDATA;
783 sh->slice_ctb_addr_rs = sh->slice_segment_addr;
785 if (!s->sh.slice_ctb_addr_rs && s->sh.dependent_slice_segment_flag) {
786 av_log(s->avctx, AV_LOG_ERROR, "Impossible slice segment.\n");
787 return AVERROR_INVALIDDATA;
790 s->HEVClc.first_qp_group = !s->sh.dependent_slice_segment_flag;
792 if (!s->pps->cu_qp_delta_enabled_flag)
793 s->HEVClc.qp_y = FFUMOD(s->sh.slice_qp + 52 + 2 * s->sps->qp_bd_offset,
794 52 + s->sps->qp_bd_offset) - s->sps->qp_bd_offset;
796 s->slice_initialized = 1;
801 #define CTB(tab, x, y) ((tab)[(y) * s->sps->ctb_width + (x)])
803 #define SET_SAO(elem, value) \
805 if (!sao_merge_up_flag && !sao_merge_left_flag) \
807 else if (sao_merge_left_flag) \
808 sao->elem = CTB(s->sao, rx-1, ry).elem; \
809 else if (sao_merge_up_flag) \
810 sao->elem = CTB(s->sao, rx, ry-1).elem; \
815 static void hls_sao_param(HEVCContext *s, int rx, int ry)
817 HEVCLocalContext *lc = &s->HEVClc;
818 int sao_merge_left_flag = 0;
819 int sao_merge_up_flag = 0;
820 int shift = s->sps->bit_depth - FFMIN(s->sps->bit_depth, 10);
821 SAOParams *sao = &CTB(s->sao, rx, ry);
824 if (s->sh.slice_sample_adaptive_offset_flag[0] ||
825 s->sh.slice_sample_adaptive_offset_flag[1]) {
827 if (lc->ctb_left_flag)
828 sao_merge_left_flag = ff_hevc_sao_merge_flag_decode(s);
830 if (ry > 0 && !sao_merge_left_flag) {
832 sao_merge_up_flag = ff_hevc_sao_merge_flag_decode(s);
836 for (c_idx = 0; c_idx < 3; c_idx++) {
837 if (!s->sh.slice_sample_adaptive_offset_flag[c_idx]) {
838 sao->type_idx[c_idx] = SAO_NOT_APPLIED;
843 sao->type_idx[2] = sao->type_idx[1];
844 sao->eo_class[2] = sao->eo_class[1];
846 SET_SAO(type_idx[c_idx], ff_hevc_sao_type_idx_decode(s));
849 if (sao->type_idx[c_idx] == SAO_NOT_APPLIED)
852 for (i = 0; i < 4; i++)
853 SET_SAO(offset_abs[c_idx][i], ff_hevc_sao_offset_abs_decode(s));
855 if (sao->type_idx[c_idx] == SAO_BAND) {
856 for (i = 0; i < 4; i++) {
857 if (sao->offset_abs[c_idx][i]) {
858 SET_SAO(offset_sign[c_idx][i],
859 ff_hevc_sao_offset_sign_decode(s));
861 sao->offset_sign[c_idx][i] = 0;
864 SET_SAO(band_position[c_idx], ff_hevc_sao_band_position_decode(s));
865 } else if (c_idx != 2) {
866 SET_SAO(eo_class[c_idx], ff_hevc_sao_eo_class_decode(s));
869 // Inferred parameters
870 sao->offset_val[c_idx][0] = 0;
871 for (i = 0; i < 4; i++) {
872 sao->offset_val[c_idx][i + 1] = sao->offset_abs[c_idx][i] << shift;
873 if (sao->type_idx[c_idx] == SAO_EDGE) {
875 sao->offset_val[c_idx][i + 1] = -sao->offset_val[c_idx][i + 1];
876 } else if (sao->offset_sign[c_idx][i]) {
877 sao->offset_val[c_idx][i + 1] = -sao->offset_val[c_idx][i + 1];
886 static void hls_residual_coding(HEVCContext *s, int x0, int y0,
887 int log2_trafo_size, enum ScanType scan_idx,
890 #define GET_COORD(offset, n) \
892 x_c = (scan_x_cg[offset >> 4] << 2) + scan_x_off[n]; \
893 y_c = (scan_y_cg[offset >> 4] << 2) + scan_y_off[n]; \
895 HEVCLocalContext *lc = &s->HEVClc;
896 int transform_skip_flag = 0;
898 int last_significant_coeff_x, last_significant_coeff_y;
902 int greater1_ctx = 1;
905 int x_cg_last_sig, y_cg_last_sig;
907 const uint8_t *scan_x_cg, *scan_y_cg, *scan_x_off, *scan_y_off;
909 ptrdiff_t stride = s->frame->linesize[c_idx];
910 int hshift = s->sps->hshift[c_idx];
911 int vshift = s->sps->vshift[c_idx];
912 uint8_t *dst = &s->frame->data[c_idx][(y0 >> vshift) * stride +
913 ((x0 >> hshift) << s->sps->pixel_shift)];
914 DECLARE_ALIGNED(16, int16_t, coeffs[MAX_TB_SIZE * MAX_TB_SIZE]) = { 0 };
915 DECLARE_ALIGNED(8, uint8_t, significant_coeff_group_flag[8][8]) = { { 0 } };
917 int trafo_size = 1 << log2_trafo_size;
918 int i, qp, shift, add, scale, scale_m;
919 const uint8_t level_scale[] = { 40, 45, 51, 57, 64, 72 };
920 const uint8_t *scale_matrix;
923 // Derive QP for dequant
924 if (!lc->cu.cu_transquant_bypass_flag) {
925 static const int qp_c[] = {
926 29, 30, 31, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37
929 static const uint8_t rem6[51 + 2 * 6 + 1] = {
930 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2,
931 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5,
932 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3,
935 static const uint8_t div6[51 + 2 * 6 + 1] = {
936 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3,
937 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6,
938 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10,
943 qp = qp_y + s->sps->qp_bd_offset;
948 offset = s->pps->cb_qp_offset + s->sh.slice_cb_qp_offset;
950 offset = s->pps->cr_qp_offset + s->sh.slice_cr_qp_offset;
952 qp_i = av_clip_c(qp_y + offset, -s->sps->qp_bd_offset, 57);
958 qp = qp_c[qp_i - 30];
960 qp += s->sps->qp_bd_offset;
963 shift = s->sps->bit_depth + log2_trafo_size - 5;
964 add = 1 << (shift - 1);
965 scale = level_scale[rem6[qp]] << (div6[qp]);
966 scale_m = 16; // default when no custom scaling lists.
969 if (s->sps->scaling_list_enable_flag) {
970 const ScalingList *sl = s->pps->scaling_list_data_present_flag ?
971 &s->pps->scaling_list : &s->sps->scaling_list;
972 int matrix_id = lc->cu.pred_mode != MODE_INTRA;
974 if (log2_trafo_size != 5)
975 matrix_id = 3 * matrix_id + c_idx;
977 scale_matrix = sl->sl[log2_trafo_size - 2][matrix_id];
978 if (log2_trafo_size >= 4)
979 dc_scale = sl->sl_dc[log2_trafo_size - 4][matrix_id];
983 if (s->pps->transform_skip_enabled_flag &&
984 !lc->cu.cu_transquant_bypass_flag &&
985 log2_trafo_size == 2) {
986 transform_skip_flag = ff_hevc_transform_skip_flag_decode(s, c_idx);
989 last_significant_coeff_x =
990 ff_hevc_last_significant_coeff_x_prefix_decode(s, c_idx, log2_trafo_size);
991 last_significant_coeff_y =
992 ff_hevc_last_significant_coeff_y_prefix_decode(s, c_idx, log2_trafo_size);
994 if (last_significant_coeff_x > 3) {
995 int suffix = ff_hevc_last_significant_coeff_suffix_decode(s, last_significant_coeff_x);
996 last_significant_coeff_x = (1 << ((last_significant_coeff_x >> 1) - 1)) *
997 (2 + (last_significant_coeff_x & 1)) +
1001 if (last_significant_coeff_y > 3) {
1002 int suffix = ff_hevc_last_significant_coeff_suffix_decode(s, last_significant_coeff_y);
1003 last_significant_coeff_y = (1 << ((last_significant_coeff_y >> 1) - 1)) *
1004 (2 + (last_significant_coeff_y & 1)) +
1008 if (scan_idx == SCAN_VERT)
1009 FFSWAP(int, last_significant_coeff_x, last_significant_coeff_y);
1011 x_cg_last_sig = last_significant_coeff_x >> 2;
1012 y_cg_last_sig = last_significant_coeff_y >> 2;
1016 int last_x_c = last_significant_coeff_x & 3;
1017 int last_y_c = last_significant_coeff_y & 3;
1019 scan_x_off = ff_hevc_diag_scan4x4_x;
1020 scan_y_off = ff_hevc_diag_scan4x4_y;
1021 num_coeff = diag_scan4x4_inv[last_y_c][last_x_c];
1022 if (trafo_size == 4) {
1023 scan_x_cg = scan_1x1;
1024 scan_y_cg = scan_1x1;
1025 } else if (trafo_size == 8) {
1026 num_coeff += diag_scan2x2_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1027 scan_x_cg = diag_scan2x2_x;
1028 scan_y_cg = diag_scan2x2_y;
1029 } else if (trafo_size == 16) {
1030 num_coeff += diag_scan4x4_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1031 scan_x_cg = ff_hevc_diag_scan4x4_x;
1032 scan_y_cg = ff_hevc_diag_scan4x4_y;
1033 } else { // trafo_size == 32
1034 num_coeff += diag_scan8x8_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1035 scan_x_cg = ff_hevc_diag_scan8x8_x;
1036 scan_y_cg = ff_hevc_diag_scan8x8_y;
1041 scan_x_cg = horiz_scan2x2_x;
1042 scan_y_cg = horiz_scan2x2_y;
1043 scan_x_off = horiz_scan4x4_x;
1044 scan_y_off = horiz_scan4x4_y;
1045 num_coeff = horiz_scan8x8_inv[last_significant_coeff_y][last_significant_coeff_x];
1047 default: //SCAN_VERT
1048 scan_x_cg = horiz_scan2x2_y;
1049 scan_y_cg = horiz_scan2x2_x;
1050 scan_x_off = horiz_scan4x4_y;
1051 scan_y_off = horiz_scan4x4_x;
1052 num_coeff = horiz_scan8x8_inv[last_significant_coeff_x][last_significant_coeff_y];
1056 num_last_subset = (num_coeff - 1) >> 4;
1058 for (i = num_last_subset; i >= 0; i--) {
1060 int x_cg, y_cg, x_c, y_c;
1061 int implicit_non_zero_coeff = 0;
1062 int64_t trans_coeff_level;
1064 int offset = i << 4;
1066 uint8_t significant_coeff_flag_idx[16];
1067 uint8_t nb_significant_coeff_flag = 0;
1069 x_cg = scan_x_cg[i];
1070 y_cg = scan_y_cg[i];
1072 if (i < num_last_subset && i > 0) {
1074 if (x_cg < (1 << (log2_trafo_size - 2)) - 1)
1075 ctx_cg += significant_coeff_group_flag[x_cg + 1][y_cg];
1076 if (y_cg < (1 << (log2_trafo_size - 2)) - 1)
1077 ctx_cg += significant_coeff_group_flag[x_cg][y_cg + 1];
1079 significant_coeff_group_flag[x_cg][y_cg] =
1080 ff_hevc_significant_coeff_group_flag_decode(s, c_idx, ctx_cg);
1081 implicit_non_zero_coeff = 1;
1083 significant_coeff_group_flag[x_cg][y_cg] =
1084 ((x_cg == x_cg_last_sig && y_cg == y_cg_last_sig) ||
1085 (x_cg == 0 && y_cg == 0));
1088 last_scan_pos = num_coeff - offset - 1;
1090 if (i == num_last_subset) {
1091 n_end = last_scan_pos - 1;
1092 significant_coeff_flag_idx[0] = last_scan_pos;
1093 nb_significant_coeff_flag = 1;
1098 if (x_cg < ((1 << log2_trafo_size) - 1) >> 2)
1099 prev_sig = significant_coeff_group_flag[x_cg + 1][y_cg];
1100 if (y_cg < ((1 << log2_trafo_size) - 1) >> 2)
1101 prev_sig += significant_coeff_group_flag[x_cg][y_cg + 1] << 1;
1103 for (n = n_end; n >= 0; n--) {
1104 GET_COORD(offset, n);
1106 if (significant_coeff_group_flag[x_cg][y_cg] &&
1107 (n > 0 || implicit_non_zero_coeff == 0)) {
1108 if (ff_hevc_significant_coeff_flag_decode(s, c_idx, x_c, y_c,
1112 significant_coeff_flag_idx[nb_significant_coeff_flag] = n;
1113 nb_significant_coeff_flag++;
1114 implicit_non_zero_coeff = 0;
1117 int last_cg = (x_c == (x_cg << 2) && y_c == (y_cg << 2));
1118 if (last_cg && implicit_non_zero_coeff && significant_coeff_group_flag[x_cg][y_cg]) {
1119 significant_coeff_flag_idx[nb_significant_coeff_flag] = n;
1120 nb_significant_coeff_flag++;
1125 n_end = nb_significant_coeff_flag;
1128 int first_nz_pos_in_cg = 16;
1129 int last_nz_pos_in_cg = -1;
1130 int c_rice_param = 0;
1131 int first_greater1_coeff_idx = -1;
1132 uint8_t coeff_abs_level_greater1_flag[16] = { 0 };
1133 uint16_t coeff_sign_flag;
1135 int sign_hidden = 0;
1137 // initialize first elem of coeff_bas_level_greater1_flag
1138 int ctx_set = (i > 0 && c_idx == 0) ? 2 : 0;
1140 if (!(i == num_last_subset) && greater1_ctx == 0)
1143 last_nz_pos_in_cg = significant_coeff_flag_idx[0];
1145 for (m = 0; m < (n_end > 8 ? 8 : n_end); m++) {
1146 int n_idx = significant_coeff_flag_idx[m];
1147 int inc = (ctx_set << 2) + greater1_ctx;
1148 coeff_abs_level_greater1_flag[n_idx] =
1149 ff_hevc_coeff_abs_level_greater1_flag_decode(s, c_idx, inc);
1150 if (coeff_abs_level_greater1_flag[n_idx]) {
1152 } else if (greater1_ctx > 0 && greater1_ctx < 3) {
1156 if (coeff_abs_level_greater1_flag[n_idx] &&
1157 first_greater1_coeff_idx == -1)
1158 first_greater1_coeff_idx = n_idx;
1160 first_nz_pos_in_cg = significant_coeff_flag_idx[n_end - 1];
1161 sign_hidden = last_nz_pos_in_cg - first_nz_pos_in_cg >= 4 &&
1162 !lc->cu.cu_transquant_bypass_flag;
1164 if (first_greater1_coeff_idx != -1) {
1165 coeff_abs_level_greater1_flag[first_greater1_coeff_idx] += ff_hevc_coeff_abs_level_greater2_flag_decode(s, c_idx, ctx_set);
1167 if (!s->pps->sign_data_hiding_flag || !sign_hidden) {
1168 coeff_sign_flag = ff_hevc_coeff_sign_flag(s, nb_significant_coeff_flag) << (16 - nb_significant_coeff_flag);
1170 coeff_sign_flag = ff_hevc_coeff_sign_flag(s, nb_significant_coeff_flag - 1) << (16 - (nb_significant_coeff_flag - 1));
1173 for (m = 0; m < n_end; m++) {
1174 n = significant_coeff_flag_idx[m];
1175 GET_COORD(offset, n);
1176 trans_coeff_level = 1 + coeff_abs_level_greater1_flag[n];
1177 if (trans_coeff_level == ((m < 8) ?
1178 ((n == first_greater1_coeff_idx) ? 3 : 2) : 1)) {
1179 int last_coeff_abs_level_remaining = ff_hevc_coeff_abs_level_remaining(s, trans_coeff_level, c_rice_param);
1181 trans_coeff_level += last_coeff_abs_level_remaining;
1182 if ((trans_coeff_level) > (3 * (1 << c_rice_param)))
1183 c_rice_param = FFMIN(c_rice_param + 1, 4);
1185 if (s->pps->sign_data_hiding_flag && sign_hidden) {
1186 sum_abs += trans_coeff_level;
1187 if (n == first_nz_pos_in_cg && ((sum_abs & 1) == 1))
1188 trans_coeff_level = -trans_coeff_level;
1190 if (coeff_sign_flag >> 15)
1191 trans_coeff_level = -trans_coeff_level;
1192 coeff_sign_flag <<= 1;
1193 if (!lc->cu.cu_transquant_bypass_flag) {
1194 if (s->sps->scaling_list_enable_flag) {
1195 if (y_c || x_c || log2_trafo_size < 4) {
1197 switch (log2_trafo_size) {
1198 case 3: pos = (y_c << 3) + x_c; break;
1199 case 4: pos = ((y_c >> 1) << 3) + (x_c >> 1); break;
1200 case 5: pos = ((y_c >> 2) << 3) + (x_c >> 2); break;
1201 default: pos = (y_c << 2) + x_c;
1203 scale_m = scale_matrix[pos];
1208 trans_coeff_level = (trans_coeff_level * (int64_t)scale * (int64_t)scale_m + add) >> shift;
1209 if(trans_coeff_level < 0) {
1210 if((~trans_coeff_level) & 0xFffffffffff8000)
1211 trans_coeff_level = -32768;
1213 if (trans_coeff_level & 0xffffffffffff8000)
1214 trans_coeff_level = 32767;
1217 coeffs[y_c * trafo_size + x_c] = trans_coeff_level;
1222 if (lc->cu.cu_transquant_bypass_flag) {
1223 s->hevcdsp.transquant_bypass[log2_trafo_size - 2](dst, coeffs, stride);
1225 if (transform_skip_flag)
1226 s->hevcdsp.transform_skip(dst, coeffs, stride);
1227 else if (lc->cu.pred_mode == MODE_INTRA && c_idx == 0 &&
1228 log2_trafo_size == 2)
1229 s->hevcdsp.transform_4x4_luma_add(dst, coeffs, stride);
1231 s->hevcdsp.transform_add[log2_trafo_size - 2](dst, coeffs, stride);
1235 static int hls_transform_unit(HEVCContext *s, int x0, int y0,
1236 int xBase, int yBase, int cb_xBase, int cb_yBase,
1237 int log2_cb_size, int log2_trafo_size,
1238 int blk_idx, int cbf_luma, int cbf_cb, int cbf_cr)
1240 HEVCLocalContext *lc = &s->HEVClc;
1242 if (lc->cu.pred_mode == MODE_INTRA) {
1243 int trafo_size = 1 << log2_trafo_size;
1244 ff_hevc_set_neighbour_available(s, x0, y0, trafo_size, trafo_size);
1246 s->hpc.intra_pred[log2_trafo_size - 2](s, x0, y0, 0);
1247 if (log2_trafo_size > 2) {
1248 trafo_size = trafo_size << (s->sps->hshift[1] - 1);
1249 ff_hevc_set_neighbour_available(s, x0, y0, trafo_size, trafo_size);
1250 s->hpc.intra_pred[log2_trafo_size - 3](s, x0, y0, 1);
1251 s->hpc.intra_pred[log2_trafo_size - 3](s, x0, y0, 2);
1252 } else if (blk_idx == 3) {
1253 trafo_size = trafo_size << s->sps->hshift[1];
1254 ff_hevc_set_neighbour_available(s, xBase, yBase,
1255 trafo_size, trafo_size);
1256 s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase, 1);
1257 s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase, 2);
1261 if (cbf_luma || cbf_cb || cbf_cr) {
1262 int scan_idx = SCAN_DIAG;
1263 int scan_idx_c = SCAN_DIAG;
1265 if (s->pps->cu_qp_delta_enabled_flag && !lc->tu.is_cu_qp_delta_coded) {
1266 lc->tu.cu_qp_delta = ff_hevc_cu_qp_delta_abs(s);
1267 if (lc->tu.cu_qp_delta != 0)
1268 if (ff_hevc_cu_qp_delta_sign_flag(s) == 1)
1269 lc->tu.cu_qp_delta = -lc->tu.cu_qp_delta;
1270 lc->tu.is_cu_qp_delta_coded = 1;
1272 if (lc->tu.cu_qp_delta < -(26 + s->sps->qp_bd_offset / 2) ||
1273 lc->tu.cu_qp_delta > (25 + s->sps->qp_bd_offset / 2)) {
1274 av_log(s->avctx, AV_LOG_ERROR,
1275 "The cu_qp_delta %d is outside the valid range "
1278 -(26 + s->sps->qp_bd_offset / 2),
1279 (25 + s->sps->qp_bd_offset / 2));
1280 return AVERROR_INVALIDDATA;
1283 ff_hevc_set_qPy(s, x0, y0, cb_xBase, cb_yBase, log2_cb_size);
1286 if (lc->cu.pred_mode == MODE_INTRA && log2_trafo_size < 4) {
1287 if (lc->tu.cur_intra_pred_mode >= 6 &&
1288 lc->tu.cur_intra_pred_mode <= 14) {
1289 scan_idx = SCAN_VERT;
1290 } else if (lc->tu.cur_intra_pred_mode >= 22 &&
1291 lc->tu.cur_intra_pred_mode <= 30) {
1292 scan_idx = SCAN_HORIZ;
1295 if (lc->pu.intra_pred_mode_c >= 6 &&
1296 lc->pu.intra_pred_mode_c <= 14) {
1297 scan_idx_c = SCAN_VERT;
1298 } else if (lc->pu.intra_pred_mode_c >= 22 &&
1299 lc->pu.intra_pred_mode_c <= 30) {
1300 scan_idx_c = SCAN_HORIZ;
1305 hls_residual_coding(s, x0, y0, log2_trafo_size, scan_idx, 0);
1306 if (log2_trafo_size > 2) {
1308 hls_residual_coding(s, x0, y0, log2_trafo_size - 1, scan_idx_c, 1);
1310 hls_residual_coding(s, x0, y0, log2_trafo_size - 1, scan_idx_c, 2);
1311 } else if (blk_idx == 3) {
1313 hls_residual_coding(s, xBase, yBase, log2_trafo_size, scan_idx_c, 1);
1315 hls_residual_coding(s, xBase, yBase, log2_trafo_size, scan_idx_c, 2);
1321 static void set_deblocking_bypass(HEVCContext *s, int x0, int y0, int log2_cb_size)
1323 int cb_size = 1 << log2_cb_size;
1324 int log2_min_pu_size = s->sps->log2_min_pu_size;
1326 int min_pu_width = s->sps->min_pu_width;
1327 int x_end = FFMIN(x0 + cb_size, s->sps->width);
1328 int y_end = FFMIN(y0 + cb_size, s->sps->height);
1331 for (j = (y0 >> log2_min_pu_size); j < (y_end >> log2_min_pu_size); j++)
1332 for (i = (x0 >> log2_min_pu_size); i < (x_end >> log2_min_pu_size); i++)
1333 s->is_pcm[i + j * min_pu_width] = 2;
1336 static int hls_transform_tree(HEVCContext *s, int x0, int y0,
1337 int xBase, int yBase, int cb_xBase, int cb_yBase,
1338 int log2_cb_size, int log2_trafo_size,
1339 int trafo_depth, int blk_idx,
1340 int cbf_cb, int cbf_cr)
1342 HEVCLocalContext *lc = &s->HEVClc;
1343 uint8_t split_transform_flag;
1346 if (lc->cu.intra_split_flag) {
1347 if (trafo_depth == 1)
1348 lc->tu.cur_intra_pred_mode = lc->pu.intra_pred_mode[blk_idx];
1350 lc->tu.cur_intra_pred_mode = lc->pu.intra_pred_mode[0];
1353 if (log2_trafo_size <= s->sps->log2_max_trafo_size &&
1354 log2_trafo_size > s->sps->log2_min_tb_size &&
1355 trafo_depth < lc->cu.max_trafo_depth &&
1356 !(lc->cu.intra_split_flag && trafo_depth == 0)) {
1357 split_transform_flag = ff_hevc_split_transform_flag_decode(s, log2_trafo_size);
1359 int inter_split = s->sps->max_transform_hierarchy_depth_inter == 0 &&
1360 lc->cu.pred_mode == MODE_INTER &&
1361 lc->cu.part_mode != PART_2Nx2N &&
1364 split_transform_flag = log2_trafo_size > s->sps->log2_max_trafo_size ||
1365 (lc->cu.intra_split_flag && trafo_depth == 0) ||
1369 if (log2_trafo_size > 2 && (trafo_depth == 0 || cbf_cb))
1370 cbf_cb = ff_hevc_cbf_cb_cr_decode(s, trafo_depth);
1371 else if (log2_trafo_size > 2 || trafo_depth == 0)
1373 if (log2_trafo_size > 2 && (trafo_depth == 0 || cbf_cr))
1374 cbf_cr = ff_hevc_cbf_cb_cr_decode(s, trafo_depth);
1375 else if (log2_trafo_size > 2 || trafo_depth == 0)
1378 if (split_transform_flag) {
1379 const int trafo_size_split = 1 << (log2_trafo_size - 1);
1380 const int x1 = x0 + trafo_size_split;
1381 const int y1 = y0 + trafo_size_split;
1383 #define SUBDIVIDE(x, y, idx) \
1385 ret = hls_transform_tree(s, x, y, x0, y0, cb_xBase, cb_yBase, log2_cb_size, \
1386 log2_trafo_size - 1, trafo_depth + 1, idx, \
1392 SUBDIVIDE(x0, y0, 0);
1393 SUBDIVIDE(x1, y0, 1);
1394 SUBDIVIDE(x0, y1, 2);
1395 SUBDIVIDE(x1, y1, 3);
1399 int min_tu_size = 1 << s->sps->log2_min_tb_size;
1400 int log2_min_tu_size = s->sps->log2_min_tb_size;
1401 int min_tu_width = s->sps->min_tb_width;
1404 if (lc->cu.pred_mode == MODE_INTRA || trafo_depth != 0 ||
1406 cbf_luma = ff_hevc_cbf_luma_decode(s, trafo_depth);
1408 ret = hls_transform_unit(s, x0, y0, xBase, yBase, cb_xBase, cb_yBase,
1409 log2_cb_size, log2_trafo_size,
1410 blk_idx, cbf_luma, cbf_cb, cbf_cr);
1413 // TODO: store cbf_luma somewhere else
1416 for (i = 0; i < (1 << log2_trafo_size); i += min_tu_size)
1417 for (j = 0; j < (1 << log2_trafo_size); j += min_tu_size) {
1418 int x_tu = (x0 + j) >> log2_min_tu_size;
1419 int y_tu = (y0 + i) >> log2_min_tu_size;
1420 s->cbf_luma[y_tu * min_tu_width + x_tu] = 1;
1423 if (!s->sh.disable_deblocking_filter_flag) {
1424 ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_trafo_size);
1425 if (s->pps->transquant_bypass_enable_flag &&
1426 lc->cu.cu_transquant_bypass_flag)
1427 set_deblocking_bypass(s, x0, y0, log2_trafo_size);
1433 static int hls_pcm_sample(HEVCContext *s, int x0, int y0, int log2_cb_size)
1435 //TODO: non-4:2:0 support
1436 HEVCLocalContext *lc = &s->HEVClc;
1438 int cb_size = 1 << log2_cb_size;
1439 int stride0 = s->frame->linesize[0];
1440 uint8_t *dst0 = &s->frame->data[0][y0 * stride0 + (x0 << s->sps->pixel_shift)];
1441 int stride1 = s->frame->linesize[1];
1442 uint8_t *dst1 = &s->frame->data[1][(y0 >> s->sps->vshift[1]) * stride1 + ((x0 >> s->sps->hshift[1]) << s->sps->pixel_shift)];
1443 int stride2 = s->frame->linesize[2];
1444 uint8_t *dst2 = &s->frame->data[2][(y0 >> s->sps->vshift[2]) * stride2 + ((x0 >> s->sps->hshift[2]) << s->sps->pixel_shift)];
1446 int length = cb_size * cb_size * s->sps->pcm.bit_depth + ((cb_size * cb_size) >> 1) * s->sps->pcm.bit_depth_chroma;
1447 const uint8_t *pcm = skip_bytes(&lc->cc, (length + 7) >> 3);
1450 if (!s->sh.disable_deblocking_filter_flag)
1451 ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_cb_size);
1453 ret = init_get_bits(&gb, pcm, length);
1457 s->hevcdsp.put_pcm(dst0, stride0, cb_size, &gb, s->sps->pcm.bit_depth);
1458 s->hevcdsp.put_pcm(dst1, stride1, cb_size / 2, &gb, s->sps->pcm.bit_depth_chroma);
1459 s->hevcdsp.put_pcm(dst2, stride2, cb_size / 2, &gb, s->sps->pcm.bit_depth_chroma);
1463 static void hls_mvd_coding(HEVCContext *s, int x0, int y0, int log2_cb_size)
1465 HEVCLocalContext *lc = &s->HEVClc;
1466 int x = ff_hevc_abs_mvd_greater0_flag_decode(s);
1467 int y = ff_hevc_abs_mvd_greater0_flag_decode(s);
1470 x += ff_hevc_abs_mvd_greater1_flag_decode(s);
1472 y += ff_hevc_abs_mvd_greater1_flag_decode(s);
1475 case 2: lc->pu.mvd.x = ff_hevc_mvd_decode(s); break;
1476 case 1: lc->pu.mvd.x = ff_hevc_mvd_sign_flag_decode(s); break;
1477 case 0: lc->pu.mvd.x = 0; break;
1481 case 2: lc->pu.mvd.y = ff_hevc_mvd_decode(s); break;
1482 case 1: lc->pu.mvd.y = ff_hevc_mvd_sign_flag_decode(s); break;
1483 case 0: lc->pu.mvd.y = 0; break;
1488 * 8.5.3.2.2.1 Luma sample interpolation process
1490 * @param s HEVC decoding context
1491 * @param dst target buffer for block data at block position
1492 * @param dststride stride of the dst buffer
1493 * @param ref reference picture buffer at origin (0, 0)
1494 * @param mv motion vector (relative to block position) to get pixel data from
1495 * @param x_off horizontal position of block from origin (0, 0)
1496 * @param y_off vertical position of block from origin (0, 0)
1497 * @param block_w width of block
1498 * @param block_h height of block
1500 static void luma_mc(HEVCContext *s, int16_t *dst, ptrdiff_t dststride,
1501 AVFrame *ref, const Mv *mv, int x_off, int y_off,
1502 int block_w, int block_h)
1504 HEVCLocalContext *lc = &s->HEVClc;
1505 uint8_t *src = ref->data[0];
1506 ptrdiff_t srcstride = ref->linesize[0];
1507 int pic_width = s->sps->width;
1508 int pic_height = s->sps->height;
1512 int extra_left = ff_hevc_qpel_extra_before[mx];
1513 int extra_top = ff_hevc_qpel_extra_before[my];
1515 x_off += mv->x >> 2;
1516 y_off += mv->y >> 2;
1517 src += y_off * srcstride + (x_off << s->sps->pixel_shift);
1519 if (x_off < extra_left || y_off < extra_top ||
1520 x_off >= pic_width - block_w - ff_hevc_qpel_extra_after[mx] ||
1521 y_off >= pic_height - block_h - ff_hevc_qpel_extra_after[my]) {
1522 const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->sps->pixel_shift;
1523 int offset = extra_top * srcstride + (extra_left << s->sps->pixel_shift);
1524 int buf_offset = extra_top *
1525 edge_emu_stride + (extra_left << s->sps->pixel_shift);
1527 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src - offset,
1528 edge_emu_stride, srcstride,
1529 block_w + ff_hevc_qpel_extra[mx],
1530 block_h + ff_hevc_qpel_extra[my],
1531 x_off - extra_left, y_off - extra_top,
1532 pic_width, pic_height);
1533 src = lc->edge_emu_buffer + buf_offset;
1534 srcstride = edge_emu_stride;
1536 s->hevcdsp.put_hevc_qpel[my][mx](dst, dststride, src, srcstride, block_w,
1537 block_h, lc->mc_buffer);
1541 * 8.5.3.2.2.2 Chroma sample interpolation process
1543 * @param s HEVC decoding context
1544 * @param dst1 target buffer for block data at block position (U plane)
1545 * @param dst2 target buffer for block data at block position (V plane)
1546 * @param dststride stride of the dst1 and dst2 buffers
1547 * @param ref reference picture buffer at origin (0, 0)
1548 * @param mv motion vector (relative to block position) to get pixel data from
1549 * @param x_off horizontal position of block from origin (0, 0)
1550 * @param y_off vertical position of block from origin (0, 0)
1551 * @param block_w width of block
1552 * @param block_h height of block
1554 static void chroma_mc(HEVCContext *s, int16_t *dst1, int16_t *dst2,
1555 ptrdiff_t dststride, AVFrame *ref, const Mv *mv,
1556 int x_off, int y_off, int block_w, int block_h)
1558 HEVCLocalContext *lc = &s->HEVClc;
1559 uint8_t *src1 = ref->data[1];
1560 uint8_t *src2 = ref->data[2];
1561 ptrdiff_t src1stride = ref->linesize[1];
1562 ptrdiff_t src2stride = ref->linesize[2];
1563 int pic_width = s->sps->width >> 1;
1564 int pic_height = s->sps->height >> 1;
1569 x_off += mv->x >> 3;
1570 y_off += mv->y >> 3;
1571 src1 += y_off * src1stride + (x_off << s->sps->pixel_shift);
1572 src2 += y_off * src2stride + (x_off << s->sps->pixel_shift);
1574 if (x_off < EPEL_EXTRA_BEFORE || y_off < EPEL_EXTRA_AFTER ||
1575 x_off >= pic_width - block_w - EPEL_EXTRA_AFTER ||
1576 y_off >= pic_height - block_h - EPEL_EXTRA_AFTER) {
1577 const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->sps->pixel_shift;
1578 int offset1 = EPEL_EXTRA_BEFORE * (src1stride + (1 << s->sps->pixel_shift));
1579 int buf_offset1 = EPEL_EXTRA_BEFORE *
1580 (edge_emu_stride + (1 << s->sps->pixel_shift));
1581 int offset2 = EPEL_EXTRA_BEFORE * (src2stride + (1 << s->sps->pixel_shift));
1582 int buf_offset2 = EPEL_EXTRA_BEFORE *
1583 (edge_emu_stride + (1 << s->sps->pixel_shift));
1585 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src1 - offset1,
1586 edge_emu_stride, src1stride,
1587 block_w + EPEL_EXTRA, block_h + EPEL_EXTRA,
1588 x_off - EPEL_EXTRA_BEFORE,
1589 y_off - EPEL_EXTRA_BEFORE,
1590 pic_width, pic_height);
1592 src1 = lc->edge_emu_buffer + buf_offset1;
1593 src1stride = edge_emu_stride;
1594 s->hevcdsp.put_hevc_epel[!!my][!!mx](dst1, dststride, src1, src1stride,
1595 block_w, block_h, mx, my, lc->mc_buffer);
1597 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src2 - offset2,
1598 edge_emu_stride, src2stride,
1599 block_w + EPEL_EXTRA, block_h + EPEL_EXTRA,
1600 x_off - EPEL_EXTRA_BEFORE,
1601 y_off - EPEL_EXTRA_BEFORE,
1602 pic_width, pic_height);
1603 src2 = lc->edge_emu_buffer + buf_offset2;
1604 src2stride = edge_emu_stride;
1606 s->hevcdsp.put_hevc_epel[!!my][!!mx](dst2, dststride, src2, src2stride,
1607 block_w, block_h, mx, my,
1610 s->hevcdsp.put_hevc_epel[!!my][!!mx](dst1, dststride, src1, src1stride,
1611 block_w, block_h, mx, my,
1613 s->hevcdsp.put_hevc_epel[!!my][!!mx](dst2, dststride, src2, src2stride,
1614 block_w, block_h, mx, my,
1619 static void hevc_await_progress(HEVCContext *s, HEVCFrame *ref,
1620 const Mv *mv, int y0, int height)
1622 int y = (mv->y >> 2) + y0 + height + 9;
1623 ff_thread_await_progress(&ref->tf, y, 0);
1626 static void hevc_luma_mv_mpv_mode(HEVCContext *s, int x0, int y0, int nPbW,
1627 int nPbH, int log2_cb_size, int part_idx,
1628 int merge_idx, MvField *mv)
1630 HEVCLocalContext *lc = &s->HEVClc;
1631 enum InterPredIdc inter_pred_idc = PRED_L0;
1634 ff_hevc_set_neighbour_available(s, x0, y0, nPbW, nPbH);
1635 if (s->sh.slice_type == B_SLICE)
1636 inter_pred_idc = ff_hevc_inter_pred_idc_decode(s, nPbW, nPbH);
1638 if (inter_pred_idc != PRED_L1) {
1639 if (s->sh.nb_refs[L0])
1640 mv->ref_idx[0]= ff_hevc_ref_idx_lx_decode(s, s->sh.nb_refs[L0]);
1642 mv->pred_flag[0] = 1;
1643 hls_mvd_coding(s, x0, y0, 0);
1644 mvp_flag = ff_hevc_mvp_lx_flag_decode(s);
1645 ff_hevc_luma_mv_mvp_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
1646 part_idx, merge_idx, mv, mvp_flag, 0);
1647 mv->mv[0].x += lc->pu.mvd.x;
1648 mv->mv[0].y += lc->pu.mvd.y;
1651 if (inter_pred_idc != PRED_L0) {
1652 if (s->sh.nb_refs[L1])
1653 mv->ref_idx[1]= ff_hevc_ref_idx_lx_decode(s, s->sh.nb_refs[L1]);
1655 if (s->sh.mvd_l1_zero_flag == 1 && inter_pred_idc == PRED_BI) {
1656 AV_ZERO32(&lc->pu.mvd);
1658 hls_mvd_coding(s, x0, y0, 1);
1661 mv->pred_flag[1] = 1;
1662 mvp_flag = ff_hevc_mvp_lx_flag_decode(s);
1663 ff_hevc_luma_mv_mvp_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
1664 part_idx, merge_idx, mv, mvp_flag, 1);
1665 mv->mv[1].x += lc->pu.mvd.x;
1666 mv->mv[1].y += lc->pu.mvd.y;
1670 static void hls_prediction_unit(HEVCContext *s, int x0, int y0,
1672 int log2_cb_size, int partIdx)
1674 #define POS(c_idx, x, y) \
1675 &s->frame->data[c_idx][((y) >> s->sps->vshift[c_idx]) * s->frame->linesize[c_idx] + \
1676 (((x) >> s->sps->hshift[c_idx]) << s->sps->pixel_shift)]
1677 HEVCLocalContext *lc = &s->HEVClc;
1679 struct MvField current_mv = {{{ 0 }}};
1681 int min_pu_width = s->sps->min_pu_width;
1683 MvField *tab_mvf = s->ref->tab_mvf;
1684 RefPicList *refPicList = s->ref->refPicList;
1685 HEVCFrame *ref0, *ref1;
1687 int tmpstride = MAX_PB_SIZE;
1689 uint8_t *dst0 = POS(0, x0, y0);
1690 uint8_t *dst1 = POS(1, x0, y0);
1691 uint8_t *dst2 = POS(2, x0, y0);
1692 int log2_min_cb_size = s->sps->log2_min_cb_size;
1693 int min_cb_width = s->sps->min_cb_width;
1694 int x_cb = x0 >> log2_min_cb_size;
1695 int y_cb = y0 >> log2_min_cb_size;
1699 int skip_flag = SAMPLE_CTB(s->skip_flag, x_cb, y_cb);
1702 lc->pu.merge_flag = ff_hevc_merge_flag_decode(s);
1704 if (skip_flag || lc->pu.merge_flag) {
1705 if (s->sh.max_num_merge_cand > 1)
1706 merge_idx = ff_hevc_merge_idx_decode(s);
1710 ff_hevc_luma_mv_merge_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
1711 partIdx, merge_idx, ¤t_mv);
1713 hevc_luma_mv_mpv_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
1714 partIdx, merge_idx, ¤t_mv);
1717 x_pu = x0 >> s->sps->log2_min_pu_size;
1718 y_pu = y0 >> s->sps->log2_min_pu_size;
1720 for (j = 0; j < nPbH >> s->sps->log2_min_pu_size; j++)
1721 for (i = 0; i < nPbW >> s->sps->log2_min_pu_size; i++)
1722 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i] = current_mv;
1724 if (current_mv.pred_flag[0]) {
1725 ref0 = refPicList[0].ref[current_mv.ref_idx[0]];
1728 hevc_await_progress(s, ref0, ¤t_mv.mv[0], y0, nPbH);
1730 if (current_mv.pred_flag[1]) {
1731 ref1 = refPicList[1].ref[current_mv.ref_idx[1]];
1734 hevc_await_progress(s, ref1, ¤t_mv.mv[1], y0, nPbH);
1737 if (current_mv.pred_flag[0] && !current_mv.pred_flag[1]) {
1738 DECLARE_ALIGNED(16, int16_t, tmp[MAX_PB_SIZE * MAX_PB_SIZE]);
1739 DECLARE_ALIGNED(16, int16_t, tmp2[MAX_PB_SIZE * MAX_PB_SIZE]);
1741 luma_mc(s, tmp, tmpstride, ref0->frame,
1742 ¤t_mv.mv[0], x0, y0, nPbW, nPbH);
1744 if ((s->sh.slice_type == P_SLICE && s->pps->weighted_pred_flag) ||
1745 (s->sh.slice_type == B_SLICE && s->pps->weighted_bipred_flag)) {
1746 s->hevcdsp.weighted_pred(s->sh.luma_log2_weight_denom,
1747 s->sh.luma_weight_l0[current_mv.ref_idx[0]],
1748 s->sh.luma_offset_l0[current_mv.ref_idx[0]],
1749 dst0, s->frame->linesize[0], tmp,
1750 tmpstride, nPbW, nPbH);
1752 s->hevcdsp.put_unweighted_pred(dst0, s->frame->linesize[0], tmp, tmpstride, nPbW, nPbH);
1754 chroma_mc(s, tmp, tmp2, tmpstride, ref0->frame,
1755 ¤t_mv.mv[0], x0 / 2, y0 / 2, nPbW / 2, nPbH / 2);
1757 if ((s->sh.slice_type == P_SLICE && s->pps->weighted_pred_flag) ||
1758 (s->sh.slice_type == B_SLICE && s->pps->weighted_bipred_flag)) {
1759 s->hevcdsp.weighted_pred(s->sh.chroma_log2_weight_denom,
1760 s->sh.chroma_weight_l0[current_mv.ref_idx[0]][0],
1761 s->sh.chroma_offset_l0[current_mv.ref_idx[0]][0],
1762 dst1, s->frame->linesize[1], tmp, tmpstride,
1763 nPbW / 2, nPbH / 2);
1764 s->hevcdsp.weighted_pred(s->sh.chroma_log2_weight_denom,
1765 s->sh.chroma_weight_l0[current_mv.ref_idx[0]][1],
1766 s->sh.chroma_offset_l0[current_mv.ref_idx[0]][1],
1767 dst2, s->frame->linesize[2], tmp2, tmpstride,
1768 nPbW / 2, nPbH / 2);
1770 s->hevcdsp.put_unweighted_pred(dst1, s->frame->linesize[1], tmp, tmpstride, nPbW/2, nPbH/2);
1771 s->hevcdsp.put_unweighted_pred(dst2, s->frame->linesize[2], tmp2, tmpstride, nPbW/2, nPbH/2);
1773 } else if (!current_mv.pred_flag[0] && current_mv.pred_flag[1]) {
1774 DECLARE_ALIGNED(16, int16_t, tmp [MAX_PB_SIZE * MAX_PB_SIZE]);
1775 DECLARE_ALIGNED(16, int16_t, tmp2[MAX_PB_SIZE * MAX_PB_SIZE]);
1777 luma_mc(s, tmp, tmpstride, ref1->frame,
1778 ¤t_mv.mv[1], x0, y0, nPbW, nPbH);
1780 if ((s->sh.slice_type == P_SLICE && s->pps->weighted_pred_flag) ||
1781 (s->sh.slice_type == B_SLICE && s->pps->weighted_bipred_flag)) {
1782 s->hevcdsp.weighted_pred(s->sh.luma_log2_weight_denom,
1783 s->sh.luma_weight_l1[current_mv.ref_idx[1]],
1784 s->sh.luma_offset_l1[current_mv.ref_idx[1]],
1785 dst0, s->frame->linesize[0], tmp, tmpstride,
1788 s->hevcdsp.put_unweighted_pred(dst0, s->frame->linesize[0], tmp, tmpstride, nPbW, nPbH);
1791 chroma_mc(s, tmp, tmp2, tmpstride, ref1->frame,
1792 ¤t_mv.mv[1], x0/2, y0/2, nPbW/2, nPbH/2);
1794 if ((s->sh.slice_type == P_SLICE && s->pps->weighted_pred_flag) ||
1795 (s->sh.slice_type == B_SLICE && s->pps->weighted_bipred_flag)) {
1796 s->hevcdsp.weighted_pred(s->sh.chroma_log2_weight_denom,
1797 s->sh.chroma_weight_l1[current_mv.ref_idx[1]][0],
1798 s->sh.chroma_offset_l1[current_mv.ref_idx[1]][0],
1799 dst1, s->frame->linesize[1], tmp, tmpstride, nPbW/2, nPbH/2);
1800 s->hevcdsp.weighted_pred(s->sh.chroma_log2_weight_denom,
1801 s->sh.chroma_weight_l1[current_mv.ref_idx[1]][1],
1802 s->sh.chroma_offset_l1[current_mv.ref_idx[1]][1],
1803 dst2, s->frame->linesize[2], tmp2, tmpstride, nPbW/2, nPbH/2);
1805 s->hevcdsp.put_unweighted_pred(dst1, s->frame->linesize[1], tmp, tmpstride, nPbW/2, nPbH/2);
1806 s->hevcdsp.put_unweighted_pred(dst2, s->frame->linesize[2], tmp2, tmpstride, nPbW/2, nPbH/2);
1808 } else if (current_mv.pred_flag[0] && current_mv.pred_flag[1]) {
1809 DECLARE_ALIGNED(16, int16_t, tmp [MAX_PB_SIZE * MAX_PB_SIZE]);
1810 DECLARE_ALIGNED(16, int16_t, tmp2[MAX_PB_SIZE * MAX_PB_SIZE]);
1811 DECLARE_ALIGNED(16, int16_t, tmp3[MAX_PB_SIZE * MAX_PB_SIZE]);
1812 DECLARE_ALIGNED(16, int16_t, tmp4[MAX_PB_SIZE * MAX_PB_SIZE]);
1814 luma_mc(s, tmp, tmpstride, ref0->frame,
1815 ¤t_mv.mv[0], x0, y0, nPbW, nPbH);
1816 luma_mc(s, tmp2, tmpstride, ref1->frame,
1817 ¤t_mv.mv[1], x0, y0, nPbW, nPbH);
1819 if ((s->sh.slice_type == P_SLICE && s->pps->weighted_pred_flag) ||
1820 (s->sh.slice_type == B_SLICE && s->pps->weighted_bipred_flag)) {
1821 s->hevcdsp.weighted_pred_avg(s->sh.luma_log2_weight_denom,
1822 s->sh.luma_weight_l0[current_mv.ref_idx[0]],
1823 s->sh.luma_weight_l1[current_mv.ref_idx[1]],
1824 s->sh.luma_offset_l0[current_mv.ref_idx[0]],
1825 s->sh.luma_offset_l1[current_mv.ref_idx[1]],
1826 dst0, s->frame->linesize[0],
1827 tmp, tmp2, tmpstride, nPbW, nPbH);
1829 s->hevcdsp.put_weighted_pred_avg(dst0, s->frame->linesize[0],
1830 tmp, tmp2, tmpstride, nPbW, nPbH);
1833 chroma_mc(s, tmp, tmp2, tmpstride, ref0->frame,
1834 ¤t_mv.mv[0], x0 / 2, y0 / 2, nPbW / 2, nPbH / 2);
1835 chroma_mc(s, tmp3, tmp4, tmpstride, ref1->frame,
1836 ¤t_mv.mv[1], x0 / 2, y0 / 2, nPbW / 2, nPbH / 2);
1838 if ((s->sh.slice_type == P_SLICE && s->pps->weighted_pred_flag) ||
1839 (s->sh.slice_type == B_SLICE && s->pps->weighted_bipred_flag)) {
1840 s->hevcdsp.weighted_pred_avg(s->sh.chroma_log2_weight_denom,
1841 s->sh.chroma_weight_l0[current_mv.ref_idx[0]][0],
1842 s->sh.chroma_weight_l1[current_mv.ref_idx[1]][0],
1843 s->sh.chroma_offset_l0[current_mv.ref_idx[0]][0],
1844 s->sh.chroma_offset_l1[current_mv.ref_idx[1]][0],
1845 dst1, s->frame->linesize[1], tmp, tmp3,
1846 tmpstride, nPbW / 2, nPbH / 2);
1847 s->hevcdsp.weighted_pred_avg(s->sh.chroma_log2_weight_denom,
1848 s->sh.chroma_weight_l0[current_mv.ref_idx[0]][1],
1849 s->sh.chroma_weight_l1[current_mv.ref_idx[1]][1],
1850 s->sh.chroma_offset_l0[current_mv.ref_idx[0]][1],
1851 s->sh.chroma_offset_l1[current_mv.ref_idx[1]][1],
1852 dst2, s->frame->linesize[2], tmp2, tmp4,
1853 tmpstride, nPbW / 2, nPbH / 2);
1855 s->hevcdsp.put_weighted_pred_avg(dst1, s->frame->linesize[1], tmp, tmp3, tmpstride, nPbW/2, nPbH/2);
1856 s->hevcdsp.put_weighted_pred_avg(dst2, s->frame->linesize[2], tmp2, tmp4, tmpstride, nPbW/2, nPbH/2);
1864 static int luma_intra_pred_mode(HEVCContext *s, int x0, int y0, int pu_size,
1865 int prev_intra_luma_pred_flag)
1867 HEVCLocalContext *lc = &s->HEVClc;
1868 int x_pu = x0 >> s->sps->log2_min_pu_size;
1869 int y_pu = y0 >> s->sps->log2_min_pu_size;
1870 int min_pu_width = s->sps->min_pu_width;
1871 int size_in_pus = pu_size >> s->sps->log2_min_pu_size;
1872 int x0b = x0 & ((1 << s->sps->log2_ctb_size) - 1);
1873 int y0b = y0 & ((1 << s->sps->log2_ctb_size) - 1);
1875 int cand_up = (lc->ctb_up_flag || y0b) ?
1876 s->tab_ipm[(y_pu - 1) * min_pu_width + x_pu] : INTRA_DC;
1877 int cand_left = (lc->ctb_left_flag || x0b) ?
1878 s->tab_ipm[y_pu * min_pu_width + x_pu - 1] : INTRA_DC;
1880 int y_ctb = (y0 >> (s->sps->log2_ctb_size)) << (s->sps->log2_ctb_size);
1882 MvField *tab_mvf = s->ref->tab_mvf;
1883 int intra_pred_mode;
1887 // intra_pred_mode prediction does not cross vertical CTB boundaries
1888 if ((y0 - 1) < y_ctb)
1891 if (cand_left == cand_up) {
1892 if (cand_left < 2) {
1893 candidate[0] = INTRA_PLANAR;
1894 candidate[1] = INTRA_DC;
1895 candidate[2] = INTRA_ANGULAR_26;
1897 candidate[0] = cand_left;
1898 candidate[1] = 2 + ((cand_left - 2 - 1 + 32) & 31);
1899 candidate[2] = 2 + ((cand_left - 2 + 1) & 31);
1902 candidate[0] = cand_left;
1903 candidate[1] = cand_up;
1904 if (candidate[0] != INTRA_PLANAR && candidate[1] != INTRA_PLANAR) {
1905 candidate[2] = INTRA_PLANAR;
1906 } else if (candidate[0] != INTRA_DC && candidate[1] != INTRA_DC) {
1907 candidate[2] = INTRA_DC;
1909 candidate[2] = INTRA_ANGULAR_26;
1913 if (prev_intra_luma_pred_flag) {
1914 intra_pred_mode = candidate[lc->pu.mpm_idx];
1916 if (candidate[0] > candidate[1])
1917 FFSWAP(uint8_t, candidate[0], candidate[1]);
1918 if (candidate[0] > candidate[2])
1919 FFSWAP(uint8_t, candidate[0], candidate[2]);
1920 if (candidate[1] > candidate[2])
1921 FFSWAP(uint8_t, candidate[1], candidate[2]);
1923 intra_pred_mode = lc->pu.rem_intra_luma_pred_mode;
1924 for (i = 0; i < 3; i++)
1925 if (intra_pred_mode >= candidate[i])
1929 /* write the intra prediction units into the mv array */
1932 for (i = 0; i < size_in_pus; i++) {
1933 memset(&s->tab_ipm[(y_pu + i) * min_pu_width + x_pu],
1934 intra_pred_mode, size_in_pus);
1936 for (j = 0; j < size_in_pus; j++) {
1937 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].is_intra = 1;
1938 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].pred_flag[0] = 0;
1939 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].pred_flag[1] = 0;
1940 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].ref_idx[0] = 0;
1941 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].ref_idx[1] = 0;
1942 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].mv[0].x = 0;
1943 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].mv[0].y = 0;
1944 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].mv[1].x = 0;
1945 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].mv[1].y = 0;
1949 return intra_pred_mode;
1952 static av_always_inline void set_ct_depth(HEVCContext *s, int x0, int y0,
1953 int log2_cb_size, int ct_depth)
1955 int length = (1 << log2_cb_size) >> s->sps->log2_min_cb_size;
1956 int x_cb = x0 >> s->sps->log2_min_cb_size;
1957 int y_cb = y0 >> s->sps->log2_min_cb_size;
1960 for (y = 0; y < length; y++)
1961 memset(&s->tab_ct_depth[(y_cb + y) * s->sps->min_cb_width + x_cb],
1965 static void intra_prediction_unit(HEVCContext *s, int x0, int y0,
1968 HEVCLocalContext *lc = &s->HEVClc;
1969 static const uint8_t intra_chroma_table[4] = { 0, 26, 10, 1 };
1970 uint8_t prev_intra_luma_pred_flag[4];
1971 int split = lc->cu.part_mode == PART_NxN;
1972 int pb_size = (1 << log2_cb_size) >> split;
1973 int side = split + 1;
1977 for (i = 0; i < side; i++)
1978 for (j = 0; j < side; j++)
1979 prev_intra_luma_pred_flag[2 * i + j] = ff_hevc_prev_intra_luma_pred_flag_decode(s);
1981 for (i = 0; i < side; i++) {
1982 for (j = 0; j < side; j++) {
1983 if (prev_intra_luma_pred_flag[2 * i + j])
1984 lc->pu.mpm_idx = ff_hevc_mpm_idx_decode(s);
1986 lc->pu.rem_intra_luma_pred_mode = ff_hevc_rem_intra_luma_pred_mode_decode(s);
1988 lc->pu.intra_pred_mode[2 * i + j] =
1989 luma_intra_pred_mode(s, x0 + pb_size * j, y0 + pb_size * i, pb_size,
1990 prev_intra_luma_pred_flag[2 * i + j]);
1994 chroma_mode = ff_hevc_intra_chroma_pred_mode_decode(s);
1995 if (chroma_mode != 4) {
1996 if (lc->pu.intra_pred_mode[0] == intra_chroma_table[chroma_mode])
1997 lc->pu.intra_pred_mode_c = 34;
1999 lc->pu.intra_pred_mode_c = intra_chroma_table[chroma_mode];
2001 lc->pu.intra_pred_mode_c = lc->pu.intra_pred_mode[0];
2005 static void intra_prediction_unit_default_value(HEVCContext *s,
2009 HEVCLocalContext *lc = &s->HEVClc;
2010 int pb_size = 1 << log2_cb_size;
2011 int size_in_pus = pb_size >> s->sps->log2_min_pu_size;
2012 int min_pu_width = s->sps->min_pu_width;
2013 MvField *tab_mvf = s->ref->tab_mvf;
2014 int x_pu = x0 >> s->sps->log2_min_pu_size;
2015 int y_pu = y0 >> s->sps->log2_min_pu_size;
2018 if (size_in_pus == 0)
2020 for (j = 0; j < size_in_pus; j++) {
2021 memset(&s->tab_ipm[(y_pu + j) * min_pu_width + x_pu], INTRA_DC, size_in_pus);
2022 for (k = 0; k < size_in_pus; k++)
2023 tab_mvf[(y_pu + j) * min_pu_width + x_pu + k].is_intra = lc->cu.pred_mode == MODE_INTRA;
2027 static int hls_coding_unit(HEVCContext *s, int x0, int y0, int log2_cb_size)
2029 int cb_size = 1 << log2_cb_size;
2030 HEVCLocalContext *lc = &s->HEVClc;
2031 int log2_min_cb_size = s->sps->log2_min_cb_size;
2032 int length = cb_size >> log2_min_cb_size;
2033 int min_cb_width = s->sps->min_cb_width;
2034 int x_cb = x0 >> log2_min_cb_size;
2035 int y_cb = y0 >> log2_min_cb_size;
2040 lc->cu.pred_mode = MODE_INTRA;
2041 lc->cu.part_mode = PART_2Nx2N;
2042 lc->cu.intra_split_flag = 0;
2044 SAMPLE_CTB(s->skip_flag, x_cb, y_cb) = 0;
2045 for (x = 0; x < 4; x++)
2046 lc->pu.intra_pred_mode[x] = 1;
2047 if (s->pps->transquant_bypass_enable_flag) {
2048 lc->cu.cu_transquant_bypass_flag = ff_hevc_cu_transquant_bypass_flag_decode(s);
2049 if (lc->cu.cu_transquant_bypass_flag)
2050 set_deblocking_bypass(s, x0, y0, log2_cb_size);
2052 lc->cu.cu_transquant_bypass_flag = 0;
2054 if (s->sh.slice_type != I_SLICE) {
2055 uint8_t skip_flag = ff_hevc_skip_flag_decode(s, x0, y0, x_cb, y_cb);
2057 x = y_cb * min_cb_width + x_cb;
2058 for (y = 0; y < length; y++) {
2059 memset(&s->skip_flag[x], skip_flag, length);
2062 lc->cu.pred_mode = skip_flag ? MODE_SKIP : MODE_INTER;
2065 if (SAMPLE_CTB(s->skip_flag, x_cb, y_cb)) {
2066 hls_prediction_unit(s, x0, y0, cb_size, cb_size, log2_cb_size, 0);
2067 intra_prediction_unit_default_value(s, x0, y0, log2_cb_size);
2069 if (!s->sh.disable_deblocking_filter_flag)
2070 ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_cb_size);
2074 if (s->sh.slice_type != I_SLICE)
2075 lc->cu.pred_mode = ff_hevc_pred_mode_decode(s);
2076 if (lc->cu.pred_mode != MODE_INTRA ||
2077 log2_cb_size == s->sps->log2_min_cb_size) {
2078 lc->cu.part_mode = ff_hevc_part_mode_decode(s, log2_cb_size);
2079 lc->cu.intra_split_flag = lc->cu.part_mode == PART_NxN &&
2080 lc->cu.pred_mode == MODE_INTRA;
2083 if (lc->cu.pred_mode == MODE_INTRA) {
2084 if (lc->cu.part_mode == PART_2Nx2N && s->sps->pcm_enabled_flag &&
2085 log2_cb_size >= s->sps->pcm.log2_min_pcm_cb_size &&
2086 log2_cb_size <= s->sps->pcm.log2_max_pcm_cb_size) {
2087 pcm_flag = ff_hevc_pcm_flag_decode(s);
2090 intra_prediction_unit_default_value(s, x0, y0, log2_cb_size);
2091 ret = hls_pcm_sample(s, x0, y0, log2_cb_size);
2092 if (s->sps->pcm.loop_filter_disable_flag)
2093 set_deblocking_bypass(s, x0, y0, log2_cb_size);
2098 intra_prediction_unit(s, x0, y0, log2_cb_size);
2101 intra_prediction_unit_default_value(s, x0, y0, log2_cb_size);
2102 switch (lc->cu.part_mode) {
2104 hls_prediction_unit(s, x0, y0, cb_size, cb_size, log2_cb_size, 0);
2107 hls_prediction_unit(s, x0, y0, cb_size, cb_size / 2, log2_cb_size, 0);
2108 hls_prediction_unit(s, x0, y0 + cb_size / 2, cb_size, cb_size / 2, log2_cb_size, 1);
2111 hls_prediction_unit(s, x0, y0, cb_size / 2, cb_size, log2_cb_size, 0);
2112 hls_prediction_unit(s, x0 + cb_size / 2, y0, cb_size / 2, cb_size, log2_cb_size, 1);
2115 hls_prediction_unit(s, x0, y0, cb_size, cb_size / 4, log2_cb_size, 0);
2116 hls_prediction_unit(s, x0, y0 + cb_size / 4, cb_size, cb_size * 3 / 4, log2_cb_size, 1);
2119 hls_prediction_unit(s, x0, y0, cb_size, cb_size * 3 / 4, log2_cb_size, 0);
2120 hls_prediction_unit(s, x0, y0 + cb_size * 3 / 4, cb_size, cb_size / 4, log2_cb_size, 1);
2123 hls_prediction_unit(s, x0, y0, cb_size / 4, cb_size, log2_cb_size, 0);
2124 hls_prediction_unit(s, x0 + cb_size / 4, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 1);
2127 hls_prediction_unit(s, x0, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 0);
2128 hls_prediction_unit(s, x0 + cb_size * 3 / 4, y0, cb_size / 4, cb_size, log2_cb_size, 1);
2131 hls_prediction_unit(s, x0, y0, cb_size / 2, cb_size / 2, log2_cb_size, 0);
2132 hls_prediction_unit(s, x0 + cb_size / 2, y0, cb_size / 2, cb_size / 2, log2_cb_size, 1);
2133 hls_prediction_unit(s, x0, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 2);
2134 hls_prediction_unit(s, x0 + cb_size / 2, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 3);
2140 int rqt_root_cbf = 1;
2142 if (lc->cu.pred_mode != MODE_INTRA &&
2143 !(lc->cu.part_mode == PART_2Nx2N && lc->pu.merge_flag)) {
2144 rqt_root_cbf = ff_hevc_no_residual_syntax_flag_decode(s);
2147 lc->cu.max_trafo_depth = lc->cu.pred_mode == MODE_INTRA ?
2148 s->sps->max_transform_hierarchy_depth_intra + lc->cu.intra_split_flag :
2149 s->sps->max_transform_hierarchy_depth_inter;
2150 ret = hls_transform_tree(s, x0, y0, x0, y0, x0, y0,
2152 log2_cb_size, 0, 0, 0, 0);
2156 if (!s->sh.disable_deblocking_filter_flag)
2157 ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_cb_size);
2162 if (s->pps->cu_qp_delta_enabled_flag && lc->tu.is_cu_qp_delta_coded == 0)
2163 ff_hevc_set_qPy(s, x0, y0, x0, y0, log2_cb_size);
2165 x = y_cb * min_cb_width + x_cb;
2166 for (y = 0; y < length; y++) {
2167 memset(&s->qp_y_tab[x], lc->qp_y, length);
2171 set_ct_depth(s, x0, y0, log2_cb_size, lc->ct.depth);
2176 static int hls_coding_quadtree(HEVCContext *s, int x0, int y0,
2177 int log2_cb_size, int cb_depth)
2179 HEVCLocalContext *lc = &s->HEVClc;
2180 const int cb_size = 1 << log2_cb_size;
2183 lc->ct.depth = cb_depth;
2184 if (x0 + cb_size <= s->sps->width &&
2185 y0 + cb_size <= s->sps->height &&
2186 log2_cb_size > s->sps->log2_min_cb_size) {
2187 split_cu = ff_hevc_split_coding_unit_flag_decode(s, cb_depth, x0, y0);
2189 split_cu = (log2_cb_size > s->sps->log2_min_cb_size);
2191 if (s->pps->cu_qp_delta_enabled_flag &&
2192 log2_cb_size >= s->sps->log2_ctb_size - s->pps->diff_cu_qp_delta_depth) {
2193 lc->tu.is_cu_qp_delta_coded = 0;
2194 lc->tu.cu_qp_delta = 0;
2198 const int cb_size_split = cb_size >> 1;
2199 const int x1 = x0 + cb_size_split;
2200 const int y1 = y0 + cb_size_split;
2205 #define SUBDIVIDE(x, y) \
2207 if (x < s->sps->width && y < s->sps->height) { \
2208 int ret = hls_coding_quadtree(s, x, y, log2_cb_size, cb_depth);\
2219 int ret = hls_coding_unit(s, x0, y0, log2_cb_size);
2227 static void hls_decode_neighbour(HEVCContext *s, int x_ctb, int y_ctb,
2230 HEVCLocalContext *lc = &s->HEVClc;
2231 int ctb_size = 1 << s->sps->log2_ctb_size;
2232 int ctb_addr_rs = s->pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2233 int ctb_addr_in_slice = ctb_addr_rs - s->sh.slice_addr;
2235 s->tab_slice_address[ctb_addr_rs] = s->sh.slice_addr;
2237 if (s->pps->entropy_coding_sync_enabled_flag) {
2238 if (x_ctb == 0 && (y_ctb & (ctb_size - 1)) == 0)
2239 lc->first_qp_group = 1;
2240 lc->end_of_tiles_x = s->sps->width;
2241 } else if (s->pps->tiles_enabled_flag) {
2242 if (ctb_addr_ts && s->pps->tile_id[ctb_addr_ts] != s->pps->tile_id[ctb_addr_ts - 1]) {
2243 int idxX = s->pps->col_idxX[x_ctb >> s->sps->log2_ctb_size];
2244 lc->start_of_tiles_x = x_ctb;
2245 lc->end_of_tiles_x = x_ctb + (s->pps->column_width[idxX] << s->sps->log2_ctb_size);
2246 lc->first_qp_group = 1;
2249 lc->end_of_tiles_x = s->sps->width;
2252 lc->end_of_tiles_y = FFMIN(y_ctb + ctb_size, s->sps->height);
2254 lc->boundary_flags = 0;
2255 if (s->pps->tiles_enabled_flag) {
2256 if (x_ctb > 0 && s->pps->tile_id[ctb_addr_ts] != s->pps->tile_id[s->pps->ctb_addr_rs_to_ts[ctb_addr_rs - 1]])
2257 lc->boundary_flags |= BOUNDARY_LEFT_TILE;
2258 if (x_ctb > 0 && s->tab_slice_address[ctb_addr_rs] != s->tab_slice_address[ctb_addr_rs - 1])
2259 lc->boundary_flags |= BOUNDARY_LEFT_SLICE;
2260 if (y_ctb > 0 && s->pps->tile_id[ctb_addr_ts] != s->pps->tile_id[s->pps->ctb_addr_rs_to_ts[ctb_addr_rs - s->sps->ctb_width]])
2261 lc->boundary_flags |= BOUNDARY_UPPER_TILE;
2262 if (y_ctb > 0 && s->tab_slice_address[ctb_addr_rs] != s->tab_slice_address[ctb_addr_rs - s->sps->ctb_width])
2263 lc->boundary_flags |= BOUNDARY_UPPER_SLICE;
2265 if (!ctb_addr_in_slice > 0)
2266 lc->boundary_flags |= BOUNDARY_LEFT_SLICE;
2267 if (ctb_addr_in_slice < s->sps->ctb_width)
2268 lc->boundary_flags |= BOUNDARY_UPPER_SLICE;
2271 lc->ctb_left_flag = ((x_ctb > 0) && (ctb_addr_in_slice > 0) && !(lc->boundary_flags & BOUNDARY_LEFT_TILE));
2272 lc->ctb_up_flag = ((y_ctb > 0) && (ctb_addr_in_slice >= s->sps->ctb_width) && !(lc->boundary_flags & BOUNDARY_UPPER_TILE));
2273 lc->ctb_up_right_flag = ((y_ctb > 0) && (ctb_addr_in_slice+1 >= s->sps->ctb_width) && (s->pps->tile_id[ctb_addr_ts] == s->pps->tile_id[s->pps->ctb_addr_rs_to_ts[ctb_addr_rs+1 - s->sps->ctb_width]]));
2274 lc->ctb_up_left_flag = ((x_ctb > 0) && (y_ctb > 0) && (ctb_addr_in_slice-1 >= s->sps->ctb_width) && (s->pps->tile_id[ctb_addr_ts] == s->pps->tile_id[s->pps->ctb_addr_rs_to_ts[ctb_addr_rs-1 - s->sps->ctb_width]]));
2277 static int hls_slice_data(HEVCContext *s)
2279 int ctb_size = 1 << s->sps->log2_ctb_size;
2283 int ctb_addr_ts = s->pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs];
2286 while (more_data && ctb_addr_ts < s->sps->ctb_size) {
2287 int ctb_addr_rs = s->pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2289 x_ctb = (ctb_addr_rs % ((s->sps->width + ctb_size - 1) >> s->sps->log2_ctb_size)) << s->sps->log2_ctb_size;
2290 y_ctb = (ctb_addr_rs / ((s->sps->width + ctb_size - 1) >> s->sps->log2_ctb_size)) << s->sps->log2_ctb_size;
2291 hls_decode_neighbour(s, x_ctb, y_ctb, ctb_addr_ts);
2293 ff_hevc_cabac_init(s, ctb_addr_ts);
2295 hls_sao_param(s, x_ctb >> s->sps->log2_ctb_size, y_ctb >> s->sps->log2_ctb_size);
2297 s->deblock[ctb_addr_rs].beta_offset = s->sh.beta_offset;
2298 s->deblock[ctb_addr_rs].tc_offset = s->sh.tc_offset;
2299 s->filter_slice_edges[ctb_addr_rs] = s->sh.slice_loop_filter_across_slices_enabled_flag;
2301 ret = hls_coding_quadtree(s, x_ctb, y_ctb, s->sps->log2_ctb_size, 0);
2304 more_data = !ff_hevc_end_of_slice_flag_decode(s);
2307 ff_hevc_save_states(s, ctb_addr_ts);
2308 ff_hevc_hls_filters(s, x_ctb, y_ctb, ctb_size);
2311 if (x_ctb + ctb_size >= s->sps->width &&
2312 y_ctb + ctb_size >= s->sps->height)
2313 ff_hevc_hls_filter(s, x_ctb, y_ctb);
2319 * @return AVERROR_INVALIDDATA if the packet is not a valid NAL unit,
2320 * 0 if the unit should be skipped, 1 otherwise
2322 static int hls_nal_unit(HEVCContext *s)
2324 GetBitContext *gb = &s->HEVClc.gb;
2327 if (get_bits1(gb) != 0)
2328 return AVERROR_INVALIDDATA;
2330 s->nal_unit_type = get_bits(gb, 6);
2332 nuh_layer_id = get_bits(gb, 6);
2333 s->temporal_id = get_bits(gb, 3) - 1;
2334 if (s->temporal_id < 0)
2335 return AVERROR_INVALIDDATA;
2337 av_log(s->avctx, AV_LOG_DEBUG,
2338 "nal_unit_type: %d, nuh_layer_id: %dtemporal_id: %d\n",
2339 s->nal_unit_type, nuh_layer_id, s->temporal_id);
2341 return nuh_layer_id == 0;
2344 static void restore_tqb_pixels(HEVCContext *s)
2346 int min_pu_size = 1 << s->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->sps->hshift[c_idx];
2352 int vshift = s->sps->vshift[c_idx];
2353 for (y = 0; y < s->sps->min_pu_height; y++) {
2354 for (x = 0; x < s->sps->min_pu_width; x++) {
2355 if (s->is_pcm[y * s->sps->min_pu_width + x]) {
2357 int len = min_pu_size >> hshift;
2358 uint8_t *src = &s->frame->data[c_idx][((y << s->sps->log2_min_pu_size) >> vshift) * stride + (((x << s->sps->log2_min_pu_size) >> hshift) << s->sps->pixel_shift)];
2359 uint8_t *dst = &s->sao_frame->data[c_idx][((y << s->sps->log2_min_pu_size) >> vshift) * stride + (((x << s->sps->log2_min_pu_size) >> hshift) << s->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->frame_packing_arrangement_type >= 3 &&
2377 s->frame_packing_arrangement_type <= 5 &&
2378 s->content_interpretation_type > 0 &&
2379 s->content_interpretation_type < 3) {
2380 AVStereo3D *stereo = av_stereo3d_create_side_data(out);
2382 return AVERROR(ENOMEM);
2384 switch (s->frame_packing_arrangement_type) {
2386 if (s->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->content_interpretation_type == 2)
2400 stereo->flags = AV_STEREO3D_FLAG_INVERT;
2403 if (s->sei_display_orientation_present &&
2404 (s->sei_anticlockwise_rotation || s->sei_hflip || s->sei_vflip)) {
2405 double angle = s->sei_anticlockwise_rotation * 360 / (double) (1 << 16);
2406 AVFrameSideData *rotation = av_frame_new_side_data(out,
2407 AV_FRAME_DATA_DISPLAYMATRIX,
2408 sizeof(int32_t) * 9);
2410 return AVERROR(ENOMEM);
2412 av_display_rotation_set((int32_t *)rotation->data, angle);
2413 av_display_matrix_flip((int32_t *)rotation->data,
2414 s->sei_hflip, s->sei_vflip);
2420 static int hevc_frame_start(HEVCContext *s)
2422 HEVCLocalContext *lc = &s->HEVClc;
2425 memset(s->horizontal_bs, 0, 2 * s->bs_width * (s->bs_height + 1));
2426 memset(s->vertical_bs, 0, 2 * s->bs_width * (s->bs_height + 1));
2427 memset(s->cbf_luma, 0, s->sps->min_tb_width * s->sps->min_tb_height);
2428 memset(s->is_pcm, 0, s->sps->min_pu_width * s->sps->min_pu_height);
2430 lc->start_of_tiles_x = 0;
2432 s->first_nal_type = s->nal_unit_type;
2434 if (s->pps->tiles_enabled_flag)
2435 lc->end_of_tiles_x = s->pps->column_width[0] << s->sps->log2_ctb_size;
2437 ret = ff_hevc_set_new_ref(s, s->sps->sao_enabled ? &s->sao_frame : &s->frame,
2442 ret = ff_hevc_frame_rps(s);
2444 av_log(s->avctx, AV_LOG_ERROR, "Error constructing the frame RPS.\n");
2448 s->ref->frame->key_frame = IS_IRAP(s);
2450 ret = set_side_data(s);
2454 av_frame_unref(s->output_frame);
2455 ret = ff_hevc_output_frame(s, s->output_frame, 0);
2459 ff_thread_finish_setup(s->avctx);
2465 ff_hevc_unref_frame(s, s->ref, ~0);
2470 static int decode_nal_unit(HEVCContext *s, const HEVCNAL *nal)
2472 HEVCLocalContext *lc = &s->HEVClc;
2473 GetBitContext *gb = &lc->gb;
2474 int ctb_addr_ts, ret;
2476 ret = init_get_bits8(gb, nal->data, nal->size);
2480 ret = hls_nal_unit(s);
2482 av_log(s->avctx, AV_LOG_ERROR, "Invalid NAL unit %d, skipping.\n",
2488 switch (s->nal_unit_type) {
2490 ret = ff_hevc_decode_nal_vps(s);
2495 ret = ff_hevc_decode_nal_sps(s);
2500 ret = ff_hevc_decode_nal_pps(s);
2504 case NAL_SEI_PREFIX:
2505 case NAL_SEI_SUFFIX:
2506 ret = ff_hevc_decode_nal_sei(s);
2517 case NAL_BLA_W_RADL:
2519 case NAL_IDR_W_RADL:
2526 ret = hls_slice_header(s);
2530 if (s->max_ra == INT_MAX) {
2531 if (s->nal_unit_type == NAL_CRA_NUT || IS_BLA(s)) {
2535 s->max_ra = INT_MIN;
2539 if ((s->nal_unit_type == NAL_RASL_R || s->nal_unit_type == NAL_RASL_N) &&
2540 s->poc <= s->max_ra) {
2544 if (s->nal_unit_type == NAL_RASL_R && s->poc > s->max_ra)
2545 s->max_ra = INT_MIN;
2548 if (s->sh.first_slice_in_pic_flag) {
2549 ret = hevc_frame_start(s);
2552 } else if (!s->ref) {
2553 av_log(s->avctx, AV_LOG_ERROR, "First slice in a frame missing.\n");
2557 if (s->nal_unit_type != s->first_nal_type) {
2558 av_log(s->avctx, AV_LOG_ERROR,
2559 "Non-matching NAL types of the VCL NALUs: %d %d\n",
2560 s->first_nal_type, s->nal_unit_type);
2561 return AVERROR_INVALIDDATA;
2564 if (!s->sh.dependent_slice_segment_flag &&
2565 s->sh.slice_type != I_SLICE) {
2566 ret = ff_hevc_slice_rpl(s);
2568 av_log(s->avctx, AV_LOG_WARNING,
2569 "Error constructing the reference lists for the current slice.\n");
2574 ctb_addr_ts = hls_slice_data(s);
2575 if (ctb_addr_ts >= (s->sps->ctb_width * s->sps->ctb_height)) {
2577 if ((s->pps->transquant_bypass_enable_flag ||
2578 (s->sps->pcm.loop_filter_disable_flag && s->sps->pcm_enabled_flag)) &&
2579 s->sps->sao_enabled)
2580 restore_tqb_pixels(s);
2583 if (ctb_addr_ts < 0) {
2590 s->seq_decode = (s->seq_decode + 1) & 0xff;
2591 s->max_ra = INT_MAX;
2597 av_log(s->avctx, AV_LOG_INFO,
2598 "Skipping NAL unit %d\n", s->nal_unit_type);
2603 if (s->avctx->err_recognition & AV_EF_EXPLODE)
2608 /* FIXME: This is adapted from ff_h264_decode_nal, avoiding duplication
2609 * between these functions would be nice. */
2610 static int extract_rbsp(const uint8_t *src, int length,
2616 #define STARTCODE_TEST \
2617 if (i + 2 < length && src[i + 1] == 0 && src[i + 2] <= 3) { \
2618 if (src[i + 2] != 3) { \
2619 /* startcode, so we must be past the end */ \
2624 #if HAVE_FAST_UNALIGNED
2625 #define FIND_FIRST_ZERO \
2626 if (i > 0 && !src[i]) \
2631 for (i = 0; i + 1 < length; i += 9) {
2632 if (!((~AV_RN64A(src + i) &
2633 (AV_RN64A(src + i) - 0x0100010001000101ULL)) &
2634 0x8000800080008080ULL))
2641 for (i = 0; i + 1 < length; i += 5) {
2642 if (!((~AV_RN32A(src + i) &
2643 (AV_RN32A(src + i) - 0x01000101U)) &
2650 #endif /* HAVE_FAST_64BIT */
2652 for (i = 0; i + 1 < length; i += 2) {
2655 if (i > 0 && src[i - 1] == 0)
2659 #endif /* HAVE_FAST_UNALIGNED */
2661 if (i >= length - 1) { // no escaped 0
2663 nal->raw_data = src;
2665 nal->raw_size = length;
2669 av_fast_malloc(&nal->rbsp_buffer, &nal->rbsp_buffer_size,
2670 length + FF_INPUT_BUFFER_PADDING_SIZE);
2671 if (!nal->rbsp_buffer)
2672 return AVERROR(ENOMEM);
2674 dst = nal->rbsp_buffer;
2676 memcpy(dst, src, i);
2678 while (si + 2 < length) {
2679 // remove escapes (very rare 1:2^22)
2680 if (src[si + 2] > 3) {
2681 dst[di++] = src[si++];
2682 dst[di++] = src[si++];
2683 } else if (src[si] == 0 && src[si + 1] == 0) {
2684 if (src[si + 2] == 3) { // escape
2690 } else // next start code
2694 dst[di++] = src[si++];
2697 dst[di++] = src[si++];
2700 memset(dst + di, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2704 nal->raw_data = src;
2709 static int decode_nal_units(HEVCContext *s, const uint8_t *buf, int length)
2711 int i, consumed, ret = 0;
2716 /* split the input packet into NAL units, so we know the upper bound on the
2717 * number of slices in the frame */
2719 while (length >= 4) {
2721 int extract_length = 0;
2725 for (i = 0; i < s->nal_length_size; i++)
2726 extract_length = (extract_length << 8) | buf[i];
2727 buf += s->nal_length_size;
2728 length -= s->nal_length_size;
2730 if (extract_length > length) {
2731 av_log(s->avctx, AV_LOG_ERROR, "Invalid NAL unit size.\n");
2732 ret = AVERROR_INVALIDDATA;
2741 if (buf[0] != 0 || buf[1] != 0 || buf[2] != 1) {
2742 ret = AVERROR_INVALIDDATA;
2748 extract_length = length;
2751 if (s->nals_allocated < s->nb_nals + 1) {
2752 int new_size = s->nals_allocated + 1;
2753 HEVCNAL *tmp = av_realloc_array(s->nals, new_size, sizeof(*tmp));
2755 ret = AVERROR(ENOMEM);
2759 memset(s->nals + s->nals_allocated, 0,
2760 (new_size - s->nals_allocated) * sizeof(*tmp));
2761 s->nals_allocated = new_size;
2763 nal = &s->nals[s->nb_nals++];
2765 consumed = extract_rbsp(buf, extract_length, nal);
2771 ret = init_get_bits8(&s->HEVClc.gb, nal->data, nal->size);
2776 if (s->nal_unit_type == NAL_EOB_NUT ||
2777 s->nal_unit_type == NAL_EOS_NUT)
2784 /* parse the NAL units */
2785 for (i = 0; i < s->nb_nals; i++) {
2786 int ret = decode_nal_unit(s, &s->nals[i]);
2788 av_log(s->avctx, AV_LOG_WARNING,
2789 "Error parsing NAL unit #%d.\n", i);
2796 ff_thread_report_progress(&s->ref->tf, INT_MAX, 0);
2801 static void print_md5(void *log_ctx, int level, uint8_t md5[16])
2804 for (i = 0; i < 16; i++)
2805 av_log(log_ctx, level, "%02"PRIx8, md5[i]);
2808 static int verify_md5(HEVCContext *s, AVFrame *frame)
2810 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format);
2815 return AVERROR(EINVAL);
2817 pixel_shift = desc->comp[0].depth_minus1 > 7;
2819 av_log(s->avctx, AV_LOG_DEBUG, "Verifying checksum for frame with POC %d: ",
2822 /* the checksums are LE, so we have to byteswap for >8bpp formats
2825 if (pixel_shift && !s->checksum_buf) {
2826 av_fast_malloc(&s->checksum_buf, &s->checksum_buf_size,
2827 FFMAX3(frame->linesize[0], frame->linesize[1],
2828 frame->linesize[2]));
2829 if (!s->checksum_buf)
2830 return AVERROR(ENOMEM);
2834 for (i = 0; frame->data[i]; i++) {
2835 int width = s->avctx->coded_width;
2836 int height = s->avctx->coded_height;
2837 int w = (i == 1 || i == 2) ? (width >> desc->log2_chroma_w) : width;
2838 int h = (i == 1 || i == 2) ? (height >> desc->log2_chroma_h) : height;
2841 av_md5_init(s->md5_ctx);
2842 for (j = 0; j < h; j++) {
2843 const uint8_t *src = frame->data[i] + j * frame->linesize[i];
2846 s->bdsp.bswap16_buf((uint16_t *) s->checksum_buf,
2847 (const uint16_t *) src, w);
2848 src = s->checksum_buf;
2851 av_md5_update(s->md5_ctx, src, w << pixel_shift);
2853 av_md5_final(s->md5_ctx, md5);
2855 if (!memcmp(md5, s->md5[i], 16)) {
2856 av_log (s->avctx, AV_LOG_DEBUG, "plane %d - correct ", i);
2857 print_md5(s->avctx, AV_LOG_DEBUG, md5);
2858 av_log (s->avctx, AV_LOG_DEBUG, "; ");
2860 av_log (s->avctx, AV_LOG_ERROR, "mismatching checksum of plane %d - ", i);
2861 print_md5(s->avctx, AV_LOG_ERROR, md5);
2862 av_log (s->avctx, AV_LOG_ERROR, " != ");
2863 print_md5(s->avctx, AV_LOG_ERROR, s->md5[i]);
2864 av_log (s->avctx, AV_LOG_ERROR, "\n");
2865 return AVERROR_INVALIDDATA;
2869 av_log(s->avctx, AV_LOG_DEBUG, "\n");
2874 static int hevc_decode_frame(AVCodecContext *avctx, void *data, int *got_output,
2878 HEVCContext *s = avctx->priv_data;
2881 ret = ff_hevc_output_frame(s, data, 1);
2890 ret = decode_nal_units(s, avpkt->data, avpkt->size);
2894 /* verify the SEI checksum */
2895 if (avctx->err_recognition & AV_EF_CRCCHECK && s->is_decoded &&
2897 ret = verify_md5(s, s->ref->frame);
2898 if (ret < 0 && avctx->err_recognition & AV_EF_EXPLODE) {
2899 ff_hevc_unref_frame(s, s->ref, ~0);
2905 if (s->is_decoded) {
2906 av_log(avctx, AV_LOG_DEBUG, "Decoded frame with POC %d.\n", s->poc);
2910 if (s->output_frame->buf[0]) {
2911 av_frame_move_ref(data, s->output_frame);
2918 static int hevc_ref_frame(HEVCContext *s, HEVCFrame *dst, HEVCFrame *src)
2920 int ret = ff_thread_ref_frame(&dst->tf, &src->tf);
2924 dst->tab_mvf_buf = av_buffer_ref(src->tab_mvf_buf);
2925 if (!dst->tab_mvf_buf)
2927 dst->tab_mvf = src->tab_mvf;
2929 dst->rpl_tab_buf = av_buffer_ref(src->rpl_tab_buf);
2930 if (!dst->rpl_tab_buf)
2932 dst->rpl_tab = src->rpl_tab;
2934 dst->rpl_buf = av_buffer_ref(src->rpl_buf);
2938 dst->poc = src->poc;
2939 dst->ctb_count = src->ctb_count;
2940 dst->window = src->window;
2941 dst->flags = src->flags;
2942 dst->sequence = src->sequence;
2946 ff_hevc_unref_frame(s, dst, ~0);
2947 return AVERROR(ENOMEM);
2950 static av_cold int hevc_decode_free(AVCodecContext *avctx)
2952 HEVCContext *s = avctx->priv_data;
2957 av_freep(&s->md5_ctx);
2959 av_frame_free(&s->tmp_frame);
2960 av_frame_free(&s->output_frame);
2962 for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
2963 ff_hevc_unref_frame(s, &s->DPB[i], ~0);
2964 av_frame_free(&s->DPB[i].frame);
2967 for (i = 0; i < FF_ARRAY_ELEMS(s->vps_list); i++)
2968 av_buffer_unref(&s->vps_list[i]);
2969 for (i = 0; i < FF_ARRAY_ELEMS(s->sps_list); i++)
2970 av_buffer_unref(&s->sps_list[i]);
2971 for (i = 0; i < FF_ARRAY_ELEMS(s->pps_list); i++)
2972 av_buffer_unref(&s->pps_list[i]);
2974 for (i = 0; i < s->nals_allocated; i++)
2975 av_freep(&s->nals[i].rbsp_buffer);
2977 s->nals_allocated = 0;
2982 static av_cold int hevc_init_context(AVCodecContext *avctx)
2984 HEVCContext *s = avctx->priv_data;
2989 s->tmp_frame = av_frame_alloc();
2993 s->output_frame = av_frame_alloc();
2994 if (!s->output_frame)
2997 for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
2998 s->DPB[i].frame = av_frame_alloc();
2999 if (!s->DPB[i].frame)
3001 s->DPB[i].tf.f = s->DPB[i].frame;
3004 s->max_ra = INT_MAX;
3006 s->md5_ctx = av_md5_alloc();
3010 ff_bswapdsp_init(&s->bdsp);
3012 s->context_initialized = 1;
3017 hevc_decode_free(avctx);
3018 return AVERROR(ENOMEM);
3021 static int hevc_update_thread_context(AVCodecContext *dst,
3022 const AVCodecContext *src)
3024 HEVCContext *s = dst->priv_data;
3025 HEVCContext *s0 = src->priv_data;
3028 if (!s->context_initialized) {
3029 ret = hevc_init_context(dst);
3034 for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
3035 ff_hevc_unref_frame(s, &s->DPB[i], ~0);
3036 if (s0->DPB[i].frame->buf[0]) {
3037 ret = hevc_ref_frame(s, &s->DPB[i], &s0->DPB[i]);
3043 for (i = 0; i < FF_ARRAY_ELEMS(s->vps_list); i++) {
3044 av_buffer_unref(&s->vps_list[i]);
3045 if (s0->vps_list[i]) {
3046 s->vps_list[i] = av_buffer_ref(s0->vps_list[i]);
3047 if (!s->vps_list[i])
3048 return AVERROR(ENOMEM);
3052 for (i = 0; i < FF_ARRAY_ELEMS(s->sps_list); i++) {
3053 av_buffer_unref(&s->sps_list[i]);
3054 if (s0->sps_list[i]) {
3055 s->sps_list[i] = av_buffer_ref(s0->sps_list[i]);
3056 if (!s->sps_list[i])
3057 return AVERROR(ENOMEM);
3061 for (i = 0; i < FF_ARRAY_ELEMS(s->pps_list); i++) {
3062 av_buffer_unref(&s->pps_list[i]);
3063 if (s0->pps_list[i]) {
3064 s->pps_list[i] = av_buffer_ref(s0->pps_list[i]);
3065 if (!s->pps_list[i])
3066 return AVERROR(ENOMEM);
3070 if (s->sps != s0->sps)
3071 ret = set_sps(s, s0->sps);
3073 s->seq_decode = s0->seq_decode;
3074 s->seq_output = s0->seq_output;
3075 s->pocTid0 = s0->pocTid0;
3076 s->max_ra = s0->max_ra;
3078 s->is_nalff = s0->is_nalff;
3079 s->nal_length_size = s0->nal_length_size;
3082 s->seq_decode = (s->seq_decode + 1) & 0xff;
3083 s->max_ra = INT_MAX;
3089 static int hevc_decode_extradata(HEVCContext *s)
3091 AVCodecContext *avctx = s->avctx;
3095 bytestream2_init(&gb, avctx->extradata, avctx->extradata_size);
3097 if (avctx->extradata_size > 3 &&
3098 (avctx->extradata[0] || avctx->extradata[1] ||
3099 avctx->extradata[2] > 1)) {
3100 /* It seems the extradata is encoded as hvcC format.
3101 * Temporarily, we support configurationVersion==0 until 14496-15 3rd
3102 * is finalized. When finalized, configurationVersion will be 1 and we
3103 * can recognize hvcC by checking if avctx->extradata[0]==1 or not. */
3104 int i, j, num_arrays, nal_len_size;
3108 bytestream2_skip(&gb, 21);
3109 nal_len_size = (bytestream2_get_byte(&gb) & 3) + 1;
3110 num_arrays = bytestream2_get_byte(&gb);
3112 /* nal units in the hvcC always have length coded with 2 bytes,
3113 * so put a fake nal_length_size = 2 while parsing them */
3114 s->nal_length_size = 2;
3116 /* Decode nal units from hvcC. */
3117 for (i = 0; i < num_arrays; i++) {
3118 int type = bytestream2_get_byte(&gb) & 0x3f;
3119 int cnt = bytestream2_get_be16(&gb);
3121 for (j = 0; j < cnt; j++) {
3122 // +2 for the nal size field
3123 int nalsize = bytestream2_peek_be16(&gb) + 2;
3124 if (bytestream2_get_bytes_left(&gb) < nalsize) {
3125 av_log(s->avctx, AV_LOG_ERROR,
3126 "Invalid NAL unit size in extradata.\n");
3127 return AVERROR_INVALIDDATA;
3130 ret = decode_nal_units(s, gb.buffer, nalsize);
3132 av_log(avctx, AV_LOG_ERROR,
3133 "Decoding nal unit %d %d from hvcC failed\n",
3137 bytestream2_skip(&gb, nalsize);
3141 /* Now store right nal length size, that will be used to parse
3143 s->nal_length_size = nal_len_size;
3146 ret = decode_nal_units(s, avctx->extradata, avctx->extradata_size);
3153 static av_cold int hevc_decode_init(AVCodecContext *avctx)
3155 HEVCContext *s = avctx->priv_data;
3158 ff_init_cabac_states();
3160 avctx->internal->allocate_progress = 1;
3162 ret = hevc_init_context(avctx);
3166 if (avctx->extradata_size > 0 && avctx->extradata) {
3167 ret = hevc_decode_extradata(s);
3169 hevc_decode_free(avctx);
3177 static av_cold int hevc_init_thread_copy(AVCodecContext *avctx)
3179 HEVCContext *s = avctx->priv_data;
3182 memset(s, 0, sizeof(*s));
3184 ret = hevc_init_context(avctx);
3191 static void hevc_decode_flush(AVCodecContext *avctx)
3193 HEVCContext *s = avctx->priv_data;
3194 ff_hevc_flush_dpb(s);
3195 s->max_ra = INT_MAX;
3198 #define OFFSET(x) offsetof(HEVCContext, x)
3199 #define PAR (AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
3201 static const AVProfile profiles[] = {
3202 { FF_PROFILE_HEVC_MAIN, "Main" },
3203 { FF_PROFILE_HEVC_MAIN_10, "Main 10" },
3204 { FF_PROFILE_HEVC_MAIN_STILL_PICTURE, "Main Still Picture" },
3205 { FF_PROFILE_UNKNOWN },
3208 static const AVOption options[] = {
3209 { "apply_defdispwin", "Apply default display window from VUI", OFFSET(apply_defdispwin),
3210 AV_OPT_TYPE_INT, {.i64 = 0}, 0, 1, PAR },
3214 static const AVClass hevc_decoder_class = {
3215 .class_name = "HEVC decoder",
3216 .item_name = av_default_item_name,
3218 .version = LIBAVUTIL_VERSION_INT,
3221 AVCodec ff_hevc_decoder = {
3223 .long_name = NULL_IF_CONFIG_SMALL("HEVC (High Efficiency Video Coding)"),
3224 .type = AVMEDIA_TYPE_VIDEO,
3225 .id = AV_CODEC_ID_HEVC,
3226 .priv_data_size = sizeof(HEVCContext),
3227 .priv_class = &hevc_decoder_class,
3228 .init = hevc_decode_init,
3229 .close = hevc_decode_free,
3230 .decode = hevc_decode_frame,
3231 .flush = hevc_decode_flush,
3232 .update_thread_context = hevc_update_thread_context,
3233 .init_thread_copy = hevc_init_thread_copy,
3234 .capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY |
3235 CODEC_CAP_FRAME_THREADS,
3236 .profiles = NULL_IF_CONFIG_SMALL(profiles),