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);
169 av_freep(&s->split_cu_flag);
171 av_freep(&s->skip_flag);
172 av_freep(&s->tab_ct_depth);
174 av_freep(&s->tab_ipm);
175 av_freep(&s->cbf_luma);
176 av_freep(&s->is_pcm);
178 av_freep(&s->qp_y_tab);
179 av_freep(&s->tab_slice_address);
180 av_freep(&s->filter_slice_edges);
182 av_freep(&s->horizontal_bs);
183 av_freep(&s->vertical_bs);
185 av_buffer_pool_uninit(&s->tab_mvf_pool);
186 av_buffer_pool_uninit(&s->rpl_tab_pool);
189 /* allocate arrays that depend on frame dimensions */
190 static int pic_arrays_init(HEVCContext *s, const HEVCSPS *sps)
192 int log2_min_cb_size = sps->log2_min_cb_size;
193 int width = sps->width;
194 int height = sps->height;
195 int pic_size = width * height;
196 int pic_size_in_ctb = ((width >> log2_min_cb_size) + 1) *
197 ((height >> log2_min_cb_size) + 1);
198 int ctb_count = sps->ctb_width * sps->ctb_height;
199 int min_pu_size = sps->min_pu_width * sps->min_pu_height;
201 s->bs_width = width >> 3;
202 s->bs_height = height >> 3;
204 s->sao = av_mallocz_array(ctb_count, sizeof(*s->sao));
205 s->deblock = av_mallocz_array(ctb_count, sizeof(*s->deblock));
206 s->split_cu_flag = av_malloc(pic_size);
207 if (!s->sao || !s->deblock || !s->split_cu_flag)
210 s->skip_flag = av_malloc(pic_size_in_ctb);
211 s->tab_ct_depth = av_malloc(sps->min_cb_height * sps->min_cb_width);
212 if (!s->skip_flag || !s->tab_ct_depth)
215 s->cbf_luma = av_malloc(sps->min_tb_width * sps->min_tb_height);
216 s->tab_ipm = av_mallocz(min_pu_size);
217 s->is_pcm = av_malloc(min_pu_size);
218 if (!s->tab_ipm || !s->cbf_luma || !s->is_pcm)
221 s->filter_slice_edges = av_malloc(ctb_count);
222 s->tab_slice_address = av_malloc(pic_size_in_ctb *
223 sizeof(*s->tab_slice_address));
224 s->qp_y_tab = av_malloc(pic_size_in_ctb *
225 sizeof(*s->qp_y_tab));
226 if (!s->qp_y_tab || !s->filter_slice_edges || !s->tab_slice_address)
229 s->horizontal_bs = av_mallocz(2 * s->bs_width * (s->bs_height + 1));
230 s->vertical_bs = av_mallocz(2 * s->bs_width * (s->bs_height + 1));
231 if (!s->horizontal_bs || !s->vertical_bs)
234 s->tab_mvf_pool = av_buffer_pool_init(min_pu_size * sizeof(MvField),
236 s->rpl_tab_pool = av_buffer_pool_init(ctb_count * sizeof(RefPicListTab),
238 if (!s->tab_mvf_pool || !s->rpl_tab_pool)
245 return AVERROR(ENOMEM);
248 static void pred_weight_table(HEVCContext *s, GetBitContext *gb)
252 uint8_t luma_weight_l0_flag[16];
253 uint8_t chroma_weight_l0_flag[16];
254 uint8_t luma_weight_l1_flag[16];
255 uint8_t chroma_weight_l1_flag[16];
257 s->sh.luma_log2_weight_denom = get_ue_golomb_long(gb);
258 if (s->sps->chroma_format_idc != 0) {
259 int delta = get_se_golomb(gb);
260 s->sh.chroma_log2_weight_denom = av_clip_c(s->sh.luma_log2_weight_denom + delta, 0, 7);
263 for (i = 0; i < s->sh.nb_refs[L0]; i++) {
264 luma_weight_l0_flag[i] = get_bits1(gb);
265 if (!luma_weight_l0_flag[i]) {
266 s->sh.luma_weight_l0[i] = 1 << s->sh.luma_log2_weight_denom;
267 s->sh.luma_offset_l0[i] = 0;
270 if (s->sps->chroma_format_idc != 0) { // FIXME: invert "if" and "for"
271 for (i = 0; i < s->sh.nb_refs[L0]; i++)
272 chroma_weight_l0_flag[i] = get_bits1(gb);
274 for (i = 0; i < s->sh.nb_refs[L0]; i++)
275 chroma_weight_l0_flag[i] = 0;
277 for (i = 0; i < s->sh.nb_refs[L0]; i++) {
278 if (luma_weight_l0_flag[i]) {
279 int delta_luma_weight_l0 = get_se_golomb(gb);
280 s->sh.luma_weight_l0[i] = (1 << s->sh.luma_log2_weight_denom) + delta_luma_weight_l0;
281 s->sh.luma_offset_l0[i] = get_se_golomb(gb);
283 if (chroma_weight_l0_flag[i]) {
284 for (j = 0; j < 2; j++) {
285 int delta_chroma_weight_l0 = get_se_golomb(gb);
286 int delta_chroma_offset_l0 = get_se_golomb(gb);
287 s->sh.chroma_weight_l0[i][j] = (1 << s->sh.chroma_log2_weight_denom) + delta_chroma_weight_l0;
288 s->sh.chroma_offset_l0[i][j] = av_clip_c((delta_chroma_offset_l0 - ((128 * s->sh.chroma_weight_l0[i][j])
289 >> s->sh.chroma_log2_weight_denom) + 128), -128, 127);
292 s->sh.chroma_weight_l0[i][0] = 1 << s->sh.chroma_log2_weight_denom;
293 s->sh.chroma_offset_l0[i][0] = 0;
294 s->sh.chroma_weight_l0[i][1] = 1 << s->sh.chroma_log2_weight_denom;
295 s->sh.chroma_offset_l0[i][1] = 0;
298 if (s->sh.slice_type == B_SLICE) {
299 for (i = 0; i < s->sh.nb_refs[L1]; i++) {
300 luma_weight_l1_flag[i] = get_bits1(gb);
301 if (!luma_weight_l1_flag[i]) {
302 s->sh.luma_weight_l1[i] = 1 << s->sh.luma_log2_weight_denom;
303 s->sh.luma_offset_l1[i] = 0;
306 if (s->sps->chroma_format_idc != 0) {
307 for (i = 0; i < s->sh.nb_refs[L1]; i++)
308 chroma_weight_l1_flag[i] = get_bits1(gb);
310 for (i = 0; i < s->sh.nb_refs[L1]; i++)
311 chroma_weight_l1_flag[i] = 0;
313 for (i = 0; i < s->sh.nb_refs[L1]; i++) {
314 if (luma_weight_l1_flag[i]) {
315 int delta_luma_weight_l1 = get_se_golomb(gb);
316 s->sh.luma_weight_l1[i] = (1 << s->sh.luma_log2_weight_denom) + delta_luma_weight_l1;
317 s->sh.luma_offset_l1[i] = get_se_golomb(gb);
319 if (chroma_weight_l1_flag[i]) {
320 for (j = 0; j < 2; j++) {
321 int delta_chroma_weight_l1 = get_se_golomb(gb);
322 int delta_chroma_offset_l1 = get_se_golomb(gb);
323 s->sh.chroma_weight_l1[i][j] = (1 << s->sh.chroma_log2_weight_denom) + delta_chroma_weight_l1;
324 s->sh.chroma_offset_l1[i][j] = av_clip_c((delta_chroma_offset_l1 - ((128 * s->sh.chroma_weight_l1[i][j])
325 >> s->sh.chroma_log2_weight_denom) + 128), -128, 127);
328 s->sh.chroma_weight_l1[i][0] = 1 << s->sh.chroma_log2_weight_denom;
329 s->sh.chroma_offset_l1[i][0] = 0;
330 s->sh.chroma_weight_l1[i][1] = 1 << s->sh.chroma_log2_weight_denom;
331 s->sh.chroma_offset_l1[i][1] = 0;
337 static int decode_lt_rps(HEVCContext *s, LongTermRPS *rps, GetBitContext *gb)
339 const HEVCSPS *sps = s->sps;
340 int max_poc_lsb = 1 << sps->log2_max_poc_lsb;
341 int prev_delta_msb = 0;
342 unsigned int nb_sps = 0, nb_sh;
346 if (!sps->long_term_ref_pics_present_flag)
349 if (sps->num_long_term_ref_pics_sps > 0)
350 nb_sps = get_ue_golomb_long(gb);
351 nb_sh = get_ue_golomb_long(gb);
353 if (nb_sh + nb_sps > FF_ARRAY_ELEMS(rps->poc))
354 return AVERROR_INVALIDDATA;
356 rps->nb_refs = nb_sh + nb_sps;
358 for (i = 0; i < rps->nb_refs; i++) {
359 uint8_t delta_poc_msb_present;
362 uint8_t lt_idx_sps = 0;
364 if (sps->num_long_term_ref_pics_sps > 1)
365 lt_idx_sps = get_bits(gb, av_ceil_log2(sps->num_long_term_ref_pics_sps));
367 rps->poc[i] = sps->lt_ref_pic_poc_lsb_sps[lt_idx_sps];
368 rps->used[i] = sps->used_by_curr_pic_lt_sps_flag[lt_idx_sps];
370 rps->poc[i] = get_bits(gb, sps->log2_max_poc_lsb);
371 rps->used[i] = get_bits1(gb);
374 delta_poc_msb_present = get_bits1(gb);
375 if (delta_poc_msb_present) {
376 int delta = get_ue_golomb_long(gb);
378 if (i && i != nb_sps)
379 delta += prev_delta_msb;
381 rps->poc[i] += s->poc - delta * max_poc_lsb - s->sh.pic_order_cnt_lsb;
382 prev_delta_msb = delta;
389 static int set_sps(HEVCContext *s, const HEVCSPS *sps)
392 unsigned int num = 0, den = 0;
395 ret = pic_arrays_init(s, sps);
399 s->avctx->coded_width = sps->width;
400 s->avctx->coded_height = sps->height;
401 s->avctx->width = sps->output_width;
402 s->avctx->height = sps->output_height;
403 s->avctx->pix_fmt = sps->pix_fmt;
404 s->avctx->has_b_frames = sps->temporal_layer[sps->max_sub_layers - 1].num_reorder_pics;
406 ff_set_sar(s->avctx, sps->vui.sar);
408 if (sps->vui.video_signal_type_present_flag)
409 s->avctx->color_range = sps->vui.video_full_range_flag ? AVCOL_RANGE_JPEG
412 s->avctx->color_range = AVCOL_RANGE_MPEG;
414 if (sps->vui.colour_description_present_flag) {
415 s->avctx->color_primaries = sps->vui.colour_primaries;
416 s->avctx->color_trc = sps->vui.transfer_characteristic;
417 s->avctx->colorspace = sps->vui.matrix_coeffs;
419 s->avctx->color_primaries = AVCOL_PRI_UNSPECIFIED;
420 s->avctx->color_trc = AVCOL_TRC_UNSPECIFIED;
421 s->avctx->colorspace = AVCOL_SPC_UNSPECIFIED;
424 ff_hevc_pred_init(&s->hpc, sps->bit_depth);
425 ff_hevc_dsp_init (&s->hevcdsp, sps->bit_depth);
426 ff_videodsp_init (&s->vdsp, sps->bit_depth);
428 if (sps->sao_enabled) {
429 av_frame_unref(s->tmp_frame);
430 ret = ff_get_buffer(s->avctx, s->tmp_frame, AV_GET_BUFFER_FLAG_REF);
433 s->frame = s->tmp_frame;
437 s->vps = (HEVCVPS*) s->vps_list[s->sps->vps_id]->data;
439 if (s->vps->vps_timing_info_present_flag) {
440 num = s->vps->vps_num_units_in_tick;
441 den = s->vps->vps_time_scale;
442 } else if (sps->vui.vui_timing_info_present_flag) {
443 num = sps->vui.vui_num_units_in_tick;
444 den = sps->vui.vui_time_scale;
447 if (num != 0 && den != 0)
448 av_reduce(&s->avctx->time_base.num, &s->avctx->time_base.den,
459 static int hls_slice_header(HEVCContext *s)
461 GetBitContext *gb = &s->HEVClc.gb;
462 SliceHeader *sh = &s->sh;
466 sh->first_slice_in_pic_flag = get_bits1(gb);
467 if ((IS_IDR(s) || IS_BLA(s)) && sh->first_slice_in_pic_flag) {
468 s->seq_decode = (s->seq_decode + 1) & 0xff;
471 ff_hevc_clear_refs(s);
474 sh->no_output_of_prior_pics_flag = get_bits1(gb);
476 sh->pps_id = get_ue_golomb_long(gb);
477 if (sh->pps_id >= MAX_PPS_COUNT || !s->pps_list[sh->pps_id]) {
478 av_log(s->avctx, AV_LOG_ERROR, "PPS id out of range: %d\n", sh->pps_id);
479 return AVERROR_INVALIDDATA;
481 if (!sh->first_slice_in_pic_flag &&
482 s->pps != (HEVCPPS*)s->pps_list[sh->pps_id]->data) {
483 av_log(s->avctx, AV_LOG_ERROR, "PPS changed between slices.\n");
484 return AVERROR_INVALIDDATA;
486 s->pps = (HEVCPPS*)s->pps_list[sh->pps_id]->data;
488 if (s->sps != (HEVCSPS*)s->sps_list[s->pps->sps_id]->data) {
489 s->sps = (HEVCSPS*)s->sps_list[s->pps->sps_id]->data;
491 ff_hevc_clear_refs(s);
492 ret = set_sps(s, s->sps);
496 s->seq_decode = (s->seq_decode + 1) & 0xff;
500 s->avctx->profile = s->sps->ptl.general_ptl.profile_idc;
501 s->avctx->level = s->sps->ptl.general_ptl.level_idc;
503 sh->dependent_slice_segment_flag = 0;
504 if (!sh->first_slice_in_pic_flag) {
505 int slice_address_length;
507 if (s->pps->dependent_slice_segments_enabled_flag)
508 sh->dependent_slice_segment_flag = get_bits1(gb);
510 slice_address_length = av_ceil_log2(s->sps->ctb_width *
512 sh->slice_segment_addr = get_bits(gb, slice_address_length);
513 if (sh->slice_segment_addr >= s->sps->ctb_width * s->sps->ctb_height) {
514 av_log(s->avctx, AV_LOG_ERROR,
515 "Invalid slice segment address: %u.\n",
516 sh->slice_segment_addr);
517 return AVERROR_INVALIDDATA;
520 if (!sh->dependent_slice_segment_flag) {
521 sh->slice_addr = sh->slice_segment_addr;
525 sh->slice_segment_addr = sh->slice_addr = 0;
527 s->slice_initialized = 0;
530 if (!sh->dependent_slice_segment_flag) {
531 s->slice_initialized = 0;
533 for (i = 0; i < s->pps->num_extra_slice_header_bits; i++)
534 skip_bits(gb, 1); // slice_reserved_undetermined_flag[]
536 sh->slice_type = get_ue_golomb_long(gb);
537 if (!(sh->slice_type == I_SLICE ||
538 sh->slice_type == P_SLICE ||
539 sh->slice_type == B_SLICE)) {
540 av_log(s->avctx, AV_LOG_ERROR, "Unknown slice type: %d.\n",
542 return AVERROR_INVALIDDATA;
544 if (IS_IRAP(s) && sh->slice_type != I_SLICE) {
545 av_log(s->avctx, AV_LOG_ERROR, "Inter slices in an IRAP frame.\n");
546 return AVERROR_INVALIDDATA;
549 if (s->pps->output_flag_present_flag)
550 sh->pic_output_flag = get_bits1(gb);
552 if (s->sps->separate_colour_plane_flag)
553 sh->colour_plane_id = get_bits(gb, 2);
556 int short_term_ref_pic_set_sps_flag, poc;
558 sh->pic_order_cnt_lsb = get_bits(gb, s->sps->log2_max_poc_lsb);
559 poc = ff_hevc_compute_poc(s, sh->pic_order_cnt_lsb);
560 if (!sh->first_slice_in_pic_flag && poc != s->poc) {
561 av_log(s->avctx, AV_LOG_WARNING,
562 "Ignoring POC change between slices: %d -> %d\n", s->poc, poc);
563 if (s->avctx->err_recognition & AV_EF_EXPLODE)
564 return AVERROR_INVALIDDATA;
569 short_term_ref_pic_set_sps_flag = get_bits1(gb);
570 if (!short_term_ref_pic_set_sps_flag) {
571 ret = ff_hevc_decode_short_term_rps(s, &sh->slice_rps, s->sps, 1);
575 sh->short_term_rps = &sh->slice_rps;
577 int numbits, rps_idx;
579 if (!s->sps->nb_st_rps) {
580 av_log(s->avctx, AV_LOG_ERROR, "No ref lists in the SPS.\n");
581 return AVERROR_INVALIDDATA;
584 numbits = av_ceil_log2(s->sps->nb_st_rps);
585 rps_idx = numbits > 0 ? get_bits(gb, numbits) : 0;
586 sh->short_term_rps = &s->sps->st_rps[rps_idx];
589 ret = decode_lt_rps(s, &sh->long_term_rps, gb);
591 av_log(s->avctx, AV_LOG_WARNING, "Invalid long term RPS.\n");
592 if (s->avctx->err_recognition & AV_EF_EXPLODE)
593 return AVERROR_INVALIDDATA;
596 if (s->sps->sps_temporal_mvp_enabled_flag)
597 sh->slice_temporal_mvp_enabled_flag = get_bits1(gb);
599 sh->slice_temporal_mvp_enabled_flag = 0;
601 s->sh.short_term_rps = NULL;
606 if (s->temporal_id == 0 &&
607 s->nal_unit_type != NAL_TRAIL_N &&
608 s->nal_unit_type != NAL_TSA_N &&
609 s->nal_unit_type != NAL_STSA_N &&
610 s->nal_unit_type != NAL_RADL_N &&
611 s->nal_unit_type != NAL_RADL_R &&
612 s->nal_unit_type != NAL_RASL_N &&
613 s->nal_unit_type != NAL_RASL_R)
616 if (s->sps->sao_enabled) {
617 sh->slice_sample_adaptive_offset_flag[0] = get_bits1(gb);
618 sh->slice_sample_adaptive_offset_flag[1] =
619 sh->slice_sample_adaptive_offset_flag[2] = get_bits1(gb);
621 sh->slice_sample_adaptive_offset_flag[0] = 0;
622 sh->slice_sample_adaptive_offset_flag[1] = 0;
623 sh->slice_sample_adaptive_offset_flag[2] = 0;
626 sh->nb_refs[L0] = sh->nb_refs[L1] = 0;
627 if (sh->slice_type == P_SLICE || sh->slice_type == B_SLICE) {
630 sh->nb_refs[L0] = s->pps->num_ref_idx_l0_default_active;
631 if (sh->slice_type == B_SLICE)
632 sh->nb_refs[L1] = s->pps->num_ref_idx_l1_default_active;
634 if (get_bits1(gb)) { // num_ref_idx_active_override_flag
635 sh->nb_refs[L0] = get_ue_golomb_long(gb) + 1;
636 if (sh->slice_type == B_SLICE)
637 sh->nb_refs[L1] = get_ue_golomb_long(gb) + 1;
639 if (sh->nb_refs[L0] > MAX_REFS || sh->nb_refs[L1] > MAX_REFS) {
640 av_log(s->avctx, AV_LOG_ERROR, "Too many refs: %d/%d.\n",
641 sh->nb_refs[L0], sh->nb_refs[L1]);
642 return AVERROR_INVALIDDATA;
645 sh->rpl_modification_flag[0] = 0;
646 sh->rpl_modification_flag[1] = 0;
647 nb_refs = ff_hevc_frame_nb_refs(s);
649 av_log(s->avctx, AV_LOG_ERROR, "Zero refs for a frame with P or B slices.\n");
650 return AVERROR_INVALIDDATA;
653 if (s->pps->lists_modification_present_flag && nb_refs > 1) {
654 sh->rpl_modification_flag[0] = get_bits1(gb);
655 if (sh->rpl_modification_flag[0]) {
656 for (i = 0; i < sh->nb_refs[L0]; i++)
657 sh->list_entry_lx[0][i] = get_bits(gb, av_ceil_log2(nb_refs));
660 if (sh->slice_type == B_SLICE) {
661 sh->rpl_modification_flag[1] = get_bits1(gb);
662 if (sh->rpl_modification_flag[1] == 1)
663 for (i = 0; i < sh->nb_refs[L1]; i++)
664 sh->list_entry_lx[1][i] = get_bits(gb, av_ceil_log2(nb_refs));
668 if (sh->slice_type == B_SLICE)
669 sh->mvd_l1_zero_flag = get_bits1(gb);
671 if (s->pps->cabac_init_present_flag)
672 sh->cabac_init_flag = get_bits1(gb);
674 sh->cabac_init_flag = 0;
676 sh->collocated_ref_idx = 0;
677 if (sh->slice_temporal_mvp_enabled_flag) {
678 sh->collocated_list = L0;
679 if (sh->slice_type == B_SLICE)
680 sh->collocated_list = !get_bits1(gb);
682 if (sh->nb_refs[sh->collocated_list] > 1) {
683 sh->collocated_ref_idx = get_ue_golomb_long(gb);
684 if (sh->collocated_ref_idx >= sh->nb_refs[sh->collocated_list]) {
685 av_log(s->avctx, AV_LOG_ERROR,
686 "Invalid collocated_ref_idx: %d.\n",
687 sh->collocated_ref_idx);
688 return AVERROR_INVALIDDATA;
693 if ((s->pps->weighted_pred_flag && sh->slice_type == P_SLICE) ||
694 (s->pps->weighted_bipred_flag && sh->slice_type == B_SLICE)) {
695 pred_weight_table(s, gb);
698 sh->max_num_merge_cand = 5 - get_ue_golomb_long(gb);
699 if (sh->max_num_merge_cand < 1 || sh->max_num_merge_cand > 5) {
700 av_log(s->avctx, AV_LOG_ERROR,
701 "Invalid number of merging MVP candidates: %d.\n",
702 sh->max_num_merge_cand);
703 return AVERROR_INVALIDDATA;
707 sh->slice_qp_delta = get_se_golomb(gb);
709 if (s->pps->pic_slice_level_chroma_qp_offsets_present_flag) {
710 sh->slice_cb_qp_offset = get_se_golomb(gb);
711 sh->slice_cr_qp_offset = get_se_golomb(gb);
713 sh->slice_cb_qp_offset = 0;
714 sh->slice_cr_qp_offset = 0;
717 if (s->pps->deblocking_filter_control_present_flag) {
718 int deblocking_filter_override_flag = 0;
720 if (s->pps->deblocking_filter_override_enabled_flag)
721 deblocking_filter_override_flag = get_bits1(gb);
723 if (deblocking_filter_override_flag) {
724 sh->disable_deblocking_filter_flag = get_bits1(gb);
725 if (!sh->disable_deblocking_filter_flag) {
726 sh->beta_offset = get_se_golomb(gb) * 2;
727 sh->tc_offset = get_se_golomb(gb) * 2;
730 sh->disable_deblocking_filter_flag = s->pps->disable_dbf;
731 sh->beta_offset = s->pps->beta_offset;
732 sh->tc_offset = s->pps->tc_offset;
735 sh->disable_deblocking_filter_flag = 0;
740 if (s->pps->seq_loop_filter_across_slices_enabled_flag &&
741 (sh->slice_sample_adaptive_offset_flag[0] ||
742 sh->slice_sample_adaptive_offset_flag[1] ||
743 !sh->disable_deblocking_filter_flag)) {
744 sh->slice_loop_filter_across_slices_enabled_flag = get_bits1(gb);
746 sh->slice_loop_filter_across_slices_enabled_flag = s->pps->seq_loop_filter_across_slices_enabled_flag;
748 } else if (!s->slice_initialized) {
749 av_log(s->avctx, AV_LOG_ERROR, "Independent slice segment missing.\n");
750 return AVERROR_INVALIDDATA;
753 sh->num_entry_point_offsets = 0;
754 if (s->pps->tiles_enabled_flag || s->pps->entropy_coding_sync_enabled_flag) {
755 sh->num_entry_point_offsets = get_ue_golomb_long(gb);
756 if (sh->num_entry_point_offsets > 0) {
757 int offset_len = get_ue_golomb_long(gb) + 1;
759 for (i = 0; i < sh->num_entry_point_offsets; i++)
760 skip_bits(gb, offset_len);
764 if (s->pps->slice_header_extension_present_flag) {
765 unsigned int length = get_ue_golomb_long(gb);
766 for (i = 0; i < length; i++)
767 skip_bits(gb, 8); // slice_header_extension_data_byte
770 // Inferred parameters
771 sh->slice_qp = 26 + s->pps->pic_init_qp_minus26 + sh->slice_qp_delta;
772 if (sh->slice_qp > 51 ||
773 sh->slice_qp < -s->sps->qp_bd_offset) {
774 av_log(s->avctx, AV_LOG_ERROR,
775 "The slice_qp %d is outside the valid range "
778 -s->sps->qp_bd_offset);
779 return AVERROR_INVALIDDATA;
782 sh->slice_ctb_addr_rs = sh->slice_segment_addr;
784 if (!s->sh.slice_ctb_addr_rs && s->sh.dependent_slice_segment_flag) {
785 av_log(s->avctx, AV_LOG_ERROR, "Impossible slice segment.\n");
786 return AVERROR_INVALIDDATA;
789 s->HEVClc.first_qp_group = !s->sh.dependent_slice_segment_flag;
791 if (!s->pps->cu_qp_delta_enabled_flag)
792 s->HEVClc.qp_y = FFUMOD(s->sh.slice_qp + 52 + 2 * s->sps->qp_bd_offset,
793 52 + s->sps->qp_bd_offset) - s->sps->qp_bd_offset;
795 s->slice_initialized = 1;
800 #define CTB(tab, x, y) ((tab)[(y) * s->sps->ctb_width + (x)])
802 #define SET_SAO(elem, value) \
804 if (!sao_merge_up_flag && !sao_merge_left_flag) \
806 else if (sao_merge_left_flag) \
807 sao->elem = CTB(s->sao, rx-1, ry).elem; \
808 else if (sao_merge_up_flag) \
809 sao->elem = CTB(s->sao, rx, ry-1).elem; \
814 static void hls_sao_param(HEVCContext *s, int rx, int ry)
816 HEVCLocalContext *lc = &s->HEVClc;
817 int sao_merge_left_flag = 0;
818 int sao_merge_up_flag = 0;
819 int shift = s->sps->bit_depth - FFMIN(s->sps->bit_depth, 10);
820 SAOParams *sao = &CTB(s->sao, rx, ry);
823 if (s->sh.slice_sample_adaptive_offset_flag[0] ||
824 s->sh.slice_sample_adaptive_offset_flag[1]) {
826 if (lc->ctb_left_flag)
827 sao_merge_left_flag = ff_hevc_sao_merge_flag_decode(s);
829 if (ry > 0 && !sao_merge_left_flag) {
831 sao_merge_up_flag = ff_hevc_sao_merge_flag_decode(s);
835 for (c_idx = 0; c_idx < 3; c_idx++) {
836 if (!s->sh.slice_sample_adaptive_offset_flag[c_idx]) {
837 sao->type_idx[c_idx] = SAO_NOT_APPLIED;
842 sao->type_idx[2] = sao->type_idx[1];
843 sao->eo_class[2] = sao->eo_class[1];
845 SET_SAO(type_idx[c_idx], ff_hevc_sao_type_idx_decode(s));
848 if (sao->type_idx[c_idx] == SAO_NOT_APPLIED)
851 for (i = 0; i < 4; i++)
852 SET_SAO(offset_abs[c_idx][i], ff_hevc_sao_offset_abs_decode(s));
854 if (sao->type_idx[c_idx] == SAO_BAND) {
855 for (i = 0; i < 4; i++) {
856 if (sao->offset_abs[c_idx][i]) {
857 SET_SAO(offset_sign[c_idx][i],
858 ff_hevc_sao_offset_sign_decode(s));
860 sao->offset_sign[c_idx][i] = 0;
863 SET_SAO(band_position[c_idx], ff_hevc_sao_band_position_decode(s));
864 } else if (c_idx != 2) {
865 SET_SAO(eo_class[c_idx], ff_hevc_sao_eo_class_decode(s));
868 // Inferred parameters
869 sao->offset_val[c_idx][0] = 0;
870 for (i = 0; i < 4; i++) {
871 sao->offset_val[c_idx][i + 1] = sao->offset_abs[c_idx][i] << shift;
872 if (sao->type_idx[c_idx] == SAO_EDGE) {
874 sao->offset_val[c_idx][i + 1] = -sao->offset_val[c_idx][i + 1];
875 } else if (sao->offset_sign[c_idx][i]) {
876 sao->offset_val[c_idx][i + 1] = -sao->offset_val[c_idx][i + 1];
885 static void hls_residual_coding(HEVCContext *s, int x0, int y0,
886 int log2_trafo_size, enum ScanType scan_idx,
889 #define GET_COORD(offset, n) \
891 x_c = (scan_x_cg[offset >> 4] << 2) + scan_x_off[n]; \
892 y_c = (scan_y_cg[offset >> 4] << 2) + scan_y_off[n]; \
894 HEVCLocalContext *lc = &s->HEVClc;
895 int transform_skip_flag = 0;
897 int last_significant_coeff_x, last_significant_coeff_y;
901 int greater1_ctx = 1;
904 int x_cg_last_sig, y_cg_last_sig;
906 const uint8_t *scan_x_cg, *scan_y_cg, *scan_x_off, *scan_y_off;
908 ptrdiff_t stride = s->frame->linesize[c_idx];
909 int hshift = s->sps->hshift[c_idx];
910 int vshift = s->sps->vshift[c_idx];
911 uint8_t *dst = &s->frame->data[c_idx][(y0 >> vshift) * stride +
912 ((x0 >> hshift) << s->sps->pixel_shift)];
913 DECLARE_ALIGNED(16, int16_t, coeffs[MAX_TB_SIZE * MAX_TB_SIZE]) = { 0 };
914 DECLARE_ALIGNED(8, uint8_t, significant_coeff_group_flag[8][8]) = { { 0 } };
916 int trafo_size = 1 << log2_trafo_size;
917 int i, qp, shift, add, scale, scale_m;
918 const uint8_t level_scale[] = { 40, 45, 51, 57, 64, 72 };
919 const uint8_t *scale_matrix;
922 // Derive QP for dequant
923 if (!lc->cu.cu_transquant_bypass_flag) {
924 static const int qp_c[] = {
925 29, 30, 31, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37
928 static const uint8_t rem6[51 + 2 * 6 + 1] = {
929 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2,
930 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5,
931 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3,
934 static const uint8_t div6[51 + 2 * 6 + 1] = {
935 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3,
936 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6,
937 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10,
942 qp = qp_y + s->sps->qp_bd_offset;
947 offset = s->pps->cb_qp_offset + s->sh.slice_cb_qp_offset;
949 offset = s->pps->cr_qp_offset + s->sh.slice_cr_qp_offset;
951 qp_i = av_clip_c(qp_y + offset, -s->sps->qp_bd_offset, 57);
957 qp = qp_c[qp_i - 30];
959 qp += s->sps->qp_bd_offset;
962 shift = s->sps->bit_depth + log2_trafo_size - 5;
963 add = 1 << (shift - 1);
964 scale = level_scale[rem6[qp]] << (div6[qp]);
965 scale_m = 16; // default when no custom scaling lists.
968 if (s->sps->scaling_list_enable_flag) {
969 const ScalingList *sl = s->pps->scaling_list_data_present_flag ?
970 &s->pps->scaling_list : &s->sps->scaling_list;
971 int matrix_id = lc->cu.pred_mode != MODE_INTRA;
973 if (log2_trafo_size != 5)
974 matrix_id = 3 * matrix_id + c_idx;
976 scale_matrix = sl->sl[log2_trafo_size - 2][matrix_id];
977 if (log2_trafo_size >= 4)
978 dc_scale = sl->sl_dc[log2_trafo_size - 4][matrix_id];
982 if (s->pps->transform_skip_enabled_flag &&
983 !lc->cu.cu_transquant_bypass_flag &&
984 log2_trafo_size == 2) {
985 transform_skip_flag = ff_hevc_transform_skip_flag_decode(s, c_idx);
988 last_significant_coeff_x =
989 ff_hevc_last_significant_coeff_x_prefix_decode(s, c_idx, log2_trafo_size);
990 last_significant_coeff_y =
991 ff_hevc_last_significant_coeff_y_prefix_decode(s, c_idx, log2_trafo_size);
993 if (last_significant_coeff_x > 3) {
994 int suffix = ff_hevc_last_significant_coeff_suffix_decode(s, last_significant_coeff_x);
995 last_significant_coeff_x = (1 << ((last_significant_coeff_x >> 1) - 1)) *
996 (2 + (last_significant_coeff_x & 1)) +
1000 if (last_significant_coeff_y > 3) {
1001 int suffix = ff_hevc_last_significant_coeff_suffix_decode(s, last_significant_coeff_y);
1002 last_significant_coeff_y = (1 << ((last_significant_coeff_y >> 1) - 1)) *
1003 (2 + (last_significant_coeff_y & 1)) +
1007 if (scan_idx == SCAN_VERT)
1008 FFSWAP(int, last_significant_coeff_x, last_significant_coeff_y);
1010 x_cg_last_sig = last_significant_coeff_x >> 2;
1011 y_cg_last_sig = last_significant_coeff_y >> 2;
1015 int last_x_c = last_significant_coeff_x & 3;
1016 int last_y_c = last_significant_coeff_y & 3;
1018 scan_x_off = ff_hevc_diag_scan4x4_x;
1019 scan_y_off = ff_hevc_diag_scan4x4_y;
1020 num_coeff = diag_scan4x4_inv[last_y_c][last_x_c];
1021 if (trafo_size == 4) {
1022 scan_x_cg = scan_1x1;
1023 scan_y_cg = scan_1x1;
1024 } else if (trafo_size == 8) {
1025 num_coeff += diag_scan2x2_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1026 scan_x_cg = diag_scan2x2_x;
1027 scan_y_cg = diag_scan2x2_y;
1028 } else if (trafo_size == 16) {
1029 num_coeff += diag_scan4x4_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1030 scan_x_cg = ff_hevc_diag_scan4x4_x;
1031 scan_y_cg = ff_hevc_diag_scan4x4_y;
1032 } else { // trafo_size == 32
1033 num_coeff += diag_scan8x8_inv[y_cg_last_sig][x_cg_last_sig] << 4;
1034 scan_x_cg = ff_hevc_diag_scan8x8_x;
1035 scan_y_cg = ff_hevc_diag_scan8x8_y;
1040 scan_x_cg = horiz_scan2x2_x;
1041 scan_y_cg = horiz_scan2x2_y;
1042 scan_x_off = horiz_scan4x4_x;
1043 scan_y_off = horiz_scan4x4_y;
1044 num_coeff = horiz_scan8x8_inv[last_significant_coeff_y][last_significant_coeff_x];
1046 default: //SCAN_VERT
1047 scan_x_cg = horiz_scan2x2_y;
1048 scan_y_cg = horiz_scan2x2_x;
1049 scan_x_off = horiz_scan4x4_y;
1050 scan_y_off = horiz_scan4x4_x;
1051 num_coeff = horiz_scan8x8_inv[last_significant_coeff_x][last_significant_coeff_y];
1055 num_last_subset = (num_coeff - 1) >> 4;
1057 for (i = num_last_subset; i >= 0; i--) {
1059 int x_cg, y_cg, x_c, y_c;
1060 int implicit_non_zero_coeff = 0;
1061 int64_t trans_coeff_level;
1063 int offset = i << 4;
1065 uint8_t significant_coeff_flag_idx[16];
1066 uint8_t nb_significant_coeff_flag = 0;
1068 x_cg = scan_x_cg[i];
1069 y_cg = scan_y_cg[i];
1071 if (i < num_last_subset && i > 0) {
1073 if (x_cg < (1 << (log2_trafo_size - 2)) - 1)
1074 ctx_cg += significant_coeff_group_flag[x_cg + 1][y_cg];
1075 if (y_cg < (1 << (log2_trafo_size - 2)) - 1)
1076 ctx_cg += significant_coeff_group_flag[x_cg][y_cg + 1];
1078 significant_coeff_group_flag[x_cg][y_cg] =
1079 ff_hevc_significant_coeff_group_flag_decode(s, c_idx, ctx_cg);
1080 implicit_non_zero_coeff = 1;
1082 significant_coeff_group_flag[x_cg][y_cg] =
1083 ((x_cg == x_cg_last_sig && y_cg == y_cg_last_sig) ||
1084 (x_cg == 0 && y_cg == 0));
1087 last_scan_pos = num_coeff - offset - 1;
1089 if (i == num_last_subset) {
1090 n_end = last_scan_pos - 1;
1091 significant_coeff_flag_idx[0] = last_scan_pos;
1092 nb_significant_coeff_flag = 1;
1097 if (x_cg < ((1 << log2_trafo_size) - 1) >> 2)
1098 prev_sig = significant_coeff_group_flag[x_cg + 1][y_cg];
1099 if (y_cg < ((1 << log2_trafo_size) - 1) >> 2)
1100 prev_sig += significant_coeff_group_flag[x_cg][y_cg + 1] << 1;
1102 for (n = n_end; n >= 0; n--) {
1103 GET_COORD(offset, n);
1105 if (significant_coeff_group_flag[x_cg][y_cg] &&
1106 (n > 0 || implicit_non_zero_coeff == 0)) {
1107 if (ff_hevc_significant_coeff_flag_decode(s, c_idx, x_c, y_c,
1111 significant_coeff_flag_idx[nb_significant_coeff_flag] = n;
1112 nb_significant_coeff_flag++;
1113 implicit_non_zero_coeff = 0;
1116 int last_cg = (x_c == (x_cg << 2) && y_c == (y_cg << 2));
1117 if (last_cg && implicit_non_zero_coeff && significant_coeff_group_flag[x_cg][y_cg]) {
1118 significant_coeff_flag_idx[nb_significant_coeff_flag] = n;
1119 nb_significant_coeff_flag++;
1124 n_end = nb_significant_coeff_flag;
1127 int first_nz_pos_in_cg = 16;
1128 int last_nz_pos_in_cg = -1;
1129 int c_rice_param = 0;
1130 int first_greater1_coeff_idx = -1;
1131 uint8_t coeff_abs_level_greater1_flag[16] = { 0 };
1132 uint16_t coeff_sign_flag;
1134 int sign_hidden = 0;
1136 // initialize first elem of coeff_bas_level_greater1_flag
1137 int ctx_set = (i > 0 && c_idx == 0) ? 2 : 0;
1139 if (!(i == num_last_subset) && greater1_ctx == 0)
1142 last_nz_pos_in_cg = significant_coeff_flag_idx[0];
1144 for (m = 0; m < (n_end > 8 ? 8 : n_end); m++) {
1145 int n_idx = significant_coeff_flag_idx[m];
1146 int inc = (ctx_set << 2) + greater1_ctx;
1147 coeff_abs_level_greater1_flag[n_idx] =
1148 ff_hevc_coeff_abs_level_greater1_flag_decode(s, c_idx, inc);
1149 if (coeff_abs_level_greater1_flag[n_idx]) {
1151 } else if (greater1_ctx > 0 && greater1_ctx < 3) {
1155 if (coeff_abs_level_greater1_flag[n_idx] &&
1156 first_greater1_coeff_idx == -1)
1157 first_greater1_coeff_idx = n_idx;
1159 first_nz_pos_in_cg = significant_coeff_flag_idx[n_end - 1];
1160 sign_hidden = last_nz_pos_in_cg - first_nz_pos_in_cg >= 4 &&
1161 !lc->cu.cu_transquant_bypass_flag;
1163 if (first_greater1_coeff_idx != -1) {
1164 coeff_abs_level_greater1_flag[first_greater1_coeff_idx] += ff_hevc_coeff_abs_level_greater2_flag_decode(s, c_idx, ctx_set);
1166 if (!s->pps->sign_data_hiding_flag || !sign_hidden) {
1167 coeff_sign_flag = ff_hevc_coeff_sign_flag(s, nb_significant_coeff_flag) << (16 - nb_significant_coeff_flag);
1169 coeff_sign_flag = ff_hevc_coeff_sign_flag(s, nb_significant_coeff_flag - 1) << (16 - (nb_significant_coeff_flag - 1));
1172 for (m = 0; m < n_end; m++) {
1173 n = significant_coeff_flag_idx[m];
1174 GET_COORD(offset, n);
1175 trans_coeff_level = 1 + coeff_abs_level_greater1_flag[n];
1176 if (trans_coeff_level == ((m < 8) ?
1177 ((n == first_greater1_coeff_idx) ? 3 : 2) : 1)) {
1178 int last_coeff_abs_level_remaining = ff_hevc_coeff_abs_level_remaining(s, trans_coeff_level, c_rice_param);
1180 trans_coeff_level += last_coeff_abs_level_remaining;
1181 if ((trans_coeff_level) > (3 * (1 << c_rice_param)))
1182 c_rice_param = FFMIN(c_rice_param + 1, 4);
1184 if (s->pps->sign_data_hiding_flag && sign_hidden) {
1185 sum_abs += trans_coeff_level;
1186 if (n == first_nz_pos_in_cg && ((sum_abs & 1) == 1))
1187 trans_coeff_level = -trans_coeff_level;
1189 if (coeff_sign_flag >> 15)
1190 trans_coeff_level = -trans_coeff_level;
1191 coeff_sign_flag <<= 1;
1192 if (!lc->cu.cu_transquant_bypass_flag) {
1193 if (s->sps->scaling_list_enable_flag) {
1194 if (y_c || x_c || log2_trafo_size < 4) {
1196 switch (log2_trafo_size) {
1197 case 3: pos = (y_c << 3) + x_c; break;
1198 case 4: pos = ((y_c >> 1) << 3) + (x_c >> 1); break;
1199 case 5: pos = ((y_c >> 2) << 3) + (x_c >> 2); break;
1200 default: pos = (y_c << 2) + x_c;
1202 scale_m = scale_matrix[pos];
1207 trans_coeff_level = (trans_coeff_level * (int64_t)scale * (int64_t)scale_m + add) >> shift;
1208 if(trans_coeff_level < 0) {
1209 if((~trans_coeff_level) & 0xFffffffffff8000)
1210 trans_coeff_level = -32768;
1212 if (trans_coeff_level & 0xffffffffffff8000)
1213 trans_coeff_level = 32767;
1216 coeffs[y_c * trafo_size + x_c] = trans_coeff_level;
1221 if (lc->cu.cu_transquant_bypass_flag) {
1222 s->hevcdsp.transquant_bypass[log2_trafo_size - 2](dst, coeffs, stride);
1224 if (transform_skip_flag)
1225 s->hevcdsp.transform_skip(dst, coeffs, stride);
1226 else if (lc->cu.pred_mode == MODE_INTRA && c_idx == 0 &&
1227 log2_trafo_size == 2)
1228 s->hevcdsp.transform_4x4_luma_add(dst, coeffs, stride);
1230 s->hevcdsp.transform_add[log2_trafo_size - 2](dst, coeffs, stride);
1234 static int hls_transform_unit(HEVCContext *s, int x0, int y0,
1235 int xBase, int yBase, int cb_xBase, int cb_yBase,
1236 int log2_cb_size, int log2_trafo_size,
1237 int trafo_depth, int blk_idx)
1239 HEVCLocalContext *lc = &s->HEVClc;
1241 if (lc->cu.pred_mode == MODE_INTRA) {
1242 int trafo_size = 1 << log2_trafo_size;
1243 ff_hevc_set_neighbour_available(s, x0, y0, trafo_size, trafo_size);
1245 s->hpc.intra_pred[log2_trafo_size - 2](s, x0, y0, 0);
1246 if (log2_trafo_size > 2) {
1247 trafo_size = trafo_size << (s->sps->hshift[1] - 1);
1248 ff_hevc_set_neighbour_available(s, x0, y0, trafo_size, trafo_size);
1249 s->hpc.intra_pred[log2_trafo_size - 3](s, x0, y0, 1);
1250 s->hpc.intra_pred[log2_trafo_size - 3](s, x0, y0, 2);
1251 } else if (blk_idx == 3) {
1252 trafo_size = trafo_size << s->sps->hshift[1];
1253 ff_hevc_set_neighbour_available(s, xBase, yBase,
1254 trafo_size, trafo_size);
1255 s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase, 1);
1256 s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase, 2);
1260 if (lc->tt.cbf_luma ||
1261 SAMPLE_CBF(lc->tt.cbf_cb[trafo_depth], x0, y0) ||
1262 SAMPLE_CBF(lc->tt.cbf_cr[trafo_depth], x0, y0)) {
1263 int scan_idx = SCAN_DIAG;
1264 int scan_idx_c = SCAN_DIAG;
1266 if (s->pps->cu_qp_delta_enabled_flag && !lc->tu.is_cu_qp_delta_coded) {
1267 lc->tu.cu_qp_delta = ff_hevc_cu_qp_delta_abs(s);
1268 if (lc->tu.cu_qp_delta != 0)
1269 if (ff_hevc_cu_qp_delta_sign_flag(s) == 1)
1270 lc->tu.cu_qp_delta = -lc->tu.cu_qp_delta;
1271 lc->tu.is_cu_qp_delta_coded = 1;
1273 if (lc->tu.cu_qp_delta < -(26 + s->sps->qp_bd_offset / 2) ||
1274 lc->tu.cu_qp_delta > (25 + s->sps->qp_bd_offset / 2)) {
1275 av_log(s->avctx, AV_LOG_ERROR,
1276 "The cu_qp_delta %d is outside the valid range "
1279 -(26 + s->sps->qp_bd_offset / 2),
1280 (25 + s->sps->qp_bd_offset / 2));
1281 return AVERROR_INVALIDDATA;
1284 ff_hevc_set_qPy(s, x0, y0, cb_xBase, cb_yBase, log2_cb_size);
1287 if (lc->cu.pred_mode == MODE_INTRA && log2_trafo_size < 4) {
1288 if (lc->tu.cur_intra_pred_mode >= 6 &&
1289 lc->tu.cur_intra_pred_mode <= 14) {
1290 scan_idx = SCAN_VERT;
1291 } else if (lc->tu.cur_intra_pred_mode >= 22 &&
1292 lc->tu.cur_intra_pred_mode <= 30) {
1293 scan_idx = SCAN_HORIZ;
1296 if (lc->pu.intra_pred_mode_c >= 6 &&
1297 lc->pu.intra_pred_mode_c <= 14) {
1298 scan_idx_c = SCAN_VERT;
1299 } else if (lc->pu.intra_pred_mode_c >= 22 &&
1300 lc->pu.intra_pred_mode_c <= 30) {
1301 scan_idx_c = SCAN_HORIZ;
1305 if (lc->tt.cbf_luma)
1306 hls_residual_coding(s, x0, y0, log2_trafo_size, scan_idx, 0);
1307 if (log2_trafo_size > 2) {
1308 if (SAMPLE_CBF(lc->tt.cbf_cb[trafo_depth], x0, y0))
1309 hls_residual_coding(s, x0, y0, log2_trafo_size - 1, scan_idx_c, 1);
1310 if (SAMPLE_CBF(lc->tt.cbf_cr[trafo_depth], x0, y0))
1311 hls_residual_coding(s, x0, y0, log2_trafo_size - 1, scan_idx_c, 2);
1312 } else if (blk_idx == 3) {
1313 if (SAMPLE_CBF(lc->tt.cbf_cb[trafo_depth], xBase, yBase))
1314 hls_residual_coding(s, xBase, yBase, log2_trafo_size, scan_idx_c, 1);
1315 if (SAMPLE_CBF(lc->tt.cbf_cr[trafo_depth], xBase, yBase))
1316 hls_residual_coding(s, xBase, yBase, log2_trafo_size, scan_idx_c, 2);
1322 static void set_deblocking_bypass(HEVCContext *s, int x0, int y0, int log2_cb_size)
1324 int cb_size = 1 << log2_cb_size;
1325 int log2_min_pu_size = s->sps->log2_min_pu_size;
1327 int min_pu_width = s->sps->min_pu_width;
1328 int x_end = FFMIN(x0 + cb_size, s->sps->width);
1329 int y_end = FFMIN(y0 + cb_size, s->sps->height);
1332 for (j = (y0 >> log2_min_pu_size); j < (y_end >> log2_min_pu_size); j++)
1333 for (i = (x0 >> log2_min_pu_size); i < (x_end >> log2_min_pu_size); i++)
1334 s->is_pcm[i + j * min_pu_width] = 2;
1337 static int hls_transform_tree(HEVCContext *s, int x0, int y0,
1338 int xBase, int yBase, int cb_xBase, int cb_yBase,
1339 int log2_cb_size, int log2_trafo_size,
1340 int trafo_depth, int blk_idx)
1342 HEVCLocalContext *lc = &s->HEVClc;
1343 uint8_t split_transform_flag;
1346 if (trafo_depth > 0 && log2_trafo_size == 2) {
1347 SAMPLE_CBF(lc->tt.cbf_cb[trafo_depth], x0, y0) =
1348 SAMPLE_CBF(lc->tt.cbf_cb[trafo_depth - 1], xBase, yBase);
1349 SAMPLE_CBF(lc->tt.cbf_cr[trafo_depth], x0, y0) =
1350 SAMPLE_CBF(lc->tt.cbf_cr[trafo_depth - 1], xBase, yBase);
1352 SAMPLE_CBF(lc->tt.cbf_cb[trafo_depth], x0, y0) =
1353 SAMPLE_CBF(lc->tt.cbf_cr[trafo_depth], x0, y0) = 0;
1356 if (lc->cu.intra_split_flag) {
1357 if (trafo_depth == 1)
1358 lc->tu.cur_intra_pred_mode = lc->pu.intra_pred_mode[blk_idx];
1360 lc->tu.cur_intra_pred_mode = lc->pu.intra_pred_mode[0];
1363 lc->tt.cbf_luma = 1;
1365 lc->tt.inter_split_flag = s->sps->max_transform_hierarchy_depth_inter == 0 &&
1366 lc->cu.pred_mode == MODE_INTER &&
1367 lc->cu.part_mode != PART_2Nx2N &&
1370 if (log2_trafo_size <= s->sps->log2_max_trafo_size &&
1371 log2_trafo_size > s->sps->log2_min_tb_size &&
1372 trafo_depth < lc->cu.max_trafo_depth &&
1373 !(lc->cu.intra_split_flag && trafo_depth == 0)) {
1374 split_transform_flag = ff_hevc_split_transform_flag_decode(s, log2_trafo_size);
1376 split_transform_flag = log2_trafo_size > s->sps->log2_max_trafo_size ||
1377 (lc->cu.intra_split_flag && trafo_depth == 0) ||
1378 lc->tt.inter_split_flag;
1381 if (log2_trafo_size > 2) {
1382 if (trafo_depth == 0 ||
1383 SAMPLE_CBF(lc->tt.cbf_cb[trafo_depth - 1], xBase, yBase)) {
1384 SAMPLE_CBF(lc->tt.cbf_cb[trafo_depth], x0, y0) =
1385 ff_hevc_cbf_cb_cr_decode(s, trafo_depth);
1388 if (trafo_depth == 0 ||
1389 SAMPLE_CBF(lc->tt.cbf_cr[trafo_depth - 1], xBase, yBase)) {
1390 SAMPLE_CBF(lc->tt.cbf_cr[trafo_depth], x0, y0) =
1391 ff_hevc_cbf_cb_cr_decode(s, trafo_depth);
1395 if (split_transform_flag) {
1396 int x1 = x0 + ((1 << log2_trafo_size) >> 1);
1397 int y1 = y0 + ((1 << log2_trafo_size) >> 1);
1399 ret = hls_transform_tree(s, x0, y0, x0, y0, cb_xBase, cb_yBase,
1400 log2_cb_size, log2_trafo_size - 1,
1401 trafo_depth + 1, 0);
1404 ret = hls_transform_tree(s, x1, y0, x0, y0, cb_xBase, cb_yBase,
1405 log2_cb_size, log2_trafo_size - 1,
1406 trafo_depth + 1, 1);
1409 ret = hls_transform_tree(s, x0, y1, x0, y0, cb_xBase, cb_yBase,
1410 log2_cb_size, log2_trafo_size - 1,
1411 trafo_depth + 1, 2);
1414 ret = hls_transform_tree(s, x1, y1, x0, y0, cb_xBase, cb_yBase,
1415 log2_cb_size, log2_trafo_size - 1,
1416 trafo_depth + 1, 3);
1420 int min_tu_size = 1 << s->sps->log2_min_tb_size;
1421 int log2_min_tu_size = s->sps->log2_min_tb_size;
1422 int min_tu_width = s->sps->min_tb_width;
1424 if (lc->cu.pred_mode == MODE_INTRA || trafo_depth != 0 ||
1425 SAMPLE_CBF(lc->tt.cbf_cb[trafo_depth], x0, y0) ||
1426 SAMPLE_CBF(lc->tt.cbf_cr[trafo_depth], x0, y0)) {
1427 lc->tt.cbf_luma = ff_hevc_cbf_luma_decode(s, trafo_depth);
1430 ret = hls_transform_unit(s, x0, y0, xBase, yBase, cb_xBase, cb_yBase,
1431 log2_cb_size, log2_trafo_size, trafo_depth,
1435 // TODO: store cbf_luma somewhere else
1436 if (lc->tt.cbf_luma) {
1438 for (i = 0; i < (1 << log2_trafo_size); i += min_tu_size)
1439 for (j = 0; j < (1 << log2_trafo_size); j += min_tu_size) {
1440 int x_tu = (x0 + j) >> log2_min_tu_size;
1441 int y_tu = (y0 + i) >> log2_min_tu_size;
1442 s->cbf_luma[y_tu * min_tu_width + x_tu] = 1;
1445 if (!s->sh.disable_deblocking_filter_flag) {
1446 ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_trafo_size,
1447 lc->slice_or_tiles_up_boundary,
1448 lc->slice_or_tiles_left_boundary);
1449 if (s->pps->transquant_bypass_enable_flag &&
1450 lc->cu.cu_transquant_bypass_flag)
1451 set_deblocking_bypass(s, x0, y0, log2_trafo_size);
1457 static int hls_pcm_sample(HEVCContext *s, int x0, int y0, int log2_cb_size)
1459 //TODO: non-4:2:0 support
1460 HEVCLocalContext *lc = &s->HEVClc;
1462 int cb_size = 1 << log2_cb_size;
1463 int stride0 = s->frame->linesize[0];
1464 uint8_t *dst0 = &s->frame->data[0][y0 * stride0 + (x0 << s->sps->pixel_shift)];
1465 int stride1 = s->frame->linesize[1];
1466 uint8_t *dst1 = &s->frame->data[1][(y0 >> s->sps->vshift[1]) * stride1 + ((x0 >> s->sps->hshift[1]) << s->sps->pixel_shift)];
1467 int stride2 = s->frame->linesize[2];
1468 uint8_t *dst2 = &s->frame->data[2][(y0 >> s->sps->vshift[2]) * stride2 + ((x0 >> s->sps->hshift[2]) << s->sps->pixel_shift)];
1470 int length = cb_size * cb_size * s->sps->pcm.bit_depth + ((cb_size * cb_size) >> 1) * s->sps->pcm.bit_depth_chroma;
1471 const uint8_t *pcm = skip_bytes(&lc->cc, (length + 7) >> 3);
1474 ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_cb_size,
1475 lc->slice_or_tiles_up_boundary,
1476 lc->slice_or_tiles_left_boundary);
1478 ret = init_get_bits(&gb, pcm, length);
1482 s->hevcdsp.put_pcm(dst0, stride0, cb_size, &gb, s->sps->pcm.bit_depth);
1483 s->hevcdsp.put_pcm(dst1, stride1, cb_size / 2, &gb, s->sps->pcm.bit_depth_chroma);
1484 s->hevcdsp.put_pcm(dst2, stride2, cb_size / 2, &gb, s->sps->pcm.bit_depth_chroma);
1488 static void hls_mvd_coding(HEVCContext *s, int x0, int y0, int log2_cb_size)
1490 HEVCLocalContext *lc = &s->HEVClc;
1491 int x = ff_hevc_abs_mvd_greater0_flag_decode(s);
1492 int y = ff_hevc_abs_mvd_greater0_flag_decode(s);
1495 x += ff_hevc_abs_mvd_greater1_flag_decode(s);
1497 y += ff_hevc_abs_mvd_greater1_flag_decode(s);
1500 case 2: lc->pu.mvd.x = ff_hevc_mvd_decode(s); break;
1501 case 1: lc->pu.mvd.x = ff_hevc_mvd_sign_flag_decode(s); break;
1502 case 0: lc->pu.mvd.x = 0; break;
1506 case 2: lc->pu.mvd.y = ff_hevc_mvd_decode(s); break;
1507 case 1: lc->pu.mvd.y = ff_hevc_mvd_sign_flag_decode(s); break;
1508 case 0: lc->pu.mvd.y = 0; break;
1513 * 8.5.3.2.2.1 Luma sample interpolation process
1515 * @param s HEVC decoding context
1516 * @param dst target buffer for block data at block position
1517 * @param dststride stride of the dst buffer
1518 * @param ref reference picture buffer at origin (0, 0)
1519 * @param mv motion vector (relative to block position) to get pixel data from
1520 * @param x_off horizontal position of block from origin (0, 0)
1521 * @param y_off vertical position of block from origin (0, 0)
1522 * @param block_w width of block
1523 * @param block_h height of block
1525 static void luma_mc(HEVCContext *s, int16_t *dst, ptrdiff_t dststride,
1526 AVFrame *ref, const Mv *mv, int x_off, int y_off,
1527 int block_w, int block_h)
1529 HEVCLocalContext *lc = &s->HEVClc;
1530 uint8_t *src = ref->data[0];
1531 ptrdiff_t srcstride = ref->linesize[0];
1532 int pic_width = s->sps->width;
1533 int pic_height = s->sps->height;
1537 int extra_left = ff_hevc_qpel_extra_before[mx];
1538 int extra_top = ff_hevc_qpel_extra_before[my];
1540 x_off += mv->x >> 2;
1541 y_off += mv->y >> 2;
1542 src += y_off * srcstride + (x_off << s->sps->pixel_shift);
1544 if (x_off < extra_left || y_off < extra_top ||
1545 x_off >= pic_width - block_w - ff_hevc_qpel_extra_after[mx] ||
1546 y_off >= pic_height - block_h - ff_hevc_qpel_extra_after[my]) {
1547 const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->sps->pixel_shift;
1548 int offset = extra_top * srcstride + (extra_left << s->sps->pixel_shift);
1549 int buf_offset = extra_top *
1550 edge_emu_stride + (extra_left << s->sps->pixel_shift);
1552 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src - offset,
1553 edge_emu_stride, srcstride,
1554 block_w + ff_hevc_qpel_extra[mx],
1555 block_h + ff_hevc_qpel_extra[my],
1556 x_off - extra_left, y_off - extra_top,
1557 pic_width, pic_height);
1558 src = lc->edge_emu_buffer + buf_offset;
1559 srcstride = edge_emu_stride;
1561 s->hevcdsp.put_hevc_qpel[my][mx](dst, dststride, src, srcstride, block_w,
1562 block_h, lc->mc_buffer);
1566 * 8.5.3.2.2.2 Chroma sample interpolation process
1568 * @param s HEVC decoding context
1569 * @param dst1 target buffer for block data at block position (U plane)
1570 * @param dst2 target buffer for block data at block position (V plane)
1571 * @param dststride stride of the dst1 and dst2 buffers
1572 * @param ref reference picture buffer at origin (0, 0)
1573 * @param mv motion vector (relative to block position) to get pixel data from
1574 * @param x_off horizontal position of block from origin (0, 0)
1575 * @param y_off vertical position of block from origin (0, 0)
1576 * @param block_w width of block
1577 * @param block_h height of block
1579 static void chroma_mc(HEVCContext *s, int16_t *dst1, int16_t *dst2,
1580 ptrdiff_t dststride, AVFrame *ref, const Mv *mv,
1581 int x_off, int y_off, int block_w, int block_h)
1583 HEVCLocalContext *lc = &s->HEVClc;
1584 uint8_t *src1 = ref->data[1];
1585 uint8_t *src2 = ref->data[2];
1586 ptrdiff_t src1stride = ref->linesize[1];
1587 ptrdiff_t src2stride = ref->linesize[2];
1588 int pic_width = s->sps->width >> 1;
1589 int pic_height = s->sps->height >> 1;
1594 x_off += mv->x >> 3;
1595 y_off += mv->y >> 3;
1596 src1 += y_off * src1stride + (x_off << s->sps->pixel_shift);
1597 src2 += y_off * src2stride + (x_off << s->sps->pixel_shift);
1599 if (x_off < EPEL_EXTRA_BEFORE || y_off < EPEL_EXTRA_AFTER ||
1600 x_off >= pic_width - block_w - EPEL_EXTRA_AFTER ||
1601 y_off >= pic_height - block_h - EPEL_EXTRA_AFTER) {
1602 const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->sps->pixel_shift;
1603 int offset1 = EPEL_EXTRA_BEFORE * (src1stride + (1 << s->sps->pixel_shift));
1604 int buf_offset1 = EPEL_EXTRA_BEFORE *
1605 (edge_emu_stride + (1 << s->sps->pixel_shift));
1606 int offset2 = EPEL_EXTRA_BEFORE * (src2stride + (1 << s->sps->pixel_shift));
1607 int buf_offset2 = EPEL_EXTRA_BEFORE *
1608 (edge_emu_stride + (1 << s->sps->pixel_shift));
1610 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src1 - offset1,
1611 edge_emu_stride, src1stride,
1612 block_w + EPEL_EXTRA, block_h + EPEL_EXTRA,
1613 x_off - EPEL_EXTRA_BEFORE,
1614 y_off - EPEL_EXTRA_BEFORE,
1615 pic_width, pic_height);
1617 src1 = lc->edge_emu_buffer + buf_offset1;
1618 src1stride = edge_emu_stride;
1619 s->hevcdsp.put_hevc_epel[!!my][!!mx](dst1, dststride, src1, src1stride,
1620 block_w, block_h, mx, my, lc->mc_buffer);
1622 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src2 - offset2,
1623 edge_emu_stride, src2stride,
1624 block_w + EPEL_EXTRA, block_h + EPEL_EXTRA,
1625 x_off - EPEL_EXTRA_BEFORE,
1626 y_off - EPEL_EXTRA_BEFORE,
1627 pic_width, pic_height);
1628 src2 = lc->edge_emu_buffer + buf_offset2;
1629 src2stride = edge_emu_stride;
1631 s->hevcdsp.put_hevc_epel[!!my][!!mx](dst2, dststride, src2, src2stride,
1632 block_w, block_h, mx, my,
1635 s->hevcdsp.put_hevc_epel[!!my][!!mx](dst1, dststride, src1, src1stride,
1636 block_w, block_h, mx, my,
1638 s->hevcdsp.put_hevc_epel[!!my][!!mx](dst2, dststride, src2, src2stride,
1639 block_w, block_h, mx, my,
1644 static void hevc_await_progress(HEVCContext *s, HEVCFrame *ref,
1645 const Mv *mv, int y0, int height)
1647 int y = (mv->y >> 2) + y0 + height + 9;
1648 ff_thread_await_progress(&ref->tf, y, 0);
1651 static void hls_prediction_unit(HEVCContext *s, int x0, int y0,
1653 int log2_cb_size, int partIdx)
1655 #define POS(c_idx, x, y) \
1656 &s->frame->data[c_idx][((y) >> s->sps->vshift[c_idx]) * s->frame->linesize[c_idx] + \
1657 (((x) >> s->sps->hshift[c_idx]) << s->sps->pixel_shift)]
1658 HEVCLocalContext *lc = &s->HEVClc;
1660 struct MvField current_mv = {{{ 0 }}};
1662 int min_pu_width = s->sps->min_pu_width;
1664 MvField *tab_mvf = s->ref->tab_mvf;
1665 RefPicList *refPicList = s->ref->refPicList;
1666 HEVCFrame *ref0, *ref1;
1668 int tmpstride = MAX_PB_SIZE;
1670 uint8_t *dst0 = POS(0, x0, y0);
1671 uint8_t *dst1 = POS(1, x0, y0);
1672 uint8_t *dst2 = POS(2, x0, y0);
1673 int log2_min_cb_size = s->sps->log2_min_cb_size;
1674 int min_cb_width = s->sps->min_cb_width;
1675 int x_cb = x0 >> log2_min_cb_size;
1676 int y_cb = y0 >> log2_min_cb_size;
1682 if (SAMPLE_CTB(s->skip_flag, x_cb, y_cb)) {
1683 if (s->sh.max_num_merge_cand > 1)
1684 merge_idx = ff_hevc_merge_idx_decode(s);
1688 ff_hevc_luma_mv_merge_mode(s, x0, y0,
1691 log2_cb_size, partIdx,
1692 merge_idx, ¤t_mv);
1693 x_pu = x0 >> s->sps->log2_min_pu_size;
1694 y_pu = y0 >> s->sps->log2_min_pu_size;
1696 for (i = 0; i < nPbW >> s->sps->log2_min_pu_size; i++)
1697 for (j = 0; j < nPbH >> s->sps->log2_min_pu_size; j++)
1698 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i] = current_mv;
1699 } else { /* MODE_INTER */
1700 lc->pu.merge_flag = ff_hevc_merge_flag_decode(s);
1701 if (lc->pu.merge_flag) {
1702 if (s->sh.max_num_merge_cand > 1)
1703 merge_idx = ff_hevc_merge_idx_decode(s);
1707 ff_hevc_luma_mv_merge_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
1708 partIdx, merge_idx, ¤t_mv);
1709 x_pu = x0 >> s->sps->log2_min_pu_size;
1710 y_pu = y0 >> s->sps->log2_min_pu_size;
1712 for (i = 0; i < nPbW >> s->sps->log2_min_pu_size; i++)
1713 for (j = 0; j < nPbH >> s->sps->log2_min_pu_size; j++)
1714 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i] = current_mv;
1716 enum InterPredIdc inter_pred_idc = PRED_L0;
1717 ff_hevc_set_neighbour_available(s, x0, y0, nPbW, nPbH);
1718 if (s->sh.slice_type == B_SLICE)
1719 inter_pred_idc = ff_hevc_inter_pred_idc_decode(s, nPbW, nPbH);
1721 if (inter_pred_idc != PRED_L1) {
1722 if (s->sh.nb_refs[L0]) {
1723 ref_idx[0] = ff_hevc_ref_idx_lx_decode(s, s->sh.nb_refs[L0]);
1724 current_mv.ref_idx[0] = ref_idx[0];
1726 current_mv.pred_flag[0] = 1;
1727 hls_mvd_coding(s, x0, y0, 0);
1728 mvp_flag[0] = ff_hevc_mvp_lx_flag_decode(s);
1729 ff_hevc_luma_mv_mvp_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
1730 partIdx, merge_idx, ¤t_mv,
1732 current_mv.mv[0].x += lc->pu.mvd.x;
1733 current_mv.mv[0].y += lc->pu.mvd.y;
1736 if (inter_pred_idc != PRED_L0) {
1737 if (s->sh.nb_refs[L1]) {
1738 ref_idx[1] = ff_hevc_ref_idx_lx_decode(s, s->sh.nb_refs[L1]);
1739 current_mv.ref_idx[1] = ref_idx[1];
1742 if (s->sh.mvd_l1_zero_flag == 1 && inter_pred_idc == PRED_BI) {
1746 hls_mvd_coding(s, x0, y0, 1);
1749 current_mv.pred_flag[1] = 1;
1750 mvp_flag[1] = ff_hevc_mvp_lx_flag_decode(s);
1751 ff_hevc_luma_mv_mvp_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
1752 partIdx, merge_idx, ¤t_mv,
1754 current_mv.mv[1].x += lc->pu.mvd.x;
1755 current_mv.mv[1].y += lc->pu.mvd.y;
1758 x_pu = x0 >> s->sps->log2_min_pu_size;
1759 y_pu = y0 >> s->sps->log2_min_pu_size;
1761 for (i = 0; i < nPbW >> s->sps->log2_min_pu_size; i++)
1762 for(j = 0; j < nPbH >> s->sps->log2_min_pu_size; j++)
1763 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i] = current_mv;
1767 if (current_mv.pred_flag[0]) {
1768 ref0 = refPicList[0].ref[current_mv.ref_idx[0]];
1771 hevc_await_progress(s, ref0, ¤t_mv.mv[0], y0, nPbH);
1773 if (current_mv.pred_flag[1]) {
1774 ref1 = refPicList[1].ref[current_mv.ref_idx[1]];
1777 hevc_await_progress(s, ref1, ¤t_mv.mv[1], y0, nPbH);
1780 if (current_mv.pred_flag[0] && !current_mv.pred_flag[1]) {
1781 DECLARE_ALIGNED(16, int16_t, tmp[MAX_PB_SIZE * MAX_PB_SIZE]);
1782 DECLARE_ALIGNED(16, int16_t, tmp2[MAX_PB_SIZE * MAX_PB_SIZE]);
1784 luma_mc(s, tmp, tmpstride, ref0->frame,
1785 ¤t_mv.mv[0], x0, y0, nPbW, nPbH);
1787 if ((s->sh.slice_type == P_SLICE && s->pps->weighted_pred_flag) ||
1788 (s->sh.slice_type == B_SLICE && s->pps->weighted_bipred_flag)) {
1789 s->hevcdsp.weighted_pred(s->sh.luma_log2_weight_denom,
1790 s->sh.luma_weight_l0[current_mv.ref_idx[0]],
1791 s->sh.luma_offset_l0[current_mv.ref_idx[0]],
1792 dst0, s->frame->linesize[0], tmp,
1793 tmpstride, nPbW, nPbH);
1795 s->hevcdsp.put_unweighted_pred(dst0, s->frame->linesize[0], tmp, tmpstride, nPbW, nPbH);
1797 chroma_mc(s, tmp, tmp2, tmpstride, ref0->frame,
1798 ¤t_mv.mv[0], x0 / 2, y0 / 2, nPbW / 2, nPbH / 2);
1800 if ((s->sh.slice_type == P_SLICE && s->pps->weighted_pred_flag) ||
1801 (s->sh.slice_type == B_SLICE && s->pps->weighted_bipred_flag)) {
1802 s->hevcdsp.weighted_pred(s->sh.chroma_log2_weight_denom,
1803 s->sh.chroma_weight_l0[current_mv.ref_idx[0]][0],
1804 s->sh.chroma_offset_l0[current_mv.ref_idx[0]][0],
1805 dst1, s->frame->linesize[1], tmp, tmpstride,
1806 nPbW / 2, nPbH / 2);
1807 s->hevcdsp.weighted_pred(s->sh.chroma_log2_weight_denom,
1808 s->sh.chroma_weight_l0[current_mv.ref_idx[0]][1],
1809 s->sh.chroma_offset_l0[current_mv.ref_idx[0]][1],
1810 dst2, s->frame->linesize[2], tmp2, tmpstride,
1811 nPbW / 2, nPbH / 2);
1813 s->hevcdsp.put_unweighted_pred(dst1, s->frame->linesize[1], tmp, tmpstride, nPbW/2, nPbH/2);
1814 s->hevcdsp.put_unweighted_pred(dst2, s->frame->linesize[2], tmp2, tmpstride, nPbW/2, nPbH/2);
1816 } else if (!current_mv.pred_flag[0] && current_mv.pred_flag[1]) {
1817 DECLARE_ALIGNED(16, int16_t, tmp [MAX_PB_SIZE * MAX_PB_SIZE]);
1818 DECLARE_ALIGNED(16, int16_t, tmp2[MAX_PB_SIZE * MAX_PB_SIZE]);
1823 luma_mc(s, tmp, tmpstride, ref1->frame,
1824 ¤t_mv.mv[1], x0, y0, nPbW, nPbH);
1826 if ((s->sh.slice_type == P_SLICE && s->pps->weighted_pred_flag) ||
1827 (s->sh.slice_type == B_SLICE && s->pps->weighted_bipred_flag)) {
1828 s->hevcdsp.weighted_pred(s->sh.luma_log2_weight_denom,
1829 s->sh.luma_weight_l1[current_mv.ref_idx[1]],
1830 s->sh.luma_offset_l1[current_mv.ref_idx[1]],
1831 dst0, s->frame->linesize[0], tmp, tmpstride,
1834 s->hevcdsp.put_unweighted_pred(dst0, s->frame->linesize[0], tmp, tmpstride, nPbW, nPbH);
1837 chroma_mc(s, tmp, tmp2, tmpstride, ref1->frame,
1838 ¤t_mv.mv[1], x0/2, y0/2, nPbW/2, nPbH/2);
1840 if ((s->sh.slice_type == P_SLICE && s->pps->weighted_pred_flag) ||
1841 (s->sh.slice_type == B_SLICE && s->pps->weighted_bipred_flag)) {
1842 s->hevcdsp.weighted_pred(s->sh.chroma_log2_weight_denom,
1843 s->sh.chroma_weight_l1[current_mv.ref_idx[1]][0],
1844 s->sh.chroma_offset_l1[current_mv.ref_idx[1]][0],
1845 dst1, s->frame->linesize[1], tmp, tmpstride, nPbW/2, nPbH/2);
1846 s->hevcdsp.weighted_pred(s->sh.chroma_log2_weight_denom,
1847 s->sh.chroma_weight_l1[current_mv.ref_idx[1]][1],
1848 s->sh.chroma_offset_l1[current_mv.ref_idx[1]][1],
1849 dst2, s->frame->linesize[2], tmp2, tmpstride, nPbW/2, nPbH/2);
1851 s->hevcdsp.put_unweighted_pred(dst1, s->frame->linesize[1], tmp, tmpstride, nPbW/2, nPbH/2);
1852 s->hevcdsp.put_unweighted_pred(dst2, s->frame->linesize[2], tmp2, tmpstride, nPbW/2, nPbH/2);
1854 } else if (current_mv.pred_flag[0] && current_mv.pred_flag[1]) {
1855 DECLARE_ALIGNED(16, int16_t, tmp [MAX_PB_SIZE * MAX_PB_SIZE]);
1856 DECLARE_ALIGNED(16, int16_t, tmp2[MAX_PB_SIZE * MAX_PB_SIZE]);
1857 DECLARE_ALIGNED(16, int16_t, tmp3[MAX_PB_SIZE * MAX_PB_SIZE]);
1858 DECLARE_ALIGNED(16, int16_t, tmp4[MAX_PB_SIZE * MAX_PB_SIZE]);
1859 HEVCFrame *ref0 = refPicList[0].ref[current_mv.ref_idx[0]];
1860 HEVCFrame *ref1 = refPicList[1].ref[current_mv.ref_idx[1]];
1865 luma_mc(s, tmp, tmpstride, ref0->frame,
1866 ¤t_mv.mv[0], x0, y0, nPbW, nPbH);
1867 luma_mc(s, tmp2, tmpstride, ref1->frame,
1868 ¤t_mv.mv[1], x0, y0, nPbW, nPbH);
1870 if ((s->sh.slice_type == P_SLICE && s->pps->weighted_pred_flag) ||
1871 (s->sh.slice_type == B_SLICE && s->pps->weighted_bipred_flag)) {
1872 s->hevcdsp.weighted_pred_avg(s->sh.luma_log2_weight_denom,
1873 s->sh.luma_weight_l0[current_mv.ref_idx[0]],
1874 s->sh.luma_weight_l1[current_mv.ref_idx[1]],
1875 s->sh.luma_offset_l0[current_mv.ref_idx[0]],
1876 s->sh.luma_offset_l1[current_mv.ref_idx[1]],
1877 dst0, s->frame->linesize[0],
1878 tmp, tmp2, tmpstride, nPbW, nPbH);
1880 s->hevcdsp.put_weighted_pred_avg(dst0, s->frame->linesize[0],
1881 tmp, tmp2, tmpstride, nPbW, nPbH);
1884 chroma_mc(s, tmp, tmp2, tmpstride, ref0->frame,
1885 ¤t_mv.mv[0], x0 / 2, y0 / 2, nPbW / 2, nPbH / 2);
1886 chroma_mc(s, tmp3, tmp4, tmpstride, ref1->frame,
1887 ¤t_mv.mv[1], x0 / 2, y0 / 2, nPbW / 2, nPbH / 2);
1889 if ((s->sh.slice_type == P_SLICE && s->pps->weighted_pred_flag) ||
1890 (s->sh.slice_type == B_SLICE && s->pps->weighted_bipred_flag)) {
1891 s->hevcdsp.weighted_pred_avg(s->sh.chroma_log2_weight_denom,
1892 s->sh.chroma_weight_l0[current_mv.ref_idx[0]][0],
1893 s->sh.chroma_weight_l1[current_mv.ref_idx[1]][0],
1894 s->sh.chroma_offset_l0[current_mv.ref_idx[0]][0],
1895 s->sh.chroma_offset_l1[current_mv.ref_idx[1]][0],
1896 dst1, s->frame->linesize[1], tmp, tmp3,
1897 tmpstride, nPbW / 2, nPbH / 2);
1898 s->hevcdsp.weighted_pred_avg(s->sh.chroma_log2_weight_denom,
1899 s->sh.chroma_weight_l0[current_mv.ref_idx[0]][1],
1900 s->sh.chroma_weight_l1[current_mv.ref_idx[1]][1],
1901 s->sh.chroma_offset_l0[current_mv.ref_idx[0]][1],
1902 s->sh.chroma_offset_l1[current_mv.ref_idx[1]][1],
1903 dst2, s->frame->linesize[2], tmp2, tmp4,
1904 tmpstride, nPbW / 2, nPbH / 2);
1906 s->hevcdsp.put_weighted_pred_avg(dst1, s->frame->linesize[1], tmp, tmp3, tmpstride, nPbW/2, nPbH/2);
1907 s->hevcdsp.put_weighted_pred_avg(dst2, s->frame->linesize[2], tmp2, tmp4, tmpstride, nPbW/2, nPbH/2);
1915 static int luma_intra_pred_mode(HEVCContext *s, int x0, int y0, int pu_size,
1916 int prev_intra_luma_pred_flag)
1918 HEVCLocalContext *lc = &s->HEVClc;
1919 int x_pu = x0 >> s->sps->log2_min_pu_size;
1920 int y_pu = y0 >> s->sps->log2_min_pu_size;
1921 int min_pu_width = s->sps->min_pu_width;
1922 int size_in_pus = pu_size >> s->sps->log2_min_pu_size;
1923 int x0b = x0 & ((1 << s->sps->log2_ctb_size) - 1);
1924 int y0b = y0 & ((1 << s->sps->log2_ctb_size) - 1);
1926 int cand_up = (lc->ctb_up_flag || y0b) ?
1927 s->tab_ipm[(y_pu - 1) * min_pu_width + x_pu] : INTRA_DC;
1928 int cand_left = (lc->ctb_left_flag || x0b) ?
1929 s->tab_ipm[y_pu * min_pu_width + x_pu - 1] : INTRA_DC;
1931 int y_ctb = (y0 >> (s->sps->log2_ctb_size)) << (s->sps->log2_ctb_size);
1933 MvField *tab_mvf = s->ref->tab_mvf;
1934 int intra_pred_mode;
1938 // intra_pred_mode prediction does not cross vertical CTB boundaries
1939 if ((y0 - 1) < y_ctb)
1942 if (cand_left == cand_up) {
1943 if (cand_left < 2) {
1944 candidate[0] = INTRA_PLANAR;
1945 candidate[1] = INTRA_DC;
1946 candidate[2] = INTRA_ANGULAR_26;
1948 candidate[0] = cand_left;
1949 candidate[1] = 2 + ((cand_left - 2 - 1 + 32) & 31);
1950 candidate[2] = 2 + ((cand_left - 2 + 1) & 31);
1953 candidate[0] = cand_left;
1954 candidate[1] = cand_up;
1955 if (candidate[0] != INTRA_PLANAR && candidate[1] != INTRA_PLANAR) {
1956 candidate[2] = INTRA_PLANAR;
1957 } else if (candidate[0] != INTRA_DC && candidate[1] != INTRA_DC) {
1958 candidate[2] = INTRA_DC;
1960 candidate[2] = INTRA_ANGULAR_26;
1964 if (prev_intra_luma_pred_flag) {
1965 intra_pred_mode = candidate[lc->pu.mpm_idx];
1967 if (candidate[0] > candidate[1])
1968 FFSWAP(uint8_t, candidate[0], candidate[1]);
1969 if (candidate[0] > candidate[2])
1970 FFSWAP(uint8_t, candidate[0], candidate[2]);
1971 if (candidate[1] > candidate[2])
1972 FFSWAP(uint8_t, candidate[1], candidate[2]);
1974 intra_pred_mode = lc->pu.rem_intra_luma_pred_mode;
1975 for (i = 0; i < 3; i++)
1976 if (intra_pred_mode >= candidate[i])
1980 /* write the intra prediction units into the mv array */
1983 for (i = 0; i < size_in_pus; i++) {
1984 memset(&s->tab_ipm[(y_pu + i) * min_pu_width + x_pu],
1985 intra_pred_mode, size_in_pus);
1987 for (j = 0; j < size_in_pus; j++) {
1988 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].is_intra = 1;
1989 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].pred_flag[0] = 0;
1990 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].pred_flag[1] = 0;
1991 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].ref_idx[0] = 0;
1992 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].ref_idx[1] = 0;
1993 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].mv[0].x = 0;
1994 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].mv[0].y = 0;
1995 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].mv[1].x = 0;
1996 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].mv[1].y = 0;
2000 return intra_pred_mode;
2003 static av_always_inline void set_ct_depth(HEVCContext *s, int x0, int y0,
2004 int log2_cb_size, int ct_depth)
2006 int length = (1 << log2_cb_size) >> s->sps->log2_min_cb_size;
2007 int x_cb = x0 >> s->sps->log2_min_cb_size;
2008 int y_cb = y0 >> s->sps->log2_min_cb_size;
2011 for (y = 0; y < length; y++)
2012 memset(&s->tab_ct_depth[(y_cb + y) * s->sps->min_cb_width + x_cb],
2016 static void intra_prediction_unit(HEVCContext *s, int x0, int y0,
2019 HEVCLocalContext *lc = &s->HEVClc;
2020 static const uint8_t intra_chroma_table[4] = { 0, 26, 10, 1 };
2021 uint8_t prev_intra_luma_pred_flag[4];
2022 int split = lc->cu.part_mode == PART_NxN;
2023 int pb_size = (1 << log2_cb_size) >> split;
2024 int side = split + 1;
2028 for (i = 0; i < side; i++)
2029 for (j = 0; j < side; j++)
2030 prev_intra_luma_pred_flag[2 * i + j] = ff_hevc_prev_intra_luma_pred_flag_decode(s);
2032 for (i = 0; i < side; i++) {
2033 for (j = 0; j < side; j++) {
2034 if (prev_intra_luma_pred_flag[2 * i + j])
2035 lc->pu.mpm_idx = ff_hevc_mpm_idx_decode(s);
2037 lc->pu.rem_intra_luma_pred_mode = ff_hevc_rem_intra_luma_pred_mode_decode(s);
2039 lc->pu.intra_pred_mode[2 * i + j] =
2040 luma_intra_pred_mode(s, x0 + pb_size * j, y0 + pb_size * i, pb_size,
2041 prev_intra_luma_pred_flag[2 * i + j]);
2045 chroma_mode = ff_hevc_intra_chroma_pred_mode_decode(s);
2046 if (chroma_mode != 4) {
2047 if (lc->pu.intra_pred_mode[0] == intra_chroma_table[chroma_mode])
2048 lc->pu.intra_pred_mode_c = 34;
2050 lc->pu.intra_pred_mode_c = intra_chroma_table[chroma_mode];
2052 lc->pu.intra_pred_mode_c = lc->pu.intra_pred_mode[0];
2056 static void intra_prediction_unit_default_value(HEVCContext *s,
2060 HEVCLocalContext *lc = &s->HEVClc;
2061 int pb_size = 1 << log2_cb_size;
2062 int size_in_pus = pb_size >> s->sps->log2_min_pu_size;
2063 int min_pu_width = s->sps->min_pu_width;
2064 MvField *tab_mvf = s->ref->tab_mvf;
2065 int x_pu = x0 >> s->sps->log2_min_pu_size;
2066 int y_pu = y0 >> s->sps->log2_min_pu_size;
2069 if (size_in_pus == 0)
2071 for (j = 0; j < size_in_pus; j++) {
2072 memset(&s->tab_ipm[(y_pu + j) * min_pu_width + x_pu], INTRA_DC, size_in_pus);
2073 for (k = 0; k < size_in_pus; k++)
2074 tab_mvf[(y_pu + j) * min_pu_width + x_pu + k].is_intra = lc->cu.pred_mode == MODE_INTRA;
2078 static int hls_coding_unit(HEVCContext *s, int x0, int y0, int log2_cb_size)
2080 int cb_size = 1 << log2_cb_size;
2081 HEVCLocalContext *lc = &s->HEVClc;
2082 int log2_min_cb_size = s->sps->log2_min_cb_size;
2083 int length = cb_size >> log2_min_cb_size;
2084 int min_cb_width = s->sps->min_cb_width;
2085 int x_cb = x0 >> log2_min_cb_size;
2086 int y_cb = y0 >> log2_min_cb_size;
2091 lc->cu.rqt_root_cbf = 1;
2092 lc->cu.pred_mode = MODE_INTRA;
2093 lc->cu.part_mode = PART_2Nx2N;
2094 lc->cu.intra_split_flag = 0;
2095 lc->cu.pcm_flag = 0;
2097 SAMPLE_CTB(s->skip_flag, x_cb, y_cb) = 0;
2098 for (x = 0; x < 4; x++)
2099 lc->pu.intra_pred_mode[x] = 1;
2100 if (s->pps->transquant_bypass_enable_flag) {
2101 lc->cu.cu_transquant_bypass_flag = ff_hevc_cu_transquant_bypass_flag_decode(s);
2102 if (lc->cu.cu_transquant_bypass_flag)
2103 set_deblocking_bypass(s, x0, y0, log2_cb_size);
2105 lc->cu.cu_transquant_bypass_flag = 0;
2107 if (s->sh.slice_type != I_SLICE) {
2108 uint8_t skip_flag = ff_hevc_skip_flag_decode(s, x0, y0, x_cb, y_cb);
2110 lc->cu.pred_mode = MODE_SKIP;
2111 x = y_cb * min_cb_width + x_cb;
2112 for (y = 0; y < length; y++) {
2113 memset(&s->skip_flag[x], skip_flag, length);
2116 lc->cu.pred_mode = skip_flag ? MODE_SKIP : MODE_INTER;
2119 if (SAMPLE_CTB(s->skip_flag, x_cb, y_cb)) {
2120 hls_prediction_unit(s, x0, y0, cb_size, cb_size, log2_cb_size, 0);
2121 intra_prediction_unit_default_value(s, x0, y0, log2_cb_size);
2123 if (!s->sh.disable_deblocking_filter_flag)
2124 ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_cb_size,
2125 lc->slice_or_tiles_up_boundary,
2126 lc->slice_or_tiles_left_boundary);
2128 if (s->sh.slice_type != I_SLICE)
2129 lc->cu.pred_mode = ff_hevc_pred_mode_decode(s);
2130 if (lc->cu.pred_mode != MODE_INTRA ||
2131 log2_cb_size == s->sps->log2_min_cb_size) {
2132 lc->cu.part_mode = ff_hevc_part_mode_decode(s, log2_cb_size);
2133 lc->cu.intra_split_flag = lc->cu.part_mode == PART_NxN &&
2134 lc->cu.pred_mode == MODE_INTRA;
2137 if (lc->cu.pred_mode == MODE_INTRA) {
2138 if (lc->cu.part_mode == PART_2Nx2N && s->sps->pcm_enabled_flag &&
2139 log2_cb_size >= s->sps->pcm.log2_min_pcm_cb_size &&
2140 log2_cb_size <= s->sps->pcm.log2_max_pcm_cb_size) {
2141 lc->cu.pcm_flag = ff_hevc_pcm_flag_decode(s);
2143 if (lc->cu.pcm_flag) {
2144 intra_prediction_unit_default_value(s, x0, y0, log2_cb_size);
2145 ret = hls_pcm_sample(s, x0, y0, log2_cb_size);
2146 if (s->sps->pcm.loop_filter_disable_flag)
2147 set_deblocking_bypass(s, x0, y0, log2_cb_size);
2152 intra_prediction_unit(s, x0, y0, log2_cb_size);
2155 intra_prediction_unit_default_value(s, x0, y0, log2_cb_size);
2156 switch (lc->cu.part_mode) {
2158 hls_prediction_unit(s, x0, y0, cb_size, cb_size, log2_cb_size, 0);
2161 hls_prediction_unit(s, x0, y0, cb_size, cb_size / 2, log2_cb_size, 0);
2162 hls_prediction_unit(s, x0, y0 + cb_size / 2, cb_size, cb_size / 2, log2_cb_size, 1);
2165 hls_prediction_unit(s, x0, y0, cb_size / 2, cb_size, log2_cb_size, 0);
2166 hls_prediction_unit(s, x0 + cb_size / 2, y0, cb_size / 2, cb_size, log2_cb_size, 1);
2169 hls_prediction_unit(s, x0, y0, cb_size, cb_size / 4, log2_cb_size, 0);
2170 hls_prediction_unit(s, x0, y0 + cb_size / 4, cb_size, cb_size * 3 / 4, log2_cb_size, 1);
2173 hls_prediction_unit(s, x0, y0, cb_size, cb_size * 3 / 4, log2_cb_size, 0);
2174 hls_prediction_unit(s, x0, y0 + cb_size * 3 / 4, cb_size, cb_size / 4, log2_cb_size, 1);
2177 hls_prediction_unit(s, x0, y0, cb_size / 4, cb_size, log2_cb_size, 0);
2178 hls_prediction_unit(s, x0 + cb_size / 4, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 1);
2181 hls_prediction_unit(s, x0, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 0);
2182 hls_prediction_unit(s, x0 + cb_size * 3 / 4, y0, cb_size / 4, cb_size, log2_cb_size, 1);
2185 hls_prediction_unit(s, x0, y0, cb_size / 2, cb_size / 2, log2_cb_size, 0);
2186 hls_prediction_unit(s, x0 + cb_size / 2, y0, cb_size / 2, cb_size / 2, log2_cb_size, 1);
2187 hls_prediction_unit(s, x0, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 2);
2188 hls_prediction_unit(s, x0 + cb_size / 2, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 3);
2193 if (!lc->cu.pcm_flag) {
2194 if (lc->cu.pred_mode != MODE_INTRA &&
2195 !(lc->cu.part_mode == PART_2Nx2N && lc->pu.merge_flag)) {
2196 lc->cu.rqt_root_cbf = ff_hevc_no_residual_syntax_flag_decode(s);
2198 if (lc->cu.rqt_root_cbf) {
2199 lc->cu.max_trafo_depth = lc->cu.pred_mode == MODE_INTRA ?
2200 s->sps->max_transform_hierarchy_depth_intra + lc->cu.intra_split_flag :
2201 s->sps->max_transform_hierarchy_depth_inter;
2202 ret = hls_transform_tree(s, x0, y0, x0, y0, x0, y0,
2204 log2_cb_size, 0, 0);
2208 if (!s->sh.disable_deblocking_filter_flag)
2209 ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_cb_size,
2210 lc->slice_or_tiles_up_boundary,
2211 lc->slice_or_tiles_left_boundary);
2216 if (s->pps->cu_qp_delta_enabled_flag && lc->tu.is_cu_qp_delta_coded == 0)
2217 ff_hevc_set_qPy(s, x0, y0, x0, y0, log2_cb_size);
2219 x = y_cb * min_cb_width + x_cb;
2220 for (y = 0; y < length; y++) {
2221 memset(&s->qp_y_tab[x], lc->qp_y, length);
2225 set_ct_depth(s, x0, y0, log2_cb_size, lc->ct.depth);
2230 static int hls_coding_quadtree(HEVCContext *s, int x0, int y0,
2231 int log2_cb_size, int cb_depth)
2233 HEVCLocalContext *lc = &s->HEVClc;
2234 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 SAMPLE(s->split_cu_flag, x0, y0) =
2241 ff_hevc_split_coding_unit_flag_decode(s, cb_depth, x0, y0);
2243 SAMPLE(s->split_cu_flag, x0, y0) =
2244 (log2_cb_size > s->sps->log2_min_cb_size);
2246 if (s->pps->cu_qp_delta_enabled_flag &&
2247 log2_cb_size >= s->sps->log2_ctb_size - s->pps->diff_cu_qp_delta_depth) {
2248 lc->tu.is_cu_qp_delta_coded = 0;
2249 lc->tu.cu_qp_delta = 0;
2252 if (SAMPLE(s->split_cu_flag, x0, y0)) {
2253 const int cb_size_split = cb_size >> 1;
2254 const int x1 = x0 + cb_size_split;
2255 const int y1 = y0 + cb_size_split;
2260 #define SUBDIVIDE(x, y) \
2262 if (x < s->sps->width && y < s->sps->height) { \
2263 int ret = hls_coding_quadtree(s, x, y, log2_cb_size, cb_depth);\
2274 int ret = hls_coding_unit(s, x0, y0, log2_cb_size);
2282 static void hls_decode_neighbour(HEVCContext *s, int x_ctb, int y_ctb,
2285 HEVCLocalContext *lc = &s->HEVClc;
2286 int ctb_size = 1 << s->sps->log2_ctb_size;
2287 int ctb_addr_rs = s->pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2288 int ctb_addr_in_slice = ctb_addr_rs - s->sh.slice_addr;
2290 int tile_left_boundary, tile_up_boundary;
2291 int slice_left_boundary, slice_up_boundary;
2293 s->tab_slice_address[ctb_addr_rs] = s->sh.slice_addr;
2295 if (s->pps->entropy_coding_sync_enabled_flag) {
2296 if (x_ctb == 0 && (y_ctb & (ctb_size - 1)) == 0)
2297 lc->first_qp_group = 1;
2298 lc->end_of_tiles_x = s->sps->width;
2299 } else if (s->pps->tiles_enabled_flag) {
2300 if (ctb_addr_ts && s->pps->tile_id[ctb_addr_ts] != s->pps->tile_id[ctb_addr_ts - 1]) {
2301 int idxX = s->pps->col_idxX[x_ctb >> s->sps->log2_ctb_size];
2302 lc->start_of_tiles_x = x_ctb;
2303 lc->end_of_tiles_x = x_ctb + (s->pps->column_width[idxX] << s->sps->log2_ctb_size);
2304 lc->first_qp_group = 1;
2307 lc->end_of_tiles_x = s->sps->width;
2310 lc->end_of_tiles_y = FFMIN(y_ctb + ctb_size, s->sps->height);
2312 if (s->pps->tiles_enabled_flag) {
2313 tile_left_boundary = x_ctb > 0 &&
2314 s->pps->tile_id[ctb_addr_ts] == s->pps->tile_id[s->pps->ctb_addr_rs_to_ts[ctb_addr_rs - 1]];
2315 slice_left_boundary = x_ctb > 0 &&
2316 s->tab_slice_address[ctb_addr_rs] == s->tab_slice_address[ctb_addr_rs - 1];
2317 tile_up_boundary = y_ctb > 0 &&
2318 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]];
2319 slice_up_boundary = y_ctb > 0 &&
2320 s->tab_slice_address[ctb_addr_rs] == s->tab_slice_address[ctb_addr_rs - s->sps->ctb_width];
2322 tile_left_boundary =
2323 tile_up_boundary = 1;
2324 slice_left_boundary = ctb_addr_in_slice > 0;
2325 slice_up_boundary = ctb_addr_in_slice >= s->sps->ctb_width;
2327 lc->slice_or_tiles_left_boundary = (!slice_left_boundary) + (!tile_left_boundary << 1);
2328 lc->slice_or_tiles_up_boundary = (!slice_up_boundary + (!tile_up_boundary << 1));
2329 lc->ctb_left_flag = ((x_ctb > 0) && (ctb_addr_in_slice > 0) && tile_left_boundary);
2330 lc->ctb_up_flag = ((y_ctb > 0) && (ctb_addr_in_slice >= s->sps->ctb_width) && tile_up_boundary);
2331 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]]));
2332 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]]));
2335 static int hls_slice_data(HEVCContext *s)
2337 int ctb_size = 1 << s->sps->log2_ctb_size;
2341 int ctb_addr_ts = s->pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs];
2344 while (more_data && ctb_addr_ts < s->sps->ctb_size) {
2345 int ctb_addr_rs = s->pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2347 x_ctb = (ctb_addr_rs % ((s->sps->width + ctb_size - 1) >> s->sps->log2_ctb_size)) << s->sps->log2_ctb_size;
2348 y_ctb = (ctb_addr_rs / ((s->sps->width + ctb_size - 1) >> s->sps->log2_ctb_size)) << s->sps->log2_ctb_size;
2349 hls_decode_neighbour(s, x_ctb, y_ctb, ctb_addr_ts);
2351 ff_hevc_cabac_init(s, ctb_addr_ts);
2353 hls_sao_param(s, x_ctb >> s->sps->log2_ctb_size, y_ctb >> s->sps->log2_ctb_size);
2355 s->deblock[ctb_addr_rs].beta_offset = s->sh.beta_offset;
2356 s->deblock[ctb_addr_rs].tc_offset = s->sh.tc_offset;
2357 s->filter_slice_edges[ctb_addr_rs] = s->sh.slice_loop_filter_across_slices_enabled_flag;
2359 ret = hls_coding_quadtree(s, x_ctb, y_ctb, s->sps->log2_ctb_size, 0);
2362 more_data = !ff_hevc_end_of_slice_flag_decode(s);
2365 ff_hevc_save_states(s, ctb_addr_ts);
2366 ff_hevc_hls_filters(s, x_ctb, y_ctb, ctb_size);
2369 if (x_ctb + ctb_size >= s->sps->width &&
2370 y_ctb + ctb_size >= s->sps->height)
2371 ff_hevc_hls_filter(s, x_ctb, y_ctb);
2377 * @return AVERROR_INVALIDDATA if the packet is not a valid NAL unit,
2378 * 0 if the unit should be skipped, 1 otherwise
2380 static int hls_nal_unit(HEVCContext *s)
2382 GetBitContext *gb = &s->HEVClc.gb;
2385 if (get_bits1(gb) != 0)
2386 return AVERROR_INVALIDDATA;
2388 s->nal_unit_type = get_bits(gb, 6);
2390 nuh_layer_id = get_bits(gb, 6);
2391 s->temporal_id = get_bits(gb, 3) - 1;
2392 if (s->temporal_id < 0)
2393 return AVERROR_INVALIDDATA;
2395 av_log(s->avctx, AV_LOG_DEBUG,
2396 "nal_unit_type: %d, nuh_layer_id: %dtemporal_id: %d\n",
2397 s->nal_unit_type, nuh_layer_id, s->temporal_id);
2399 return nuh_layer_id == 0;
2402 static void restore_tqb_pixels(HEVCContext *s)
2404 int min_pu_size = 1 << s->sps->log2_min_pu_size;
2407 for (c_idx = 0; c_idx < 3; c_idx++) {
2408 ptrdiff_t stride = s->frame->linesize[c_idx];
2409 int hshift = s->sps->hshift[c_idx];
2410 int vshift = s->sps->vshift[c_idx];
2411 for (y = 0; y < s->sps->min_pu_height; y++) {
2412 for (x = 0; x < s->sps->min_pu_width; x++) {
2413 if (s->is_pcm[y * s->sps->min_pu_width + x]) {
2415 int len = min_pu_size >> hshift;
2416 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)];
2417 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)];
2418 for (n = 0; n < (min_pu_size >> vshift); n++) {
2419 memcpy(dst, src, len);
2429 static int set_side_data(HEVCContext *s)
2431 AVFrame *out = s->ref->frame;
2433 if (s->sei_frame_packing_present &&
2434 s->frame_packing_arrangement_type >= 3 &&
2435 s->frame_packing_arrangement_type <= 5 &&
2436 s->content_interpretation_type > 0 &&
2437 s->content_interpretation_type < 3) {
2438 AVStereo3D *stereo = av_stereo3d_create_side_data(out);
2440 return AVERROR(ENOMEM);
2442 switch (s->frame_packing_arrangement_type) {
2444 if (s->quincunx_subsampling)
2445 stereo->type = AV_STEREO3D_SIDEBYSIDE_QUINCUNX;
2447 stereo->type = AV_STEREO3D_SIDEBYSIDE;
2450 stereo->type = AV_STEREO3D_TOPBOTTOM;
2453 stereo->type = AV_STEREO3D_FRAMESEQUENCE;
2457 if (s->content_interpretation_type == 2)
2458 stereo->flags = AV_STEREO3D_FLAG_INVERT;
2461 if (s->sei_display_orientation_present &&
2462 (s->sei_anticlockwise_rotation || s->sei_hflip || s->sei_vflip)) {
2463 double angle = s->sei_anticlockwise_rotation * 360 / (double) (1 << 16);
2464 AVFrameSideData *rotation = av_frame_new_side_data(out,
2465 AV_FRAME_DATA_DISPLAYMATRIX,
2466 sizeof(int32_t) * 9);
2468 return AVERROR(ENOMEM);
2470 av_display_rotation_set((int32_t *)rotation->data, angle);
2471 av_display_matrix_flip((int32_t *)rotation->data,
2472 s->sei_vflip, s->sei_hflip);
2478 static int hevc_frame_start(HEVCContext *s)
2480 HEVCLocalContext *lc = &s->HEVClc;
2483 memset(s->horizontal_bs, 0, 2 * s->bs_width * (s->bs_height + 1));
2484 memset(s->vertical_bs, 0, 2 * s->bs_width * (s->bs_height + 1));
2485 memset(s->cbf_luma, 0, s->sps->min_tb_width * s->sps->min_tb_height);
2486 memset(s->is_pcm, 0, s->sps->min_pu_width * s->sps->min_pu_height);
2488 lc->start_of_tiles_x = 0;
2490 s->first_nal_type = s->nal_unit_type;
2492 if (s->pps->tiles_enabled_flag)
2493 lc->end_of_tiles_x = s->pps->column_width[0] << s->sps->log2_ctb_size;
2495 ret = ff_hevc_set_new_ref(s, s->sps->sao_enabled ? &s->sao_frame : &s->frame,
2500 ret = ff_hevc_frame_rps(s);
2502 av_log(s->avctx, AV_LOG_ERROR, "Error constructing the frame RPS.\n");
2506 s->ref->frame->key_frame = IS_IRAP(s);
2508 ret = set_side_data(s);
2512 av_frame_unref(s->output_frame);
2513 ret = ff_hevc_output_frame(s, s->output_frame, 0);
2517 ff_thread_finish_setup(s->avctx);
2523 ff_thread_report_progress(&s->ref->tf, INT_MAX, 0);
2528 static int decode_nal_unit(HEVCContext *s, const uint8_t *nal, int length)
2530 HEVCLocalContext *lc = &s->HEVClc;
2531 GetBitContext *gb = &lc->gb;
2532 int ctb_addr_ts, ret;
2534 ret = init_get_bits8(gb, nal, length);
2538 ret = hls_nal_unit(s);
2540 av_log(s->avctx, AV_LOG_ERROR, "Invalid NAL unit %d, skipping.\n",
2546 switch (s->nal_unit_type) {
2548 ret = ff_hevc_decode_nal_vps(s);
2553 ret = ff_hevc_decode_nal_sps(s);
2558 ret = ff_hevc_decode_nal_pps(s);
2562 case NAL_SEI_PREFIX:
2563 case NAL_SEI_SUFFIX:
2564 ret = ff_hevc_decode_nal_sei(s);
2575 case NAL_BLA_W_RADL:
2577 case NAL_IDR_W_RADL:
2584 ret = hls_slice_header(s);
2588 if (s->max_ra == INT_MAX) {
2589 if (s->nal_unit_type == NAL_CRA_NUT || IS_BLA(s)) {
2593 s->max_ra = INT_MIN;
2597 if ((s->nal_unit_type == NAL_RASL_R || s->nal_unit_type == NAL_RASL_N) &&
2598 s->poc <= s->max_ra) {
2602 if (s->nal_unit_type == NAL_RASL_R && s->poc > s->max_ra)
2603 s->max_ra = INT_MIN;
2606 if (s->sh.first_slice_in_pic_flag) {
2607 ret = hevc_frame_start(s);
2610 } else if (!s->ref) {
2611 av_log(s->avctx, AV_LOG_ERROR, "First slice in a frame missing.\n");
2615 if (s->nal_unit_type != s->first_nal_type) {
2616 av_log(s->avctx, AV_LOG_ERROR,
2617 "Non-matching NAL types of the VCL NALUs: %d %d\n",
2618 s->first_nal_type, s->nal_unit_type);
2619 return AVERROR_INVALIDDATA;
2622 if (!s->sh.dependent_slice_segment_flag &&
2623 s->sh.slice_type != I_SLICE) {
2624 ret = ff_hevc_slice_rpl(s);
2626 av_log(s->avctx, AV_LOG_WARNING,
2627 "Error constructing the reference lists for the current slice.\n");
2632 ctb_addr_ts = hls_slice_data(s);
2633 if (ctb_addr_ts >= (s->sps->ctb_width * s->sps->ctb_height)) {
2635 if ((s->pps->transquant_bypass_enable_flag ||
2636 (s->sps->pcm.loop_filter_disable_flag && s->sps->pcm_enabled_flag)) &&
2637 s->sps->sao_enabled)
2638 restore_tqb_pixels(s);
2641 if (ctb_addr_ts < 0) {
2648 s->seq_decode = (s->seq_decode + 1) & 0xff;
2649 s->max_ra = INT_MAX;
2655 av_log(s->avctx, AV_LOG_INFO,
2656 "Skipping NAL unit %d\n", s->nal_unit_type);
2661 if (s->avctx->err_recognition & AV_EF_EXPLODE)
2666 /* FIXME: This is adapted from ff_h264_decode_nal, avoiding duplication
2667 * between these functions would be nice. */
2668 static int extract_rbsp(const uint8_t *src, int length,
2674 #define STARTCODE_TEST \
2675 if (i + 2 < length && src[i + 1] == 0 && src[i + 2] <= 3) { \
2676 if (src[i + 2] != 3) { \
2677 /* startcode, so we must be past the end */ \
2682 #if HAVE_FAST_UNALIGNED
2683 #define FIND_FIRST_ZERO \
2684 if (i > 0 && !src[i]) \
2689 for (i = 0; i + 1 < length; i += 9) {
2690 if (!((~AV_RN64A(src + i) &
2691 (AV_RN64A(src + i) - 0x0100010001000101ULL)) &
2692 0x8000800080008080ULL))
2699 for (i = 0; i + 1 < length; i += 5) {
2700 if (!((~AV_RN32A(src + i) &
2701 (AV_RN32A(src + i) - 0x01000101U)) &
2708 #endif /* HAVE_FAST_64BIT */
2710 for (i = 0; i + 1 < length; i += 2) {
2713 if (i > 0 && src[i - 1] == 0)
2717 #endif /* HAVE_FAST_UNALIGNED */
2719 if (i >= length - 1) { // no escaped 0
2725 av_fast_malloc(&nal->rbsp_buffer, &nal->rbsp_buffer_size,
2726 length + FF_INPUT_BUFFER_PADDING_SIZE);
2727 if (!nal->rbsp_buffer)
2728 return AVERROR(ENOMEM);
2730 dst = nal->rbsp_buffer;
2732 memcpy(dst, src, i);
2734 while (si + 2 < length) {
2735 // remove escapes (very rare 1:2^22)
2736 if (src[si + 2] > 3) {
2737 dst[di++] = src[si++];
2738 dst[di++] = src[si++];
2739 } else if (src[si] == 0 && src[si + 1] == 0) {
2740 if (src[si + 2] == 3) { // escape
2746 } else // next start code
2750 dst[di++] = src[si++];
2753 dst[di++] = src[si++];
2756 memset(dst + di, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2763 static int decode_nal_units(HEVCContext *s, const uint8_t *buf, int length)
2765 int i, consumed, ret = 0;
2770 /* split the input packet into NAL units, so we know the upper bound on the
2771 * number of slices in the frame */
2773 while (length >= 4) {
2775 int extract_length = 0;
2779 for (i = 0; i < s->nal_length_size; i++)
2780 extract_length = (extract_length << 8) | buf[i];
2781 buf += s->nal_length_size;
2782 length -= s->nal_length_size;
2784 if (extract_length > length) {
2785 av_log(s->avctx, AV_LOG_ERROR, "Invalid NAL unit size.\n");
2786 ret = AVERROR_INVALIDDATA;
2795 if (buf[0] != 0 || buf[1] != 0 || buf[2] != 1) {
2796 ret = AVERROR_INVALIDDATA;
2802 extract_length = length;
2805 if (s->nals_allocated < s->nb_nals + 1) {
2806 int new_size = s->nals_allocated + 1;
2807 HEVCNAL *tmp = av_realloc_array(s->nals, new_size, sizeof(*tmp));
2809 ret = AVERROR(ENOMEM);
2813 memset(s->nals + s->nals_allocated, 0,
2814 (new_size - s->nals_allocated) * sizeof(*tmp));
2815 s->nals_allocated = new_size;
2817 nal = &s->nals[s->nb_nals++];
2819 consumed = extract_rbsp(buf, extract_length, nal);
2825 ret = init_get_bits8(&s->HEVClc.gb, nal->data, nal->size);
2830 if (s->nal_unit_type == NAL_EOB_NUT ||
2831 s->nal_unit_type == NAL_EOS_NUT)
2838 /* parse the NAL units */
2839 for (i = 0; i < s->nb_nals; i++) {
2840 int ret = decode_nal_unit(s, s->nals[i].data, s->nals[i].size);
2842 av_log(s->avctx, AV_LOG_WARNING,
2843 "Error parsing NAL unit #%d.\n", i);
2850 ff_thread_report_progress(&s->ref->tf, INT_MAX, 0);
2855 static void print_md5(void *log_ctx, int level, uint8_t md5[16])
2858 for (i = 0; i < 16; i++)
2859 av_log(log_ctx, level, "%02"PRIx8, md5[i]);
2862 static int verify_md5(HEVCContext *s, AVFrame *frame)
2864 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format);
2869 return AVERROR(EINVAL);
2871 pixel_shift = desc->comp[0].depth_minus1 > 7;
2873 av_log(s->avctx, AV_LOG_DEBUG, "Verifying checksum for frame with POC %d: ",
2876 /* the checksums are LE, so we have to byteswap for >8bpp formats
2879 if (pixel_shift && !s->checksum_buf) {
2880 av_fast_malloc(&s->checksum_buf, &s->checksum_buf_size,
2881 FFMAX3(frame->linesize[0], frame->linesize[1],
2882 frame->linesize[2]));
2883 if (!s->checksum_buf)
2884 return AVERROR(ENOMEM);
2888 for (i = 0; frame->data[i]; i++) {
2889 int width = s->avctx->coded_width;
2890 int height = s->avctx->coded_height;
2891 int w = (i == 1 || i == 2) ? (width >> desc->log2_chroma_w) : width;
2892 int h = (i == 1 || i == 2) ? (height >> desc->log2_chroma_h) : height;
2895 av_md5_init(s->md5_ctx);
2896 for (j = 0; j < h; j++) {
2897 const uint8_t *src = frame->data[i] + j * frame->linesize[i];
2900 s->bdsp.bswap16_buf((uint16_t *) s->checksum_buf,
2901 (const uint16_t *) src, w);
2902 src = s->checksum_buf;
2905 av_md5_update(s->md5_ctx, src, w << pixel_shift);
2907 av_md5_final(s->md5_ctx, md5);
2909 if (!memcmp(md5, s->md5[i], 16)) {
2910 av_log (s->avctx, AV_LOG_DEBUG, "plane %d - correct ", i);
2911 print_md5(s->avctx, AV_LOG_DEBUG, md5);
2912 av_log (s->avctx, AV_LOG_DEBUG, "; ");
2914 av_log (s->avctx, AV_LOG_ERROR, "mismatching checksum of plane %d - ", i);
2915 print_md5(s->avctx, AV_LOG_ERROR, md5);
2916 av_log (s->avctx, AV_LOG_ERROR, " != ");
2917 print_md5(s->avctx, AV_LOG_ERROR, s->md5[i]);
2918 av_log (s->avctx, AV_LOG_ERROR, "\n");
2919 return AVERROR_INVALIDDATA;
2923 av_log(s->avctx, AV_LOG_DEBUG, "\n");
2928 static int hevc_decode_frame(AVCodecContext *avctx, void *data, int *got_output,
2932 HEVCContext *s = avctx->priv_data;
2935 ret = ff_hevc_output_frame(s, data, 1);
2944 ret = decode_nal_units(s, avpkt->data, avpkt->size);
2948 /* verify the SEI checksum */
2949 if (avctx->err_recognition & AV_EF_CRCCHECK && s->is_decoded &&
2951 ret = verify_md5(s, s->ref->frame);
2952 if (ret < 0 && avctx->err_recognition & AV_EF_EXPLODE) {
2953 ff_hevc_unref_frame(s, s->ref, ~0);
2959 if (s->is_decoded) {
2960 av_log(avctx, AV_LOG_DEBUG, "Decoded frame with POC %d.\n", s->poc);
2964 if (s->output_frame->buf[0]) {
2965 av_frame_move_ref(data, s->output_frame);
2972 static int hevc_ref_frame(HEVCContext *s, HEVCFrame *dst, HEVCFrame *src)
2974 int ret = ff_thread_ref_frame(&dst->tf, &src->tf);
2978 dst->tab_mvf_buf = av_buffer_ref(src->tab_mvf_buf);
2979 if (!dst->tab_mvf_buf)
2981 dst->tab_mvf = src->tab_mvf;
2983 dst->rpl_tab_buf = av_buffer_ref(src->rpl_tab_buf);
2984 if (!dst->rpl_tab_buf)
2986 dst->rpl_tab = src->rpl_tab;
2988 dst->rpl_buf = av_buffer_ref(src->rpl_buf);
2992 dst->poc = src->poc;
2993 dst->ctb_count = src->ctb_count;
2994 dst->window = src->window;
2995 dst->flags = src->flags;
2996 dst->sequence = src->sequence;
3000 ff_hevc_unref_frame(s, dst, ~0);
3001 return AVERROR(ENOMEM);
3004 static av_cold int hevc_decode_free(AVCodecContext *avctx)
3006 HEVCContext *s = avctx->priv_data;
3011 av_freep(&s->md5_ctx);
3013 av_frame_free(&s->tmp_frame);
3014 av_frame_free(&s->output_frame);
3016 for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
3017 ff_hevc_unref_frame(s, &s->DPB[i], ~0);
3018 av_frame_free(&s->DPB[i].frame);
3021 for (i = 0; i < FF_ARRAY_ELEMS(s->vps_list); i++)
3022 av_buffer_unref(&s->vps_list[i]);
3023 for (i = 0; i < FF_ARRAY_ELEMS(s->sps_list); i++)
3024 av_buffer_unref(&s->sps_list[i]);
3025 for (i = 0; i < FF_ARRAY_ELEMS(s->pps_list); i++)
3026 av_buffer_unref(&s->pps_list[i]);
3028 for (i = 0; i < s->nals_allocated; i++)
3029 av_freep(&s->nals[i].rbsp_buffer);
3031 s->nals_allocated = 0;
3036 static av_cold int hevc_init_context(AVCodecContext *avctx)
3038 HEVCContext *s = avctx->priv_data;
3043 s->tmp_frame = av_frame_alloc();
3047 s->output_frame = av_frame_alloc();
3048 if (!s->output_frame)
3051 for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
3052 s->DPB[i].frame = av_frame_alloc();
3053 if (!s->DPB[i].frame)
3055 s->DPB[i].tf.f = s->DPB[i].frame;
3058 s->max_ra = INT_MAX;
3060 s->md5_ctx = av_md5_alloc();
3064 ff_bswapdsp_init(&s->bdsp);
3066 s->context_initialized = 1;
3071 hevc_decode_free(avctx);
3072 return AVERROR(ENOMEM);
3075 static int hevc_update_thread_context(AVCodecContext *dst,
3076 const AVCodecContext *src)
3078 HEVCContext *s = dst->priv_data;
3079 HEVCContext *s0 = src->priv_data;
3082 if (!s->context_initialized) {
3083 ret = hevc_init_context(dst);
3088 for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
3089 ff_hevc_unref_frame(s, &s->DPB[i], ~0);
3090 if (s0->DPB[i].frame->buf[0]) {
3091 ret = hevc_ref_frame(s, &s->DPB[i], &s0->DPB[i]);
3097 for (i = 0; i < FF_ARRAY_ELEMS(s->vps_list); i++) {
3098 av_buffer_unref(&s->vps_list[i]);
3099 if (s0->vps_list[i]) {
3100 s->vps_list[i] = av_buffer_ref(s0->vps_list[i]);
3101 if (!s->vps_list[i])
3102 return AVERROR(ENOMEM);
3106 for (i = 0; i < FF_ARRAY_ELEMS(s->sps_list); i++) {
3107 av_buffer_unref(&s->sps_list[i]);
3108 if (s0->sps_list[i]) {
3109 s->sps_list[i] = av_buffer_ref(s0->sps_list[i]);
3110 if (!s->sps_list[i])
3111 return AVERROR(ENOMEM);
3115 for (i = 0; i < FF_ARRAY_ELEMS(s->pps_list); i++) {
3116 av_buffer_unref(&s->pps_list[i]);
3117 if (s0->pps_list[i]) {
3118 s->pps_list[i] = av_buffer_ref(s0->pps_list[i]);
3119 if (!s->pps_list[i])
3120 return AVERROR(ENOMEM);
3124 if (s->sps != s0->sps)
3125 ret = set_sps(s, s0->sps);
3127 s->seq_decode = s0->seq_decode;
3128 s->seq_output = s0->seq_output;
3129 s->pocTid0 = s0->pocTid0;
3130 s->max_ra = s0->max_ra;
3132 s->is_nalff = s0->is_nalff;
3133 s->nal_length_size = s0->nal_length_size;
3136 s->seq_decode = (s->seq_decode + 1) & 0xff;
3137 s->max_ra = INT_MAX;
3143 static int hevc_decode_extradata(HEVCContext *s)
3145 AVCodecContext *avctx = s->avctx;
3149 bytestream2_init(&gb, avctx->extradata, avctx->extradata_size);
3151 if (avctx->extradata_size > 3 &&
3152 (avctx->extradata[0] || avctx->extradata[1] ||
3153 avctx->extradata[2] > 1)) {
3154 /* It seems the extradata is encoded as hvcC format.
3155 * Temporarily, we support configurationVersion==0 until 14496-15 3rd
3156 * is finalized. When finalized, configurationVersion will be 1 and we
3157 * can recognize hvcC by checking if avctx->extradata[0]==1 or not. */
3158 int i, j, num_arrays, nal_len_size;
3162 bytestream2_skip(&gb, 21);
3163 nal_len_size = (bytestream2_get_byte(&gb) & 3) + 1;
3164 num_arrays = bytestream2_get_byte(&gb);
3166 /* nal units in the hvcC always have length coded with 2 bytes,
3167 * so put a fake nal_length_size = 2 while parsing them */
3168 s->nal_length_size = 2;
3170 /* Decode nal units from hvcC. */
3171 for (i = 0; i < num_arrays; i++) {
3172 int type = bytestream2_get_byte(&gb) & 0x3f;
3173 int cnt = bytestream2_get_be16(&gb);
3175 for (j = 0; j < cnt; j++) {
3176 // +2 for the nal size field
3177 int nalsize = bytestream2_peek_be16(&gb) + 2;
3178 if (bytestream2_get_bytes_left(&gb) < nalsize) {
3179 av_log(s->avctx, AV_LOG_ERROR,
3180 "Invalid NAL unit size in extradata.\n");
3181 return AVERROR_INVALIDDATA;
3184 ret = decode_nal_units(s, gb.buffer, nalsize);
3186 av_log(avctx, AV_LOG_ERROR,
3187 "Decoding nal unit %d %d from hvcC failed\n",
3191 bytestream2_skip(&gb, nalsize);
3195 /* Now store right nal length size, that will be used to parse
3197 s->nal_length_size = nal_len_size;
3200 ret = decode_nal_units(s, avctx->extradata, avctx->extradata_size);
3207 static av_cold int hevc_decode_init(AVCodecContext *avctx)
3209 HEVCContext *s = avctx->priv_data;
3212 ff_init_cabac_states();
3214 avctx->internal->allocate_progress = 1;
3216 ret = hevc_init_context(avctx);
3220 if (avctx->extradata_size > 0 && avctx->extradata) {
3221 ret = hevc_decode_extradata(s);
3223 hevc_decode_free(avctx);
3231 static av_cold int hevc_init_thread_copy(AVCodecContext *avctx)
3233 HEVCContext *s = avctx->priv_data;
3236 memset(s, 0, sizeof(*s));
3238 ret = hevc_init_context(avctx);
3245 static void hevc_decode_flush(AVCodecContext *avctx)
3247 HEVCContext *s = avctx->priv_data;
3248 ff_hevc_flush_dpb(s);
3249 s->max_ra = INT_MAX;
3252 #define OFFSET(x) offsetof(HEVCContext, x)
3253 #define PAR (AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
3255 static const AVProfile profiles[] = {
3256 { FF_PROFILE_HEVC_MAIN, "Main" },
3257 { FF_PROFILE_HEVC_MAIN_10, "Main 10" },
3258 { FF_PROFILE_HEVC_MAIN_STILL_PICTURE, "Main Still Picture" },
3259 { FF_PROFILE_UNKNOWN },
3262 static const AVOption options[] = {
3263 { "apply_defdispwin", "Apply default display window from VUI", OFFSET(apply_defdispwin),
3264 AV_OPT_TYPE_INT, {.i64 = 0}, 0, 1, PAR },
3268 static const AVClass hevc_decoder_class = {
3269 .class_name = "HEVC decoder",
3270 .item_name = av_default_item_name,
3272 .version = LIBAVUTIL_VERSION_INT,
3275 AVCodec ff_hevc_decoder = {
3277 .long_name = NULL_IF_CONFIG_SMALL("HEVC (High Efficiency Video Coding)"),
3278 .type = AVMEDIA_TYPE_VIDEO,
3279 .id = AV_CODEC_ID_HEVC,
3280 .priv_data_size = sizeof(HEVCContext),
3281 .priv_class = &hevc_decoder_class,
3282 .init = hevc_decode_init,
3283 .close = hevc_decode_free,
3284 .decode = hevc_decode_frame,
3285 .flush = hevc_decode_flush,
3286 .update_thread_context = hevc_update_thread_context,
3287 .init_thread_copy = hevc_init_thread_copy,
3288 .capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY |
3289 CODEC_CAP_FRAME_THREADS,
3290 .profiles = NULL_IF_CONFIG_SMALL(profiles),