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 = get_ue_golomb_long(gb);
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->time_base.num, &s->avctx->time_base.den,
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);
555 int short_term_ref_pic_set_sps_flag, poc;
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 short_term_ref_pic_set_sps_flag = get_bits1(gb);
569 if (!short_term_ref_pic_set_sps_flag) {
570 ret = ff_hevc_decode_short_term_rps(s, &sh->slice_rps, s->sps, 1);
574 sh->short_term_rps = &sh->slice_rps;
576 int numbits, rps_idx;
578 if (!s->sps->nb_st_rps) {
579 av_log(s->avctx, AV_LOG_ERROR, "No ref lists in the SPS.\n");
580 return AVERROR_INVALIDDATA;
583 numbits = av_ceil_log2(s->sps->nb_st_rps);
584 rps_idx = numbits > 0 ? get_bits(gb, numbits) : 0;
585 sh->short_term_rps = &s->sps->st_rps[rps_idx];
588 ret = decode_lt_rps(s, &sh->long_term_rps, gb);
590 av_log(s->avctx, AV_LOG_WARNING, "Invalid long term RPS.\n");
591 if (s->avctx->err_recognition & AV_EF_EXPLODE)
592 return AVERROR_INVALIDDATA;
595 if (s->sps->sps_temporal_mvp_enabled_flag)
596 sh->slice_temporal_mvp_enabled_flag = get_bits1(gb);
598 sh->slice_temporal_mvp_enabled_flag = 0;
600 s->sh.short_term_rps = NULL;
605 if (s->temporal_id == 0 &&
606 s->nal_unit_type != NAL_TRAIL_N &&
607 s->nal_unit_type != NAL_TSA_N &&
608 s->nal_unit_type != NAL_STSA_N &&
609 s->nal_unit_type != NAL_RADL_N &&
610 s->nal_unit_type != NAL_RADL_R &&
611 s->nal_unit_type != NAL_RASL_N &&
612 s->nal_unit_type != NAL_RASL_R)
615 if (s->sps->sao_enabled) {
616 sh->slice_sample_adaptive_offset_flag[0] = get_bits1(gb);
617 sh->slice_sample_adaptive_offset_flag[1] =
618 sh->slice_sample_adaptive_offset_flag[2] = get_bits1(gb);
620 sh->slice_sample_adaptive_offset_flag[0] = 0;
621 sh->slice_sample_adaptive_offset_flag[1] = 0;
622 sh->slice_sample_adaptive_offset_flag[2] = 0;
625 sh->nb_refs[L0] = sh->nb_refs[L1] = 0;
626 if (sh->slice_type == P_SLICE || sh->slice_type == B_SLICE) {
629 sh->nb_refs[L0] = s->pps->num_ref_idx_l0_default_active;
630 if (sh->slice_type == B_SLICE)
631 sh->nb_refs[L1] = s->pps->num_ref_idx_l1_default_active;
633 if (get_bits1(gb)) { // num_ref_idx_active_override_flag
634 sh->nb_refs[L0] = get_ue_golomb_long(gb) + 1;
635 if (sh->slice_type == B_SLICE)
636 sh->nb_refs[L1] = get_ue_golomb_long(gb) + 1;
638 if (sh->nb_refs[L0] > MAX_REFS || sh->nb_refs[L1] > MAX_REFS) {
639 av_log(s->avctx, AV_LOG_ERROR, "Too many refs: %d/%d.\n",
640 sh->nb_refs[L0], sh->nb_refs[L1]);
641 return AVERROR_INVALIDDATA;
644 sh->rpl_modification_flag[0] = 0;
645 sh->rpl_modification_flag[1] = 0;
646 nb_refs = ff_hevc_frame_nb_refs(s);
648 av_log(s->avctx, AV_LOG_ERROR, "Zero refs for a frame with P or B slices.\n");
649 return AVERROR_INVALIDDATA;
652 if (s->pps->lists_modification_present_flag && nb_refs > 1) {
653 sh->rpl_modification_flag[0] = get_bits1(gb);
654 if (sh->rpl_modification_flag[0]) {
655 for (i = 0; i < sh->nb_refs[L0]; i++)
656 sh->list_entry_lx[0][i] = get_bits(gb, av_ceil_log2(nb_refs));
659 if (sh->slice_type == B_SLICE) {
660 sh->rpl_modification_flag[1] = get_bits1(gb);
661 if (sh->rpl_modification_flag[1] == 1)
662 for (i = 0; i < sh->nb_refs[L1]; i++)
663 sh->list_entry_lx[1][i] = get_bits(gb, av_ceil_log2(nb_refs));
667 if (sh->slice_type == B_SLICE)
668 sh->mvd_l1_zero_flag = get_bits1(gb);
670 if (s->pps->cabac_init_present_flag)
671 sh->cabac_init_flag = get_bits1(gb);
673 sh->cabac_init_flag = 0;
675 sh->collocated_ref_idx = 0;
676 if (sh->slice_temporal_mvp_enabled_flag) {
677 sh->collocated_list = L0;
678 if (sh->slice_type == B_SLICE)
679 sh->collocated_list = !get_bits1(gb);
681 if (sh->nb_refs[sh->collocated_list] > 1) {
682 sh->collocated_ref_idx = get_ue_golomb_long(gb);
683 if (sh->collocated_ref_idx >= sh->nb_refs[sh->collocated_list]) {
684 av_log(s->avctx, AV_LOG_ERROR,
685 "Invalid collocated_ref_idx: %d.\n",
686 sh->collocated_ref_idx);
687 return AVERROR_INVALIDDATA;
692 if ((s->pps->weighted_pred_flag && sh->slice_type == P_SLICE) ||
693 (s->pps->weighted_bipred_flag && sh->slice_type == B_SLICE)) {
694 pred_weight_table(s, gb);
697 sh->max_num_merge_cand = 5 - get_ue_golomb_long(gb);
698 if (sh->max_num_merge_cand < 1 || sh->max_num_merge_cand > 5) {
699 av_log(s->avctx, AV_LOG_ERROR,
700 "Invalid number of merging MVP candidates: %d.\n",
701 sh->max_num_merge_cand);
702 return AVERROR_INVALIDDATA;
706 sh->slice_qp_delta = get_se_golomb(gb);
708 if (s->pps->pic_slice_level_chroma_qp_offsets_present_flag) {
709 sh->slice_cb_qp_offset = get_se_golomb(gb);
710 sh->slice_cr_qp_offset = get_se_golomb(gb);
712 sh->slice_cb_qp_offset = 0;
713 sh->slice_cr_qp_offset = 0;
716 if (s->pps->deblocking_filter_control_present_flag) {
717 int deblocking_filter_override_flag = 0;
719 if (s->pps->deblocking_filter_override_enabled_flag)
720 deblocking_filter_override_flag = get_bits1(gb);
722 if (deblocking_filter_override_flag) {
723 sh->disable_deblocking_filter_flag = get_bits1(gb);
724 if (!sh->disable_deblocking_filter_flag) {
725 sh->beta_offset = get_se_golomb(gb) * 2;
726 sh->tc_offset = get_se_golomb(gb) * 2;
729 sh->disable_deblocking_filter_flag = s->pps->disable_dbf;
730 sh->beta_offset = s->pps->beta_offset;
731 sh->tc_offset = s->pps->tc_offset;
734 sh->disable_deblocking_filter_flag = 0;
739 if (s->pps->seq_loop_filter_across_slices_enabled_flag &&
740 (sh->slice_sample_adaptive_offset_flag[0] ||
741 sh->slice_sample_adaptive_offset_flag[1] ||
742 !sh->disable_deblocking_filter_flag)) {
743 sh->slice_loop_filter_across_slices_enabled_flag = get_bits1(gb);
745 sh->slice_loop_filter_across_slices_enabled_flag = s->pps->seq_loop_filter_across_slices_enabled_flag;
747 } else if (!s->slice_initialized) {
748 av_log(s->avctx, AV_LOG_ERROR, "Independent slice segment missing.\n");
749 return AVERROR_INVALIDDATA;
752 sh->num_entry_point_offsets = 0;
753 if (s->pps->tiles_enabled_flag || s->pps->entropy_coding_sync_enabled_flag) {
754 sh->num_entry_point_offsets = get_ue_golomb_long(gb);
755 if (sh->num_entry_point_offsets > 0) {
756 int offset_len = get_ue_golomb_long(gb) + 1;
758 for (i = 0; i < sh->num_entry_point_offsets; i++)
759 skip_bits(gb, offset_len);
763 if (s->pps->slice_header_extension_present_flag) {
764 unsigned int length = get_ue_golomb_long(gb);
765 for (i = 0; i < length; i++)
766 skip_bits(gb, 8); // slice_header_extension_data_byte
769 // Inferred parameters
770 sh->slice_qp = 26 + s->pps->pic_init_qp_minus26 + sh->slice_qp_delta;
771 if (sh->slice_qp > 51 ||
772 sh->slice_qp < -s->sps->qp_bd_offset) {
773 av_log(s->avctx, AV_LOG_ERROR,
774 "The slice_qp %d is outside the valid range "
777 -s->sps->qp_bd_offset);
778 return AVERROR_INVALIDDATA;
781 sh->slice_ctb_addr_rs = sh->slice_segment_addr;
783 if (!s->sh.slice_ctb_addr_rs && s->sh.dependent_slice_segment_flag) {
784 av_log(s->avctx, AV_LOG_ERROR, "Impossible slice segment.\n");
785 return AVERROR_INVALIDDATA;
788 s->HEVClc.first_qp_group = !s->sh.dependent_slice_segment_flag;
790 if (!s->pps->cu_qp_delta_enabled_flag)
791 s->HEVClc.qp_y = FFUMOD(s->sh.slice_qp + 52 + 2 * s->sps->qp_bd_offset,
792 52 + s->sps->qp_bd_offset) - s->sps->qp_bd_offset;
794 s->slice_initialized = 1;
799 #define CTB(tab, x, y) ((tab)[(y) * s->sps->ctb_width + (x)])
801 #define SET_SAO(elem, value) \
803 if (!sao_merge_up_flag && !sao_merge_left_flag) \
805 else if (sao_merge_left_flag) \
806 sao->elem = CTB(s->sao, rx-1, ry).elem; \
807 else if (sao_merge_up_flag) \
808 sao->elem = CTB(s->sao, rx, ry-1).elem; \
813 static void hls_sao_param(HEVCContext *s, int rx, int ry)
815 HEVCLocalContext *lc = &s->HEVClc;
816 int sao_merge_left_flag = 0;
817 int sao_merge_up_flag = 0;
818 int shift = s->sps->bit_depth - FFMIN(s->sps->bit_depth, 10);
819 SAOParams *sao = &CTB(s->sao, rx, ry);
822 if (s->sh.slice_sample_adaptive_offset_flag[0] ||
823 s->sh.slice_sample_adaptive_offset_flag[1]) {
825 if (lc->ctb_left_flag)
826 sao_merge_left_flag = ff_hevc_sao_merge_flag_decode(s);
828 if (ry > 0 && !sao_merge_left_flag) {
830 sao_merge_up_flag = ff_hevc_sao_merge_flag_decode(s);
834 for (c_idx = 0; c_idx < 3; c_idx++) {
835 if (!s->sh.slice_sample_adaptive_offset_flag[c_idx]) {
836 sao->type_idx[c_idx] = SAO_NOT_APPLIED;
841 sao->type_idx[2] = sao->type_idx[1];
842 sao->eo_class[2] = sao->eo_class[1];
844 SET_SAO(type_idx[c_idx], ff_hevc_sao_type_idx_decode(s));
847 if (sao->type_idx[c_idx] == SAO_NOT_APPLIED)
850 for (i = 0; i < 4; i++)
851 SET_SAO(offset_abs[c_idx][i], ff_hevc_sao_offset_abs_decode(s));
853 if (sao->type_idx[c_idx] == SAO_BAND) {
854 for (i = 0; i < 4; i++) {
855 if (sao->offset_abs[c_idx][i]) {
856 SET_SAO(offset_sign[c_idx][i],
857 ff_hevc_sao_offset_sign_decode(s));
859 sao->offset_sign[c_idx][i] = 0;
862 SET_SAO(band_position[c_idx], ff_hevc_sao_band_position_decode(s));
863 } else if (c_idx != 2) {
864 SET_SAO(eo_class[c_idx], ff_hevc_sao_eo_class_decode(s));
867 // Inferred parameters
868 sao->offset_val[c_idx][0] = 0;
869 for (i = 0; i < 4; i++) {
870 sao->offset_val[c_idx][i + 1] = sao->offset_abs[c_idx][i] << shift;
871 if (sao->type_idx[c_idx] == SAO_EDGE) {
873 sao->offset_val[c_idx][i + 1] = -sao->offset_val[c_idx][i + 1];
874 } else if (sao->offset_sign[c_idx][i]) {
875 sao->offset_val[c_idx][i + 1] = -sao->offset_val[c_idx][i + 1];
884 static void hls_residual_coding(HEVCContext *s, int x0, int y0,
885 int log2_trafo_size, enum ScanType scan_idx,
888 #define GET_COORD(offset, n) \
890 x_c = (scan_x_cg[offset >> 4] << 2) + scan_x_off[n]; \
891 y_c = (scan_y_cg[offset >> 4] << 2) + scan_y_off[n]; \
893 HEVCLocalContext *lc = &s->HEVClc;
894 int transform_skip_flag = 0;
896 int last_significant_coeff_x, last_significant_coeff_y;
900 int greater1_ctx = 1;
903 int x_cg_last_sig, y_cg_last_sig;
905 const uint8_t *scan_x_cg, *scan_y_cg, *scan_x_off, *scan_y_off;
907 ptrdiff_t stride = s->frame->linesize[c_idx];
908 int hshift = s->sps->hshift[c_idx];
909 int vshift = s->sps->vshift[c_idx];
910 uint8_t *dst = &s->frame->data[c_idx][(y0 >> vshift) * stride +
911 ((x0 >> hshift) << s->sps->pixel_shift)];
912 DECLARE_ALIGNED(16, int16_t, coeffs[MAX_TB_SIZE * MAX_TB_SIZE]) = { 0 };
913 DECLARE_ALIGNED(8, uint8_t, significant_coeff_group_flag[8][8]) = { { 0 } };
915 int trafo_size = 1 << log2_trafo_size;
916 int i, qp, shift, add, scale, scale_m;
917 const uint8_t level_scale[] = { 40, 45, 51, 57, 64, 72 };
918 const uint8_t *scale_matrix;
921 // Derive QP for dequant
922 if (!lc->cu.cu_transquant_bypass_flag) {
923 static const int qp_c[] = {
924 29, 30, 31, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37
927 static const uint8_t rem6[51 + 2 * 6 + 1] = {
928 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2,
929 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5,
930 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3,
933 static const uint8_t div6[51 + 2 * 6 + 1] = {
934 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3,
935 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6,
936 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10,
941 qp = qp_y + s->sps->qp_bd_offset;
946 offset = s->pps->cb_qp_offset + s->sh.slice_cb_qp_offset;
948 offset = s->pps->cr_qp_offset + s->sh.slice_cr_qp_offset;
950 qp_i = av_clip_c(qp_y + offset, -s->sps->qp_bd_offset, 57);
956 qp = qp_c[qp_i - 30];
958 qp += s->sps->qp_bd_offset;
961 shift = s->sps->bit_depth + log2_trafo_size - 5;
962 add = 1 << (shift - 1);
963 scale = level_scale[rem6[qp]] << (div6[qp]);
964 scale_m = 16; // default when no custom scaling lists.
967 if (s->sps->scaling_list_enable_flag) {
968 const ScalingList *sl = s->pps->scaling_list_data_present_flag ?
969 &s->pps->scaling_list : &s->sps->scaling_list;
970 int matrix_id = lc->cu.pred_mode != MODE_INTRA;
972 if (log2_trafo_size != 5)
973 matrix_id = 3 * matrix_id + c_idx;
975 scale_matrix = sl->sl[log2_trafo_size - 2][matrix_id];
976 if (log2_trafo_size >= 4)
977 dc_scale = sl->sl_dc[log2_trafo_size - 4][matrix_id];
981 if (s->pps->transform_skip_enabled_flag &&
982 !lc->cu.cu_transquant_bypass_flag &&
983 log2_trafo_size == 2) {
984 transform_skip_flag = ff_hevc_transform_skip_flag_decode(s, c_idx);
987 last_significant_coeff_x =
988 ff_hevc_last_significant_coeff_x_prefix_decode(s, c_idx, log2_trafo_size);
989 last_significant_coeff_y =
990 ff_hevc_last_significant_coeff_y_prefix_decode(s, c_idx, log2_trafo_size);
992 if (last_significant_coeff_x > 3) {
993 int suffix = ff_hevc_last_significant_coeff_suffix_decode(s, last_significant_coeff_x);
994 last_significant_coeff_x = (1 << ((last_significant_coeff_x >> 1) - 1)) *
995 (2 + (last_significant_coeff_x & 1)) +
999 if (last_significant_coeff_y > 3) {
1000 int suffix = ff_hevc_last_significant_coeff_suffix_decode(s, last_significant_coeff_y);
1001 last_significant_coeff_y = (1 << ((last_significant_coeff_y >> 1) - 1)) *
1002 (2 + (last_significant_coeff_y & 1)) +
1006 if (scan_idx == SCAN_VERT)
1007 FFSWAP(int, last_significant_coeff_x, last_significant_coeff_y);
1009 x_cg_last_sig = last_significant_coeff_x >> 2;
1010 y_cg_last_sig = last_significant_coeff_y >> 2;
1014 int last_x_c = last_significant_coeff_x & 3;
1015 int last_y_c = last_significant_coeff_y & 3;
1017 scan_x_off = ff_hevc_diag_scan4x4_x;
1018 scan_y_off = ff_hevc_diag_scan4x4_y;
1019 num_coeff = diag_scan4x4_inv[last_y_c][last_x_c];
1020 if (trafo_size == 4) {
1021 scan_x_cg = scan_1x1;
1022 scan_y_cg = scan_1x1;
1023 } else if (trafo_size == 8) {
1024 num_coeff += diag_scan2x2_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1025 scan_x_cg = diag_scan2x2_x;
1026 scan_y_cg = diag_scan2x2_y;
1027 } else if (trafo_size == 16) {
1028 num_coeff += diag_scan4x4_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1029 scan_x_cg = ff_hevc_diag_scan4x4_x;
1030 scan_y_cg = ff_hevc_diag_scan4x4_y;
1031 } else { // trafo_size == 32
1032 num_coeff += diag_scan8x8_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1033 scan_x_cg = ff_hevc_diag_scan8x8_x;
1034 scan_y_cg = ff_hevc_diag_scan8x8_y;
1039 scan_x_cg = horiz_scan2x2_x;
1040 scan_y_cg = horiz_scan2x2_y;
1041 scan_x_off = horiz_scan4x4_x;
1042 scan_y_off = horiz_scan4x4_y;
1043 num_coeff = horiz_scan8x8_inv[last_significant_coeff_y][last_significant_coeff_x];
1045 default: //SCAN_VERT
1046 scan_x_cg = horiz_scan2x2_y;
1047 scan_y_cg = horiz_scan2x2_x;
1048 scan_x_off = horiz_scan4x4_y;
1049 scan_y_off = horiz_scan4x4_x;
1050 num_coeff = horiz_scan8x8_inv[last_significant_coeff_x][last_significant_coeff_y];
1054 num_last_subset = (num_coeff - 1) >> 4;
1056 for (i = num_last_subset; i >= 0; i--) {
1058 int x_cg, y_cg, x_c, y_c;
1059 int implicit_non_zero_coeff = 0;
1060 int64_t trans_coeff_level;
1062 int offset = i << 4;
1064 uint8_t significant_coeff_flag_idx[16];
1065 uint8_t nb_significant_coeff_flag = 0;
1067 x_cg = scan_x_cg[i];
1068 y_cg = scan_y_cg[i];
1070 if (i < num_last_subset && i > 0) {
1072 if (x_cg < (1 << (log2_trafo_size - 2)) - 1)
1073 ctx_cg += significant_coeff_group_flag[x_cg + 1][y_cg];
1074 if (y_cg < (1 << (log2_trafo_size - 2)) - 1)
1075 ctx_cg += significant_coeff_group_flag[x_cg][y_cg + 1];
1077 significant_coeff_group_flag[x_cg][y_cg] =
1078 ff_hevc_significant_coeff_group_flag_decode(s, c_idx, ctx_cg);
1079 implicit_non_zero_coeff = 1;
1081 significant_coeff_group_flag[x_cg][y_cg] =
1082 ((x_cg == x_cg_last_sig && y_cg == y_cg_last_sig) ||
1083 (x_cg == 0 && y_cg == 0));
1086 last_scan_pos = num_coeff - offset - 1;
1088 if (i == num_last_subset) {
1089 n_end = last_scan_pos - 1;
1090 significant_coeff_flag_idx[0] = last_scan_pos;
1091 nb_significant_coeff_flag = 1;
1096 if (x_cg < ((1 << log2_trafo_size) - 1) >> 2)
1097 prev_sig = significant_coeff_group_flag[x_cg + 1][y_cg];
1098 if (y_cg < ((1 << log2_trafo_size) - 1) >> 2)
1099 prev_sig += significant_coeff_group_flag[x_cg][y_cg + 1] << 1;
1101 for (n = n_end; n >= 0; n--) {
1102 GET_COORD(offset, n);
1104 if (significant_coeff_group_flag[x_cg][y_cg] &&
1105 (n > 0 || implicit_non_zero_coeff == 0)) {
1106 if (ff_hevc_significant_coeff_flag_decode(s, c_idx, x_c, y_c,
1110 significant_coeff_flag_idx[nb_significant_coeff_flag] = n;
1111 nb_significant_coeff_flag++;
1112 implicit_non_zero_coeff = 0;
1115 int last_cg = (x_c == (x_cg << 2) && y_c == (y_cg << 2));
1116 if (last_cg && implicit_non_zero_coeff && significant_coeff_group_flag[x_cg][y_cg]) {
1117 significant_coeff_flag_idx[nb_significant_coeff_flag] = n;
1118 nb_significant_coeff_flag++;
1123 n_end = nb_significant_coeff_flag;
1126 int first_nz_pos_in_cg = 16;
1127 int last_nz_pos_in_cg = -1;
1128 int c_rice_param = 0;
1129 int first_greater1_coeff_idx = -1;
1130 uint8_t coeff_abs_level_greater1_flag[16] = { 0 };
1131 uint16_t coeff_sign_flag;
1133 int sign_hidden = 0;
1135 // initialize first elem of coeff_bas_level_greater1_flag
1136 int ctx_set = (i > 0 && c_idx == 0) ? 2 : 0;
1138 if (!(i == num_last_subset) && greater1_ctx == 0)
1141 last_nz_pos_in_cg = significant_coeff_flag_idx[0];
1143 for (m = 0; m < (n_end > 8 ? 8 : n_end); m++) {
1144 int n_idx = significant_coeff_flag_idx[m];
1145 int inc = (ctx_set << 2) + greater1_ctx;
1146 coeff_abs_level_greater1_flag[n_idx] =
1147 ff_hevc_coeff_abs_level_greater1_flag_decode(s, c_idx, inc);
1148 if (coeff_abs_level_greater1_flag[n_idx]) {
1150 } else if (greater1_ctx > 0 && greater1_ctx < 3) {
1154 if (coeff_abs_level_greater1_flag[n_idx] &&
1155 first_greater1_coeff_idx == -1)
1156 first_greater1_coeff_idx = n_idx;
1158 first_nz_pos_in_cg = significant_coeff_flag_idx[n_end - 1];
1159 sign_hidden = last_nz_pos_in_cg - first_nz_pos_in_cg >= 4 &&
1160 !lc->cu.cu_transquant_bypass_flag;
1162 if (first_greater1_coeff_idx != -1) {
1163 coeff_abs_level_greater1_flag[first_greater1_coeff_idx] += ff_hevc_coeff_abs_level_greater2_flag_decode(s, c_idx, ctx_set);
1165 if (!s->pps->sign_data_hiding_flag || !sign_hidden) {
1166 coeff_sign_flag = ff_hevc_coeff_sign_flag(s, nb_significant_coeff_flag) << (16 - nb_significant_coeff_flag);
1168 coeff_sign_flag = ff_hevc_coeff_sign_flag(s, nb_significant_coeff_flag - 1) << (16 - (nb_significant_coeff_flag - 1));
1171 for (m = 0; m < n_end; m++) {
1172 n = significant_coeff_flag_idx[m];
1173 GET_COORD(offset, n);
1174 trans_coeff_level = 1 + coeff_abs_level_greater1_flag[n];
1175 if (trans_coeff_level == ((m < 8) ?
1176 ((n == first_greater1_coeff_idx) ? 3 : 2) : 1)) {
1177 int last_coeff_abs_level_remaining = ff_hevc_coeff_abs_level_remaining(s, trans_coeff_level, c_rice_param);
1179 trans_coeff_level += last_coeff_abs_level_remaining;
1180 if ((trans_coeff_level) > (3 * (1 << c_rice_param)))
1181 c_rice_param = FFMIN(c_rice_param + 1, 4);
1183 if (s->pps->sign_data_hiding_flag && sign_hidden) {
1184 sum_abs += trans_coeff_level;
1185 if (n == first_nz_pos_in_cg && ((sum_abs & 1) == 1))
1186 trans_coeff_level = -trans_coeff_level;
1188 if (coeff_sign_flag >> 15)
1189 trans_coeff_level = -trans_coeff_level;
1190 coeff_sign_flag <<= 1;
1191 if (!lc->cu.cu_transquant_bypass_flag) {
1192 if (s->sps->scaling_list_enable_flag) {
1193 if (y_c || x_c || log2_trafo_size < 4) {
1195 switch (log2_trafo_size) {
1196 case 3: pos = (y_c << 3) + x_c; break;
1197 case 4: pos = ((y_c >> 1) << 3) + (x_c >> 1); break;
1198 case 5: pos = ((y_c >> 2) << 3) + (x_c >> 2); break;
1199 default: pos = (y_c << 2) + x_c;
1201 scale_m = scale_matrix[pos];
1206 trans_coeff_level = (trans_coeff_level * (int64_t)scale * (int64_t)scale_m + add) >> shift;
1207 if(trans_coeff_level < 0) {
1208 if((~trans_coeff_level) & 0xFffffffffff8000)
1209 trans_coeff_level = -32768;
1211 if (trans_coeff_level & 0xffffffffffff8000)
1212 trans_coeff_level = 32767;
1215 coeffs[y_c * trafo_size + x_c] = trans_coeff_level;
1220 if (lc->cu.cu_transquant_bypass_flag) {
1221 s->hevcdsp.transquant_bypass[log2_trafo_size - 2](dst, coeffs, stride);
1223 if (transform_skip_flag)
1224 s->hevcdsp.transform_skip(dst, coeffs, stride);
1225 else if (lc->cu.pred_mode == MODE_INTRA && c_idx == 0 &&
1226 log2_trafo_size == 2)
1227 s->hevcdsp.transform_4x4_luma_add(dst, coeffs, stride);
1229 s->hevcdsp.transform_add[log2_trafo_size - 2](dst, coeffs, stride);
1233 static int hls_transform_unit(HEVCContext *s, int x0, int y0,
1234 int xBase, int yBase, int cb_xBase, int cb_yBase,
1235 int log2_cb_size, int log2_trafo_size,
1236 int trafo_depth, int blk_idx)
1238 HEVCLocalContext *lc = &s->HEVClc;
1240 if (lc->cu.pred_mode == MODE_INTRA) {
1241 int trafo_size = 1 << log2_trafo_size;
1242 ff_hevc_set_neighbour_available(s, x0, y0, trafo_size, trafo_size);
1244 s->hpc.intra_pred[log2_trafo_size - 2](s, x0, y0, 0);
1245 if (log2_trafo_size > 2) {
1246 trafo_size = trafo_size << (s->sps->hshift[1] - 1);
1247 ff_hevc_set_neighbour_available(s, x0, y0, trafo_size, trafo_size);
1248 s->hpc.intra_pred[log2_trafo_size - 3](s, x0, y0, 1);
1249 s->hpc.intra_pred[log2_trafo_size - 3](s, x0, y0, 2);
1250 } else if (blk_idx == 3) {
1251 trafo_size = trafo_size << s->sps->hshift[1];
1252 ff_hevc_set_neighbour_available(s, xBase, yBase,
1253 trafo_size, trafo_size);
1254 s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase, 1);
1255 s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase, 2);
1259 if (lc->tt.cbf_luma ||
1260 SAMPLE_CBF(lc->tt.cbf_cb[trafo_depth], x0, y0) ||
1261 SAMPLE_CBF(lc->tt.cbf_cr[trafo_depth], x0, y0)) {
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;
1304 if (lc->tt.cbf_luma)
1305 hls_residual_coding(s, x0, y0, log2_trafo_size, scan_idx, 0);
1306 if (log2_trafo_size > 2) {
1307 if (SAMPLE_CBF(lc->tt.cbf_cb[trafo_depth], x0, y0))
1308 hls_residual_coding(s, x0, y0, log2_trafo_size - 1, scan_idx_c, 1);
1309 if (SAMPLE_CBF(lc->tt.cbf_cr[trafo_depth], x0, y0))
1310 hls_residual_coding(s, x0, y0, log2_trafo_size - 1, scan_idx_c, 2);
1311 } else if (blk_idx == 3) {
1312 if (SAMPLE_CBF(lc->tt.cbf_cb[trafo_depth], xBase, yBase))
1313 hls_residual_coding(s, xBase, yBase, log2_trafo_size, scan_idx_c, 1);
1314 if (SAMPLE_CBF(lc->tt.cbf_cr[trafo_depth], xBase, yBase))
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)
1341 HEVCLocalContext *lc = &s->HEVClc;
1342 uint8_t split_transform_flag;
1345 if (trafo_depth > 0 && log2_trafo_size == 2) {
1346 SAMPLE_CBF(lc->tt.cbf_cb[trafo_depth], x0, y0) =
1347 SAMPLE_CBF(lc->tt.cbf_cb[trafo_depth - 1], xBase, yBase);
1348 SAMPLE_CBF(lc->tt.cbf_cr[trafo_depth], x0, y0) =
1349 SAMPLE_CBF(lc->tt.cbf_cr[trafo_depth - 1], xBase, yBase);
1351 SAMPLE_CBF(lc->tt.cbf_cb[trafo_depth], x0, y0) =
1352 SAMPLE_CBF(lc->tt.cbf_cr[trafo_depth], x0, y0) = 0;
1355 if (lc->cu.intra_split_flag) {
1356 if (trafo_depth == 1)
1357 lc->tu.cur_intra_pred_mode = lc->pu.intra_pred_mode[blk_idx];
1359 lc->tu.cur_intra_pred_mode = lc->pu.intra_pred_mode[0];
1362 lc->tt.cbf_luma = 1;
1364 lc->tt.inter_split_flag = s->sps->max_transform_hierarchy_depth_inter == 0 &&
1365 lc->cu.pred_mode == MODE_INTER &&
1366 lc->cu.part_mode != PART_2Nx2N &&
1369 if (log2_trafo_size <= s->sps->log2_max_trafo_size &&
1370 log2_trafo_size > s->sps->log2_min_tb_size &&
1371 trafo_depth < lc->cu.max_trafo_depth &&
1372 !(lc->cu.intra_split_flag && trafo_depth == 0)) {
1373 split_transform_flag = ff_hevc_split_transform_flag_decode(s, log2_trafo_size);
1375 split_transform_flag = log2_trafo_size > s->sps->log2_max_trafo_size ||
1376 (lc->cu.intra_split_flag && trafo_depth == 0) ||
1377 lc->tt.inter_split_flag;
1380 if (log2_trafo_size > 2) {
1381 if (trafo_depth == 0 ||
1382 SAMPLE_CBF(lc->tt.cbf_cb[trafo_depth - 1], xBase, yBase)) {
1383 SAMPLE_CBF(lc->tt.cbf_cb[trafo_depth], x0, y0) =
1384 ff_hevc_cbf_cb_cr_decode(s, trafo_depth);
1387 if (trafo_depth == 0 ||
1388 SAMPLE_CBF(lc->tt.cbf_cr[trafo_depth - 1], xBase, yBase)) {
1389 SAMPLE_CBF(lc->tt.cbf_cr[trafo_depth], x0, y0) =
1390 ff_hevc_cbf_cb_cr_decode(s, trafo_depth);
1394 if (split_transform_flag) {
1395 int x1 = x0 + ((1 << log2_trafo_size) >> 1);
1396 int y1 = y0 + ((1 << log2_trafo_size) >> 1);
1398 ret = hls_transform_tree(s, x0, y0, x0, y0, cb_xBase, cb_yBase,
1399 log2_cb_size, log2_trafo_size - 1,
1400 trafo_depth + 1, 0);
1403 ret = hls_transform_tree(s, x1, y0, x0, y0, cb_xBase, cb_yBase,
1404 log2_cb_size, log2_trafo_size - 1,
1405 trafo_depth + 1, 1);
1408 ret = hls_transform_tree(s, x0, y1, x0, y0, cb_xBase, cb_yBase,
1409 log2_cb_size, log2_trafo_size - 1,
1410 trafo_depth + 1, 2);
1413 ret = hls_transform_tree(s, x1, y1, x0, y0, cb_xBase, cb_yBase,
1414 log2_cb_size, log2_trafo_size - 1,
1415 trafo_depth + 1, 3);
1419 int min_tu_size = 1 << s->sps->log2_min_tb_size;
1420 int log2_min_tu_size = s->sps->log2_min_tb_size;
1421 int min_tu_width = s->sps->min_tb_width;
1423 if (lc->cu.pred_mode == MODE_INTRA || trafo_depth != 0 ||
1424 SAMPLE_CBF(lc->tt.cbf_cb[trafo_depth], x0, y0) ||
1425 SAMPLE_CBF(lc->tt.cbf_cr[trafo_depth], x0, y0)) {
1426 lc->tt.cbf_luma = ff_hevc_cbf_luma_decode(s, trafo_depth);
1429 ret = hls_transform_unit(s, x0, y0, xBase, yBase, cb_xBase, cb_yBase,
1430 log2_cb_size, log2_trafo_size, trafo_depth,
1434 // TODO: store cbf_luma somewhere else
1435 if (lc->tt.cbf_luma) {
1437 for (i = 0; i < (1 << log2_trafo_size); i += min_tu_size)
1438 for (j = 0; j < (1 << log2_trafo_size); j += min_tu_size) {
1439 int x_tu = (x0 + j) >> log2_min_tu_size;
1440 int y_tu = (y0 + i) >> log2_min_tu_size;
1441 s->cbf_luma[y_tu * min_tu_width + x_tu] = 1;
1444 if (!s->sh.disable_deblocking_filter_flag) {
1445 ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_trafo_size,
1446 lc->slice_or_tiles_up_boundary,
1447 lc->slice_or_tiles_left_boundary);
1448 if (s->pps->transquant_bypass_enable_flag &&
1449 lc->cu.cu_transquant_bypass_flag)
1450 set_deblocking_bypass(s, x0, y0, log2_trafo_size);
1456 static int hls_pcm_sample(HEVCContext *s, int x0, int y0, int log2_cb_size)
1458 //TODO: non-4:2:0 support
1459 HEVCLocalContext *lc = &s->HEVClc;
1461 int cb_size = 1 << log2_cb_size;
1462 int stride0 = s->frame->linesize[0];
1463 uint8_t *dst0 = &s->frame->data[0][y0 * stride0 + (x0 << s->sps->pixel_shift)];
1464 int stride1 = s->frame->linesize[1];
1465 uint8_t *dst1 = &s->frame->data[1][(y0 >> s->sps->vshift[1]) * stride1 + ((x0 >> s->sps->hshift[1]) << s->sps->pixel_shift)];
1466 int stride2 = s->frame->linesize[2];
1467 uint8_t *dst2 = &s->frame->data[2][(y0 >> s->sps->vshift[2]) * stride2 + ((x0 >> s->sps->hshift[2]) << s->sps->pixel_shift)];
1469 int length = cb_size * cb_size * s->sps->pcm.bit_depth + ((cb_size * cb_size) >> 1) * s->sps->pcm.bit_depth_chroma;
1470 const uint8_t *pcm = skip_bytes(&lc->cc, (length + 7) >> 3);
1473 ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_cb_size,
1474 lc->slice_or_tiles_up_boundary,
1475 lc->slice_or_tiles_left_boundary);
1477 ret = init_get_bits(&gb, pcm, length);
1481 s->hevcdsp.put_pcm(dst0, stride0, cb_size, &gb, s->sps->pcm.bit_depth);
1482 s->hevcdsp.put_pcm(dst1, stride1, cb_size / 2, &gb, s->sps->pcm.bit_depth_chroma);
1483 s->hevcdsp.put_pcm(dst2, stride2, cb_size / 2, &gb, s->sps->pcm.bit_depth_chroma);
1487 static void hls_mvd_coding(HEVCContext *s, int x0, int y0, int log2_cb_size)
1489 HEVCLocalContext *lc = &s->HEVClc;
1490 int x = ff_hevc_abs_mvd_greater0_flag_decode(s);
1491 int y = ff_hevc_abs_mvd_greater0_flag_decode(s);
1494 x += ff_hevc_abs_mvd_greater1_flag_decode(s);
1496 y += ff_hevc_abs_mvd_greater1_flag_decode(s);
1499 case 2: lc->pu.mvd.x = ff_hevc_mvd_decode(s); break;
1500 case 1: lc->pu.mvd.x = ff_hevc_mvd_sign_flag_decode(s); break;
1501 case 0: lc->pu.mvd.x = 0; break;
1505 case 2: lc->pu.mvd.y = ff_hevc_mvd_decode(s); break;
1506 case 1: lc->pu.mvd.y = ff_hevc_mvd_sign_flag_decode(s); break;
1507 case 0: lc->pu.mvd.y = 0; break;
1512 * 8.5.3.2.2.1 Luma sample interpolation process
1514 * @param s HEVC decoding context
1515 * @param dst target buffer for block data at block position
1516 * @param dststride stride of the dst buffer
1517 * @param ref reference picture buffer at origin (0, 0)
1518 * @param mv motion vector (relative to block position) to get pixel data from
1519 * @param x_off horizontal position of block from origin (0, 0)
1520 * @param y_off vertical position of block from origin (0, 0)
1521 * @param block_w width of block
1522 * @param block_h height of block
1524 static void luma_mc(HEVCContext *s, int16_t *dst, ptrdiff_t dststride,
1525 AVFrame *ref, const Mv *mv, int x_off, int y_off,
1526 int block_w, int block_h)
1528 HEVCLocalContext *lc = &s->HEVClc;
1529 uint8_t *src = ref->data[0];
1530 ptrdiff_t srcstride = ref->linesize[0];
1531 int pic_width = s->sps->width;
1532 int pic_height = s->sps->height;
1536 int extra_left = ff_hevc_qpel_extra_before[mx];
1537 int extra_top = ff_hevc_qpel_extra_before[my];
1539 x_off += mv->x >> 2;
1540 y_off += mv->y >> 2;
1541 src += y_off * srcstride + (x_off << s->sps->pixel_shift);
1543 if (x_off < extra_left || y_off < extra_top ||
1544 x_off >= pic_width - block_w - ff_hevc_qpel_extra_after[mx] ||
1545 y_off >= pic_height - block_h - ff_hevc_qpel_extra_after[my]) {
1546 const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->sps->pixel_shift;
1547 int offset = extra_top * srcstride + (extra_left << s->sps->pixel_shift);
1548 int buf_offset = extra_top *
1549 edge_emu_stride + (extra_left << s->sps->pixel_shift);
1551 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src - offset,
1552 edge_emu_stride, srcstride,
1553 block_w + ff_hevc_qpel_extra[mx],
1554 block_h + ff_hevc_qpel_extra[my],
1555 x_off - extra_left, y_off - extra_top,
1556 pic_width, pic_height);
1557 src = lc->edge_emu_buffer + buf_offset;
1558 srcstride = edge_emu_stride;
1560 s->hevcdsp.put_hevc_qpel[my][mx](dst, dststride, src, srcstride, block_w,
1561 block_h, lc->mc_buffer);
1565 * 8.5.3.2.2.2 Chroma sample interpolation process
1567 * @param s HEVC decoding context
1568 * @param dst1 target buffer for block data at block position (U plane)
1569 * @param dst2 target buffer for block data at block position (V plane)
1570 * @param dststride stride of the dst1 and dst2 buffers
1571 * @param ref reference picture buffer at origin (0, 0)
1572 * @param mv motion vector (relative to block position) to get pixel data from
1573 * @param x_off horizontal position of block from origin (0, 0)
1574 * @param y_off vertical position of block from origin (0, 0)
1575 * @param block_w width of block
1576 * @param block_h height of block
1578 static void chroma_mc(HEVCContext *s, int16_t *dst1, int16_t *dst2,
1579 ptrdiff_t dststride, AVFrame *ref, const Mv *mv,
1580 int x_off, int y_off, int block_w, int block_h)
1582 HEVCLocalContext *lc = &s->HEVClc;
1583 uint8_t *src1 = ref->data[1];
1584 uint8_t *src2 = ref->data[2];
1585 ptrdiff_t src1stride = ref->linesize[1];
1586 ptrdiff_t src2stride = ref->linesize[2];
1587 int pic_width = s->sps->width >> 1;
1588 int pic_height = s->sps->height >> 1;
1593 x_off += mv->x >> 3;
1594 y_off += mv->y >> 3;
1595 src1 += y_off * src1stride + (x_off << s->sps->pixel_shift);
1596 src2 += y_off * src2stride + (x_off << s->sps->pixel_shift);
1598 if (x_off < EPEL_EXTRA_BEFORE || y_off < EPEL_EXTRA_AFTER ||
1599 x_off >= pic_width - block_w - EPEL_EXTRA_AFTER ||
1600 y_off >= pic_height - block_h - EPEL_EXTRA_AFTER) {
1601 const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->sps->pixel_shift;
1602 int offset1 = EPEL_EXTRA_BEFORE * (src1stride + (1 << s->sps->pixel_shift));
1603 int buf_offset1 = EPEL_EXTRA_BEFORE *
1604 (edge_emu_stride + (1 << s->sps->pixel_shift));
1605 int offset2 = EPEL_EXTRA_BEFORE * (src2stride + (1 << s->sps->pixel_shift));
1606 int buf_offset2 = EPEL_EXTRA_BEFORE *
1607 (edge_emu_stride + (1 << s->sps->pixel_shift));
1609 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src1 - offset1,
1610 edge_emu_stride, src1stride,
1611 block_w + EPEL_EXTRA, block_h + EPEL_EXTRA,
1612 x_off - EPEL_EXTRA_BEFORE,
1613 y_off - EPEL_EXTRA_BEFORE,
1614 pic_width, pic_height);
1616 src1 = lc->edge_emu_buffer + buf_offset1;
1617 src1stride = edge_emu_stride;
1618 s->hevcdsp.put_hevc_epel[!!my][!!mx](dst1, dststride, src1, src1stride,
1619 block_w, block_h, mx, my, lc->mc_buffer);
1621 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src2 - offset2,
1622 edge_emu_stride, src2stride,
1623 block_w + EPEL_EXTRA, block_h + EPEL_EXTRA,
1624 x_off - EPEL_EXTRA_BEFORE,
1625 y_off - EPEL_EXTRA_BEFORE,
1626 pic_width, pic_height);
1627 src2 = lc->edge_emu_buffer + buf_offset2;
1628 src2stride = edge_emu_stride;
1630 s->hevcdsp.put_hevc_epel[!!my][!!mx](dst2, dststride, src2, src2stride,
1631 block_w, block_h, mx, my,
1634 s->hevcdsp.put_hevc_epel[!!my][!!mx](dst1, dststride, src1, src1stride,
1635 block_w, block_h, mx, my,
1637 s->hevcdsp.put_hevc_epel[!!my][!!mx](dst2, dststride, src2, src2stride,
1638 block_w, block_h, mx, my,
1643 static void hevc_await_progress(HEVCContext *s, HEVCFrame *ref,
1644 const Mv *mv, int y0, int height)
1646 int y = (mv->y >> 2) + y0 + height + 9;
1647 ff_thread_await_progress(&ref->tf, y, 0);
1650 static void hls_prediction_unit(HEVCContext *s, int x0, int y0,
1652 int log2_cb_size, int partIdx)
1654 #define POS(c_idx, x, y) \
1655 &s->frame->data[c_idx][((y) >> s->sps->vshift[c_idx]) * s->frame->linesize[c_idx] + \
1656 (((x) >> s->sps->hshift[c_idx]) << s->sps->pixel_shift)]
1657 HEVCLocalContext *lc = &s->HEVClc;
1659 struct MvField current_mv = {{{ 0 }}};
1661 int min_pu_width = s->sps->min_pu_width;
1663 MvField *tab_mvf = s->ref->tab_mvf;
1664 RefPicList *refPicList = s->ref->refPicList;
1665 HEVCFrame *ref0, *ref1;
1667 int tmpstride = MAX_PB_SIZE;
1669 uint8_t *dst0 = POS(0, x0, y0);
1670 uint8_t *dst1 = POS(1, x0, y0);
1671 uint8_t *dst2 = POS(2, x0, y0);
1672 int log2_min_cb_size = s->sps->log2_min_cb_size;
1673 int min_cb_width = s->sps->min_cb_width;
1674 int x_cb = x0 >> log2_min_cb_size;
1675 int y_cb = y0 >> log2_min_cb_size;
1681 if (SAMPLE_CTB(s->skip_flag, x_cb, y_cb)) {
1682 if (s->sh.max_num_merge_cand > 1)
1683 merge_idx = ff_hevc_merge_idx_decode(s);
1687 ff_hevc_luma_mv_merge_mode(s, x0, y0,
1690 log2_cb_size, partIdx,
1691 merge_idx, ¤t_mv);
1692 x_pu = x0 >> s->sps->log2_min_pu_size;
1693 y_pu = y0 >> s->sps->log2_min_pu_size;
1695 for (i = 0; i < nPbW >> s->sps->log2_min_pu_size; i++)
1696 for (j = 0; j < nPbH >> s->sps->log2_min_pu_size; j++)
1697 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i] = current_mv;
1698 } else { /* MODE_INTER */
1699 lc->pu.merge_flag = ff_hevc_merge_flag_decode(s);
1700 if (lc->pu.merge_flag) {
1701 if (s->sh.max_num_merge_cand > 1)
1702 merge_idx = ff_hevc_merge_idx_decode(s);
1706 ff_hevc_luma_mv_merge_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
1707 partIdx, merge_idx, ¤t_mv);
1708 x_pu = x0 >> s->sps->log2_min_pu_size;
1709 y_pu = y0 >> s->sps->log2_min_pu_size;
1711 for (i = 0; i < nPbW >> s->sps->log2_min_pu_size; i++)
1712 for (j = 0; j < nPbH >> s->sps->log2_min_pu_size; j++)
1713 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i] = current_mv;
1715 enum InterPredIdc inter_pred_idc = PRED_L0;
1716 ff_hevc_set_neighbour_available(s, x0, y0, nPbW, nPbH);
1717 if (s->sh.slice_type == B_SLICE)
1718 inter_pred_idc = ff_hevc_inter_pred_idc_decode(s, nPbW, nPbH);
1720 if (inter_pred_idc != PRED_L1) {
1721 if (s->sh.nb_refs[L0]) {
1722 ref_idx[0] = ff_hevc_ref_idx_lx_decode(s, s->sh.nb_refs[L0]);
1723 current_mv.ref_idx[0] = ref_idx[0];
1725 current_mv.pred_flag[0] = 1;
1726 hls_mvd_coding(s, x0, y0, 0);
1727 mvp_flag[0] = ff_hevc_mvp_lx_flag_decode(s);
1728 ff_hevc_luma_mv_mvp_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
1729 partIdx, merge_idx, ¤t_mv,
1731 current_mv.mv[0].x += lc->pu.mvd.x;
1732 current_mv.mv[0].y += lc->pu.mvd.y;
1735 if (inter_pred_idc != PRED_L0) {
1736 if (s->sh.nb_refs[L1]) {
1737 ref_idx[1] = ff_hevc_ref_idx_lx_decode(s, s->sh.nb_refs[L1]);
1738 current_mv.ref_idx[1] = ref_idx[1];
1741 if (s->sh.mvd_l1_zero_flag == 1 && inter_pred_idc == PRED_BI) {
1745 hls_mvd_coding(s, x0, y0, 1);
1748 current_mv.pred_flag[1] = 1;
1749 mvp_flag[1] = ff_hevc_mvp_lx_flag_decode(s);
1750 ff_hevc_luma_mv_mvp_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
1751 partIdx, merge_idx, ¤t_mv,
1753 current_mv.mv[1].x += lc->pu.mvd.x;
1754 current_mv.mv[1].y += lc->pu.mvd.y;
1757 x_pu = x0 >> s->sps->log2_min_pu_size;
1758 y_pu = y0 >> s->sps->log2_min_pu_size;
1760 for (i = 0; i < nPbW >> s->sps->log2_min_pu_size; i++)
1761 for(j = 0; j < nPbH >> s->sps->log2_min_pu_size; j++)
1762 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i] = current_mv;
1766 if (current_mv.pred_flag[0]) {
1767 ref0 = refPicList[0].ref[current_mv.ref_idx[0]];
1770 hevc_await_progress(s, ref0, ¤t_mv.mv[0], y0, nPbH);
1772 if (current_mv.pred_flag[1]) {
1773 ref1 = refPicList[1].ref[current_mv.ref_idx[1]];
1776 hevc_await_progress(s, ref1, ¤t_mv.mv[1], y0, nPbH);
1779 if (current_mv.pred_flag[0] && !current_mv.pred_flag[1]) {
1780 DECLARE_ALIGNED(16, int16_t, tmp[MAX_PB_SIZE * MAX_PB_SIZE]);
1781 DECLARE_ALIGNED(16, int16_t, tmp2[MAX_PB_SIZE * MAX_PB_SIZE]);
1783 luma_mc(s, tmp, tmpstride, ref0->frame,
1784 ¤t_mv.mv[0], x0, y0, nPbW, nPbH);
1786 if ((s->sh.slice_type == P_SLICE && s->pps->weighted_pred_flag) ||
1787 (s->sh.slice_type == B_SLICE && s->pps->weighted_bipred_flag)) {
1788 s->hevcdsp.weighted_pred(s->sh.luma_log2_weight_denom,
1789 s->sh.luma_weight_l0[current_mv.ref_idx[0]],
1790 s->sh.luma_offset_l0[current_mv.ref_idx[0]],
1791 dst0, s->frame->linesize[0], tmp,
1792 tmpstride, nPbW, nPbH);
1794 s->hevcdsp.put_unweighted_pred(dst0, s->frame->linesize[0], tmp, tmpstride, nPbW, nPbH);
1796 chroma_mc(s, tmp, tmp2, tmpstride, ref0->frame,
1797 ¤t_mv.mv[0], x0 / 2, y0 / 2, nPbW / 2, nPbH / 2);
1799 if ((s->sh.slice_type == P_SLICE && s->pps->weighted_pred_flag) ||
1800 (s->sh.slice_type == B_SLICE && s->pps->weighted_bipred_flag)) {
1801 s->hevcdsp.weighted_pred(s->sh.chroma_log2_weight_denom,
1802 s->sh.chroma_weight_l0[current_mv.ref_idx[0]][0],
1803 s->sh.chroma_offset_l0[current_mv.ref_idx[0]][0],
1804 dst1, s->frame->linesize[1], tmp, tmpstride,
1805 nPbW / 2, nPbH / 2);
1806 s->hevcdsp.weighted_pred(s->sh.chroma_log2_weight_denom,
1807 s->sh.chroma_weight_l0[current_mv.ref_idx[0]][1],
1808 s->sh.chroma_offset_l0[current_mv.ref_idx[0]][1],
1809 dst2, s->frame->linesize[2], tmp2, tmpstride,
1810 nPbW / 2, nPbH / 2);
1812 s->hevcdsp.put_unweighted_pred(dst1, s->frame->linesize[1], tmp, tmpstride, nPbW/2, nPbH/2);
1813 s->hevcdsp.put_unweighted_pred(dst2, s->frame->linesize[2], tmp2, tmpstride, nPbW/2, nPbH/2);
1815 } else if (!current_mv.pred_flag[0] && current_mv.pred_flag[1]) {
1816 DECLARE_ALIGNED(16, int16_t, tmp [MAX_PB_SIZE * MAX_PB_SIZE]);
1817 DECLARE_ALIGNED(16, int16_t, tmp2[MAX_PB_SIZE * MAX_PB_SIZE]);
1822 luma_mc(s, tmp, tmpstride, ref1->frame,
1823 ¤t_mv.mv[1], x0, y0, nPbW, nPbH);
1825 if ((s->sh.slice_type == P_SLICE && s->pps->weighted_pred_flag) ||
1826 (s->sh.slice_type == B_SLICE && s->pps->weighted_bipred_flag)) {
1827 s->hevcdsp.weighted_pred(s->sh.luma_log2_weight_denom,
1828 s->sh.luma_weight_l1[current_mv.ref_idx[1]],
1829 s->sh.luma_offset_l1[current_mv.ref_idx[1]],
1830 dst0, s->frame->linesize[0], tmp, tmpstride,
1833 s->hevcdsp.put_unweighted_pred(dst0, s->frame->linesize[0], tmp, tmpstride, nPbW, nPbH);
1836 chroma_mc(s, tmp, tmp2, tmpstride, ref1->frame,
1837 ¤t_mv.mv[1], x0/2, y0/2, nPbW/2, nPbH/2);
1839 if ((s->sh.slice_type == P_SLICE && s->pps->weighted_pred_flag) ||
1840 (s->sh.slice_type == B_SLICE && s->pps->weighted_bipred_flag)) {
1841 s->hevcdsp.weighted_pred(s->sh.chroma_log2_weight_denom,
1842 s->sh.chroma_weight_l1[current_mv.ref_idx[1]][0],
1843 s->sh.chroma_offset_l1[current_mv.ref_idx[1]][0],
1844 dst1, s->frame->linesize[1], tmp, tmpstride, nPbW/2, nPbH/2);
1845 s->hevcdsp.weighted_pred(s->sh.chroma_log2_weight_denom,
1846 s->sh.chroma_weight_l1[current_mv.ref_idx[1]][1],
1847 s->sh.chroma_offset_l1[current_mv.ref_idx[1]][1],
1848 dst2, s->frame->linesize[2], tmp2, tmpstride, nPbW/2, nPbH/2);
1850 s->hevcdsp.put_unweighted_pred(dst1, s->frame->linesize[1], tmp, tmpstride, nPbW/2, nPbH/2);
1851 s->hevcdsp.put_unweighted_pred(dst2, s->frame->linesize[2], tmp2, tmpstride, nPbW/2, nPbH/2);
1853 } else if (current_mv.pred_flag[0] && current_mv.pred_flag[1]) {
1854 DECLARE_ALIGNED(16, int16_t, tmp [MAX_PB_SIZE * MAX_PB_SIZE]);
1855 DECLARE_ALIGNED(16, int16_t, tmp2[MAX_PB_SIZE * MAX_PB_SIZE]);
1856 DECLARE_ALIGNED(16, int16_t, tmp3[MAX_PB_SIZE * MAX_PB_SIZE]);
1857 DECLARE_ALIGNED(16, int16_t, tmp4[MAX_PB_SIZE * MAX_PB_SIZE]);
1858 HEVCFrame *ref0 = refPicList[0].ref[current_mv.ref_idx[0]];
1859 HEVCFrame *ref1 = refPicList[1].ref[current_mv.ref_idx[1]];
1864 luma_mc(s, tmp, tmpstride, ref0->frame,
1865 ¤t_mv.mv[0], x0, y0, nPbW, nPbH);
1866 luma_mc(s, tmp2, tmpstride, ref1->frame,
1867 ¤t_mv.mv[1], x0, y0, nPbW, nPbH);
1869 if ((s->sh.slice_type == P_SLICE && s->pps->weighted_pred_flag) ||
1870 (s->sh.slice_type == B_SLICE && s->pps->weighted_bipred_flag)) {
1871 s->hevcdsp.weighted_pred_avg(s->sh.luma_log2_weight_denom,
1872 s->sh.luma_weight_l0[current_mv.ref_idx[0]],
1873 s->sh.luma_weight_l1[current_mv.ref_idx[1]],
1874 s->sh.luma_offset_l0[current_mv.ref_idx[0]],
1875 s->sh.luma_offset_l1[current_mv.ref_idx[1]],
1876 dst0, s->frame->linesize[0],
1877 tmp, tmp2, tmpstride, nPbW, nPbH);
1879 s->hevcdsp.put_weighted_pred_avg(dst0, s->frame->linesize[0],
1880 tmp, tmp2, tmpstride, nPbW, nPbH);
1883 chroma_mc(s, tmp, tmp2, tmpstride, ref0->frame,
1884 ¤t_mv.mv[0], x0 / 2, y0 / 2, nPbW / 2, nPbH / 2);
1885 chroma_mc(s, tmp3, tmp4, tmpstride, ref1->frame,
1886 ¤t_mv.mv[1], x0 / 2, y0 / 2, nPbW / 2, nPbH / 2);
1888 if ((s->sh.slice_type == P_SLICE && s->pps->weighted_pred_flag) ||
1889 (s->sh.slice_type == B_SLICE && s->pps->weighted_bipred_flag)) {
1890 s->hevcdsp.weighted_pred_avg(s->sh.chroma_log2_weight_denom,
1891 s->sh.chroma_weight_l0[current_mv.ref_idx[0]][0],
1892 s->sh.chroma_weight_l1[current_mv.ref_idx[1]][0],
1893 s->sh.chroma_offset_l0[current_mv.ref_idx[0]][0],
1894 s->sh.chroma_offset_l1[current_mv.ref_idx[1]][0],
1895 dst1, s->frame->linesize[1], tmp, tmp3,
1896 tmpstride, nPbW / 2, nPbH / 2);
1897 s->hevcdsp.weighted_pred_avg(s->sh.chroma_log2_weight_denom,
1898 s->sh.chroma_weight_l0[current_mv.ref_idx[0]][1],
1899 s->sh.chroma_weight_l1[current_mv.ref_idx[1]][1],
1900 s->sh.chroma_offset_l0[current_mv.ref_idx[0]][1],
1901 s->sh.chroma_offset_l1[current_mv.ref_idx[1]][1],
1902 dst2, s->frame->linesize[2], tmp2, tmp4,
1903 tmpstride, nPbW / 2, nPbH / 2);
1905 s->hevcdsp.put_weighted_pred_avg(dst1, s->frame->linesize[1], tmp, tmp3, tmpstride, nPbW/2, nPbH/2);
1906 s->hevcdsp.put_weighted_pred_avg(dst2, s->frame->linesize[2], tmp2, tmp4, tmpstride, nPbW/2, nPbH/2);
1914 static int luma_intra_pred_mode(HEVCContext *s, int x0, int y0, int pu_size,
1915 int prev_intra_luma_pred_flag)
1917 HEVCLocalContext *lc = &s->HEVClc;
1918 int x_pu = x0 >> s->sps->log2_min_pu_size;
1919 int y_pu = y0 >> s->sps->log2_min_pu_size;
1920 int min_pu_width = s->sps->min_pu_width;
1921 int size_in_pus = pu_size >> s->sps->log2_min_pu_size;
1922 int x0b = x0 & ((1 << s->sps->log2_ctb_size) - 1);
1923 int y0b = y0 & ((1 << s->sps->log2_ctb_size) - 1);
1925 int cand_up = (lc->ctb_up_flag || y0b) ?
1926 s->tab_ipm[(y_pu - 1) * min_pu_width + x_pu] : INTRA_DC;
1927 int cand_left = (lc->ctb_left_flag || x0b) ?
1928 s->tab_ipm[y_pu * min_pu_width + x_pu - 1] : INTRA_DC;
1930 int y_ctb = (y0 >> (s->sps->log2_ctb_size)) << (s->sps->log2_ctb_size);
1932 MvField *tab_mvf = s->ref->tab_mvf;
1933 int intra_pred_mode;
1937 // intra_pred_mode prediction does not cross vertical CTB boundaries
1938 if ((y0 - 1) < y_ctb)
1941 if (cand_left == cand_up) {
1942 if (cand_left < 2) {
1943 candidate[0] = INTRA_PLANAR;
1944 candidate[1] = INTRA_DC;
1945 candidate[2] = INTRA_ANGULAR_26;
1947 candidate[0] = cand_left;
1948 candidate[1] = 2 + ((cand_left - 2 - 1 + 32) & 31);
1949 candidate[2] = 2 + ((cand_left - 2 + 1) & 31);
1952 candidate[0] = cand_left;
1953 candidate[1] = cand_up;
1954 if (candidate[0] != INTRA_PLANAR && candidate[1] != INTRA_PLANAR) {
1955 candidate[2] = INTRA_PLANAR;
1956 } else if (candidate[0] != INTRA_DC && candidate[1] != INTRA_DC) {
1957 candidate[2] = INTRA_DC;
1959 candidate[2] = INTRA_ANGULAR_26;
1963 if (prev_intra_luma_pred_flag) {
1964 intra_pred_mode = candidate[lc->pu.mpm_idx];
1966 if (candidate[0] > candidate[1])
1967 FFSWAP(uint8_t, candidate[0], candidate[1]);
1968 if (candidate[0] > candidate[2])
1969 FFSWAP(uint8_t, candidate[0], candidate[2]);
1970 if (candidate[1] > candidate[2])
1971 FFSWAP(uint8_t, candidate[1], candidate[2]);
1973 intra_pred_mode = lc->pu.rem_intra_luma_pred_mode;
1974 for (i = 0; i < 3; i++)
1975 if (intra_pred_mode >= candidate[i])
1979 /* write the intra prediction units into the mv array */
1982 for (i = 0; i < size_in_pus; i++) {
1983 memset(&s->tab_ipm[(y_pu + i) * min_pu_width + x_pu],
1984 intra_pred_mode, size_in_pus);
1986 for (j = 0; j < size_in_pus; j++) {
1987 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].is_intra = 1;
1988 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].pred_flag[0] = 0;
1989 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].pred_flag[1] = 0;
1990 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].ref_idx[0] = 0;
1991 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].ref_idx[1] = 0;
1992 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].mv[0].x = 0;
1993 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].mv[0].y = 0;
1994 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].mv[1].x = 0;
1995 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].mv[1].y = 0;
1999 return intra_pred_mode;
2002 static av_always_inline void set_ct_depth(HEVCContext *s, int x0, int y0,
2003 int log2_cb_size, int ct_depth)
2005 int length = (1 << log2_cb_size) >> s->sps->log2_min_cb_size;
2006 int x_cb = x0 >> s->sps->log2_min_cb_size;
2007 int y_cb = y0 >> s->sps->log2_min_cb_size;
2010 for (y = 0; y < length; y++)
2011 memset(&s->tab_ct_depth[(y_cb + y) * s->sps->min_cb_width + x_cb],
2015 static void intra_prediction_unit(HEVCContext *s, int x0, int y0,
2018 HEVCLocalContext *lc = &s->HEVClc;
2019 static const uint8_t intra_chroma_table[4] = { 0, 26, 10, 1 };
2020 uint8_t prev_intra_luma_pred_flag[4];
2021 int split = lc->cu.part_mode == PART_NxN;
2022 int pb_size = (1 << log2_cb_size) >> split;
2023 int side = split + 1;
2027 for (i = 0; i < side; i++)
2028 for (j = 0; j < side; j++)
2029 prev_intra_luma_pred_flag[2 * i + j] = ff_hevc_prev_intra_luma_pred_flag_decode(s);
2031 for (i = 0; i < side; i++) {
2032 for (j = 0; j < side; j++) {
2033 if (prev_intra_luma_pred_flag[2 * i + j])
2034 lc->pu.mpm_idx = ff_hevc_mpm_idx_decode(s);
2036 lc->pu.rem_intra_luma_pred_mode = ff_hevc_rem_intra_luma_pred_mode_decode(s);
2038 lc->pu.intra_pred_mode[2 * i + j] =
2039 luma_intra_pred_mode(s, x0 + pb_size * j, y0 + pb_size * i, pb_size,
2040 prev_intra_luma_pred_flag[2 * i + j]);
2044 chroma_mode = ff_hevc_intra_chroma_pred_mode_decode(s);
2045 if (chroma_mode != 4) {
2046 if (lc->pu.intra_pred_mode[0] == intra_chroma_table[chroma_mode])
2047 lc->pu.intra_pred_mode_c = 34;
2049 lc->pu.intra_pred_mode_c = intra_chroma_table[chroma_mode];
2051 lc->pu.intra_pred_mode_c = lc->pu.intra_pred_mode[0];
2055 static void intra_prediction_unit_default_value(HEVCContext *s,
2059 HEVCLocalContext *lc = &s->HEVClc;
2060 int pb_size = 1 << log2_cb_size;
2061 int size_in_pus = pb_size >> s->sps->log2_min_pu_size;
2062 int min_pu_width = s->sps->min_pu_width;
2063 MvField *tab_mvf = s->ref->tab_mvf;
2064 int x_pu = x0 >> s->sps->log2_min_pu_size;
2065 int y_pu = y0 >> s->sps->log2_min_pu_size;
2068 if (size_in_pus == 0)
2070 for (j = 0; j < size_in_pus; j++) {
2071 memset(&s->tab_ipm[(y_pu + j) * min_pu_width + x_pu], INTRA_DC, size_in_pus);
2072 for (k = 0; k < size_in_pus; k++)
2073 tab_mvf[(y_pu + j) * min_pu_width + x_pu + k].is_intra = lc->cu.pred_mode == MODE_INTRA;
2077 static int hls_coding_unit(HEVCContext *s, int x0, int y0, int log2_cb_size)
2079 int cb_size = 1 << log2_cb_size;
2080 HEVCLocalContext *lc = &s->HEVClc;
2081 int log2_min_cb_size = s->sps->log2_min_cb_size;
2082 int length = cb_size >> log2_min_cb_size;
2083 int min_cb_width = s->sps->min_cb_width;
2084 int x_cb = x0 >> log2_min_cb_size;
2085 int y_cb = y0 >> log2_min_cb_size;
2090 lc->cu.rqt_root_cbf = 1;
2091 lc->cu.pred_mode = MODE_INTRA;
2092 lc->cu.part_mode = PART_2Nx2N;
2093 lc->cu.intra_split_flag = 0;
2094 lc->cu.pcm_flag = 0;
2096 SAMPLE_CTB(s->skip_flag, x_cb, y_cb) = 0;
2097 for (x = 0; x < 4; x++)
2098 lc->pu.intra_pred_mode[x] = 1;
2099 if (s->pps->transquant_bypass_enable_flag) {
2100 lc->cu.cu_transquant_bypass_flag = ff_hevc_cu_transquant_bypass_flag_decode(s);
2101 if (lc->cu.cu_transquant_bypass_flag)
2102 set_deblocking_bypass(s, x0, y0, log2_cb_size);
2104 lc->cu.cu_transquant_bypass_flag = 0;
2106 if (s->sh.slice_type != I_SLICE) {
2107 uint8_t skip_flag = ff_hevc_skip_flag_decode(s, x0, y0, x_cb, y_cb);
2109 lc->cu.pred_mode = MODE_SKIP;
2110 x = y_cb * min_cb_width + x_cb;
2111 for (y = 0; y < length; y++) {
2112 memset(&s->skip_flag[x], skip_flag, length);
2115 lc->cu.pred_mode = skip_flag ? MODE_SKIP : MODE_INTER;
2118 if (SAMPLE_CTB(s->skip_flag, x_cb, y_cb)) {
2119 hls_prediction_unit(s, x0, y0, cb_size, cb_size, log2_cb_size, 0);
2120 intra_prediction_unit_default_value(s, x0, y0, log2_cb_size);
2122 if (!s->sh.disable_deblocking_filter_flag)
2123 ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_cb_size,
2124 lc->slice_or_tiles_up_boundary,
2125 lc->slice_or_tiles_left_boundary);
2127 if (s->sh.slice_type != I_SLICE)
2128 lc->cu.pred_mode = ff_hevc_pred_mode_decode(s);
2129 if (lc->cu.pred_mode != MODE_INTRA ||
2130 log2_cb_size == s->sps->log2_min_cb_size) {
2131 lc->cu.part_mode = ff_hevc_part_mode_decode(s, log2_cb_size);
2132 lc->cu.intra_split_flag = lc->cu.part_mode == PART_NxN &&
2133 lc->cu.pred_mode == MODE_INTRA;
2136 if (lc->cu.pred_mode == MODE_INTRA) {
2137 if (lc->cu.part_mode == PART_2Nx2N && s->sps->pcm_enabled_flag &&
2138 log2_cb_size >= s->sps->pcm.log2_min_pcm_cb_size &&
2139 log2_cb_size <= s->sps->pcm.log2_max_pcm_cb_size) {
2140 lc->cu.pcm_flag = ff_hevc_pcm_flag_decode(s);
2142 if (lc->cu.pcm_flag) {
2143 intra_prediction_unit_default_value(s, x0, y0, log2_cb_size);
2144 ret = hls_pcm_sample(s, x0, y0, log2_cb_size);
2145 if (s->sps->pcm.loop_filter_disable_flag)
2146 set_deblocking_bypass(s, x0, y0, log2_cb_size);
2151 intra_prediction_unit(s, x0, y0, log2_cb_size);
2154 intra_prediction_unit_default_value(s, x0, y0, log2_cb_size);
2155 switch (lc->cu.part_mode) {
2157 hls_prediction_unit(s, x0, y0, cb_size, cb_size, log2_cb_size, 0);
2160 hls_prediction_unit(s, x0, y0, cb_size, cb_size / 2, log2_cb_size, 0);
2161 hls_prediction_unit(s, x0, y0 + cb_size / 2, cb_size, cb_size / 2, log2_cb_size, 1);
2164 hls_prediction_unit(s, x0, y0, cb_size / 2, cb_size, log2_cb_size, 0);
2165 hls_prediction_unit(s, x0 + cb_size / 2, y0, cb_size / 2, cb_size, log2_cb_size, 1);
2168 hls_prediction_unit(s, x0, y0, cb_size, cb_size / 4, log2_cb_size, 0);
2169 hls_prediction_unit(s, x0, y0 + cb_size / 4, cb_size, cb_size * 3 / 4, log2_cb_size, 1);
2172 hls_prediction_unit(s, x0, y0, cb_size, cb_size * 3 / 4, log2_cb_size, 0);
2173 hls_prediction_unit(s, x0, y0 + cb_size * 3 / 4, cb_size, cb_size / 4, log2_cb_size, 1);
2176 hls_prediction_unit(s, x0, y0, cb_size / 4, cb_size, log2_cb_size, 0);
2177 hls_prediction_unit(s, x0 + cb_size / 4, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 1);
2180 hls_prediction_unit(s, x0, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 0);
2181 hls_prediction_unit(s, x0 + cb_size * 3 / 4, y0, cb_size / 4, cb_size, log2_cb_size, 1);
2184 hls_prediction_unit(s, x0, y0, cb_size / 2, cb_size / 2, log2_cb_size, 0);
2185 hls_prediction_unit(s, x0 + cb_size / 2, y0, cb_size / 2, cb_size / 2, log2_cb_size, 1);
2186 hls_prediction_unit(s, x0, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 2);
2187 hls_prediction_unit(s, x0 + cb_size / 2, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 3);
2192 if (!lc->cu.pcm_flag) {
2193 if (lc->cu.pred_mode != MODE_INTRA &&
2194 !(lc->cu.part_mode == PART_2Nx2N && lc->pu.merge_flag)) {
2195 lc->cu.rqt_root_cbf = ff_hevc_no_residual_syntax_flag_decode(s);
2197 if (lc->cu.rqt_root_cbf) {
2198 lc->cu.max_trafo_depth = lc->cu.pred_mode == MODE_INTRA ?
2199 s->sps->max_transform_hierarchy_depth_intra + lc->cu.intra_split_flag :
2200 s->sps->max_transform_hierarchy_depth_inter;
2201 ret = hls_transform_tree(s, x0, y0, x0, y0, x0, y0,
2203 log2_cb_size, 0, 0);
2207 if (!s->sh.disable_deblocking_filter_flag)
2208 ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_cb_size,
2209 lc->slice_or_tiles_up_boundary,
2210 lc->slice_or_tiles_left_boundary);
2215 if (s->pps->cu_qp_delta_enabled_flag && lc->tu.is_cu_qp_delta_coded == 0)
2216 ff_hevc_set_qPy(s, x0, y0, x0, y0, log2_cb_size);
2218 x = y_cb * min_cb_width + x_cb;
2219 for (y = 0; y < length; y++) {
2220 memset(&s->qp_y_tab[x], lc->qp_y, length);
2224 set_ct_depth(s, x0, y0, log2_cb_size, lc->ct.depth);
2229 static int hls_coding_quadtree(HEVCContext *s, int x0, int y0,
2230 int log2_cb_size, int cb_depth)
2232 HEVCLocalContext *lc = &s->HEVClc;
2233 const int cb_size = 1 << log2_cb_size;
2236 lc->ct.depth = cb_depth;
2237 if (x0 + cb_size <= s->sps->width &&
2238 y0 + cb_size <= s->sps->height &&
2239 log2_cb_size > s->sps->log2_min_cb_size) {
2240 split_cu = ff_hevc_split_coding_unit_flag_decode(s, cb_depth, x0, y0);
2242 split_cu = (log2_cb_size > s->sps->log2_min_cb_size);
2244 if (s->pps->cu_qp_delta_enabled_flag &&
2245 log2_cb_size >= s->sps->log2_ctb_size - s->pps->diff_cu_qp_delta_depth) {
2246 lc->tu.is_cu_qp_delta_coded = 0;
2247 lc->tu.cu_qp_delta = 0;
2251 const int cb_size_split = cb_size >> 1;
2252 const int x1 = x0 + cb_size_split;
2253 const int y1 = y0 + cb_size_split;
2258 #define SUBDIVIDE(x, y) \
2260 if (x < s->sps->width && y < s->sps->height) { \
2261 int ret = hls_coding_quadtree(s, x, y, log2_cb_size, cb_depth);\
2272 int ret = hls_coding_unit(s, x0, y0, log2_cb_size);
2280 static void hls_decode_neighbour(HEVCContext *s, int x_ctb, int y_ctb,
2283 HEVCLocalContext *lc = &s->HEVClc;
2284 int ctb_size = 1 << s->sps->log2_ctb_size;
2285 int ctb_addr_rs = s->pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2286 int ctb_addr_in_slice = ctb_addr_rs - s->sh.slice_addr;
2288 int tile_left_boundary, tile_up_boundary;
2289 int slice_left_boundary, slice_up_boundary;
2291 s->tab_slice_address[ctb_addr_rs] = s->sh.slice_addr;
2293 if (s->pps->entropy_coding_sync_enabled_flag) {
2294 if (x_ctb == 0 && (y_ctb & (ctb_size - 1)) == 0)
2295 lc->first_qp_group = 1;
2296 lc->end_of_tiles_x = s->sps->width;
2297 } else if (s->pps->tiles_enabled_flag) {
2298 if (ctb_addr_ts && s->pps->tile_id[ctb_addr_ts] != s->pps->tile_id[ctb_addr_ts - 1]) {
2299 int idxX = s->pps->col_idxX[x_ctb >> s->sps->log2_ctb_size];
2300 lc->start_of_tiles_x = x_ctb;
2301 lc->end_of_tiles_x = x_ctb + (s->pps->column_width[idxX] << s->sps->log2_ctb_size);
2302 lc->first_qp_group = 1;
2305 lc->end_of_tiles_x = s->sps->width;
2308 lc->end_of_tiles_y = FFMIN(y_ctb + ctb_size, s->sps->height);
2310 if (s->pps->tiles_enabled_flag) {
2311 tile_left_boundary = x_ctb > 0 &&
2312 s->pps->tile_id[ctb_addr_ts] == s->pps->tile_id[s->pps->ctb_addr_rs_to_ts[ctb_addr_rs - 1]];
2313 slice_left_boundary = x_ctb > 0 &&
2314 s->tab_slice_address[ctb_addr_rs] == s->tab_slice_address[ctb_addr_rs - 1];
2315 tile_up_boundary = y_ctb > 0 &&
2316 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]];
2317 slice_up_boundary = y_ctb > 0 &&
2318 s->tab_slice_address[ctb_addr_rs] == s->tab_slice_address[ctb_addr_rs - s->sps->ctb_width];
2320 tile_left_boundary =
2321 tile_up_boundary = 1;
2322 slice_left_boundary = ctb_addr_in_slice > 0;
2323 slice_up_boundary = ctb_addr_in_slice >= s->sps->ctb_width;
2325 lc->slice_or_tiles_left_boundary = (!slice_left_boundary) + (!tile_left_boundary << 1);
2326 lc->slice_or_tiles_up_boundary = (!slice_up_boundary + (!tile_up_boundary << 1));
2327 lc->ctb_left_flag = ((x_ctb > 0) && (ctb_addr_in_slice > 0) && tile_left_boundary);
2328 lc->ctb_up_flag = ((y_ctb > 0) && (ctb_addr_in_slice >= s->sps->ctb_width) && tile_up_boundary);
2329 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]]));
2330 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]]));
2333 static int hls_slice_data(HEVCContext *s)
2335 int ctb_size = 1 << s->sps->log2_ctb_size;
2339 int ctb_addr_ts = s->pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs];
2342 while (more_data && ctb_addr_ts < s->sps->ctb_size) {
2343 int ctb_addr_rs = s->pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2345 x_ctb = (ctb_addr_rs % ((s->sps->width + ctb_size - 1) >> s->sps->log2_ctb_size)) << s->sps->log2_ctb_size;
2346 y_ctb = (ctb_addr_rs / ((s->sps->width + ctb_size - 1) >> s->sps->log2_ctb_size)) << s->sps->log2_ctb_size;
2347 hls_decode_neighbour(s, x_ctb, y_ctb, ctb_addr_ts);
2349 ff_hevc_cabac_init(s, ctb_addr_ts);
2351 hls_sao_param(s, x_ctb >> s->sps->log2_ctb_size, y_ctb >> s->sps->log2_ctb_size);
2353 s->deblock[ctb_addr_rs].beta_offset = s->sh.beta_offset;
2354 s->deblock[ctb_addr_rs].tc_offset = s->sh.tc_offset;
2355 s->filter_slice_edges[ctb_addr_rs] = s->sh.slice_loop_filter_across_slices_enabled_flag;
2357 ret = hls_coding_quadtree(s, x_ctb, y_ctb, s->sps->log2_ctb_size, 0);
2360 more_data = !ff_hevc_end_of_slice_flag_decode(s);
2363 ff_hevc_save_states(s, ctb_addr_ts);
2364 ff_hevc_hls_filters(s, x_ctb, y_ctb, ctb_size);
2367 if (x_ctb + ctb_size >= s->sps->width &&
2368 y_ctb + ctb_size >= s->sps->height)
2369 ff_hevc_hls_filter(s, x_ctb, y_ctb);
2375 * @return AVERROR_INVALIDDATA if the packet is not a valid NAL unit,
2376 * 0 if the unit should be skipped, 1 otherwise
2378 static int hls_nal_unit(HEVCContext *s)
2380 GetBitContext *gb = &s->HEVClc.gb;
2383 if (get_bits1(gb) != 0)
2384 return AVERROR_INVALIDDATA;
2386 s->nal_unit_type = get_bits(gb, 6);
2388 nuh_layer_id = get_bits(gb, 6);
2389 s->temporal_id = get_bits(gb, 3) - 1;
2390 if (s->temporal_id < 0)
2391 return AVERROR_INVALIDDATA;
2393 av_log(s->avctx, AV_LOG_DEBUG,
2394 "nal_unit_type: %d, nuh_layer_id: %dtemporal_id: %d\n",
2395 s->nal_unit_type, nuh_layer_id, s->temporal_id);
2397 return nuh_layer_id == 0;
2400 static void restore_tqb_pixels(HEVCContext *s)
2402 int min_pu_size = 1 << s->sps->log2_min_pu_size;
2405 for (c_idx = 0; c_idx < 3; c_idx++) {
2406 ptrdiff_t stride = s->frame->linesize[c_idx];
2407 int hshift = s->sps->hshift[c_idx];
2408 int vshift = s->sps->vshift[c_idx];
2409 for (y = 0; y < s->sps->min_pu_height; y++) {
2410 for (x = 0; x < s->sps->min_pu_width; x++) {
2411 if (s->is_pcm[y * s->sps->min_pu_width + x]) {
2413 int len = min_pu_size >> hshift;
2414 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)];
2415 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)];
2416 for (n = 0; n < (min_pu_size >> vshift); n++) {
2417 memcpy(dst, src, len);
2427 static int set_side_data(HEVCContext *s)
2429 AVFrame *out = s->ref->frame;
2431 if (s->sei_frame_packing_present &&
2432 s->frame_packing_arrangement_type >= 3 &&
2433 s->frame_packing_arrangement_type <= 5 &&
2434 s->content_interpretation_type > 0 &&
2435 s->content_interpretation_type < 3) {
2436 AVStereo3D *stereo = av_stereo3d_create_side_data(out);
2438 return AVERROR(ENOMEM);
2440 switch (s->frame_packing_arrangement_type) {
2442 if (s->quincunx_subsampling)
2443 stereo->type = AV_STEREO3D_SIDEBYSIDE_QUINCUNX;
2445 stereo->type = AV_STEREO3D_SIDEBYSIDE;
2448 stereo->type = AV_STEREO3D_TOPBOTTOM;
2451 stereo->type = AV_STEREO3D_FRAMESEQUENCE;
2455 if (s->content_interpretation_type == 2)
2456 stereo->flags = AV_STEREO3D_FLAG_INVERT;
2459 if (s->sei_display_orientation_present &&
2460 (s->sei_anticlockwise_rotation || s->sei_hflip || s->sei_vflip)) {
2461 double angle = s->sei_anticlockwise_rotation * 360 / (double) (1 << 16);
2462 AVFrameSideData *rotation = av_frame_new_side_data(out,
2463 AV_FRAME_DATA_DISPLAYMATRIX,
2464 sizeof(int32_t) * 9);
2466 return AVERROR(ENOMEM);
2468 av_display_rotation_set((int32_t *)rotation->data, angle);
2469 av_display_matrix_flip((int32_t *)rotation->data,
2470 s->sei_vflip, s->sei_hflip);
2476 static int hevc_frame_start(HEVCContext *s)
2478 HEVCLocalContext *lc = &s->HEVClc;
2481 memset(s->horizontal_bs, 0, 2 * s->bs_width * (s->bs_height + 1));
2482 memset(s->vertical_bs, 0, 2 * s->bs_width * (s->bs_height + 1));
2483 memset(s->cbf_luma, 0, s->sps->min_tb_width * s->sps->min_tb_height);
2484 memset(s->is_pcm, 0, s->sps->min_pu_width * s->sps->min_pu_height);
2486 lc->start_of_tiles_x = 0;
2488 s->first_nal_type = s->nal_unit_type;
2490 if (s->pps->tiles_enabled_flag)
2491 lc->end_of_tiles_x = s->pps->column_width[0] << s->sps->log2_ctb_size;
2493 ret = ff_hevc_set_new_ref(s, s->sps->sao_enabled ? &s->sao_frame : &s->frame,
2498 ret = ff_hevc_frame_rps(s);
2500 av_log(s->avctx, AV_LOG_ERROR, "Error constructing the frame RPS.\n");
2504 s->ref->frame->key_frame = IS_IRAP(s);
2506 ret = set_side_data(s);
2510 av_frame_unref(s->output_frame);
2511 ret = ff_hevc_output_frame(s, s->output_frame, 0);
2515 ff_thread_finish_setup(s->avctx);
2521 ff_thread_report_progress(&s->ref->tf, INT_MAX, 0);
2526 static int decode_nal_unit(HEVCContext *s, const uint8_t *nal, int length)
2528 HEVCLocalContext *lc = &s->HEVClc;
2529 GetBitContext *gb = &lc->gb;
2530 int ctb_addr_ts, ret;
2532 ret = init_get_bits8(gb, nal, length);
2536 ret = hls_nal_unit(s);
2538 av_log(s->avctx, AV_LOG_ERROR, "Invalid NAL unit %d, skipping.\n",
2544 switch (s->nal_unit_type) {
2546 ret = ff_hevc_decode_nal_vps(s);
2551 ret = ff_hevc_decode_nal_sps(s);
2556 ret = ff_hevc_decode_nal_pps(s);
2560 case NAL_SEI_PREFIX:
2561 case NAL_SEI_SUFFIX:
2562 ret = ff_hevc_decode_nal_sei(s);
2573 case NAL_BLA_W_RADL:
2575 case NAL_IDR_W_RADL:
2582 ret = hls_slice_header(s);
2586 if (s->max_ra == INT_MAX) {
2587 if (s->nal_unit_type == NAL_CRA_NUT || IS_BLA(s)) {
2591 s->max_ra = INT_MIN;
2595 if ((s->nal_unit_type == NAL_RASL_R || s->nal_unit_type == NAL_RASL_N) &&
2596 s->poc <= s->max_ra) {
2600 if (s->nal_unit_type == NAL_RASL_R && s->poc > s->max_ra)
2601 s->max_ra = INT_MIN;
2604 if (s->sh.first_slice_in_pic_flag) {
2605 ret = hevc_frame_start(s);
2608 } else if (!s->ref) {
2609 av_log(s->avctx, AV_LOG_ERROR, "First slice in a frame missing.\n");
2613 if (s->nal_unit_type != s->first_nal_type) {
2614 av_log(s->avctx, AV_LOG_ERROR,
2615 "Non-matching NAL types of the VCL NALUs: %d %d\n",
2616 s->first_nal_type, s->nal_unit_type);
2617 return AVERROR_INVALIDDATA;
2620 if (!s->sh.dependent_slice_segment_flag &&
2621 s->sh.slice_type != I_SLICE) {
2622 ret = ff_hevc_slice_rpl(s);
2624 av_log(s->avctx, AV_LOG_WARNING,
2625 "Error constructing the reference lists for the current slice.\n");
2630 ctb_addr_ts = hls_slice_data(s);
2631 if (ctb_addr_ts >= (s->sps->ctb_width * s->sps->ctb_height)) {
2633 if ((s->pps->transquant_bypass_enable_flag ||
2634 (s->sps->pcm.loop_filter_disable_flag && s->sps->pcm_enabled_flag)) &&
2635 s->sps->sao_enabled)
2636 restore_tqb_pixels(s);
2639 if (ctb_addr_ts < 0) {
2646 s->seq_decode = (s->seq_decode + 1) & 0xff;
2647 s->max_ra = INT_MAX;
2653 av_log(s->avctx, AV_LOG_INFO,
2654 "Skipping NAL unit %d\n", s->nal_unit_type);
2659 if (s->avctx->err_recognition & AV_EF_EXPLODE)
2664 /* FIXME: This is adapted from ff_h264_decode_nal, avoiding duplication
2665 * between these functions would be nice. */
2666 static int extract_rbsp(const uint8_t *src, int length,
2672 #define STARTCODE_TEST \
2673 if (i + 2 < length && src[i + 1] == 0 && src[i + 2] <= 3) { \
2674 if (src[i + 2] != 3) { \
2675 /* startcode, so we must be past the end */ \
2680 #if HAVE_FAST_UNALIGNED
2681 #define FIND_FIRST_ZERO \
2682 if (i > 0 && !src[i]) \
2687 for (i = 0; i + 1 < length; i += 9) {
2688 if (!((~AV_RN64A(src + i) &
2689 (AV_RN64A(src + i) - 0x0100010001000101ULL)) &
2690 0x8000800080008080ULL))
2697 for (i = 0; i + 1 < length; i += 5) {
2698 if (!((~AV_RN32A(src + i) &
2699 (AV_RN32A(src + i) - 0x01000101U)) &
2706 #endif /* HAVE_FAST_64BIT */
2708 for (i = 0; i + 1 < length; i += 2) {
2711 if (i > 0 && src[i - 1] == 0)
2715 #endif /* HAVE_FAST_UNALIGNED */
2717 if (i >= length - 1) { // no escaped 0
2723 av_fast_malloc(&nal->rbsp_buffer, &nal->rbsp_buffer_size,
2724 length + FF_INPUT_BUFFER_PADDING_SIZE);
2725 if (!nal->rbsp_buffer)
2726 return AVERROR(ENOMEM);
2728 dst = nal->rbsp_buffer;
2730 memcpy(dst, src, i);
2732 while (si + 2 < length) {
2733 // remove escapes (very rare 1:2^22)
2734 if (src[si + 2] > 3) {
2735 dst[di++] = src[si++];
2736 dst[di++] = src[si++];
2737 } else if (src[si] == 0 && src[si + 1] == 0) {
2738 if (src[si + 2] == 3) { // escape
2744 } else // next start code
2748 dst[di++] = src[si++];
2751 dst[di++] = src[si++];
2754 memset(dst + di, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2761 static int decode_nal_units(HEVCContext *s, const uint8_t *buf, int length)
2763 int i, consumed, ret = 0;
2768 /* split the input packet into NAL units, so we know the upper bound on the
2769 * number of slices in the frame */
2771 while (length >= 4) {
2773 int extract_length = 0;
2777 for (i = 0; i < s->nal_length_size; i++)
2778 extract_length = (extract_length << 8) | buf[i];
2779 buf += s->nal_length_size;
2780 length -= s->nal_length_size;
2782 if (extract_length > length) {
2783 av_log(s->avctx, AV_LOG_ERROR, "Invalid NAL unit size.\n");
2784 ret = AVERROR_INVALIDDATA;
2793 if (buf[0] != 0 || buf[1] != 0 || buf[2] != 1) {
2794 ret = AVERROR_INVALIDDATA;
2800 extract_length = length;
2803 if (s->nals_allocated < s->nb_nals + 1) {
2804 int new_size = s->nals_allocated + 1;
2805 HEVCNAL *tmp = av_realloc_array(s->nals, new_size, sizeof(*tmp));
2807 ret = AVERROR(ENOMEM);
2811 memset(s->nals + s->nals_allocated, 0,
2812 (new_size - s->nals_allocated) * sizeof(*tmp));
2813 s->nals_allocated = new_size;
2815 nal = &s->nals[s->nb_nals++];
2817 consumed = extract_rbsp(buf, extract_length, nal);
2823 ret = init_get_bits8(&s->HEVClc.gb, nal->data, nal->size);
2828 if (s->nal_unit_type == NAL_EOB_NUT ||
2829 s->nal_unit_type == NAL_EOS_NUT)
2836 /* parse the NAL units */
2837 for (i = 0; i < s->nb_nals; i++) {
2838 int ret = decode_nal_unit(s, s->nals[i].data, s->nals[i].size);
2840 av_log(s->avctx, AV_LOG_WARNING,
2841 "Error parsing NAL unit #%d.\n", i);
2848 ff_thread_report_progress(&s->ref->tf, INT_MAX, 0);
2853 static void print_md5(void *log_ctx, int level, uint8_t md5[16])
2856 for (i = 0; i < 16; i++)
2857 av_log(log_ctx, level, "%02"PRIx8, md5[i]);
2860 static int verify_md5(HEVCContext *s, AVFrame *frame)
2862 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format);
2867 return AVERROR(EINVAL);
2869 pixel_shift = desc->comp[0].depth_minus1 > 7;
2871 av_log(s->avctx, AV_LOG_DEBUG, "Verifying checksum for frame with POC %d: ",
2874 /* the checksums are LE, so we have to byteswap for >8bpp formats
2877 if (pixel_shift && !s->checksum_buf) {
2878 av_fast_malloc(&s->checksum_buf, &s->checksum_buf_size,
2879 FFMAX3(frame->linesize[0], frame->linesize[1],
2880 frame->linesize[2]));
2881 if (!s->checksum_buf)
2882 return AVERROR(ENOMEM);
2886 for (i = 0; frame->data[i]; i++) {
2887 int width = s->avctx->coded_width;
2888 int height = s->avctx->coded_height;
2889 int w = (i == 1 || i == 2) ? (width >> desc->log2_chroma_w) : width;
2890 int h = (i == 1 || i == 2) ? (height >> desc->log2_chroma_h) : height;
2893 av_md5_init(s->md5_ctx);
2894 for (j = 0; j < h; j++) {
2895 const uint8_t *src = frame->data[i] + j * frame->linesize[i];
2898 s->bdsp.bswap16_buf((uint16_t *) s->checksum_buf,
2899 (const uint16_t *) src, w);
2900 src = s->checksum_buf;
2903 av_md5_update(s->md5_ctx, src, w << pixel_shift);
2905 av_md5_final(s->md5_ctx, md5);
2907 if (!memcmp(md5, s->md5[i], 16)) {
2908 av_log (s->avctx, AV_LOG_DEBUG, "plane %d - correct ", i);
2909 print_md5(s->avctx, AV_LOG_DEBUG, md5);
2910 av_log (s->avctx, AV_LOG_DEBUG, "; ");
2912 av_log (s->avctx, AV_LOG_ERROR, "mismatching checksum of plane %d - ", i);
2913 print_md5(s->avctx, AV_LOG_ERROR, md5);
2914 av_log (s->avctx, AV_LOG_ERROR, " != ");
2915 print_md5(s->avctx, AV_LOG_ERROR, s->md5[i]);
2916 av_log (s->avctx, AV_LOG_ERROR, "\n");
2917 return AVERROR_INVALIDDATA;
2921 av_log(s->avctx, AV_LOG_DEBUG, "\n");
2926 static int hevc_decode_frame(AVCodecContext *avctx, void *data, int *got_output,
2930 HEVCContext *s = avctx->priv_data;
2933 ret = ff_hevc_output_frame(s, data, 1);
2942 ret = decode_nal_units(s, avpkt->data, avpkt->size);
2946 /* verify the SEI checksum */
2947 if (avctx->err_recognition & AV_EF_CRCCHECK && s->is_decoded &&
2949 ret = verify_md5(s, s->ref->frame);
2950 if (ret < 0 && avctx->err_recognition & AV_EF_EXPLODE) {
2951 ff_hevc_unref_frame(s, s->ref, ~0);
2957 if (s->is_decoded) {
2958 av_log(avctx, AV_LOG_DEBUG, "Decoded frame with POC %d.\n", s->poc);
2962 if (s->output_frame->buf[0]) {
2963 av_frame_move_ref(data, s->output_frame);
2970 static int hevc_ref_frame(HEVCContext *s, HEVCFrame *dst, HEVCFrame *src)
2972 int ret = ff_thread_ref_frame(&dst->tf, &src->tf);
2976 dst->tab_mvf_buf = av_buffer_ref(src->tab_mvf_buf);
2977 if (!dst->tab_mvf_buf)
2979 dst->tab_mvf = src->tab_mvf;
2981 dst->rpl_tab_buf = av_buffer_ref(src->rpl_tab_buf);
2982 if (!dst->rpl_tab_buf)
2984 dst->rpl_tab = src->rpl_tab;
2986 dst->rpl_buf = av_buffer_ref(src->rpl_buf);
2990 dst->poc = src->poc;
2991 dst->ctb_count = src->ctb_count;
2992 dst->window = src->window;
2993 dst->flags = src->flags;
2994 dst->sequence = src->sequence;
2998 ff_hevc_unref_frame(s, dst, ~0);
2999 return AVERROR(ENOMEM);
3002 static av_cold int hevc_decode_free(AVCodecContext *avctx)
3004 HEVCContext *s = avctx->priv_data;
3009 av_freep(&s->md5_ctx);
3011 av_frame_free(&s->tmp_frame);
3012 av_frame_free(&s->output_frame);
3014 for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
3015 ff_hevc_unref_frame(s, &s->DPB[i], ~0);
3016 av_frame_free(&s->DPB[i].frame);
3019 for (i = 0; i < FF_ARRAY_ELEMS(s->vps_list); i++)
3020 av_buffer_unref(&s->vps_list[i]);
3021 for (i = 0; i < FF_ARRAY_ELEMS(s->sps_list); i++)
3022 av_buffer_unref(&s->sps_list[i]);
3023 for (i = 0; i < FF_ARRAY_ELEMS(s->pps_list); i++)
3024 av_buffer_unref(&s->pps_list[i]);
3026 for (i = 0; i < s->nals_allocated; i++)
3027 av_freep(&s->nals[i].rbsp_buffer);
3029 s->nals_allocated = 0;
3034 static av_cold int hevc_init_context(AVCodecContext *avctx)
3036 HEVCContext *s = avctx->priv_data;
3041 s->tmp_frame = av_frame_alloc();
3045 s->output_frame = av_frame_alloc();
3046 if (!s->output_frame)
3049 for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
3050 s->DPB[i].frame = av_frame_alloc();
3051 if (!s->DPB[i].frame)
3053 s->DPB[i].tf.f = s->DPB[i].frame;
3056 s->max_ra = INT_MAX;
3058 s->md5_ctx = av_md5_alloc();
3062 ff_bswapdsp_init(&s->bdsp);
3064 s->context_initialized = 1;
3069 hevc_decode_free(avctx);
3070 return AVERROR(ENOMEM);
3073 static int hevc_update_thread_context(AVCodecContext *dst,
3074 const AVCodecContext *src)
3076 HEVCContext *s = dst->priv_data;
3077 HEVCContext *s0 = src->priv_data;
3080 if (!s->context_initialized) {
3081 ret = hevc_init_context(dst);
3086 for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
3087 ff_hevc_unref_frame(s, &s->DPB[i], ~0);
3088 if (s0->DPB[i].frame->buf[0]) {
3089 ret = hevc_ref_frame(s, &s->DPB[i], &s0->DPB[i]);
3095 for (i = 0; i < FF_ARRAY_ELEMS(s->vps_list); i++) {
3096 av_buffer_unref(&s->vps_list[i]);
3097 if (s0->vps_list[i]) {
3098 s->vps_list[i] = av_buffer_ref(s0->vps_list[i]);
3099 if (!s->vps_list[i])
3100 return AVERROR(ENOMEM);
3104 for (i = 0; i < FF_ARRAY_ELEMS(s->sps_list); i++) {
3105 av_buffer_unref(&s->sps_list[i]);
3106 if (s0->sps_list[i]) {
3107 s->sps_list[i] = av_buffer_ref(s0->sps_list[i]);
3108 if (!s->sps_list[i])
3109 return AVERROR(ENOMEM);
3113 for (i = 0; i < FF_ARRAY_ELEMS(s->pps_list); i++) {
3114 av_buffer_unref(&s->pps_list[i]);
3115 if (s0->pps_list[i]) {
3116 s->pps_list[i] = av_buffer_ref(s0->pps_list[i]);
3117 if (!s->pps_list[i])
3118 return AVERROR(ENOMEM);
3122 if (s->sps != s0->sps)
3123 ret = set_sps(s, s0->sps);
3125 s->seq_decode = s0->seq_decode;
3126 s->seq_output = s0->seq_output;
3127 s->pocTid0 = s0->pocTid0;
3128 s->max_ra = s0->max_ra;
3130 s->is_nalff = s0->is_nalff;
3131 s->nal_length_size = s0->nal_length_size;
3134 s->seq_decode = (s->seq_decode + 1) & 0xff;
3135 s->max_ra = INT_MAX;
3141 static int hevc_decode_extradata(HEVCContext *s)
3143 AVCodecContext *avctx = s->avctx;
3147 bytestream2_init(&gb, avctx->extradata, avctx->extradata_size);
3149 if (avctx->extradata_size > 3 &&
3150 (avctx->extradata[0] || avctx->extradata[1] ||
3151 avctx->extradata[2] > 1)) {
3152 /* It seems the extradata is encoded as hvcC format.
3153 * Temporarily, we support configurationVersion==0 until 14496-15 3rd
3154 * is finalized. When finalized, configurationVersion will be 1 and we
3155 * can recognize hvcC by checking if avctx->extradata[0]==1 or not. */
3156 int i, j, num_arrays, nal_len_size;
3160 bytestream2_skip(&gb, 21);
3161 nal_len_size = (bytestream2_get_byte(&gb) & 3) + 1;
3162 num_arrays = bytestream2_get_byte(&gb);
3164 /* nal units in the hvcC always have length coded with 2 bytes,
3165 * so put a fake nal_length_size = 2 while parsing them */
3166 s->nal_length_size = 2;
3168 /* Decode nal units from hvcC. */
3169 for (i = 0; i < num_arrays; i++) {
3170 int type = bytestream2_get_byte(&gb) & 0x3f;
3171 int cnt = bytestream2_get_be16(&gb);
3173 for (j = 0; j < cnt; j++) {
3174 // +2 for the nal size field
3175 int nalsize = bytestream2_peek_be16(&gb) + 2;
3176 if (bytestream2_get_bytes_left(&gb) < nalsize) {
3177 av_log(s->avctx, AV_LOG_ERROR,
3178 "Invalid NAL unit size in extradata.\n");
3179 return AVERROR_INVALIDDATA;
3182 ret = decode_nal_units(s, gb.buffer, nalsize);
3184 av_log(avctx, AV_LOG_ERROR,
3185 "Decoding nal unit %d %d from hvcC failed\n",
3189 bytestream2_skip(&gb, nalsize);
3193 /* Now store right nal length size, that will be used to parse
3195 s->nal_length_size = nal_len_size;
3198 ret = decode_nal_units(s, avctx->extradata, avctx->extradata_size);
3205 static av_cold int hevc_decode_init(AVCodecContext *avctx)
3207 HEVCContext *s = avctx->priv_data;
3210 ff_init_cabac_states();
3212 avctx->internal->allocate_progress = 1;
3214 ret = hevc_init_context(avctx);
3218 if (avctx->extradata_size > 0 && avctx->extradata) {
3219 ret = hevc_decode_extradata(s);
3221 hevc_decode_free(avctx);
3229 static av_cold int hevc_init_thread_copy(AVCodecContext *avctx)
3231 HEVCContext *s = avctx->priv_data;
3234 memset(s, 0, sizeof(*s));
3236 ret = hevc_init_context(avctx);
3243 static void hevc_decode_flush(AVCodecContext *avctx)
3245 HEVCContext *s = avctx->priv_data;
3246 ff_hevc_flush_dpb(s);
3247 s->max_ra = INT_MAX;
3250 #define OFFSET(x) offsetof(HEVCContext, x)
3251 #define PAR (AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
3253 static const AVProfile profiles[] = {
3254 { FF_PROFILE_HEVC_MAIN, "Main" },
3255 { FF_PROFILE_HEVC_MAIN_10, "Main 10" },
3256 { FF_PROFILE_HEVC_MAIN_STILL_PICTURE, "Main Still Picture" },
3257 { FF_PROFILE_UNKNOWN },
3260 static const AVOption options[] = {
3261 { "apply_defdispwin", "Apply default display window from VUI", OFFSET(apply_defdispwin),
3262 AV_OPT_TYPE_INT, {.i64 = 0}, 0, 1, PAR },
3266 static const AVClass hevc_decoder_class = {
3267 .class_name = "HEVC decoder",
3268 .item_name = av_default_item_name,
3270 .version = LIBAVUTIL_VERSION_INT,
3273 AVCodec ff_hevc_decoder = {
3275 .long_name = NULL_IF_CONFIG_SMALL("HEVC (High Efficiency Video Coding)"),
3276 .type = AVMEDIA_TYPE_VIDEO,
3277 .id = AV_CODEC_ID_HEVC,
3278 .priv_data_size = sizeof(HEVCContext),
3279 .priv_class = &hevc_decoder_class,
3280 .init = hevc_decode_init,
3281 .close = hevc_decode_free,
3282 .decode = hevc_decode_frame,
3283 .flush = hevc_decode_flush,
3284 .update_thread_context = hevc_update_thread_context,
3285 .init_thread_copy = hevc_init_thread_copy,
3286 .capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY |
3287 CODEC_CAP_FRAME_THREADS,
3288 .profiles = NULL_IF_CONFIG_SMALL(profiles),