4 * Copyright (C) 2012 - 2013 Guillaume Martres
5 * Copyright (C) 2012 - 2013 Mickael Raulet
6 * Copyright (C) 2012 - 2013 Gildas Cocherel
7 * Copyright (C) 2012 - 2013 Wassim Hamidouche
9 * This file is part of FFmpeg.
11 * FFmpeg is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public
13 * License as published by the Free Software Foundation; either
14 * version 2.1 of the License, or (at your option) any later version.
16 * FFmpeg is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Lesser General Public License for more details.
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with FFmpeg; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
26 #include "libavutil/atomic.h"
27 #include "libavutil/attributes.h"
28 #include "libavutil/common.h"
29 #include "libavutil/display.h"
30 #include "libavutil/internal.h"
31 #include "libavutil/md5.h"
32 #include "libavutil/opt.h"
33 #include "libavutil/pixdesc.h"
34 #include "libavutil/stereo3d.h"
37 #include "bytestream.h"
38 #include "cabac_functions.h"
42 const uint8_t ff_hevc_pel_weight[65] = { [2] = 0, [4] = 1, [6] = 2, [8] = 3, [12] = 4, [16] = 5, [24] = 6, [32] = 7, [48] = 8, [64] = 9 };
45 * NOTE: Each function hls_foo correspond to the function foo in the
46 * specification (HLS stands for High Level Syntax).
53 /* free everything allocated by pic_arrays_init() */
54 static void pic_arrays_free(HEVCContext *s)
57 av_freep(&s->deblock);
59 av_freep(&s->skip_flag);
60 av_freep(&s->tab_ct_depth);
62 av_freep(&s->tab_ipm);
63 av_freep(&s->cbf_luma);
66 av_freep(&s->qp_y_tab);
67 av_freep(&s->tab_slice_address);
68 av_freep(&s->filter_slice_edges);
70 av_freep(&s->horizontal_bs);
71 av_freep(&s->vertical_bs);
73 av_freep(&s->sh.entry_point_offset);
74 av_freep(&s->sh.size);
75 av_freep(&s->sh.offset);
77 av_buffer_pool_uninit(&s->tab_mvf_pool);
78 av_buffer_pool_uninit(&s->rpl_tab_pool);
81 /* allocate arrays that depend on frame dimensions */
82 static int pic_arrays_init(HEVCContext *s, const HEVCSPS *sps)
84 int log2_min_cb_size = sps->log2_min_cb_size;
85 int width = sps->width;
86 int height = sps->height;
87 int pic_size_in_ctb = ((width >> log2_min_cb_size) + 1) *
88 ((height >> log2_min_cb_size) + 1);
89 int ctb_count = sps->ctb_width * sps->ctb_height;
90 int min_pu_size = sps->min_pu_width * sps->min_pu_height;
92 s->bs_width = (width >> 2) + 1;
93 s->bs_height = (height >> 2) + 1;
95 s->sao = av_mallocz_array(ctb_count, sizeof(*s->sao));
96 s->deblock = av_mallocz_array(ctb_count, sizeof(*s->deblock));
97 if (!s->sao || !s->deblock)
100 s->skip_flag = av_malloc(sps->min_cb_height * sps->min_cb_width);
101 s->tab_ct_depth = av_malloc_array(sps->min_cb_height, sps->min_cb_width);
102 if (!s->skip_flag || !s->tab_ct_depth)
105 s->cbf_luma = av_malloc_array(sps->min_tb_width, sps->min_tb_height);
106 s->tab_ipm = av_mallocz(min_pu_size);
107 s->is_pcm = av_malloc((sps->min_pu_width + 1) * (sps->min_pu_height + 1));
108 if (!s->tab_ipm || !s->cbf_luma || !s->is_pcm)
111 s->filter_slice_edges = av_malloc(ctb_count);
112 s->tab_slice_address = av_malloc_array(pic_size_in_ctb,
113 sizeof(*s->tab_slice_address));
114 s->qp_y_tab = av_malloc_array(pic_size_in_ctb,
115 sizeof(*s->qp_y_tab));
116 if (!s->qp_y_tab || !s->filter_slice_edges || !s->tab_slice_address)
119 s->horizontal_bs = av_mallocz_array(s->bs_width, s->bs_height);
120 s->vertical_bs = av_mallocz_array(s->bs_width, s->bs_height);
121 if (!s->horizontal_bs || !s->vertical_bs)
124 s->tab_mvf_pool = av_buffer_pool_init(min_pu_size * sizeof(MvField),
126 s->rpl_tab_pool = av_buffer_pool_init(ctb_count * sizeof(RefPicListTab),
128 if (!s->tab_mvf_pool || !s->rpl_tab_pool)
135 return AVERROR(ENOMEM);
138 static void pred_weight_table(HEVCContext *s, GetBitContext *gb)
142 uint8_t luma_weight_l0_flag[16];
143 uint8_t chroma_weight_l0_flag[16];
144 uint8_t luma_weight_l1_flag[16];
145 uint8_t chroma_weight_l1_flag[16];
147 s->sh.luma_log2_weight_denom = get_ue_golomb_long(gb);
148 if (s->sps->chroma_format_idc != 0) {
149 int delta = get_se_golomb(gb);
150 s->sh.chroma_log2_weight_denom = av_clip(s->sh.luma_log2_weight_denom + delta, 0, 7);
153 for (i = 0; i < s->sh.nb_refs[L0]; i++) {
154 luma_weight_l0_flag[i] = get_bits1(gb);
155 if (!luma_weight_l0_flag[i]) {
156 s->sh.luma_weight_l0[i] = 1 << s->sh.luma_log2_weight_denom;
157 s->sh.luma_offset_l0[i] = 0;
160 if (s->sps->chroma_format_idc != 0) {
161 for (i = 0; i < s->sh.nb_refs[L0]; i++)
162 chroma_weight_l0_flag[i] = get_bits1(gb);
164 for (i = 0; i < s->sh.nb_refs[L0]; i++)
165 chroma_weight_l0_flag[i] = 0;
167 for (i = 0; i < s->sh.nb_refs[L0]; i++) {
168 if (luma_weight_l0_flag[i]) {
169 int delta_luma_weight_l0 = get_se_golomb(gb);
170 s->sh.luma_weight_l0[i] = (1 << s->sh.luma_log2_weight_denom) + delta_luma_weight_l0;
171 s->sh.luma_offset_l0[i] = get_se_golomb(gb);
173 if (chroma_weight_l0_flag[i]) {
174 for (j = 0; j < 2; j++) {
175 int delta_chroma_weight_l0 = get_se_golomb(gb);
176 int delta_chroma_offset_l0 = get_se_golomb(gb);
177 s->sh.chroma_weight_l0[i][j] = (1 << s->sh.chroma_log2_weight_denom) + delta_chroma_weight_l0;
178 s->sh.chroma_offset_l0[i][j] = av_clip((delta_chroma_offset_l0 - ((128 * s->sh.chroma_weight_l0[i][j])
179 >> s->sh.chroma_log2_weight_denom) + 128), -128, 127);
182 s->sh.chroma_weight_l0[i][0] = 1 << s->sh.chroma_log2_weight_denom;
183 s->sh.chroma_offset_l0[i][0] = 0;
184 s->sh.chroma_weight_l0[i][1] = 1 << s->sh.chroma_log2_weight_denom;
185 s->sh.chroma_offset_l0[i][1] = 0;
188 if (s->sh.slice_type == B_SLICE) {
189 for (i = 0; i < s->sh.nb_refs[L1]; i++) {
190 luma_weight_l1_flag[i] = get_bits1(gb);
191 if (!luma_weight_l1_flag[i]) {
192 s->sh.luma_weight_l1[i] = 1 << s->sh.luma_log2_weight_denom;
193 s->sh.luma_offset_l1[i] = 0;
196 if (s->sps->chroma_format_idc != 0) {
197 for (i = 0; i < s->sh.nb_refs[L1]; i++)
198 chroma_weight_l1_flag[i] = get_bits1(gb);
200 for (i = 0; i < s->sh.nb_refs[L1]; i++)
201 chroma_weight_l1_flag[i] = 0;
203 for (i = 0; i < s->sh.nb_refs[L1]; i++) {
204 if (luma_weight_l1_flag[i]) {
205 int delta_luma_weight_l1 = get_se_golomb(gb);
206 s->sh.luma_weight_l1[i] = (1 << s->sh.luma_log2_weight_denom) + delta_luma_weight_l1;
207 s->sh.luma_offset_l1[i] = get_se_golomb(gb);
209 if (chroma_weight_l1_flag[i]) {
210 for (j = 0; j < 2; j++) {
211 int delta_chroma_weight_l1 = get_se_golomb(gb);
212 int delta_chroma_offset_l1 = get_se_golomb(gb);
213 s->sh.chroma_weight_l1[i][j] = (1 << s->sh.chroma_log2_weight_denom) + delta_chroma_weight_l1;
214 s->sh.chroma_offset_l1[i][j] = av_clip((delta_chroma_offset_l1 - ((128 * s->sh.chroma_weight_l1[i][j])
215 >> s->sh.chroma_log2_weight_denom) + 128), -128, 127);
218 s->sh.chroma_weight_l1[i][0] = 1 << s->sh.chroma_log2_weight_denom;
219 s->sh.chroma_offset_l1[i][0] = 0;
220 s->sh.chroma_weight_l1[i][1] = 1 << s->sh.chroma_log2_weight_denom;
221 s->sh.chroma_offset_l1[i][1] = 0;
227 static int decode_lt_rps(HEVCContext *s, LongTermRPS *rps, GetBitContext *gb)
229 const HEVCSPS *sps = s->sps;
230 int max_poc_lsb = 1 << sps->log2_max_poc_lsb;
231 int prev_delta_msb = 0;
232 unsigned int nb_sps = 0, nb_sh;
236 if (!sps->long_term_ref_pics_present_flag)
239 if (sps->num_long_term_ref_pics_sps > 0)
240 nb_sps = get_ue_golomb_long(gb);
241 nb_sh = get_ue_golomb_long(gb);
243 if (nb_sh + (uint64_t)nb_sps > FF_ARRAY_ELEMS(rps->poc))
244 return AVERROR_INVALIDDATA;
246 rps->nb_refs = nb_sh + nb_sps;
248 for (i = 0; i < rps->nb_refs; i++) {
249 uint8_t delta_poc_msb_present;
252 uint8_t lt_idx_sps = 0;
254 if (sps->num_long_term_ref_pics_sps > 1)
255 lt_idx_sps = get_bits(gb, av_ceil_log2(sps->num_long_term_ref_pics_sps));
257 rps->poc[i] = sps->lt_ref_pic_poc_lsb_sps[lt_idx_sps];
258 rps->used[i] = sps->used_by_curr_pic_lt_sps_flag[lt_idx_sps];
260 rps->poc[i] = get_bits(gb, sps->log2_max_poc_lsb);
261 rps->used[i] = get_bits1(gb);
264 delta_poc_msb_present = get_bits1(gb);
265 if (delta_poc_msb_present) {
266 int delta = get_ue_golomb_long(gb);
268 if (i && i != nb_sps)
269 delta += prev_delta_msb;
271 rps->poc[i] += s->poc - delta * max_poc_lsb - s->sh.pic_order_cnt_lsb;
272 prev_delta_msb = delta;
279 static int get_buffer_sao(HEVCContext *s, AVFrame *frame, const HEVCSPS *sps)
283 frame->width = s->avctx->coded_width + 2;
284 frame->height = s->avctx->coded_height + 2;
285 if ((ret = ff_get_buffer(s->avctx, frame, AV_GET_BUFFER_FLAG_REF)) < 0)
287 for (i = 0; frame->data[i]; i++) {
288 int offset = frame->linesize[i] + (1 << sps->pixel_shift);
289 frame->data[i] += offset;
291 frame->width = s->avctx->coded_width;
292 frame->height = s->avctx->coded_height;
297 static int set_sps(HEVCContext *s, const HEVCSPS *sps)
300 unsigned int num = 0, den = 0;
303 ret = pic_arrays_init(s, sps);
307 s->avctx->coded_width = sps->width;
308 s->avctx->coded_height = sps->height;
309 s->avctx->width = sps->output_width;
310 s->avctx->height = sps->output_height;
311 s->avctx->pix_fmt = sps->pix_fmt;
312 s->avctx->has_b_frames = sps->temporal_layer[sps->max_sub_layers - 1].num_reorder_pics;
314 ff_set_sar(s->avctx, sps->vui.sar);
316 if (sps->vui.video_signal_type_present_flag)
317 s->avctx->color_range = sps->vui.video_full_range_flag ? AVCOL_RANGE_JPEG
320 s->avctx->color_range = AVCOL_RANGE_MPEG;
322 if (sps->vui.colour_description_present_flag) {
323 s->avctx->color_primaries = sps->vui.colour_primaries;
324 s->avctx->color_trc = sps->vui.transfer_characteristic;
325 s->avctx->colorspace = sps->vui.matrix_coeffs;
327 s->avctx->color_primaries = AVCOL_PRI_UNSPECIFIED;
328 s->avctx->color_trc = AVCOL_TRC_UNSPECIFIED;
329 s->avctx->colorspace = AVCOL_SPC_UNSPECIFIED;
332 ff_hevc_pred_init(&s->hpc, sps->bit_depth);
333 ff_hevc_dsp_init (&s->hevcdsp, sps->bit_depth);
334 ff_videodsp_init (&s->vdsp, sps->bit_depth);
336 if (sps->sao_enabled) {
337 av_frame_unref(s->tmp_frame);
338 ret = get_buffer_sao(s, s->tmp_frame, sps);
339 s->sao_frame = s->tmp_frame;
343 s->vps = (HEVCVPS*) s->vps_list[s->sps->vps_id]->data;
345 if (s->vps->vps_timing_info_present_flag) {
346 num = s->vps->vps_num_units_in_tick;
347 den = s->vps->vps_time_scale;
348 } else if (sps->vui.vui_timing_info_present_flag) {
349 num = sps->vui.vui_num_units_in_tick;
350 den = sps->vui.vui_time_scale;
353 if (num != 0 && den != 0)
354 av_reduce(&s->avctx->time_base.num, &s->avctx->time_base.den,
365 static int hls_slice_header(HEVCContext *s)
367 GetBitContext *gb = &s->HEVClc->gb;
368 SliceHeader *sh = &s->sh;
372 sh->first_slice_in_pic_flag = get_bits1(gb);
373 if ((IS_IDR(s) || IS_BLA(s)) && sh->first_slice_in_pic_flag) {
374 s->seq_decode = (s->seq_decode + 1) & 0xff;
377 ff_hevc_clear_refs(s);
379 sh->no_output_of_prior_pics_flag = 0;
381 sh->no_output_of_prior_pics_flag = get_bits1(gb);
383 sh->pps_id = get_ue_golomb_long(gb);
384 if (sh->pps_id >= MAX_PPS_COUNT || !s->pps_list[sh->pps_id]) {
385 av_log(s->avctx, AV_LOG_ERROR, "PPS id out of range: %d\n", sh->pps_id);
386 return AVERROR_INVALIDDATA;
388 if (!sh->first_slice_in_pic_flag &&
389 s->pps != (HEVCPPS*)s->pps_list[sh->pps_id]->data) {
390 av_log(s->avctx, AV_LOG_ERROR, "PPS changed between slices.\n");
391 return AVERROR_INVALIDDATA;
393 s->pps = (HEVCPPS*)s->pps_list[sh->pps_id]->data;
394 if (s->nal_unit_type == NAL_CRA_NUT && s->last_eos == 1)
395 sh->no_output_of_prior_pics_flag = 1;
397 if (s->sps != (HEVCSPS*)s->sps_list[s->pps->sps_id]->data) {
398 const HEVCSPS* last_sps = s->sps;
399 s->sps = (HEVCSPS*)s->sps_list[s->pps->sps_id]->data;
400 if (last_sps && IS_IRAP(s) && s->nal_unit_type != NAL_CRA_NUT) {
401 if (s->sps->width != last_sps->width || s->sps->height != last_sps->height ||
402 s->sps->temporal_layer[s->sps->max_sub_layers - 1].max_dec_pic_buffering !=
403 last_sps->temporal_layer[last_sps->max_sub_layers - 1].max_dec_pic_buffering)
404 sh->no_output_of_prior_pics_flag = 0;
406 ff_hevc_clear_refs(s);
407 ret = set_sps(s, s->sps);
411 s->seq_decode = (s->seq_decode + 1) & 0xff;
415 s->avctx->profile = s->sps->ptl.general_ptl.profile_idc;
416 s->avctx->level = s->sps->ptl.general_ptl.level_idc;
418 sh->dependent_slice_segment_flag = 0;
419 if (!sh->first_slice_in_pic_flag) {
420 int slice_address_length;
422 if (s->pps->dependent_slice_segments_enabled_flag)
423 sh->dependent_slice_segment_flag = get_bits1(gb);
425 slice_address_length = av_ceil_log2(s->sps->ctb_width *
427 sh->slice_segment_addr = get_bits(gb, slice_address_length);
428 if (sh->slice_segment_addr >= s->sps->ctb_width * s->sps->ctb_height) {
429 av_log(s->avctx, AV_LOG_ERROR,
430 "Invalid slice segment address: %u.\n",
431 sh->slice_segment_addr);
432 return AVERROR_INVALIDDATA;
435 if (!sh->dependent_slice_segment_flag) {
436 sh->slice_addr = sh->slice_segment_addr;
440 sh->slice_segment_addr = sh->slice_addr = 0;
442 s->slice_initialized = 0;
445 if (!sh->dependent_slice_segment_flag) {
446 s->slice_initialized = 0;
448 for (i = 0; i < s->pps->num_extra_slice_header_bits; i++)
449 skip_bits(gb, 1); // slice_reserved_undetermined_flag[]
451 sh->slice_type = get_ue_golomb_long(gb);
452 if (!(sh->slice_type == I_SLICE ||
453 sh->slice_type == P_SLICE ||
454 sh->slice_type == B_SLICE)) {
455 av_log(s->avctx, AV_LOG_ERROR, "Unknown slice type: %d.\n",
457 return AVERROR_INVALIDDATA;
459 if (IS_IRAP(s) && sh->slice_type != I_SLICE) {
460 av_log(s->avctx, AV_LOG_ERROR, "Inter slices in an IRAP frame.\n");
461 return AVERROR_INVALIDDATA;
464 // when flag is not present, picture is inferred to be output
465 sh->pic_output_flag = 1;
466 if (s->pps->output_flag_present_flag)
467 sh->pic_output_flag = get_bits1(gb);
469 if (s->sps->separate_colour_plane_flag)
470 sh->colour_plane_id = get_bits(gb, 2);
473 int short_term_ref_pic_set_sps_flag, poc;
475 sh->pic_order_cnt_lsb = get_bits(gb, s->sps->log2_max_poc_lsb);
476 poc = ff_hevc_compute_poc(s, sh->pic_order_cnt_lsb);
477 if (!sh->first_slice_in_pic_flag && poc != s->poc) {
478 av_log(s->avctx, AV_LOG_WARNING,
479 "Ignoring POC change between slices: %d -> %d\n", s->poc, poc);
480 if (s->avctx->err_recognition & AV_EF_EXPLODE)
481 return AVERROR_INVALIDDATA;
486 short_term_ref_pic_set_sps_flag = get_bits1(gb);
487 if (!short_term_ref_pic_set_sps_flag) {
488 ret = ff_hevc_decode_short_term_rps(s, &sh->slice_rps, s->sps, 1);
492 sh->short_term_rps = &sh->slice_rps;
494 int numbits, rps_idx;
496 if (!s->sps->nb_st_rps) {
497 av_log(s->avctx, AV_LOG_ERROR, "No ref lists in the SPS.\n");
498 return AVERROR_INVALIDDATA;
501 numbits = av_ceil_log2(s->sps->nb_st_rps);
502 rps_idx = numbits > 0 ? get_bits(gb, numbits) : 0;
503 sh->short_term_rps = &s->sps->st_rps[rps_idx];
506 ret = decode_lt_rps(s, &sh->long_term_rps, gb);
508 av_log(s->avctx, AV_LOG_WARNING, "Invalid long term RPS.\n");
509 if (s->avctx->err_recognition & AV_EF_EXPLODE)
510 return AVERROR_INVALIDDATA;
513 if (s->sps->sps_temporal_mvp_enabled_flag)
514 sh->slice_temporal_mvp_enabled_flag = get_bits1(gb);
516 sh->slice_temporal_mvp_enabled_flag = 0;
518 s->sh.short_term_rps = NULL;
523 if (s->temporal_id == 0 &&
524 s->nal_unit_type != NAL_TRAIL_N &&
525 s->nal_unit_type != NAL_TSA_N &&
526 s->nal_unit_type != NAL_STSA_N &&
527 s->nal_unit_type != NAL_RADL_N &&
528 s->nal_unit_type != NAL_RADL_R &&
529 s->nal_unit_type != NAL_RASL_N &&
530 s->nal_unit_type != NAL_RASL_R)
533 if (s->sps->sao_enabled) {
534 sh->slice_sample_adaptive_offset_flag[0] = get_bits1(gb);
535 sh->slice_sample_adaptive_offset_flag[1] =
536 sh->slice_sample_adaptive_offset_flag[2] = get_bits1(gb);
538 sh->slice_sample_adaptive_offset_flag[0] = 0;
539 sh->slice_sample_adaptive_offset_flag[1] = 0;
540 sh->slice_sample_adaptive_offset_flag[2] = 0;
543 sh->nb_refs[L0] = sh->nb_refs[L1] = 0;
544 if (sh->slice_type == P_SLICE || sh->slice_type == B_SLICE) {
547 sh->nb_refs[L0] = s->pps->num_ref_idx_l0_default_active;
548 if (sh->slice_type == B_SLICE)
549 sh->nb_refs[L1] = s->pps->num_ref_idx_l1_default_active;
551 if (get_bits1(gb)) { // num_ref_idx_active_override_flag
552 sh->nb_refs[L0] = get_ue_golomb_long(gb) + 1;
553 if (sh->slice_type == B_SLICE)
554 sh->nb_refs[L1] = get_ue_golomb_long(gb) + 1;
556 if (sh->nb_refs[L0] > MAX_REFS || sh->nb_refs[L1] > MAX_REFS) {
557 av_log(s->avctx, AV_LOG_ERROR, "Too many refs: %d/%d.\n",
558 sh->nb_refs[L0], sh->nb_refs[L1]);
559 return AVERROR_INVALIDDATA;
562 sh->rpl_modification_flag[0] = 0;
563 sh->rpl_modification_flag[1] = 0;
564 nb_refs = ff_hevc_frame_nb_refs(s);
566 av_log(s->avctx, AV_LOG_ERROR, "Zero refs for a frame with P or B slices.\n");
567 return AVERROR_INVALIDDATA;
570 if (s->pps->lists_modification_present_flag && nb_refs > 1) {
571 sh->rpl_modification_flag[0] = get_bits1(gb);
572 if (sh->rpl_modification_flag[0]) {
573 for (i = 0; i < sh->nb_refs[L0]; i++)
574 sh->list_entry_lx[0][i] = get_bits(gb, av_ceil_log2(nb_refs));
577 if (sh->slice_type == B_SLICE) {
578 sh->rpl_modification_flag[1] = get_bits1(gb);
579 if (sh->rpl_modification_flag[1] == 1)
580 for (i = 0; i < sh->nb_refs[L1]; i++)
581 sh->list_entry_lx[1][i] = get_bits(gb, av_ceil_log2(nb_refs));
585 if (sh->slice_type == B_SLICE)
586 sh->mvd_l1_zero_flag = get_bits1(gb);
588 if (s->pps->cabac_init_present_flag)
589 sh->cabac_init_flag = get_bits1(gb);
591 sh->cabac_init_flag = 0;
593 sh->collocated_ref_idx = 0;
594 if (sh->slice_temporal_mvp_enabled_flag) {
595 sh->collocated_list = L0;
596 if (sh->slice_type == B_SLICE)
597 sh->collocated_list = !get_bits1(gb);
599 if (sh->nb_refs[sh->collocated_list] > 1) {
600 sh->collocated_ref_idx = get_ue_golomb_long(gb);
601 if (sh->collocated_ref_idx >= sh->nb_refs[sh->collocated_list]) {
602 av_log(s->avctx, AV_LOG_ERROR,
603 "Invalid collocated_ref_idx: %d.\n",
604 sh->collocated_ref_idx);
605 return AVERROR_INVALIDDATA;
610 if ((s->pps->weighted_pred_flag && sh->slice_type == P_SLICE) ||
611 (s->pps->weighted_bipred_flag && sh->slice_type == B_SLICE)) {
612 pred_weight_table(s, gb);
615 sh->max_num_merge_cand = 5 - get_ue_golomb_long(gb);
616 if (sh->max_num_merge_cand < 1 || sh->max_num_merge_cand > 5) {
617 av_log(s->avctx, AV_LOG_ERROR,
618 "Invalid number of merging MVP candidates: %d.\n",
619 sh->max_num_merge_cand);
620 return AVERROR_INVALIDDATA;
624 sh->slice_qp_delta = get_se_golomb(gb);
626 if (s->pps->pic_slice_level_chroma_qp_offsets_present_flag) {
627 sh->slice_cb_qp_offset = get_se_golomb(gb);
628 sh->slice_cr_qp_offset = get_se_golomb(gb);
630 sh->slice_cb_qp_offset = 0;
631 sh->slice_cr_qp_offset = 0;
634 if (s->pps->chroma_qp_offset_list_enabled_flag)
635 sh->cu_chroma_qp_offset_enabled_flag = get_bits1(gb);
637 sh->cu_chroma_qp_offset_enabled_flag = 0;
639 if (s->pps->deblocking_filter_control_present_flag) {
640 int deblocking_filter_override_flag = 0;
642 if (s->pps->deblocking_filter_override_enabled_flag)
643 deblocking_filter_override_flag = get_bits1(gb);
645 if (deblocking_filter_override_flag) {
646 sh->disable_deblocking_filter_flag = get_bits1(gb);
647 if (!sh->disable_deblocking_filter_flag) {
648 sh->beta_offset = get_se_golomb(gb) * 2;
649 sh->tc_offset = get_se_golomb(gb) * 2;
652 sh->disable_deblocking_filter_flag = s->pps->disable_dbf;
653 sh->beta_offset = s->pps->beta_offset;
654 sh->tc_offset = s->pps->tc_offset;
657 sh->disable_deblocking_filter_flag = 0;
662 if (s->pps->seq_loop_filter_across_slices_enabled_flag &&
663 (sh->slice_sample_adaptive_offset_flag[0] ||
664 sh->slice_sample_adaptive_offset_flag[1] ||
665 !sh->disable_deblocking_filter_flag)) {
666 sh->slice_loop_filter_across_slices_enabled_flag = get_bits1(gb);
668 sh->slice_loop_filter_across_slices_enabled_flag = s->pps->seq_loop_filter_across_slices_enabled_flag;
670 } else if (!s->slice_initialized) {
671 av_log(s->avctx, AV_LOG_ERROR, "Independent slice segment missing.\n");
672 return AVERROR_INVALIDDATA;
675 sh->num_entry_point_offsets = 0;
676 if (s->pps->tiles_enabled_flag || s->pps->entropy_coding_sync_enabled_flag) {
677 sh->num_entry_point_offsets = get_ue_golomb_long(gb);
678 if (sh->num_entry_point_offsets > 0) {
679 int offset_len = get_ue_golomb_long(gb) + 1;
680 int segments = offset_len >> 4;
681 int rest = (offset_len & 15);
682 av_freep(&sh->entry_point_offset);
683 av_freep(&sh->offset);
685 sh->entry_point_offset = av_malloc_array(sh->num_entry_point_offsets, sizeof(int));
686 sh->offset = av_malloc_array(sh->num_entry_point_offsets, sizeof(int));
687 sh->size = av_malloc_array(sh->num_entry_point_offsets, sizeof(int));
688 if (!sh->entry_point_offset || !sh->offset || !sh->size) {
689 sh->num_entry_point_offsets = 0;
690 av_log(s->avctx, AV_LOG_ERROR, "Failed to allocate memory\n");
691 return AVERROR(ENOMEM);
693 for (i = 0; i < sh->num_entry_point_offsets; i++) {
695 for (j = 0; j < segments; j++) {
697 val += get_bits(gb, 16);
701 val += get_bits(gb, rest);
703 sh->entry_point_offset[i] = val + 1; // +1; // +1 to get the size
705 if (s->threads_number > 1 && (s->pps->num_tile_rows > 1 || s->pps->num_tile_columns > 1)) {
706 s->enable_parallel_tiles = 0; // TODO: you can enable tiles in parallel here
707 s->threads_number = 1;
709 s->enable_parallel_tiles = 0;
711 s->enable_parallel_tiles = 0;
714 if (s->pps->slice_header_extension_present_flag) {
715 unsigned int length = get_ue_golomb_long(gb);
716 if (length*8LL > get_bits_left(gb)) {
717 av_log(s->avctx, AV_LOG_ERROR, "too many slice_header_extension_data_bytes\n");
718 return AVERROR_INVALIDDATA;
720 for (i = 0; i < length; i++)
721 skip_bits(gb, 8); // slice_header_extension_data_byte
724 // Inferred parameters
725 sh->slice_qp = 26U + s->pps->pic_init_qp_minus26 + sh->slice_qp_delta;
726 if (sh->slice_qp > 51 ||
727 sh->slice_qp < -s->sps->qp_bd_offset) {
728 av_log(s->avctx, AV_LOG_ERROR,
729 "The slice_qp %d is outside the valid range "
732 -s->sps->qp_bd_offset);
733 return AVERROR_INVALIDDATA;
736 sh->slice_ctb_addr_rs = sh->slice_segment_addr;
738 if (!s->sh.slice_ctb_addr_rs && s->sh.dependent_slice_segment_flag) {
739 av_log(s->avctx, AV_LOG_ERROR, "Impossible slice segment.\n");
740 return AVERROR_INVALIDDATA;
743 if (get_bits_left(gb) < 0) {
744 av_log(s->avctx, AV_LOG_ERROR,
745 "Overread slice header by %d bits\n", -get_bits_left(gb));
746 return AVERROR_INVALIDDATA;
749 s->HEVClc->first_qp_group = !s->sh.dependent_slice_segment_flag;
751 if (!s->pps->cu_qp_delta_enabled_flag)
752 s->HEVClc->qp_y = s->sh.slice_qp;
754 s->slice_initialized = 1;
755 s->HEVClc->tu.cu_qp_offset_cb = 0;
756 s->HEVClc->tu.cu_qp_offset_cr = 0;
761 #define CTB(tab, x, y) ((tab)[(y) * s->sps->ctb_width + (x)])
763 #define SET_SAO(elem, value) \
765 if (!sao_merge_up_flag && !sao_merge_left_flag) \
767 else if (sao_merge_left_flag) \
768 sao->elem = CTB(s->sao, rx-1, ry).elem; \
769 else if (sao_merge_up_flag) \
770 sao->elem = CTB(s->sao, rx, ry-1).elem; \
775 static void hls_sao_param(HEVCContext *s, int rx, int ry)
777 HEVCLocalContext *lc = s->HEVClc;
778 int sao_merge_left_flag = 0;
779 int sao_merge_up_flag = 0;
780 SAOParams *sao = &CTB(s->sao, rx, ry);
783 if (s->sh.slice_sample_adaptive_offset_flag[0] ||
784 s->sh.slice_sample_adaptive_offset_flag[1]) {
786 if (lc->ctb_left_flag)
787 sao_merge_left_flag = ff_hevc_sao_merge_flag_decode(s);
789 if (ry > 0 && !sao_merge_left_flag) {
791 sao_merge_up_flag = ff_hevc_sao_merge_flag_decode(s);
795 for (c_idx = 0; c_idx < 3; c_idx++) {
796 int log2_sao_offset_scale = c_idx == 0 ? s->pps->log2_sao_offset_scale_luma :
797 s->pps->log2_sao_offset_scale_chroma;
799 if (!s->sh.slice_sample_adaptive_offset_flag[c_idx]) {
800 sao->type_idx[c_idx] = SAO_NOT_APPLIED;
805 sao->type_idx[2] = sao->type_idx[1];
806 sao->eo_class[2] = sao->eo_class[1];
808 SET_SAO(type_idx[c_idx], ff_hevc_sao_type_idx_decode(s));
811 if (sao->type_idx[c_idx] == SAO_NOT_APPLIED)
814 for (i = 0; i < 4; i++)
815 SET_SAO(offset_abs[c_idx][i], ff_hevc_sao_offset_abs_decode(s));
817 if (sao->type_idx[c_idx] == SAO_BAND) {
818 for (i = 0; i < 4; i++) {
819 if (sao->offset_abs[c_idx][i]) {
820 SET_SAO(offset_sign[c_idx][i],
821 ff_hevc_sao_offset_sign_decode(s));
823 sao->offset_sign[c_idx][i] = 0;
826 SET_SAO(band_position[c_idx], ff_hevc_sao_band_position_decode(s));
827 } else if (c_idx != 2) {
828 SET_SAO(eo_class[c_idx], ff_hevc_sao_eo_class_decode(s));
831 // Inferred parameters
832 sao->offset_val[c_idx][0] = 0;
833 for (i = 0; i < 4; i++) {
834 sao->offset_val[c_idx][i + 1] = sao->offset_abs[c_idx][i];
835 if (sao->type_idx[c_idx] == SAO_EDGE) {
837 sao->offset_val[c_idx][i + 1] = -sao->offset_val[c_idx][i + 1];
838 } else if (sao->offset_sign[c_idx][i]) {
839 sao->offset_val[c_idx][i + 1] = -sao->offset_val[c_idx][i + 1];
841 sao->offset_val[c_idx][i + 1] <<= log2_sao_offset_scale;
849 static int hls_cross_component_pred(HEVCContext *s, int idx) {
850 HEVCLocalContext *lc = s->HEVClc;
851 int log2_res_scale_abs_plus1 = ff_hevc_log2_res_scale_abs(s, idx);
853 if (log2_res_scale_abs_plus1 != 0) {
854 int res_scale_sign_flag = ff_hevc_res_scale_sign_flag(s, idx);
855 lc->tu.res_scale_val = (1 << (log2_res_scale_abs_plus1 - 1)) *
856 (1 - 2 * res_scale_sign_flag);
858 lc->tu.res_scale_val = 0;
865 static int hls_transform_unit(HEVCContext *s, int x0, int y0,
866 int xBase, int yBase, int cb_xBase, int cb_yBase,
867 int log2_cb_size, int log2_trafo_size,
868 int trafo_depth, int blk_idx,
869 int cbf_luma, int *cbf_cb, int *cbf_cr)
871 HEVCLocalContext *lc = s->HEVClc;
872 const int log2_trafo_size_c = log2_trafo_size - s->sps->hshift[1];
875 if (lc->cu.pred_mode == MODE_INTRA) {
876 int trafo_size = 1 << log2_trafo_size;
877 ff_hevc_set_neighbour_available(s, x0, y0, trafo_size, trafo_size);
879 s->hpc.intra_pred[log2_trafo_size - 2](s, x0, y0, 0);
882 if (cbf_luma || cbf_cb[0] || cbf_cr[0] ||
883 (s->sps->chroma_format_idc == 2 && (cbf_cb[1] || cbf_cr[1]))) {
884 int scan_idx = SCAN_DIAG;
885 int scan_idx_c = SCAN_DIAG;
886 int cbf_chroma = cbf_cb[0] || cbf_cr[0] ||
887 (s->sps->chroma_format_idc == 2 &&
888 (cbf_cb[1] || cbf_cr[1]));
890 if (s->pps->cu_qp_delta_enabled_flag && !lc->tu.is_cu_qp_delta_coded) {
891 lc->tu.cu_qp_delta = ff_hevc_cu_qp_delta_abs(s);
892 if (lc->tu.cu_qp_delta != 0)
893 if (ff_hevc_cu_qp_delta_sign_flag(s) == 1)
894 lc->tu.cu_qp_delta = -lc->tu.cu_qp_delta;
895 lc->tu.is_cu_qp_delta_coded = 1;
897 if (lc->tu.cu_qp_delta < -(26 + s->sps->qp_bd_offset / 2) ||
898 lc->tu.cu_qp_delta > (25 + s->sps->qp_bd_offset / 2)) {
899 av_log(s->avctx, AV_LOG_ERROR,
900 "The cu_qp_delta %d is outside the valid range "
903 -(26 + s->sps->qp_bd_offset / 2),
904 (25 + s->sps->qp_bd_offset / 2));
905 return AVERROR_INVALIDDATA;
908 ff_hevc_set_qPy(s, cb_xBase, cb_yBase, log2_cb_size);
911 if (s->sh.cu_chroma_qp_offset_enabled_flag && cbf_chroma &&
912 !lc->cu.cu_transquant_bypass_flag && !lc->tu.is_cu_chroma_qp_offset_coded) {
913 int cu_chroma_qp_offset_flag = ff_hevc_cu_chroma_qp_offset_flag(s);
914 if (cu_chroma_qp_offset_flag) {
915 int cu_chroma_qp_offset_idx = 0;
916 if (s->pps->chroma_qp_offset_list_len_minus1 > 0) {
917 cu_chroma_qp_offset_idx = ff_hevc_cu_chroma_qp_offset_idx(s);
918 av_log(s->avctx, AV_LOG_ERROR,
919 "cu_chroma_qp_offset_idx not yet tested.\n");
921 lc->tu.cu_qp_offset_cb = s->pps->cb_qp_offset_list[cu_chroma_qp_offset_idx];
922 lc->tu.cu_qp_offset_cr = s->pps->cr_qp_offset_list[cu_chroma_qp_offset_idx];
924 lc->tu.cu_qp_offset_cb = 0;
925 lc->tu.cu_qp_offset_cr = 0;
927 lc->tu.is_cu_chroma_qp_offset_coded = 1;
930 if (lc->cu.pred_mode == MODE_INTRA && log2_trafo_size < 4) {
931 if (lc->tu.intra_pred_mode >= 6 &&
932 lc->tu.intra_pred_mode <= 14) {
933 scan_idx = SCAN_VERT;
934 } else if (lc->tu.intra_pred_mode >= 22 &&
935 lc->tu.intra_pred_mode <= 30) {
936 scan_idx = SCAN_HORIZ;
939 if (lc->tu.intra_pred_mode_c >= 6 &&
940 lc->tu.intra_pred_mode_c <= 14) {
941 scan_idx_c = SCAN_VERT;
942 } else if (lc->tu.intra_pred_mode_c >= 22 &&
943 lc->tu.intra_pred_mode_c <= 30) {
944 scan_idx_c = SCAN_HORIZ;
951 ff_hevc_hls_residual_coding(s, x0, y0, log2_trafo_size, scan_idx, 0);
952 if (log2_trafo_size > 2 || s->sps->chroma_format_idc == 3) {
953 int trafo_size_h = 1 << (log2_trafo_size_c + s->sps->hshift[1]);
954 int trafo_size_v = 1 << (log2_trafo_size_c + s->sps->vshift[1]);
955 lc->tu.cross_pf = (s->pps->cross_component_prediction_enabled_flag && cbf_luma &&
956 (lc->cu.pred_mode == MODE_INTER ||
957 (lc->tu.chroma_mode_c == 4)));
959 if (lc->tu.cross_pf) {
960 hls_cross_component_pred(s, 0);
962 for (i = 0; i < (s->sps->chroma_format_idc == 2 ? 2 : 1); i++) {
963 if (lc->cu.pred_mode == MODE_INTRA) {
964 ff_hevc_set_neighbour_available(s, x0, y0 + (i << log2_trafo_size_c), trafo_size_h, trafo_size_v);
965 s->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0 + (i << log2_trafo_size_c), 1);
968 ff_hevc_hls_residual_coding(s, x0, y0 + (i << log2_trafo_size_c),
969 log2_trafo_size_c, scan_idx_c, 1);
971 if (lc->tu.cross_pf) {
972 ptrdiff_t stride = s->frame->linesize[1];
973 int hshift = s->sps->hshift[1];
974 int vshift = s->sps->vshift[1];
975 int16_t *coeffs_y = lc->tu.coeffs[0];
976 int16_t *coeffs = lc->tu.coeffs[1];
977 int size = 1 << log2_trafo_size_c;
979 uint8_t *dst = &s->frame->data[1][(y0 >> vshift) * stride +
980 ((x0 >> hshift) << s->sps->pixel_shift)];
981 for (i = 0; i < (size * size); i++) {
982 coeffs[i] = ((lc->tu.res_scale_val * coeffs_y[i]) >> 3);
984 s->hevcdsp.transform_add[log2_trafo_size-2](dst, coeffs, stride);
988 if (lc->tu.cross_pf) {
989 hls_cross_component_pred(s, 1);
991 for (i = 0; i < (s->sps->chroma_format_idc == 2 ? 2 : 1); i++) {
992 if (lc->cu.pred_mode == MODE_INTRA) {
993 ff_hevc_set_neighbour_available(s, x0, y0 + (i << log2_trafo_size_c), trafo_size_h, trafo_size_v);
994 s->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0 + (i << log2_trafo_size_c), 2);
997 ff_hevc_hls_residual_coding(s, x0, y0 + (i << log2_trafo_size_c),
998 log2_trafo_size_c, scan_idx_c, 2);
1000 if (lc->tu.cross_pf) {
1001 ptrdiff_t stride = s->frame->linesize[2];
1002 int hshift = s->sps->hshift[2];
1003 int vshift = s->sps->vshift[2];
1004 int16_t *coeffs_y = lc->tu.coeffs[0];
1005 int16_t *coeffs = lc->tu.coeffs[1];
1006 int size = 1 << log2_trafo_size_c;
1008 uint8_t *dst = &s->frame->data[2][(y0 >> vshift) * stride +
1009 ((x0 >> hshift) << s->sps->pixel_shift)];
1010 for (i = 0; i < (size * size); i++) {
1011 coeffs[i] = ((lc->tu.res_scale_val * coeffs_y[i]) >> 3);
1013 s->hevcdsp.transform_add[log2_trafo_size-2](dst, coeffs, stride);
1016 } else if (blk_idx == 3) {
1017 int trafo_size_h = 1 << (log2_trafo_size + 1);
1018 int trafo_size_v = 1 << (log2_trafo_size + s->sps->vshift[1]);
1019 for (i = 0; i < (s->sps->chroma_format_idc == 2 ? 2 : 1); i++) {
1020 if (lc->cu.pred_mode == MODE_INTRA) {
1021 ff_hevc_set_neighbour_available(s, xBase, yBase + (i << log2_trafo_size),
1022 trafo_size_h, trafo_size_v);
1023 s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase + (i << log2_trafo_size), 1);
1026 ff_hevc_hls_residual_coding(s, xBase, yBase + (i << log2_trafo_size),
1027 log2_trafo_size, scan_idx_c, 1);
1029 for (i = 0; i < (s->sps->chroma_format_idc == 2 ? 2 : 1); i++) {
1030 if (lc->cu.pred_mode == MODE_INTRA) {
1031 ff_hevc_set_neighbour_available(s, xBase, yBase + (i << log2_trafo_size),
1032 trafo_size_h, trafo_size_v);
1033 s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase + (i << log2_trafo_size), 2);
1036 ff_hevc_hls_residual_coding(s, xBase, yBase + (i << log2_trafo_size),
1037 log2_trafo_size, scan_idx_c, 2);
1040 } else if (lc->cu.pred_mode == MODE_INTRA) {
1041 if (log2_trafo_size > 2 || s->sps->chroma_format_idc == 3) {
1042 int trafo_size_h = 1 << (log2_trafo_size_c + s->sps->hshift[1]);
1043 int trafo_size_v = 1 << (log2_trafo_size_c + s->sps->vshift[1]);
1044 ff_hevc_set_neighbour_available(s, x0, y0, trafo_size_h, trafo_size_v);
1045 s->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0, 1);
1046 s->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0, 2);
1047 if (s->sps->chroma_format_idc == 2) {
1048 ff_hevc_set_neighbour_available(s, x0, y0 + (1 << log2_trafo_size_c),
1049 trafo_size_h, trafo_size_v);
1050 s->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0 + (1 << log2_trafo_size_c), 1);
1051 s->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0 + (1 << log2_trafo_size_c), 2);
1053 } else if (blk_idx == 3) {
1054 int trafo_size_h = 1 << (log2_trafo_size + 1);
1055 int trafo_size_v = 1 << (log2_trafo_size + s->sps->vshift[1]);
1056 ff_hevc_set_neighbour_available(s, xBase, yBase,
1057 trafo_size_h, trafo_size_v);
1058 s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase, 1);
1059 s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase, 2);
1060 if (s->sps->chroma_format_idc == 2) {
1061 ff_hevc_set_neighbour_available(s, xBase, yBase + (1 << (log2_trafo_size)),
1062 trafo_size_h, trafo_size_v);
1063 s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase + (1 << (log2_trafo_size)), 1);
1064 s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase + (1 << (log2_trafo_size)), 2);
1072 static void set_deblocking_bypass(HEVCContext *s, int x0, int y0, int log2_cb_size)
1074 int cb_size = 1 << log2_cb_size;
1075 int log2_min_pu_size = s->sps->log2_min_pu_size;
1077 int min_pu_width = s->sps->min_pu_width;
1078 int x_end = FFMIN(x0 + cb_size, s->sps->width);
1079 int y_end = FFMIN(y0 + cb_size, s->sps->height);
1082 for (j = (y0 >> log2_min_pu_size); j < (y_end >> log2_min_pu_size); j++)
1083 for (i = (x0 >> log2_min_pu_size); i < (x_end >> log2_min_pu_size); i++)
1084 s->is_pcm[i + j * min_pu_width] = 2;
1087 static int hls_transform_tree(HEVCContext *s, int x0, int y0,
1088 int xBase, int yBase, int cb_xBase, int cb_yBase,
1089 int log2_cb_size, int log2_trafo_size,
1090 int trafo_depth, int blk_idx,
1091 const int *base_cbf_cb, const int *base_cbf_cr)
1093 HEVCLocalContext *lc = s->HEVClc;
1094 uint8_t split_transform_flag;
1099 cbf_cb[0] = base_cbf_cb[0];
1100 cbf_cb[1] = base_cbf_cb[1];
1101 cbf_cr[0] = base_cbf_cr[0];
1102 cbf_cr[1] = base_cbf_cr[1];
1104 if (lc->cu.intra_split_flag) {
1105 if (trafo_depth == 1) {
1106 lc->tu.intra_pred_mode = lc->pu.intra_pred_mode[blk_idx];
1107 if (s->sps->chroma_format_idc == 3) {
1108 lc->tu.intra_pred_mode_c = lc->pu.intra_pred_mode_c[blk_idx];
1109 lc->tu.chroma_mode_c = lc->pu.chroma_mode_c[blk_idx];
1111 lc->tu.intra_pred_mode_c = lc->pu.intra_pred_mode_c[0];
1112 lc->tu.chroma_mode_c = lc->pu.chroma_mode_c[0];
1116 lc->tu.intra_pred_mode = lc->pu.intra_pred_mode[0];
1117 lc->tu.intra_pred_mode_c = lc->pu.intra_pred_mode_c[0];
1118 lc->tu.chroma_mode_c = lc->pu.chroma_mode_c[0];
1121 if (log2_trafo_size <= s->sps->log2_max_trafo_size &&
1122 log2_trafo_size > s->sps->log2_min_tb_size &&
1123 trafo_depth < lc->cu.max_trafo_depth &&
1124 !(lc->cu.intra_split_flag && trafo_depth == 0)) {
1125 split_transform_flag = ff_hevc_split_transform_flag_decode(s, log2_trafo_size);
1127 int inter_split = s->sps->max_transform_hierarchy_depth_inter == 0 &&
1128 lc->cu.pred_mode == MODE_INTER &&
1129 lc->cu.part_mode != PART_2Nx2N &&
1132 split_transform_flag = log2_trafo_size > s->sps->log2_max_trafo_size ||
1133 (lc->cu.intra_split_flag && trafo_depth == 0) ||
1137 if (log2_trafo_size > 2 || s->sps->chroma_format_idc == 3) {
1138 if (trafo_depth == 0 || cbf_cb[0]) {
1139 cbf_cb[0] = ff_hevc_cbf_cb_cr_decode(s, trafo_depth);
1140 if (s->sps->chroma_format_idc == 2 && (!split_transform_flag || log2_trafo_size == 3)) {
1141 cbf_cb[1] = ff_hevc_cbf_cb_cr_decode(s, trafo_depth);
1143 } else if (trafo_depth == 0) {
1148 if (trafo_depth == 0 || cbf_cr[0]) {
1149 cbf_cr[0] = ff_hevc_cbf_cb_cr_decode(s, trafo_depth);
1150 if (s->sps->chroma_format_idc == 2 && (!split_transform_flag || log2_trafo_size == 3)) {
1151 cbf_cr[1] = ff_hevc_cbf_cb_cr_decode(s, trafo_depth);
1153 } else if (trafo_depth == 0) {
1159 if (split_transform_flag) {
1160 const int trafo_size_split = 1 << (log2_trafo_size - 1);
1161 const int x1 = x0 + trafo_size_split;
1162 const int y1 = y0 + trafo_size_split;
1164 #define SUBDIVIDE(x, y, idx) \
1166 ret = hls_transform_tree(s, x, y, x0, y0, cb_xBase, cb_yBase, log2_cb_size, \
1167 log2_trafo_size - 1, trafo_depth + 1, idx, \
1173 SUBDIVIDE(x0, y0, 0);
1174 SUBDIVIDE(x1, y0, 1);
1175 SUBDIVIDE(x0, y1, 2);
1176 SUBDIVIDE(x1, y1, 3);
1180 int min_tu_size = 1 << s->sps->log2_min_tb_size;
1181 int log2_min_tu_size = s->sps->log2_min_tb_size;
1182 int min_tu_width = s->sps->min_tb_width;
1185 if (lc->cu.pred_mode == MODE_INTRA || trafo_depth != 0 ||
1186 cbf_cb[0] || cbf_cr[0] ||
1187 (s->sps->chroma_format_idc == 2 && (cbf_cb[1] || cbf_cr[1]))) {
1188 cbf_luma = ff_hevc_cbf_luma_decode(s, trafo_depth);
1191 ret = hls_transform_unit(s, x0, y0, xBase, yBase, cb_xBase, cb_yBase,
1192 log2_cb_size, log2_trafo_size, trafo_depth,
1193 blk_idx, cbf_luma, cbf_cb, cbf_cr);
1196 // TODO: store cbf_luma somewhere else
1199 for (i = 0; i < (1 << log2_trafo_size); i += min_tu_size)
1200 for (j = 0; j < (1 << log2_trafo_size); j += min_tu_size) {
1201 int x_tu = (x0 + j) >> log2_min_tu_size;
1202 int y_tu = (y0 + i) >> log2_min_tu_size;
1203 s->cbf_luma[y_tu * min_tu_width + x_tu] = 1;
1206 if (!s->sh.disable_deblocking_filter_flag) {
1207 ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_trafo_size);
1208 if (s->pps->transquant_bypass_enable_flag &&
1209 lc->cu.cu_transquant_bypass_flag)
1210 set_deblocking_bypass(s, x0, y0, log2_trafo_size);
1216 static int hls_pcm_sample(HEVCContext *s, int x0, int y0, int log2_cb_size)
1218 HEVCLocalContext *lc = s->HEVClc;
1220 int cb_size = 1 << log2_cb_size;
1221 int stride0 = s->frame->linesize[0];
1222 uint8_t *dst0 = &s->frame->data[0][y0 * stride0 + (x0 << s->sps->pixel_shift)];
1223 int stride1 = s->frame->linesize[1];
1224 uint8_t *dst1 = &s->frame->data[1][(y0 >> s->sps->vshift[1]) * stride1 + ((x0 >> s->sps->hshift[1]) << s->sps->pixel_shift)];
1225 int stride2 = s->frame->linesize[2];
1226 uint8_t *dst2 = &s->frame->data[2][(y0 >> s->sps->vshift[2]) * stride2 + ((x0 >> s->sps->hshift[2]) << s->sps->pixel_shift)];
1228 int length = cb_size * cb_size * s->sps->pcm.bit_depth +
1229 (((cb_size >> s->sps->hshift[1]) * (cb_size >> s->sps->vshift[1])) +
1230 ((cb_size >> s->sps->hshift[2]) * (cb_size >> s->sps->vshift[2]))) *
1231 s->sps->pcm.bit_depth_chroma;
1232 const uint8_t *pcm = skip_bytes(&lc->cc, (length + 7) >> 3);
1235 if (!s->sh.disable_deblocking_filter_flag)
1236 ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_cb_size);
1238 ret = init_get_bits(&gb, pcm, length);
1242 s->hevcdsp.put_pcm(dst0, stride0, cb_size, cb_size, &gb, s->sps->pcm.bit_depth);
1243 s->hevcdsp.put_pcm(dst1, stride1,
1244 cb_size >> s->sps->hshift[1],
1245 cb_size >> s->sps->vshift[1],
1246 &gb, s->sps->pcm.bit_depth_chroma);
1247 s->hevcdsp.put_pcm(dst2, stride2,
1248 cb_size >> s->sps->hshift[2],
1249 cb_size >> s->sps->vshift[2],
1250 &gb, s->sps->pcm.bit_depth_chroma);
1255 * 8.5.3.2.2.1 Luma sample unidirectional interpolation process
1257 * @param s HEVC decoding context
1258 * @param dst target buffer for block data at block position
1259 * @param dststride stride of the dst buffer
1260 * @param ref reference picture buffer at origin (0, 0)
1261 * @param mv motion vector (relative to block position) to get pixel data from
1262 * @param x_off horizontal position of block from origin (0, 0)
1263 * @param y_off vertical position of block from origin (0, 0)
1264 * @param block_w width of block
1265 * @param block_h height of block
1266 * @param luma_weight weighting factor applied to the luma prediction
1267 * @param luma_offset additive offset applied to the luma prediction value
1270 static void luma_mc_uni(HEVCContext *s, uint8_t *dst, ptrdiff_t dststride,
1271 AVFrame *ref, const Mv *mv, int x_off, int y_off,
1272 int block_w, int block_h, int luma_weight, int luma_offset)
1274 HEVCLocalContext *lc = s->HEVClc;
1275 uint8_t *src = ref->data[0];
1276 ptrdiff_t srcstride = ref->linesize[0];
1277 int pic_width = s->sps->width;
1278 int pic_height = s->sps->height;
1281 int weight_flag = (s->sh.slice_type == P_SLICE && s->pps->weighted_pred_flag) ||
1282 (s->sh.slice_type == B_SLICE && s->pps->weighted_bipred_flag);
1283 int idx = ff_hevc_pel_weight[block_w];
1285 x_off += mv->x >> 2;
1286 y_off += mv->y >> 2;
1287 src += y_off * srcstride + (x_off << s->sps->pixel_shift);
1289 if (x_off < QPEL_EXTRA_BEFORE || y_off < QPEL_EXTRA_AFTER ||
1290 x_off >= pic_width - block_w - QPEL_EXTRA_AFTER ||
1291 y_off >= pic_height - block_h - QPEL_EXTRA_AFTER) {
1292 const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->sps->pixel_shift;
1293 int offset = QPEL_EXTRA_BEFORE * srcstride + (QPEL_EXTRA_BEFORE << s->sps->pixel_shift);
1294 int buf_offset = QPEL_EXTRA_BEFORE * edge_emu_stride + (QPEL_EXTRA_BEFORE << s->sps->pixel_shift);
1296 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src - offset,
1297 edge_emu_stride, srcstride,
1298 block_w + QPEL_EXTRA,
1299 block_h + QPEL_EXTRA,
1300 x_off - QPEL_EXTRA_BEFORE, y_off - QPEL_EXTRA_BEFORE,
1301 pic_width, pic_height);
1302 src = lc->edge_emu_buffer + buf_offset;
1303 srcstride = edge_emu_stride;
1307 s->hevcdsp.put_hevc_qpel_uni[idx][!!my][!!mx](dst, dststride, src, srcstride,
1308 block_h, mx, my, block_w);
1310 s->hevcdsp.put_hevc_qpel_uni_w[idx][!!my][!!mx](dst, dststride, src, srcstride,
1311 block_h, s->sh.luma_log2_weight_denom,
1312 luma_weight, luma_offset, mx, my, block_w);
1316 * 8.5.3.2.2.1 Luma sample bidirectional interpolation process
1318 * @param s HEVC decoding context
1319 * @param dst target buffer for block data at block position
1320 * @param dststride stride of the dst buffer
1321 * @param ref0 reference picture0 buffer at origin (0, 0)
1322 * @param mv0 motion vector0 (relative to block position) to get pixel data from
1323 * @param x_off horizontal position of block from origin (0, 0)
1324 * @param y_off vertical position of block from origin (0, 0)
1325 * @param block_w width of block
1326 * @param block_h height of block
1327 * @param ref1 reference picture1 buffer at origin (0, 0)
1328 * @param mv1 motion vector1 (relative to block position) to get pixel data from
1329 * @param current_mv current motion vector structure
1331 static void luma_mc_bi(HEVCContext *s, uint8_t *dst, ptrdiff_t dststride,
1332 AVFrame *ref0, const Mv *mv0, int x_off, int y_off,
1333 int block_w, int block_h, AVFrame *ref1, const Mv *mv1, struct MvField *current_mv)
1335 HEVCLocalContext *lc = s->HEVClc;
1336 DECLARE_ALIGNED(16, int16_t, tmp[MAX_PB_SIZE * MAX_PB_SIZE]);
1337 ptrdiff_t src0stride = ref0->linesize[0];
1338 ptrdiff_t src1stride = ref1->linesize[0];
1339 int pic_width = s->sps->width;
1340 int pic_height = s->sps->height;
1341 int mx0 = mv0->x & 3;
1342 int my0 = mv0->y & 3;
1343 int mx1 = mv1->x & 3;
1344 int my1 = mv1->y & 3;
1345 int weight_flag = (s->sh.slice_type == P_SLICE && s->pps->weighted_pred_flag) ||
1346 (s->sh.slice_type == B_SLICE && s->pps->weighted_bipred_flag);
1347 int x_off0 = x_off + (mv0->x >> 2);
1348 int y_off0 = y_off + (mv0->y >> 2);
1349 int x_off1 = x_off + (mv1->x >> 2);
1350 int y_off1 = y_off + (mv1->y >> 2);
1351 int idx = ff_hevc_pel_weight[block_w];
1353 uint8_t *src0 = ref0->data[0] + y_off0 * src0stride + (int)((unsigned)x_off0 << s->sps->pixel_shift);
1354 uint8_t *src1 = ref1->data[0] + y_off1 * src1stride + (int)((unsigned)x_off1 << s->sps->pixel_shift);
1356 if (x_off0 < QPEL_EXTRA_BEFORE || y_off0 < QPEL_EXTRA_AFTER ||
1357 x_off0 >= pic_width - block_w - QPEL_EXTRA_AFTER ||
1358 y_off0 >= pic_height - block_h - QPEL_EXTRA_AFTER) {
1359 const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->sps->pixel_shift;
1360 int offset = QPEL_EXTRA_BEFORE * src0stride + (QPEL_EXTRA_BEFORE << s->sps->pixel_shift);
1361 int buf_offset = QPEL_EXTRA_BEFORE * edge_emu_stride + (QPEL_EXTRA_BEFORE << s->sps->pixel_shift);
1363 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src0 - offset,
1364 edge_emu_stride, src0stride,
1365 block_w + QPEL_EXTRA,
1366 block_h + QPEL_EXTRA,
1367 x_off0 - QPEL_EXTRA_BEFORE, y_off0 - QPEL_EXTRA_BEFORE,
1368 pic_width, pic_height);
1369 src0 = lc->edge_emu_buffer + buf_offset;
1370 src0stride = edge_emu_stride;
1373 if (x_off1 < QPEL_EXTRA_BEFORE || y_off1 < QPEL_EXTRA_AFTER ||
1374 x_off1 >= pic_width - block_w - QPEL_EXTRA_AFTER ||
1375 y_off1 >= pic_height - block_h - QPEL_EXTRA_AFTER) {
1376 const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->sps->pixel_shift;
1377 int offset = QPEL_EXTRA_BEFORE * src1stride + (QPEL_EXTRA_BEFORE << s->sps->pixel_shift);
1378 int buf_offset = QPEL_EXTRA_BEFORE * edge_emu_stride + (QPEL_EXTRA_BEFORE << s->sps->pixel_shift);
1380 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer2, src1 - offset,
1381 edge_emu_stride, src1stride,
1382 block_w + QPEL_EXTRA,
1383 block_h + QPEL_EXTRA,
1384 x_off1 - QPEL_EXTRA_BEFORE, y_off1 - QPEL_EXTRA_BEFORE,
1385 pic_width, pic_height);
1386 src1 = lc->edge_emu_buffer2 + buf_offset;
1387 src1stride = edge_emu_stride;
1390 s->hevcdsp.put_hevc_qpel[idx][!!my0][!!mx0](tmp, src0, src0stride,
1391 block_h, mx0, my0, block_w);
1393 s->hevcdsp.put_hevc_qpel_bi[idx][!!my1][!!mx1](dst, dststride, src1, src1stride, tmp,
1394 block_h, mx1, my1, block_w);
1396 s->hevcdsp.put_hevc_qpel_bi_w[idx][!!my1][!!mx1](dst, dststride, src1, src1stride, tmp,
1397 block_h, s->sh.luma_log2_weight_denom,
1398 s->sh.luma_weight_l0[current_mv->ref_idx[0]],
1399 s->sh.luma_weight_l1[current_mv->ref_idx[1]],
1400 s->sh.luma_offset_l0[current_mv->ref_idx[0]],
1401 s->sh.luma_offset_l1[current_mv->ref_idx[1]],
1407 * 8.5.3.2.2.2 Chroma sample uniprediction interpolation process
1409 * @param s HEVC decoding context
1410 * @param dst1 target buffer for block data at block position (U plane)
1411 * @param dst2 target buffer for block data at block position (V plane)
1412 * @param dststride stride of the dst1 and dst2 buffers
1413 * @param ref reference picture buffer at origin (0, 0)
1414 * @param mv motion vector (relative to block position) to get pixel data from
1415 * @param x_off horizontal position of block from origin (0, 0)
1416 * @param y_off vertical position of block from origin (0, 0)
1417 * @param block_w width of block
1418 * @param block_h height of block
1419 * @param chroma_weight weighting factor applied to the chroma prediction
1420 * @param chroma_offset additive offset applied to the chroma prediction value
1423 static void chroma_mc_uni(HEVCContext *s, uint8_t *dst0,
1424 ptrdiff_t dststride, uint8_t *src0, ptrdiff_t srcstride, int reflist,
1425 int x_off, int y_off, int block_w, int block_h, struct MvField *current_mv, int chroma_weight, int chroma_offset)
1427 HEVCLocalContext *lc = s->HEVClc;
1428 int pic_width = s->sps->width >> s->sps->hshift[1];
1429 int pic_height = s->sps->height >> s->sps->vshift[1];
1430 const Mv *mv = ¤t_mv->mv[reflist];
1431 int weight_flag = (s->sh.slice_type == P_SLICE && s->pps->weighted_pred_flag) ||
1432 (s->sh.slice_type == B_SLICE && s->pps->weighted_bipred_flag);
1433 int idx = ff_hevc_pel_weight[block_w];
1434 int hshift = s->sps->hshift[1];
1435 int vshift = s->sps->vshift[1];
1436 intptr_t mx = mv->x & ((1 << (2 + hshift)) - 1);
1437 intptr_t my = mv->y & ((1 << (2 + vshift)) - 1);
1438 intptr_t _mx = mx << (1 - hshift);
1439 intptr_t _my = my << (1 - vshift);
1441 x_off += mv->x >> (2 + hshift);
1442 y_off += mv->y >> (2 + vshift);
1443 src0 += y_off * srcstride + (x_off << s->sps->pixel_shift);
1445 if (x_off < EPEL_EXTRA_BEFORE || y_off < EPEL_EXTRA_AFTER ||
1446 x_off >= pic_width - block_w - EPEL_EXTRA_AFTER ||
1447 y_off >= pic_height - block_h - EPEL_EXTRA_AFTER) {
1448 const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->sps->pixel_shift;
1449 int offset0 = EPEL_EXTRA_BEFORE * (srcstride + (1 << s->sps->pixel_shift));
1450 int buf_offset0 = EPEL_EXTRA_BEFORE *
1451 (edge_emu_stride + (1 << s->sps->pixel_shift));
1452 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src0 - offset0,
1453 edge_emu_stride, srcstride,
1454 block_w + EPEL_EXTRA, block_h + EPEL_EXTRA,
1455 x_off - EPEL_EXTRA_BEFORE,
1456 y_off - EPEL_EXTRA_BEFORE,
1457 pic_width, pic_height);
1459 src0 = lc->edge_emu_buffer + buf_offset0;
1460 srcstride = edge_emu_stride;
1463 s->hevcdsp.put_hevc_epel_uni[idx][!!my][!!mx](dst0, dststride, src0, srcstride,
1464 block_h, _mx, _my, block_w);
1466 s->hevcdsp.put_hevc_epel_uni_w[idx][!!my][!!mx](dst0, dststride, src0, srcstride,
1467 block_h, s->sh.chroma_log2_weight_denom,
1468 chroma_weight, chroma_offset, _mx, _my, block_w);
1472 * 8.5.3.2.2.2 Chroma sample bidirectional interpolation process
1474 * @param s HEVC decoding context
1475 * @param dst target buffer for block data at block position
1476 * @param dststride stride of the dst buffer
1477 * @param ref0 reference picture0 buffer at origin (0, 0)
1478 * @param mv0 motion vector0 (relative to block position) to get pixel data from
1479 * @param x_off horizontal position of block from origin (0, 0)
1480 * @param y_off vertical position of block from origin (0, 0)
1481 * @param block_w width of block
1482 * @param block_h height of block
1483 * @param ref1 reference picture1 buffer at origin (0, 0)
1484 * @param mv1 motion vector1 (relative to block position) to get pixel data from
1485 * @param current_mv current motion vector structure
1486 * @param cidx chroma component(cb, cr)
1488 static void chroma_mc_bi(HEVCContext *s, uint8_t *dst0, ptrdiff_t dststride, AVFrame *ref0, AVFrame *ref1,
1489 int x_off, int y_off, int block_w, int block_h, struct MvField *current_mv, int cidx)
1491 DECLARE_ALIGNED(16, int16_t, tmp [MAX_PB_SIZE * MAX_PB_SIZE]);
1492 HEVCLocalContext *lc = s->HEVClc;
1493 uint8_t *src1 = ref0->data[cidx+1];
1494 uint8_t *src2 = ref1->data[cidx+1];
1495 ptrdiff_t src1stride = ref0->linesize[cidx+1];
1496 ptrdiff_t src2stride = ref1->linesize[cidx+1];
1497 int weight_flag = (s->sh.slice_type == P_SLICE && s->pps->weighted_pred_flag) ||
1498 (s->sh.slice_type == B_SLICE && s->pps->weighted_bipred_flag);
1499 int pic_width = s->sps->width >> s->sps->hshift[1];
1500 int pic_height = s->sps->height >> s->sps->vshift[1];
1501 Mv *mv0 = ¤t_mv->mv[0];
1502 Mv *mv1 = ¤t_mv->mv[1];
1503 int hshift = s->sps->hshift[1];
1504 int vshift = s->sps->vshift[1];
1506 intptr_t mx0 = mv0->x & ((1 << (2 + hshift)) - 1);
1507 intptr_t my0 = mv0->y & ((1 << (2 + vshift)) - 1);
1508 intptr_t mx1 = mv1->x & ((1 << (2 + hshift)) - 1);
1509 intptr_t my1 = mv1->y & ((1 << (2 + vshift)) - 1);
1510 intptr_t _mx0 = mx0 << (1 - hshift);
1511 intptr_t _my0 = my0 << (1 - vshift);
1512 intptr_t _mx1 = mx1 << (1 - hshift);
1513 intptr_t _my1 = my1 << (1 - vshift);
1515 int x_off0 = x_off + (mv0->x >> (2 + hshift));
1516 int y_off0 = y_off + (mv0->y >> (2 + vshift));
1517 int x_off1 = x_off + (mv1->x >> (2 + hshift));
1518 int y_off1 = y_off + (mv1->y >> (2 + vshift));
1519 int idx = ff_hevc_pel_weight[block_w];
1520 src1 += y_off0 * src1stride + (int)((unsigned)x_off0 << s->sps->pixel_shift);
1521 src2 += y_off1 * src2stride + (int)((unsigned)x_off1 << s->sps->pixel_shift);
1523 if (x_off0 < EPEL_EXTRA_BEFORE || y_off0 < EPEL_EXTRA_AFTER ||
1524 x_off0 >= pic_width - block_w - EPEL_EXTRA_AFTER ||
1525 y_off0 >= pic_height - block_h - EPEL_EXTRA_AFTER) {
1526 const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->sps->pixel_shift;
1527 int offset1 = EPEL_EXTRA_BEFORE * (src1stride + (1 << s->sps->pixel_shift));
1528 int buf_offset1 = EPEL_EXTRA_BEFORE *
1529 (edge_emu_stride + (1 << s->sps->pixel_shift));
1531 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src1 - offset1,
1532 edge_emu_stride, src1stride,
1533 block_w + EPEL_EXTRA, block_h + EPEL_EXTRA,
1534 x_off0 - EPEL_EXTRA_BEFORE,
1535 y_off0 - EPEL_EXTRA_BEFORE,
1536 pic_width, pic_height);
1538 src1 = lc->edge_emu_buffer + buf_offset1;
1539 src1stride = edge_emu_stride;
1542 if (x_off1 < EPEL_EXTRA_BEFORE || y_off1 < EPEL_EXTRA_AFTER ||
1543 x_off1 >= pic_width - block_w - EPEL_EXTRA_AFTER ||
1544 y_off1 >= pic_height - block_h - EPEL_EXTRA_AFTER) {
1545 const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->sps->pixel_shift;
1546 int offset1 = EPEL_EXTRA_BEFORE * (src2stride + (1 << s->sps->pixel_shift));
1547 int buf_offset1 = EPEL_EXTRA_BEFORE *
1548 (edge_emu_stride + (1 << s->sps->pixel_shift));
1550 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer2, src2 - offset1,
1551 edge_emu_stride, src2stride,
1552 block_w + EPEL_EXTRA, block_h + EPEL_EXTRA,
1553 x_off1 - EPEL_EXTRA_BEFORE,
1554 y_off1 - EPEL_EXTRA_BEFORE,
1555 pic_width, pic_height);
1557 src2 = lc->edge_emu_buffer2 + buf_offset1;
1558 src2stride = edge_emu_stride;
1561 s->hevcdsp.put_hevc_epel[idx][!!my0][!!mx0](tmp, src1, src1stride,
1562 block_h, _mx0, _my0, block_w);
1564 s->hevcdsp.put_hevc_epel_bi[idx][!!my1][!!mx1](dst0, s->frame->linesize[cidx+1],
1565 src2, src2stride, tmp,
1566 block_h, _mx1, _my1, block_w);
1568 s->hevcdsp.put_hevc_epel_bi_w[idx][!!my1][!!mx1](dst0, s->frame->linesize[cidx+1],
1569 src2, src2stride, tmp,
1571 s->sh.chroma_log2_weight_denom,
1572 s->sh.chroma_weight_l0[current_mv->ref_idx[0]][cidx],
1573 s->sh.chroma_weight_l1[current_mv->ref_idx[1]][cidx],
1574 s->sh.chroma_offset_l0[current_mv->ref_idx[0]][cidx],
1575 s->sh.chroma_offset_l1[current_mv->ref_idx[1]][cidx],
1576 _mx1, _my1, block_w);
1579 static void hevc_await_progress(HEVCContext *s, HEVCFrame *ref,
1580 const Mv *mv, int y0, int height)
1582 int y = (mv->y >> 2) + y0 + height + 9;
1584 if (s->threads_type == FF_THREAD_FRAME )
1585 ff_thread_await_progress(&ref->tf, y, 0);
1588 static void hls_prediction_unit(HEVCContext *s, int x0, int y0,
1590 int log2_cb_size, int partIdx, int idx)
1592 #define POS(c_idx, x, y) \
1593 &s->frame->data[c_idx][((y) >> s->sps->vshift[c_idx]) * s->frame->linesize[c_idx] + \
1594 (((x) >> s->sps->hshift[c_idx]) << s->sps->pixel_shift)]
1595 HEVCLocalContext *lc = s->HEVClc;
1597 struct MvField current_mv = {{{ 0 }}};
1599 int min_pu_width = s->sps->min_pu_width;
1601 MvField *tab_mvf = s->ref->tab_mvf;
1602 RefPicList *refPicList = s->ref->refPicList;
1603 HEVCFrame *ref0, *ref1;
1604 uint8_t *dst0 = POS(0, x0, y0);
1605 uint8_t *dst1 = POS(1, x0, y0);
1606 uint8_t *dst2 = POS(2, x0, y0);
1607 int log2_min_cb_size = s->sps->log2_min_cb_size;
1608 int min_cb_width = s->sps->min_cb_width;
1609 int x_cb = x0 >> log2_min_cb_size;
1610 int y_cb = y0 >> log2_min_cb_size;
1616 if (SAMPLE_CTB(s->skip_flag, x_cb, y_cb)) {
1617 if (s->sh.max_num_merge_cand > 1)
1618 merge_idx = ff_hevc_merge_idx_decode(s);
1622 ff_hevc_luma_mv_merge_mode(s, x0, y0,
1625 log2_cb_size, partIdx,
1626 merge_idx, ¤t_mv);
1627 x_pu = x0 >> s->sps->log2_min_pu_size;
1628 y_pu = y0 >> s->sps->log2_min_pu_size;
1630 for (j = 0; j < nPbH >> s->sps->log2_min_pu_size; j++)
1631 for (i = 0; i < nPbW >> s->sps->log2_min_pu_size; i++)
1632 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i] = current_mv;
1633 } else { /* MODE_INTER */
1634 lc->pu.merge_flag = ff_hevc_merge_flag_decode(s);
1635 if (lc->pu.merge_flag) {
1636 if (s->sh.max_num_merge_cand > 1)
1637 merge_idx = ff_hevc_merge_idx_decode(s);
1641 ff_hevc_luma_mv_merge_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
1642 partIdx, merge_idx, ¤t_mv);
1643 x_pu = x0 >> s->sps->log2_min_pu_size;
1644 y_pu = y0 >> s->sps->log2_min_pu_size;
1646 for (j = 0; j < nPbH >> s->sps->log2_min_pu_size; j++)
1647 for (i = 0; i < nPbW >> s->sps->log2_min_pu_size; i++)
1648 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i] = current_mv;
1650 enum InterPredIdc inter_pred_idc = PRED_L0;
1651 ff_hevc_set_neighbour_available(s, x0, y0, nPbW, nPbH);
1652 current_mv.pred_flag = 0;
1653 if (s->sh.slice_type == B_SLICE)
1654 inter_pred_idc = ff_hevc_inter_pred_idc_decode(s, nPbW, nPbH);
1656 if (inter_pred_idc != PRED_L1) {
1657 if (s->sh.nb_refs[L0]) {
1658 ref_idx[0] = ff_hevc_ref_idx_lx_decode(s, s->sh.nb_refs[L0]);
1659 current_mv.ref_idx[0] = ref_idx[0];
1661 current_mv.pred_flag = PF_L0;
1662 ff_hevc_hls_mvd_coding(s, x0, y0, 0);
1663 mvp_flag[0] = ff_hevc_mvp_lx_flag_decode(s);
1664 ff_hevc_luma_mv_mvp_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
1665 partIdx, merge_idx, ¤t_mv,
1667 current_mv.mv[0].x += lc->pu.mvd.x;
1668 current_mv.mv[0].y += lc->pu.mvd.y;
1671 if (inter_pred_idc != PRED_L0) {
1672 if (s->sh.nb_refs[L1]) {
1673 ref_idx[1] = ff_hevc_ref_idx_lx_decode(s, s->sh.nb_refs[L1]);
1674 current_mv.ref_idx[1] = ref_idx[1];
1677 if (s->sh.mvd_l1_zero_flag == 1 && inter_pred_idc == PRED_BI) {
1678 AV_ZERO32(&lc->pu.mvd);
1680 ff_hevc_hls_mvd_coding(s, x0, y0, 1);
1683 current_mv.pred_flag += PF_L1;
1684 mvp_flag[1] = ff_hevc_mvp_lx_flag_decode(s);
1685 ff_hevc_luma_mv_mvp_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
1686 partIdx, merge_idx, ¤t_mv,
1688 current_mv.mv[1].x += lc->pu.mvd.x;
1689 current_mv.mv[1].y += lc->pu.mvd.y;
1692 x_pu = x0 >> s->sps->log2_min_pu_size;
1693 y_pu = y0 >> s->sps->log2_min_pu_size;
1695 for(j = 0; j < nPbH >> s->sps->log2_min_pu_size; j++)
1696 for (i = 0; i < nPbW >> s->sps->log2_min_pu_size; i++)
1697 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i] = current_mv;
1701 if (current_mv.pred_flag & PF_L0) {
1702 ref0 = refPicList[0].ref[current_mv.ref_idx[0]];
1705 hevc_await_progress(s, ref0, ¤t_mv.mv[0], y0, nPbH);
1707 if (current_mv.pred_flag & PF_L1) {
1708 ref1 = refPicList[1].ref[current_mv.ref_idx[1]];
1711 hevc_await_progress(s, ref1, ¤t_mv.mv[1], y0, nPbH);
1714 if (current_mv.pred_flag == PF_L0) {
1715 int x0_c = x0 >> s->sps->hshift[1];
1716 int y0_c = y0 >> s->sps->vshift[1];
1717 int nPbW_c = nPbW >> s->sps->hshift[1];
1718 int nPbH_c = nPbH >> s->sps->vshift[1];
1720 luma_mc_uni(s, dst0, s->frame->linesize[0], ref0->frame,
1721 ¤t_mv.mv[0], x0, y0, nPbW, nPbH,
1722 s->sh.luma_weight_l0[current_mv.ref_idx[0]],
1723 s->sh.luma_offset_l0[current_mv.ref_idx[0]]);
1725 chroma_mc_uni(s, dst1, s->frame->linesize[1], ref0->frame->data[1], ref0->frame->linesize[1],
1726 0, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
1727 s->sh.chroma_weight_l0[current_mv.ref_idx[0]][0], s->sh.chroma_offset_l0[current_mv.ref_idx[0]][0]);
1728 chroma_mc_uni(s, dst2, s->frame->linesize[2], ref0->frame->data[2], ref0->frame->linesize[2],
1729 0, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
1730 s->sh.chroma_weight_l0[current_mv.ref_idx[0]][1], s->sh.chroma_offset_l0[current_mv.ref_idx[0]][1]);
1731 } else if (current_mv.pred_flag == PF_L1) {
1732 int x0_c = x0 >> s->sps->hshift[1];
1733 int y0_c = y0 >> s->sps->vshift[1];
1734 int nPbW_c = nPbW >> s->sps->hshift[1];
1735 int nPbH_c = nPbH >> s->sps->vshift[1];
1737 luma_mc_uni(s, dst0, s->frame->linesize[0], ref1->frame,
1738 ¤t_mv.mv[1], x0, y0, nPbW, nPbH,
1739 s->sh.luma_weight_l1[current_mv.ref_idx[1]],
1740 s->sh.luma_offset_l1[current_mv.ref_idx[1]]);
1742 chroma_mc_uni(s, dst1, s->frame->linesize[1], ref1->frame->data[1], ref1->frame->linesize[1],
1743 1, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
1744 s->sh.chroma_weight_l1[current_mv.ref_idx[1]][0], s->sh.chroma_offset_l1[current_mv.ref_idx[1]][0]);
1746 chroma_mc_uni(s, dst2, s->frame->linesize[2], ref1->frame->data[2], ref1->frame->linesize[2],
1747 1, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
1748 s->sh.chroma_weight_l1[current_mv.ref_idx[1]][1], s->sh.chroma_offset_l1[current_mv.ref_idx[1]][1]);
1749 } else if (current_mv.pred_flag == PF_BI) {
1750 int x0_c = x0 >> s->sps->hshift[1];
1751 int y0_c = y0 >> s->sps->vshift[1];
1752 int nPbW_c = nPbW >> s->sps->hshift[1];
1753 int nPbH_c = nPbH >> s->sps->vshift[1];
1755 luma_mc_bi(s, dst0, s->frame->linesize[0], ref0->frame,
1756 ¤t_mv.mv[0], x0, y0, nPbW, nPbH,
1757 ref1->frame, ¤t_mv.mv[1], ¤t_mv);
1759 chroma_mc_bi(s, dst1, s->frame->linesize[1], ref0->frame, ref1->frame,
1760 x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv, 0);
1762 chroma_mc_bi(s, dst2, s->frame->linesize[2], ref0->frame, ref1->frame,
1763 x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv, 1);
1770 static int luma_intra_pred_mode(HEVCContext *s, int x0, int y0, int pu_size,
1771 int prev_intra_luma_pred_flag)
1773 HEVCLocalContext *lc = s->HEVClc;
1774 int x_pu = x0 >> s->sps->log2_min_pu_size;
1775 int y_pu = y0 >> s->sps->log2_min_pu_size;
1776 int min_pu_width = s->sps->min_pu_width;
1777 int size_in_pus = pu_size >> s->sps->log2_min_pu_size;
1778 int x0b = x0 & ((1 << s->sps->log2_ctb_size) - 1);
1779 int y0b = y0 & ((1 << s->sps->log2_ctb_size) - 1);
1781 int cand_up = (lc->ctb_up_flag || y0b) ?
1782 s->tab_ipm[(y_pu - 1) * min_pu_width + x_pu] : INTRA_DC;
1783 int cand_left = (lc->ctb_left_flag || x0b) ?
1784 s->tab_ipm[y_pu * min_pu_width + x_pu - 1] : INTRA_DC;
1786 int y_ctb = (y0 >> (s->sps->log2_ctb_size)) << (s->sps->log2_ctb_size);
1788 MvField *tab_mvf = s->ref->tab_mvf;
1789 int intra_pred_mode;
1793 // intra_pred_mode prediction does not cross vertical CTB boundaries
1794 if ((y0 - 1) < y_ctb)
1797 if (cand_left == cand_up) {
1798 if (cand_left < 2) {
1799 candidate[0] = INTRA_PLANAR;
1800 candidate[1] = INTRA_DC;
1801 candidate[2] = INTRA_ANGULAR_26;
1803 candidate[0] = cand_left;
1804 candidate[1] = 2 + ((cand_left - 2 - 1 + 32) & 31);
1805 candidate[2] = 2 + ((cand_left - 2 + 1) & 31);
1808 candidate[0] = cand_left;
1809 candidate[1] = cand_up;
1810 if (candidate[0] != INTRA_PLANAR && candidate[1] != INTRA_PLANAR) {
1811 candidate[2] = INTRA_PLANAR;
1812 } else if (candidate[0] != INTRA_DC && candidate[1] != INTRA_DC) {
1813 candidate[2] = INTRA_DC;
1815 candidate[2] = INTRA_ANGULAR_26;
1819 if (prev_intra_luma_pred_flag) {
1820 intra_pred_mode = candidate[lc->pu.mpm_idx];
1822 if (candidate[0] > candidate[1])
1823 FFSWAP(uint8_t, candidate[0], candidate[1]);
1824 if (candidate[0] > candidate[2])
1825 FFSWAP(uint8_t, candidate[0], candidate[2]);
1826 if (candidate[1] > candidate[2])
1827 FFSWAP(uint8_t, candidate[1], candidate[2]);
1829 intra_pred_mode = lc->pu.rem_intra_luma_pred_mode;
1830 for (i = 0; i < 3; i++)
1831 if (intra_pred_mode >= candidate[i])
1835 /* write the intra prediction units into the mv array */
1838 for (i = 0; i < size_in_pus; i++) {
1839 memset(&s->tab_ipm[(y_pu + i) * min_pu_width + x_pu],
1840 intra_pred_mode, size_in_pus);
1842 for (j = 0; j < size_in_pus; j++) {
1843 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].pred_flag = PF_INTRA;
1847 return intra_pred_mode;
1850 static av_always_inline void set_ct_depth(HEVCContext *s, int x0, int y0,
1851 int log2_cb_size, int ct_depth)
1853 int length = (1 << log2_cb_size) >> s->sps->log2_min_cb_size;
1854 int x_cb = x0 >> s->sps->log2_min_cb_size;
1855 int y_cb = y0 >> s->sps->log2_min_cb_size;
1858 for (y = 0; y < length; y++)
1859 memset(&s->tab_ct_depth[(y_cb + y) * s->sps->min_cb_width + x_cb],
1863 static const uint8_t tab_mode_idx[] = {
1864 0, 1, 2, 2, 2, 2, 3, 5, 7, 8, 10, 12, 13, 15, 17, 18, 19, 20,
1865 21, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 29, 29, 30, 31};
1867 static void intra_prediction_unit(HEVCContext *s, int x0, int y0,
1870 HEVCLocalContext *lc = s->HEVClc;
1871 static const uint8_t intra_chroma_table[4] = { 0, 26, 10, 1 };
1872 uint8_t prev_intra_luma_pred_flag[4];
1873 int split = lc->cu.part_mode == PART_NxN;
1874 int pb_size = (1 << log2_cb_size) >> split;
1875 int side = split + 1;
1879 for (i = 0; i < side; i++)
1880 for (j = 0; j < side; j++)
1881 prev_intra_luma_pred_flag[2 * i + j] = ff_hevc_prev_intra_luma_pred_flag_decode(s);
1883 for (i = 0; i < side; i++) {
1884 for (j = 0; j < side; j++) {
1885 if (prev_intra_luma_pred_flag[2 * i + j])
1886 lc->pu.mpm_idx = ff_hevc_mpm_idx_decode(s);
1888 lc->pu.rem_intra_luma_pred_mode = ff_hevc_rem_intra_luma_pred_mode_decode(s);
1890 lc->pu.intra_pred_mode[2 * i + j] =
1891 luma_intra_pred_mode(s, x0 + pb_size * j, y0 + pb_size * i, pb_size,
1892 prev_intra_luma_pred_flag[2 * i + j]);
1896 if (s->sps->chroma_format_idc == 3) {
1897 for (i = 0; i < side; i++) {
1898 for (j = 0; j < side; j++) {
1899 lc->pu.chroma_mode_c[2 * i + j] = chroma_mode = ff_hevc_intra_chroma_pred_mode_decode(s);
1900 if (chroma_mode != 4) {
1901 if (lc->pu.intra_pred_mode[2 * i + j] == intra_chroma_table[chroma_mode])
1902 lc->pu.intra_pred_mode_c[2 * i + j] = 34;
1904 lc->pu.intra_pred_mode_c[2 * i + j] = intra_chroma_table[chroma_mode];
1906 lc->pu.intra_pred_mode_c[2 * i + j] = lc->pu.intra_pred_mode[2 * i + j];
1910 } else if (s->sps->chroma_format_idc == 2) {
1912 lc->pu.chroma_mode_c[0] = chroma_mode = ff_hevc_intra_chroma_pred_mode_decode(s);
1913 if (chroma_mode != 4) {
1914 if (lc->pu.intra_pred_mode[0] == intra_chroma_table[chroma_mode])
1917 mode_idx = intra_chroma_table[chroma_mode];
1919 mode_idx = lc->pu.intra_pred_mode[0];
1921 lc->pu.intra_pred_mode_c[0] = tab_mode_idx[mode_idx];
1922 } else if (s->sps->chroma_format_idc != 0) {
1923 chroma_mode = ff_hevc_intra_chroma_pred_mode_decode(s);
1924 if (chroma_mode != 4) {
1925 if (lc->pu.intra_pred_mode[0] == intra_chroma_table[chroma_mode])
1926 lc->pu.intra_pred_mode_c[0] = 34;
1928 lc->pu.intra_pred_mode_c[0] = intra_chroma_table[chroma_mode];
1930 lc->pu.intra_pred_mode_c[0] = lc->pu.intra_pred_mode[0];
1935 static void intra_prediction_unit_default_value(HEVCContext *s,
1939 HEVCLocalContext *lc = s->HEVClc;
1940 int pb_size = 1 << log2_cb_size;
1941 int size_in_pus = pb_size >> s->sps->log2_min_pu_size;
1942 int min_pu_width = s->sps->min_pu_width;
1943 MvField *tab_mvf = s->ref->tab_mvf;
1944 int x_pu = x0 >> s->sps->log2_min_pu_size;
1945 int y_pu = y0 >> s->sps->log2_min_pu_size;
1948 if (size_in_pus == 0)
1950 for (j = 0; j < size_in_pus; j++)
1951 memset(&s->tab_ipm[(y_pu + j) * min_pu_width + x_pu], INTRA_DC, size_in_pus);
1952 if (lc->cu.pred_mode == MODE_INTRA)
1953 for (j = 0; j < size_in_pus; j++)
1954 for (k = 0; k < size_in_pus; k++)
1955 tab_mvf[(y_pu + j) * min_pu_width + x_pu + k].pred_flag = PF_INTRA;
1958 static int hls_coding_unit(HEVCContext *s, int x0, int y0, int log2_cb_size)
1960 int cb_size = 1 << log2_cb_size;
1961 HEVCLocalContext *lc = s->HEVClc;
1962 int log2_min_cb_size = s->sps->log2_min_cb_size;
1963 int length = cb_size >> log2_min_cb_size;
1964 int min_cb_width = s->sps->min_cb_width;
1965 int x_cb = x0 >> log2_min_cb_size;
1966 int y_cb = y0 >> log2_min_cb_size;
1967 int idx = log2_cb_size - 2;
1968 int qp_block_mask = (1<<(s->sps->log2_ctb_size - s->pps->diff_cu_qp_delta_depth)) - 1;
1973 lc->cu.rqt_root_cbf = 1;
1974 lc->cu.pred_mode = MODE_INTRA;
1975 lc->cu.part_mode = PART_2Nx2N;
1976 lc->cu.intra_split_flag = 0;
1977 lc->cu.pcm_flag = 0;
1979 SAMPLE_CTB(s->skip_flag, x_cb, y_cb) = 0;
1980 for (x = 0; x < 4; x++)
1981 lc->pu.intra_pred_mode[x] = 1;
1982 if (s->pps->transquant_bypass_enable_flag) {
1983 lc->cu.cu_transquant_bypass_flag = ff_hevc_cu_transquant_bypass_flag_decode(s);
1984 if (lc->cu.cu_transquant_bypass_flag)
1985 set_deblocking_bypass(s, x0, y0, log2_cb_size);
1987 lc->cu.cu_transquant_bypass_flag = 0;
1989 if (s->sh.slice_type != I_SLICE) {
1990 uint8_t skip_flag = ff_hevc_skip_flag_decode(s, x0, y0, x_cb, y_cb);
1992 x = y_cb * min_cb_width + x_cb;
1993 for (y = 0; y < length; y++) {
1994 memset(&s->skip_flag[x], skip_flag, length);
1997 lc->cu.pred_mode = skip_flag ? MODE_SKIP : MODE_INTER;
1999 x = y_cb * min_cb_width + x_cb;
2000 for (y = 0; y < length; y++) {
2001 memset(&s->skip_flag[x], 0, length);
2006 if (SAMPLE_CTB(s->skip_flag, x_cb, y_cb)) {
2007 hls_prediction_unit(s, x0, y0, cb_size, cb_size, log2_cb_size, 0, idx);
2008 intra_prediction_unit_default_value(s, x0, y0, log2_cb_size);
2010 if (!s->sh.disable_deblocking_filter_flag)
2011 ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_cb_size);
2013 if (s->sh.slice_type != I_SLICE)
2014 lc->cu.pred_mode = ff_hevc_pred_mode_decode(s);
2015 if (lc->cu.pred_mode != MODE_INTRA ||
2016 log2_cb_size == s->sps->log2_min_cb_size) {
2017 lc->cu.part_mode = ff_hevc_part_mode_decode(s, log2_cb_size);
2018 lc->cu.intra_split_flag = lc->cu.part_mode == PART_NxN &&
2019 lc->cu.pred_mode == MODE_INTRA;
2022 if (lc->cu.pred_mode == MODE_INTRA) {
2023 if (lc->cu.part_mode == PART_2Nx2N && s->sps->pcm_enabled_flag &&
2024 log2_cb_size >= s->sps->pcm.log2_min_pcm_cb_size &&
2025 log2_cb_size <= s->sps->pcm.log2_max_pcm_cb_size) {
2026 lc->cu.pcm_flag = ff_hevc_pcm_flag_decode(s);
2028 if (lc->cu.pcm_flag) {
2029 intra_prediction_unit_default_value(s, x0, y0, log2_cb_size);
2030 ret = hls_pcm_sample(s, x0, y0, log2_cb_size);
2031 if (s->sps->pcm.loop_filter_disable_flag)
2032 set_deblocking_bypass(s, x0, y0, log2_cb_size);
2037 intra_prediction_unit(s, x0, y0, log2_cb_size);
2040 intra_prediction_unit_default_value(s, x0, y0, log2_cb_size);
2041 switch (lc->cu.part_mode) {
2043 hls_prediction_unit(s, x0, y0, cb_size, cb_size, log2_cb_size, 0, idx);
2046 hls_prediction_unit(s, x0, y0, cb_size, cb_size / 2, log2_cb_size, 0, idx);
2047 hls_prediction_unit(s, x0, y0 + cb_size / 2, cb_size, cb_size / 2, log2_cb_size, 1, idx);
2050 hls_prediction_unit(s, x0, y0, cb_size / 2, cb_size, log2_cb_size, 0, idx - 1);
2051 hls_prediction_unit(s, x0 + cb_size / 2, y0, cb_size / 2, cb_size, log2_cb_size, 1, idx - 1);
2054 hls_prediction_unit(s, x0, y0, cb_size, cb_size / 4, log2_cb_size, 0, idx);
2055 hls_prediction_unit(s, x0, y0 + cb_size / 4, cb_size, cb_size * 3 / 4, log2_cb_size, 1, idx);
2058 hls_prediction_unit(s, x0, y0, cb_size, cb_size * 3 / 4, log2_cb_size, 0, idx);
2059 hls_prediction_unit(s, x0, y0 + cb_size * 3 / 4, cb_size, cb_size / 4, log2_cb_size, 1, idx);
2062 hls_prediction_unit(s, x0, y0, cb_size / 4, cb_size, log2_cb_size, 0, idx - 2);
2063 hls_prediction_unit(s, x0 + cb_size / 4, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 1, idx - 2);
2066 hls_prediction_unit(s, x0, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 0, idx - 2);
2067 hls_prediction_unit(s, x0 + cb_size * 3 / 4, y0, cb_size / 4, cb_size, log2_cb_size, 1, idx - 2);
2070 hls_prediction_unit(s, x0, y0, cb_size / 2, cb_size / 2, log2_cb_size, 0, idx - 1);
2071 hls_prediction_unit(s, x0 + cb_size / 2, y0, cb_size / 2, cb_size / 2, log2_cb_size, 1, idx - 1);
2072 hls_prediction_unit(s, x0, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 2, idx - 1);
2073 hls_prediction_unit(s, x0 + cb_size / 2, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 3, idx - 1);
2078 if (!lc->cu.pcm_flag) {
2079 if (lc->cu.pred_mode != MODE_INTRA &&
2080 !(lc->cu.part_mode == PART_2Nx2N && lc->pu.merge_flag)) {
2081 lc->cu.rqt_root_cbf = ff_hevc_no_residual_syntax_flag_decode(s);
2083 if (lc->cu.rqt_root_cbf) {
2084 const static int cbf[2] = { 0 };
2085 lc->cu.max_trafo_depth = lc->cu.pred_mode == MODE_INTRA ?
2086 s->sps->max_transform_hierarchy_depth_intra + lc->cu.intra_split_flag :
2087 s->sps->max_transform_hierarchy_depth_inter;
2088 ret = hls_transform_tree(s, x0, y0, x0, y0, x0, y0,
2090 log2_cb_size, 0, 0, cbf, cbf);
2094 if (!s->sh.disable_deblocking_filter_flag)
2095 ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_cb_size);
2100 if (s->pps->cu_qp_delta_enabled_flag && lc->tu.is_cu_qp_delta_coded == 0)
2101 ff_hevc_set_qPy(s, x0, y0, log2_cb_size);
2103 x = y_cb * min_cb_width + x_cb;
2104 for (y = 0; y < length; y++) {
2105 memset(&s->qp_y_tab[x], lc->qp_y, length);
2109 if(((x0 + (1<<log2_cb_size)) & qp_block_mask) == 0 &&
2110 ((y0 + (1<<log2_cb_size)) & qp_block_mask) == 0) {
2111 lc->qPy_pred = lc->qp_y;
2114 set_ct_depth(s, x0, y0, log2_cb_size, lc->ct.depth);
2119 static int hls_coding_quadtree(HEVCContext *s, int x0, int y0,
2120 int log2_cb_size, int cb_depth)
2122 HEVCLocalContext *lc = s->HEVClc;
2123 const int cb_size = 1 << log2_cb_size;
2125 int qp_block_mask = (1<<(s->sps->log2_ctb_size - s->pps->diff_cu_qp_delta_depth)) - 1;
2128 lc->ct.depth = cb_depth;
2129 if (x0 + cb_size <= s->sps->width &&
2130 y0 + cb_size <= s->sps->height &&
2131 log2_cb_size > s->sps->log2_min_cb_size) {
2132 split_cu = ff_hevc_split_coding_unit_flag_decode(s, cb_depth, x0, y0);
2134 split_cu = (log2_cb_size > s->sps->log2_min_cb_size);
2136 if (s->pps->cu_qp_delta_enabled_flag &&
2137 log2_cb_size >= s->sps->log2_ctb_size - s->pps->diff_cu_qp_delta_depth) {
2138 lc->tu.is_cu_qp_delta_coded = 0;
2139 lc->tu.cu_qp_delta = 0;
2142 if (s->sh.cu_chroma_qp_offset_enabled_flag &&
2143 log2_cb_size >= s->sps->log2_ctb_size - s->pps->diff_cu_chroma_qp_offset_depth) {
2144 lc->tu.is_cu_chroma_qp_offset_coded = 0;
2148 const int cb_size_split = cb_size >> 1;
2149 const int x1 = x0 + cb_size_split;
2150 const int y1 = y0 + cb_size_split;
2154 more_data = hls_coding_quadtree(s, x0, y0, log2_cb_size - 1, cb_depth + 1);
2158 if (more_data && x1 < s->sps->width) {
2159 more_data = hls_coding_quadtree(s, x1, y0, log2_cb_size - 1, cb_depth + 1);
2163 if (more_data && y1 < s->sps->height) {
2164 more_data = hls_coding_quadtree(s, x0, y1, log2_cb_size - 1, cb_depth + 1);
2168 if (more_data && x1 < s->sps->width &&
2169 y1 < s->sps->height) {
2170 more_data = hls_coding_quadtree(s, x1, y1, log2_cb_size - 1, cb_depth + 1);
2175 if(((x0 + (1<<log2_cb_size)) & qp_block_mask) == 0 &&
2176 ((y0 + (1<<log2_cb_size)) & qp_block_mask) == 0)
2177 lc->qPy_pred = lc->qp_y;
2180 return ((x1 + cb_size_split) < s->sps->width ||
2181 (y1 + cb_size_split) < s->sps->height);
2185 ret = hls_coding_unit(s, x0, y0, log2_cb_size);
2188 if ((!((x0 + cb_size) %
2189 (1 << (s->sps->log2_ctb_size))) ||
2190 (x0 + cb_size >= s->sps->width)) &&
2192 (1 << (s->sps->log2_ctb_size))) ||
2193 (y0 + cb_size >= s->sps->height))) {
2194 int end_of_slice_flag = ff_hevc_end_of_slice_flag_decode(s);
2195 return !end_of_slice_flag;
2204 static void hls_decode_neighbour(HEVCContext *s, int x_ctb, int y_ctb,
2207 HEVCLocalContext *lc = s->HEVClc;
2208 int ctb_size = 1 << s->sps->log2_ctb_size;
2209 int ctb_addr_rs = s->pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2210 int ctb_addr_in_slice = ctb_addr_rs - s->sh.slice_addr;
2212 s->tab_slice_address[ctb_addr_rs] = s->sh.slice_addr;
2214 if (s->pps->entropy_coding_sync_enabled_flag) {
2215 if (x_ctb == 0 && (y_ctb & (ctb_size - 1)) == 0)
2216 lc->first_qp_group = 1;
2217 lc->end_of_tiles_x = s->sps->width;
2218 } else if (s->pps->tiles_enabled_flag) {
2219 if (ctb_addr_ts && s->pps->tile_id[ctb_addr_ts] != s->pps->tile_id[ctb_addr_ts - 1]) {
2220 int idxX = s->pps->col_idxX[x_ctb >> s->sps->log2_ctb_size];
2221 lc->end_of_tiles_x = x_ctb + (s->pps->column_width[idxX] << s->sps->log2_ctb_size);
2222 lc->first_qp_group = 1;
2225 lc->end_of_tiles_x = s->sps->width;
2228 lc->end_of_tiles_y = FFMIN(y_ctb + ctb_size, s->sps->height);
2230 lc->boundary_flags = 0;
2231 if (s->pps->tiles_enabled_flag) {
2232 if (x_ctb > 0 && s->pps->tile_id[ctb_addr_ts] != s->pps->tile_id[s->pps->ctb_addr_rs_to_ts[ctb_addr_rs - 1]])
2233 lc->boundary_flags |= BOUNDARY_LEFT_TILE;
2234 if (x_ctb > 0 && s->tab_slice_address[ctb_addr_rs] != s->tab_slice_address[ctb_addr_rs - 1])
2235 lc->boundary_flags |= BOUNDARY_LEFT_SLICE;
2236 if (y_ctb > 0 && s->pps->tile_id[ctb_addr_ts] != s->pps->tile_id[s->pps->ctb_addr_rs_to_ts[ctb_addr_rs - s->sps->ctb_width]])
2237 lc->boundary_flags |= BOUNDARY_UPPER_TILE;
2238 if (y_ctb > 0 && s->tab_slice_address[ctb_addr_rs] != s->tab_slice_address[ctb_addr_rs - s->sps->ctb_width])
2239 lc->boundary_flags |= BOUNDARY_UPPER_SLICE;
2241 if (!ctb_addr_in_slice > 0)
2242 lc->boundary_flags |= BOUNDARY_LEFT_SLICE;
2243 if (ctb_addr_in_slice < s->sps->ctb_width)
2244 lc->boundary_flags |= BOUNDARY_UPPER_SLICE;
2247 lc->ctb_left_flag = ((x_ctb > 0) && (ctb_addr_in_slice > 0) && !(lc->boundary_flags & BOUNDARY_LEFT_TILE));
2248 lc->ctb_up_flag = ((y_ctb > 0) && (ctb_addr_in_slice >= s->sps->ctb_width) && !(lc->boundary_flags & BOUNDARY_UPPER_TILE));
2249 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]]));
2250 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]]));
2253 static int hls_decode_entry(AVCodecContext *avctxt, void *isFilterThread)
2255 HEVCContext *s = avctxt->priv_data;
2256 int ctb_size = 1 << s->sps->log2_ctb_size;
2260 int ctb_addr_ts = s->pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs];
2262 if (!ctb_addr_ts && s->sh.dependent_slice_segment_flag) {
2263 av_log(s->avctx, AV_LOG_ERROR, "Impossible initial tile.\n");
2264 return AVERROR_INVALIDDATA;
2267 if (s->sh.dependent_slice_segment_flag) {
2268 int prev_rs = s->pps->ctb_addr_ts_to_rs[ctb_addr_ts - 1];
2269 if (s->tab_slice_address[prev_rs] != s->sh.slice_addr) {
2270 av_log(s->avctx, AV_LOG_ERROR, "Previous slice segment missing\n");
2271 return AVERROR_INVALIDDATA;
2275 while (more_data && ctb_addr_ts < s->sps->ctb_size) {
2276 int ctb_addr_rs = s->pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2278 x_ctb = (ctb_addr_rs % ((s->sps->width + ctb_size - 1) >> s->sps->log2_ctb_size)) << s->sps->log2_ctb_size;
2279 y_ctb = (ctb_addr_rs / ((s->sps->width + ctb_size - 1) >> s->sps->log2_ctb_size)) << s->sps->log2_ctb_size;
2280 hls_decode_neighbour(s, x_ctb, y_ctb, ctb_addr_ts);
2282 ff_hevc_cabac_init(s, ctb_addr_ts);
2284 hls_sao_param(s, x_ctb >> s->sps->log2_ctb_size, y_ctb >> s->sps->log2_ctb_size);
2286 s->deblock[ctb_addr_rs].beta_offset = s->sh.beta_offset;
2287 s->deblock[ctb_addr_rs].tc_offset = s->sh.tc_offset;
2288 s->filter_slice_edges[ctb_addr_rs] = s->sh.slice_loop_filter_across_slices_enabled_flag;
2290 more_data = hls_coding_quadtree(s, x_ctb, y_ctb, s->sps->log2_ctb_size, 0);
2291 if (more_data < 0) {
2292 s->tab_slice_address[ctb_addr_rs] = -1;
2298 ff_hevc_save_states(s, ctb_addr_ts);
2299 ff_hevc_hls_filters(s, x_ctb, y_ctb, ctb_size);
2302 if (x_ctb + ctb_size >= s->sps->width &&
2303 y_ctb + ctb_size >= s->sps->height)
2304 ff_hevc_hls_filter(s, x_ctb, y_ctb, ctb_size);
2309 static int hls_slice_data(HEVCContext *s)
2317 s->avctx->execute(s->avctx, hls_decode_entry, arg, ret , 1, sizeof(int));
2320 static int hls_decode_entry_wpp(AVCodecContext *avctxt, void *input_ctb_row, int job, int self_id)
2322 HEVCContext *s1 = avctxt->priv_data, *s;
2323 HEVCLocalContext *lc;
2324 int ctb_size = 1<< s1->sps->log2_ctb_size;
2326 int *ctb_row_p = input_ctb_row;
2327 int ctb_row = ctb_row_p[job];
2328 int ctb_addr_rs = s1->sh.slice_ctb_addr_rs + ctb_row * ((s1->sps->width + ctb_size - 1) >> s1->sps->log2_ctb_size);
2329 int ctb_addr_ts = s1->pps->ctb_addr_rs_to_ts[ctb_addr_rs];
2330 int thread = ctb_row % s1->threads_number;
2333 s = s1->sList[self_id];
2337 ret = init_get_bits8(&lc->gb, s->data + s->sh.offset[ctb_row - 1], s->sh.size[ctb_row - 1]);
2341 ff_init_cabac_decoder(&lc->cc, s->data + s->sh.offset[(ctb_row)-1], s->sh.size[ctb_row - 1]);
2344 while(more_data && ctb_addr_ts < s->sps->ctb_size) {
2345 int x_ctb = (ctb_addr_rs % s->sps->ctb_width) << s->sps->log2_ctb_size;
2346 int y_ctb = (ctb_addr_rs / s->sps->ctb_width) << s->sps->log2_ctb_size;
2348 hls_decode_neighbour(s, x_ctb, y_ctb, ctb_addr_ts);
2350 ff_thread_await_progress2(s->avctx, ctb_row, thread, SHIFT_CTB_WPP);
2352 if (avpriv_atomic_int_get(&s1->wpp_err)){
2353 ff_thread_report_progress2(s->avctx, ctb_row , thread, SHIFT_CTB_WPP);
2357 ff_hevc_cabac_init(s, ctb_addr_ts);
2358 hls_sao_param(s, x_ctb >> s->sps->log2_ctb_size, y_ctb >> s->sps->log2_ctb_size);
2359 more_data = hls_coding_quadtree(s, x_ctb, y_ctb, s->sps->log2_ctb_size, 0);
2361 if (more_data < 0) {
2362 s->tab_slice_address[ctb_addr_rs] = -1;
2368 ff_hevc_save_states(s, ctb_addr_ts);
2369 ff_thread_report_progress2(s->avctx, ctb_row, thread, 1);
2370 ff_hevc_hls_filters(s, x_ctb, y_ctb, ctb_size);
2372 if (!more_data && (x_ctb+ctb_size) < s->sps->width && ctb_row != s->sh.num_entry_point_offsets) {
2373 avpriv_atomic_int_set(&s1->wpp_err, 1);
2374 ff_thread_report_progress2(s->avctx, ctb_row ,thread, SHIFT_CTB_WPP);
2378 if ((x_ctb+ctb_size) >= s->sps->width && (y_ctb+ctb_size) >= s->sps->height ) {
2379 ff_hevc_hls_filter(s, x_ctb, y_ctb, ctb_size);
2380 ff_thread_report_progress2(s->avctx, ctb_row , thread, SHIFT_CTB_WPP);
2383 ctb_addr_rs = s->pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2386 if(x_ctb >= s->sps->width) {
2390 ff_thread_report_progress2(s->avctx, ctb_row ,thread, SHIFT_CTB_WPP);
2395 static int hls_slice_data_wpp(HEVCContext *s, const uint8_t *nal, int length)
2397 HEVCLocalContext *lc = s->HEVClc;
2398 int *ret = av_malloc_array(s->sh.num_entry_point_offsets + 1, sizeof(int));
2399 int *arg = av_malloc_array(s->sh.num_entry_point_offsets + 1, sizeof(int));
2401 int startheader, cmpt = 0;
2406 ff_alloc_entries(s->avctx, s->sh.num_entry_point_offsets + 1);
2409 for (i = 1; i < s->threads_number; i++) {
2410 s->sList[i] = av_malloc(sizeof(HEVCContext));
2411 memcpy(s->sList[i], s, sizeof(HEVCContext));
2412 s->HEVClcList[i] = av_mallocz(sizeof(HEVCLocalContext));
2413 s->sList[i]->HEVClc = s->HEVClcList[i];
2417 offset = (lc->gb.index >> 3);
2419 for (j = 0, cmpt = 0, startheader = offset + s->sh.entry_point_offset[0]; j < s->skipped_bytes; j++) {
2420 if (s->skipped_bytes_pos[j] >= offset && s->skipped_bytes_pos[j] < startheader) {
2426 for (i = 1; i < s->sh.num_entry_point_offsets; i++) {
2427 offset += (s->sh.entry_point_offset[i - 1] - cmpt);
2428 for (j = 0, cmpt = 0, startheader = offset
2429 + s->sh.entry_point_offset[i]; j < s->skipped_bytes; j++) {
2430 if (s->skipped_bytes_pos[j] >= offset && s->skipped_bytes_pos[j] < startheader) {
2435 s->sh.size[i - 1] = s->sh.entry_point_offset[i] - cmpt;
2436 s->sh.offset[i - 1] = offset;
2439 if (s->sh.num_entry_point_offsets != 0) {
2440 offset += s->sh.entry_point_offset[s->sh.num_entry_point_offsets - 1] - cmpt;
2441 s->sh.size[s->sh.num_entry_point_offsets - 1] = length - offset;
2442 s->sh.offset[s->sh.num_entry_point_offsets - 1] = offset;
2447 for (i = 1; i < s->threads_number; i++) {
2448 s->sList[i]->HEVClc->first_qp_group = 1;
2449 s->sList[i]->HEVClc->qp_y = s->sList[0]->HEVClc->qp_y;
2450 memcpy(s->sList[i], s, sizeof(HEVCContext));
2451 s->sList[i]->HEVClc = s->HEVClcList[i];
2454 avpriv_atomic_int_set(&s->wpp_err, 0);
2455 ff_reset_entries(s->avctx);
2457 for (i = 0; i <= s->sh.num_entry_point_offsets; i++) {
2462 if (s->pps->entropy_coding_sync_enabled_flag)
2463 s->avctx->execute2(s->avctx, (void *) hls_decode_entry_wpp, arg, ret, s->sh.num_entry_point_offsets + 1);
2465 for (i = 0; i <= s->sh.num_entry_point_offsets; i++)
2473 * @return AVERROR_INVALIDDATA if the packet is not a valid NAL unit,
2474 * 0 if the unit should be skipped, 1 otherwise
2476 static int hls_nal_unit(HEVCContext *s)
2478 GetBitContext *gb = &s->HEVClc->gb;
2481 if (get_bits1(gb) != 0)
2482 return AVERROR_INVALIDDATA;
2484 s->nal_unit_type = get_bits(gb, 6);
2486 nuh_layer_id = get_bits(gb, 6);
2487 s->temporal_id = get_bits(gb, 3) - 1;
2488 if (s->temporal_id < 0)
2489 return AVERROR_INVALIDDATA;
2491 av_log(s->avctx, AV_LOG_DEBUG,
2492 "nal_unit_type: %d, nuh_layer_id: %d, temporal_id: %d\n",
2493 s->nal_unit_type, nuh_layer_id, s->temporal_id);
2495 return nuh_layer_id == 0;
2498 static int set_side_data(HEVCContext *s)
2500 AVFrame *out = s->ref->frame;
2502 if (s->sei_frame_packing_present &&
2503 s->frame_packing_arrangement_type >= 3 &&
2504 s->frame_packing_arrangement_type <= 5 &&
2505 s->content_interpretation_type > 0 &&
2506 s->content_interpretation_type < 3) {
2507 AVStereo3D *stereo = av_stereo3d_create_side_data(out);
2509 return AVERROR(ENOMEM);
2511 switch (s->frame_packing_arrangement_type) {
2513 if (s->quincunx_subsampling)
2514 stereo->type = AV_STEREO3D_SIDEBYSIDE_QUINCUNX;
2516 stereo->type = AV_STEREO3D_SIDEBYSIDE;
2519 stereo->type = AV_STEREO3D_TOPBOTTOM;
2522 stereo->type = AV_STEREO3D_FRAMESEQUENCE;
2526 if (s->content_interpretation_type == 2)
2527 stereo->flags = AV_STEREO3D_FLAG_INVERT;
2530 if (s->sei_display_orientation_present &&
2531 (s->sei_anticlockwise_rotation || s->sei_hflip || s->sei_vflip)) {
2532 double angle = s->sei_anticlockwise_rotation * 360 / (double) (1 << 16);
2533 AVFrameSideData *rotation = av_frame_new_side_data(out,
2534 AV_FRAME_DATA_DISPLAYMATRIX,
2535 sizeof(int32_t) * 9);
2537 return AVERROR(ENOMEM);
2539 av_display_rotation_set((int32_t *)rotation->data, angle);
2540 av_display_matrix_flip((int32_t *)rotation->data,
2541 s->sei_vflip, s->sei_hflip);
2547 static int hevc_frame_start(HEVCContext *s)
2549 HEVCLocalContext *lc = s->HEVClc;
2550 int pic_size_in_ctb = ((s->sps->width >> s->sps->log2_min_cb_size) + 1) *
2551 ((s->sps->height >> s->sps->log2_min_cb_size) + 1);
2554 memset(s->horizontal_bs, 0, s->bs_width * s->bs_height);
2555 memset(s->vertical_bs, 0, s->bs_width * s->bs_height);
2556 memset(s->cbf_luma, 0, s->sps->min_tb_width * s->sps->min_tb_height);
2557 memset(s->is_pcm, 0, (s->sps->min_pu_width + 1) * (s->sps->min_pu_height + 1));
2558 memset(s->tab_slice_address, -1, pic_size_in_ctb * sizeof(*s->tab_slice_address));
2561 s->first_nal_type = s->nal_unit_type;
2563 if (s->pps->tiles_enabled_flag)
2564 lc->end_of_tiles_x = s->pps->column_width[0] << s->sps->log2_ctb_size;
2566 ret = ff_hevc_set_new_ref(s, &s->frame, s->poc);
2570 ret = ff_hevc_frame_rps(s);
2572 av_log(s->avctx, AV_LOG_ERROR, "Error constructing the frame RPS.\n");
2576 s->ref->frame->key_frame = IS_IRAP(s);
2578 ret = set_side_data(s);
2582 s->frame->pict_type = 3 - s->sh.slice_type;
2585 ff_hevc_bump_frame(s);
2587 av_frame_unref(s->output_frame);
2588 ret = ff_hevc_output_frame(s, s->output_frame, 0);
2592 ff_thread_finish_setup(s->avctx);
2597 if (s->ref && s->threads_type == FF_THREAD_FRAME)
2598 ff_thread_report_progress(&s->ref->tf, INT_MAX, 0);
2603 static int decode_nal_unit(HEVCContext *s, const uint8_t *nal, int length)
2605 HEVCLocalContext *lc = s->HEVClc;
2606 GetBitContext *gb = &lc->gb;
2607 int ctb_addr_ts, ret;
2609 ret = init_get_bits8(gb, nal, length);
2613 ret = hls_nal_unit(s);
2615 av_log(s->avctx, AV_LOG_ERROR, "Invalid NAL unit %d, skipping.\n",
2621 switch (s->nal_unit_type) {
2623 ret = ff_hevc_decode_nal_vps(s);
2628 ret = ff_hevc_decode_nal_sps(s);
2633 ret = ff_hevc_decode_nal_pps(s);
2637 case NAL_SEI_PREFIX:
2638 case NAL_SEI_SUFFIX:
2639 ret = ff_hevc_decode_nal_sei(s);
2650 case NAL_BLA_W_RADL:
2652 case NAL_IDR_W_RADL:
2659 ret = hls_slice_header(s);
2663 if (s->max_ra == INT_MAX) {
2664 if (s->nal_unit_type == NAL_CRA_NUT || IS_BLA(s)) {
2668 s->max_ra = INT_MIN;
2672 if ((s->nal_unit_type == NAL_RASL_R || s->nal_unit_type == NAL_RASL_N) &&
2673 s->poc <= s->max_ra) {
2677 if (s->nal_unit_type == NAL_RASL_R && s->poc > s->max_ra)
2678 s->max_ra = INT_MIN;
2681 if (s->sh.first_slice_in_pic_flag) {
2682 ret = hevc_frame_start(s);
2685 } else if (!s->ref) {
2686 av_log(s->avctx, AV_LOG_ERROR, "First slice in a frame missing.\n");
2690 if (s->nal_unit_type != s->first_nal_type) {
2691 av_log(s->avctx, AV_LOG_ERROR,
2692 "Non-matching NAL types of the VCL NALUs: %d %d\n",
2693 s->first_nal_type, s->nal_unit_type);
2694 return AVERROR_INVALIDDATA;
2697 if (!s->sh.dependent_slice_segment_flag &&
2698 s->sh.slice_type != I_SLICE) {
2699 ret = ff_hevc_slice_rpl(s);
2701 av_log(s->avctx, AV_LOG_WARNING,
2702 "Error constructing the reference lists for the current slice.\n");
2707 if (s->threads_number > 1 && s->sh.num_entry_point_offsets > 0)
2708 ctb_addr_ts = hls_slice_data_wpp(s, nal, length);
2710 ctb_addr_ts = hls_slice_data(s);
2711 if (ctb_addr_ts >= (s->sps->ctb_width * s->sps->ctb_height)) {
2715 if (ctb_addr_ts < 0) {
2722 s->seq_decode = (s->seq_decode + 1) & 0xff;
2723 s->max_ra = INT_MAX;
2729 av_log(s->avctx, AV_LOG_INFO,
2730 "Skipping NAL unit %d\n", s->nal_unit_type);
2735 if (s->avctx->err_recognition & AV_EF_EXPLODE)
2740 /* FIXME: This is adapted from ff_h264_decode_nal, avoiding duplication
2741 * between these functions would be nice. */
2742 int ff_hevc_extract_rbsp(HEVCContext *s, const uint8_t *src, int length,
2748 s->skipped_bytes = 0;
2749 #define STARTCODE_TEST \
2750 if (i + 2 < length && src[i + 1] == 0 && src[i + 2] <= 3) { \
2751 if (src[i + 2] != 3) { \
2752 /* startcode, so we must be past the end */ \
2757 #if HAVE_FAST_UNALIGNED
2758 #define FIND_FIRST_ZERO \
2759 if (i > 0 && !src[i]) \
2764 for (i = 0; i + 1 < length; i += 9) {
2765 if (!((~AV_RN64A(src + i) &
2766 (AV_RN64A(src + i) - 0x0100010001000101ULL)) &
2767 0x8000800080008080ULL))
2774 for (i = 0; i + 1 < length; i += 5) {
2775 if (!((~AV_RN32A(src + i) &
2776 (AV_RN32A(src + i) - 0x01000101U)) &
2783 #endif /* HAVE_FAST_64BIT */
2785 for (i = 0; i + 1 < length; i += 2) {
2788 if (i > 0 && src[i - 1] == 0)
2792 #endif /* HAVE_FAST_UNALIGNED */
2794 if (i >= length - 1) { // no escaped 0
2800 av_fast_malloc(&nal->rbsp_buffer, &nal->rbsp_buffer_size,
2801 length + FF_INPUT_BUFFER_PADDING_SIZE);
2802 if (!nal->rbsp_buffer)
2803 return AVERROR(ENOMEM);
2805 dst = nal->rbsp_buffer;
2807 memcpy(dst, src, i);
2809 while (si + 2 < length) {
2810 // remove escapes (very rare 1:2^22)
2811 if (src[si + 2] > 3) {
2812 dst[di++] = src[si++];
2813 dst[di++] = src[si++];
2814 } else if (src[si] == 0 && src[si + 1] == 0) {
2815 if (src[si + 2] == 3) { // escape
2821 if (s->skipped_bytes_pos_size < s->skipped_bytes) {
2822 s->skipped_bytes_pos_size *= 2;
2823 av_reallocp_array(&s->skipped_bytes_pos,
2824 s->skipped_bytes_pos_size,
2825 sizeof(*s->skipped_bytes_pos));
2826 if (!s->skipped_bytes_pos)
2827 return AVERROR(ENOMEM);
2829 if (s->skipped_bytes_pos)
2830 s->skipped_bytes_pos[s->skipped_bytes-1] = di - 1;
2832 } else // next start code
2836 dst[di++] = src[si++];
2839 dst[di++] = src[si++];
2842 memset(dst + di, 0, FF_INPUT_BUFFER_PADDING_SIZE);
2849 static int decode_nal_units(HEVCContext *s, const uint8_t *buf, int length)
2851 int i, consumed, ret = 0;
2854 s->last_eos = s->eos;
2857 /* split the input packet into NAL units, so we know the upper bound on the
2858 * number of slices in the frame */
2860 while (length >= 4) {
2862 int extract_length = 0;
2866 for (i = 0; i < s->nal_length_size; i++)
2867 extract_length = (extract_length << 8) | buf[i];
2868 buf += s->nal_length_size;
2869 length -= s->nal_length_size;
2871 if (extract_length > length) {
2872 av_log(s->avctx, AV_LOG_ERROR, "Invalid NAL unit size.\n");
2873 ret = AVERROR_INVALIDDATA;
2877 /* search start code */
2878 while (buf[0] != 0 || buf[1] != 0 || buf[2] != 1) {
2882 av_log(s->avctx, AV_LOG_ERROR, "No start code is found.\n");
2883 ret = AVERROR_INVALIDDATA;
2893 extract_length = length;
2895 if (s->nals_allocated < s->nb_nals + 1) {
2896 int new_size = s->nals_allocated + 1;
2897 HEVCNAL *tmp = av_realloc_array(s->nals, new_size, sizeof(*tmp));
2899 ret = AVERROR(ENOMEM);
2903 memset(s->nals + s->nals_allocated, 0,
2904 (new_size - s->nals_allocated) * sizeof(*tmp));
2905 av_reallocp_array(&s->skipped_bytes_nal, new_size, sizeof(*s->skipped_bytes_nal));
2906 av_reallocp_array(&s->skipped_bytes_pos_size_nal, new_size, sizeof(*s->skipped_bytes_pos_size_nal));
2907 av_reallocp_array(&s->skipped_bytes_pos_nal, new_size, sizeof(*s->skipped_bytes_pos_nal));
2908 s->skipped_bytes_pos_size_nal[s->nals_allocated] = 1024; // initial buffer size
2909 s->skipped_bytes_pos_nal[s->nals_allocated] = av_malloc_array(s->skipped_bytes_pos_size_nal[s->nals_allocated], sizeof(*s->skipped_bytes_pos));
2910 s->nals_allocated = new_size;
2912 s->skipped_bytes_pos_size = s->skipped_bytes_pos_size_nal[s->nb_nals];
2913 s->skipped_bytes_pos = s->skipped_bytes_pos_nal[s->nb_nals];
2914 nal = &s->nals[s->nb_nals];
2916 consumed = ff_hevc_extract_rbsp(s, buf, extract_length, nal);
2918 s->skipped_bytes_nal[s->nb_nals] = s->skipped_bytes;
2919 s->skipped_bytes_pos_size_nal[s->nb_nals] = s->skipped_bytes_pos_size;
2920 s->skipped_bytes_pos_nal[s->nb_nals++] = s->skipped_bytes_pos;
2928 ret = init_get_bits8(&s->HEVClc->gb, nal->data, nal->size);
2933 if (s->nal_unit_type == NAL_EOB_NUT ||
2934 s->nal_unit_type == NAL_EOS_NUT)
2941 /* parse the NAL units */
2942 for (i = 0; i < s->nb_nals; i++) {
2944 s->skipped_bytes = s->skipped_bytes_nal[i];
2945 s->skipped_bytes_pos = s->skipped_bytes_pos_nal[i];
2947 ret = decode_nal_unit(s, s->nals[i].data, s->nals[i].size);
2949 av_log(s->avctx, AV_LOG_WARNING,
2950 "Error parsing NAL unit #%d.\n", i);
2956 if (s->ref && s->threads_type == FF_THREAD_FRAME)
2957 ff_thread_report_progress(&s->ref->tf, INT_MAX, 0);
2962 static void print_md5(void *log_ctx, int level, uint8_t md5[16])
2965 for (i = 0; i < 16; i++)
2966 av_log(log_ctx, level, "%02"PRIx8, md5[i]);
2969 static int verify_md5(HEVCContext *s, AVFrame *frame)
2971 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format);
2976 return AVERROR(EINVAL);
2978 pixel_shift = desc->comp[0].depth_minus1 > 7;
2980 av_log(s->avctx, AV_LOG_DEBUG, "Verifying checksum for frame with POC %d: ",
2983 /* the checksums are LE, so we have to byteswap for >8bpp formats
2986 if (pixel_shift && !s->checksum_buf) {
2987 av_fast_malloc(&s->checksum_buf, &s->checksum_buf_size,
2988 FFMAX3(frame->linesize[0], frame->linesize[1],
2989 frame->linesize[2]));
2990 if (!s->checksum_buf)
2991 return AVERROR(ENOMEM);
2995 for (i = 0; frame->data[i]; i++) {
2996 int width = s->avctx->coded_width;
2997 int height = s->avctx->coded_height;
2998 int w = (i == 1 || i == 2) ? (width >> desc->log2_chroma_w) : width;
2999 int h = (i == 1 || i == 2) ? (height >> desc->log2_chroma_h) : height;
3002 av_md5_init(s->md5_ctx);
3003 for (j = 0; j < h; j++) {
3004 const uint8_t *src = frame->data[i] + j * frame->linesize[i];
3007 s->bdsp.bswap16_buf((uint16_t *) s->checksum_buf,
3008 (const uint16_t *) src, w);
3009 src = s->checksum_buf;
3012 av_md5_update(s->md5_ctx, src, w << pixel_shift);
3014 av_md5_final(s->md5_ctx, md5);
3016 if (!memcmp(md5, s->md5[i], 16)) {
3017 av_log (s->avctx, AV_LOG_DEBUG, "plane %d - correct ", i);
3018 print_md5(s->avctx, AV_LOG_DEBUG, md5);
3019 av_log (s->avctx, AV_LOG_DEBUG, "; ");
3021 av_log (s->avctx, AV_LOG_ERROR, "mismatching checksum of plane %d - ", i);
3022 print_md5(s->avctx, AV_LOG_ERROR, md5);
3023 av_log (s->avctx, AV_LOG_ERROR, " != ");
3024 print_md5(s->avctx, AV_LOG_ERROR, s->md5[i]);
3025 av_log (s->avctx, AV_LOG_ERROR, "\n");
3026 return AVERROR_INVALIDDATA;
3030 av_log(s->avctx, AV_LOG_DEBUG, "\n");
3035 static int hevc_decode_frame(AVCodecContext *avctx, void *data, int *got_output,
3039 HEVCContext *s = avctx->priv_data;
3042 ret = ff_hevc_output_frame(s, data, 1);
3051 ret = decode_nal_units(s, avpkt->data, avpkt->size);
3055 /* verify the SEI checksum */
3056 if (avctx->err_recognition & AV_EF_CRCCHECK && s->is_decoded &&
3058 ret = verify_md5(s, s->ref->frame);
3059 if (ret < 0 && avctx->err_recognition & AV_EF_EXPLODE) {
3060 ff_hevc_unref_frame(s, s->ref, ~0);
3066 if (s->is_decoded) {
3067 av_log(avctx, AV_LOG_DEBUG, "Decoded frame with POC %d.\n", s->poc);
3071 if (s->output_frame->buf[0]) {
3072 av_frame_move_ref(data, s->output_frame);
3079 static int hevc_ref_frame(HEVCContext *s, HEVCFrame *dst, HEVCFrame *src)
3083 ret = ff_thread_ref_frame(&dst->tf, &src->tf);
3087 dst->tab_mvf_buf = av_buffer_ref(src->tab_mvf_buf);
3088 if (!dst->tab_mvf_buf)
3090 dst->tab_mvf = src->tab_mvf;
3092 dst->rpl_tab_buf = av_buffer_ref(src->rpl_tab_buf);
3093 if (!dst->rpl_tab_buf)
3095 dst->rpl_tab = src->rpl_tab;
3097 dst->rpl_buf = av_buffer_ref(src->rpl_buf);
3101 dst->poc = src->poc;
3102 dst->ctb_count = src->ctb_count;
3103 dst->window = src->window;
3104 dst->flags = src->flags;
3105 dst->sequence = src->sequence;
3109 ff_hevc_unref_frame(s, dst, ~0);
3110 return AVERROR(ENOMEM);
3113 static av_cold int hevc_decode_free(AVCodecContext *avctx)
3115 HEVCContext *s = avctx->priv_data;
3120 av_freep(&s->md5_ctx);
3122 for(i=0; i < s->nals_allocated; i++) {
3123 av_freep(&s->skipped_bytes_pos_nal[i]);
3125 av_freep(&s->skipped_bytes_pos_size_nal);
3126 av_freep(&s->skipped_bytes_nal);
3127 av_freep(&s->skipped_bytes_pos_nal);
3129 av_freep(&s->cabac_state);
3131 av_frame_free(&s->tmp_frame);
3132 av_frame_free(&s->output_frame);
3134 for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
3135 ff_hevc_unref_frame(s, &s->DPB[i], ~0);
3136 av_frame_free(&s->DPB[i].frame);
3139 for (i = 0; i < FF_ARRAY_ELEMS(s->vps_list); i++)
3140 av_buffer_unref(&s->vps_list[i]);
3141 for (i = 0; i < FF_ARRAY_ELEMS(s->sps_list); i++)
3142 av_buffer_unref(&s->sps_list[i]);
3143 for (i = 0; i < FF_ARRAY_ELEMS(s->pps_list); i++)
3144 av_buffer_unref(&s->pps_list[i]);
3149 av_buffer_unref(&s->current_sps);
3151 av_freep(&s->sh.entry_point_offset);
3152 av_freep(&s->sh.offset);
3153 av_freep(&s->sh.size);
3155 for (i = 1; i < s->threads_number; i++) {
3156 HEVCLocalContext *lc = s->HEVClcList[i];
3158 av_freep(&s->HEVClcList[i]);
3159 av_freep(&s->sList[i]);
3162 if (s->HEVClc == s->HEVClcList[0])
3164 av_freep(&s->HEVClcList[0]);
3166 for (i = 0; i < s->nals_allocated; i++)
3167 av_freep(&s->nals[i].rbsp_buffer);
3169 s->nals_allocated = 0;
3174 static av_cold int hevc_init_context(AVCodecContext *avctx)
3176 HEVCContext *s = avctx->priv_data;
3181 s->HEVClc = av_mallocz(sizeof(HEVCLocalContext));
3184 s->HEVClcList[0] = s->HEVClc;
3187 s->cabac_state = av_malloc(HEVC_CONTEXTS);
3188 if (!s->cabac_state)
3191 s->tmp_frame = av_frame_alloc();
3195 s->output_frame = av_frame_alloc();
3196 if (!s->output_frame)
3199 for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
3200 s->DPB[i].frame = av_frame_alloc();
3201 if (!s->DPB[i].frame)
3203 s->DPB[i].tf.f = s->DPB[i].frame;
3206 s->max_ra = INT_MAX;
3208 s->md5_ctx = av_md5_alloc();
3212 ff_bswapdsp_init(&s->bdsp);
3214 s->context_initialized = 1;
3220 hevc_decode_free(avctx);
3221 return AVERROR(ENOMEM);
3224 static int hevc_update_thread_context(AVCodecContext *dst,
3225 const AVCodecContext *src)
3227 HEVCContext *s = dst->priv_data;
3228 HEVCContext *s0 = src->priv_data;
3231 if (!s->context_initialized) {
3232 ret = hevc_init_context(dst);
3237 for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
3238 ff_hevc_unref_frame(s, &s->DPB[i], ~0);
3239 if (s0->DPB[i].frame->buf[0]) {
3240 ret = hevc_ref_frame(s, &s->DPB[i], &s0->DPB[i]);
3246 if (s->sps != s0->sps)
3248 for (i = 0; i < FF_ARRAY_ELEMS(s->vps_list); i++) {
3249 av_buffer_unref(&s->vps_list[i]);
3250 if (s0->vps_list[i]) {
3251 s->vps_list[i] = av_buffer_ref(s0->vps_list[i]);
3252 if (!s->vps_list[i])
3253 return AVERROR(ENOMEM);
3257 for (i = 0; i < FF_ARRAY_ELEMS(s->sps_list); i++) {
3258 av_buffer_unref(&s->sps_list[i]);
3259 if (s0->sps_list[i]) {
3260 s->sps_list[i] = av_buffer_ref(s0->sps_list[i]);
3261 if (!s->sps_list[i])
3262 return AVERROR(ENOMEM);
3266 for (i = 0; i < FF_ARRAY_ELEMS(s->pps_list); i++) {
3267 av_buffer_unref(&s->pps_list[i]);
3268 if (s0->pps_list[i]) {
3269 s->pps_list[i] = av_buffer_ref(s0->pps_list[i]);
3270 if (!s->pps_list[i])
3271 return AVERROR(ENOMEM);
3275 av_buffer_unref(&s->current_sps);
3276 if (s0->current_sps) {
3277 s->current_sps = av_buffer_ref(s0->current_sps);
3278 if (!s->current_sps)
3279 return AVERROR(ENOMEM);
3282 if (s->sps != s0->sps)
3283 if ((ret = set_sps(s, s0->sps)) < 0)
3286 s->seq_decode = s0->seq_decode;
3287 s->seq_output = s0->seq_output;
3288 s->pocTid0 = s0->pocTid0;
3289 s->max_ra = s0->max_ra;
3292 s->is_nalff = s0->is_nalff;
3293 s->nal_length_size = s0->nal_length_size;
3295 s->threads_number = s0->threads_number;
3296 s->threads_type = s0->threads_type;
3299 s->seq_decode = (s->seq_decode + 1) & 0xff;
3300 s->max_ra = INT_MAX;
3306 static int hevc_decode_extradata(HEVCContext *s)
3308 AVCodecContext *avctx = s->avctx;
3312 bytestream2_init(&gb, avctx->extradata, avctx->extradata_size);
3314 if (avctx->extradata_size > 3 &&
3315 (avctx->extradata[0] || avctx->extradata[1] ||
3316 avctx->extradata[2] > 1)) {
3317 /* It seems the extradata is encoded as hvcC format.
3318 * Temporarily, we support configurationVersion==0 until 14496-15 3rd
3319 * is finalized. When finalized, configurationVersion will be 1 and we
3320 * can recognize hvcC by checking if avctx->extradata[0]==1 or not. */
3321 int i, j, num_arrays, nal_len_size;
3325 bytestream2_skip(&gb, 21);
3326 nal_len_size = (bytestream2_get_byte(&gb) & 3) + 1;
3327 num_arrays = bytestream2_get_byte(&gb);
3329 /* nal units in the hvcC always have length coded with 2 bytes,
3330 * so put a fake nal_length_size = 2 while parsing them */
3331 s->nal_length_size = 2;
3333 /* Decode nal units from hvcC. */
3334 for (i = 0; i < num_arrays; i++) {
3335 int type = bytestream2_get_byte(&gb) & 0x3f;
3336 int cnt = bytestream2_get_be16(&gb);
3338 for (j = 0; j < cnt; j++) {
3339 // +2 for the nal size field
3340 int nalsize = bytestream2_peek_be16(&gb) + 2;
3341 if (bytestream2_get_bytes_left(&gb) < nalsize) {
3342 av_log(s->avctx, AV_LOG_ERROR,
3343 "Invalid NAL unit size in extradata.\n");
3344 return AVERROR_INVALIDDATA;
3347 ret = decode_nal_units(s, gb.buffer, nalsize);
3349 av_log(avctx, AV_LOG_ERROR,
3350 "Decoding nal unit %d %d from hvcC failed\n",
3354 bytestream2_skip(&gb, nalsize);
3358 /* Now store right nal length size, that will be used to parse
3360 s->nal_length_size = nal_len_size;
3363 ret = decode_nal_units(s, avctx->extradata, avctx->extradata_size);
3370 static av_cold int hevc_decode_init(AVCodecContext *avctx)
3372 HEVCContext *s = avctx->priv_data;
3375 ff_init_cabac_states();
3377 avctx->internal->allocate_progress = 1;
3379 ret = hevc_init_context(avctx);
3383 s->enable_parallel_tiles = 0;
3384 s->picture_struct = 0;
3386 if(avctx->active_thread_type & FF_THREAD_SLICE)
3387 s->threads_number = avctx->thread_count;
3389 s->threads_number = 1;
3391 if (avctx->extradata_size > 0 && avctx->extradata) {
3392 ret = hevc_decode_extradata(s);
3394 hevc_decode_free(avctx);
3399 if((avctx->active_thread_type & FF_THREAD_FRAME) && avctx->thread_count > 1)
3400 s->threads_type = FF_THREAD_FRAME;
3402 s->threads_type = FF_THREAD_SLICE;
3407 static av_cold int hevc_init_thread_copy(AVCodecContext *avctx)
3409 HEVCContext *s = avctx->priv_data;
3412 memset(s, 0, sizeof(*s));
3414 ret = hevc_init_context(avctx);
3421 static void hevc_decode_flush(AVCodecContext *avctx)
3423 HEVCContext *s = avctx->priv_data;
3424 ff_hevc_flush_dpb(s);
3425 s->max_ra = INT_MAX;
3428 #define OFFSET(x) offsetof(HEVCContext, x)
3429 #define PAR (AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
3431 static const AVProfile profiles[] = {
3432 { FF_PROFILE_HEVC_MAIN, "Main" },
3433 { FF_PROFILE_HEVC_MAIN_10, "Main 10" },
3434 { FF_PROFILE_HEVC_MAIN_STILL_PICTURE, "Main Still Picture" },
3435 { FF_PROFILE_HEVC_REXT, "Rext" },
3436 { FF_PROFILE_UNKNOWN },
3439 static const AVOption options[] = {
3440 { "apply_defdispwin", "Apply default display window from VUI", OFFSET(apply_defdispwin),
3441 AV_OPT_TYPE_INT, {.i64 = 0}, 0, 1, PAR },
3442 { "strict-displaywin", "stricly apply default display window size", OFFSET(apply_defdispwin),
3443 AV_OPT_TYPE_INT, {.i64 = 0}, 0, 1, PAR },
3447 static const AVClass hevc_decoder_class = {
3448 .class_name = "HEVC decoder",
3449 .item_name = av_default_item_name,
3451 .version = LIBAVUTIL_VERSION_INT,
3454 AVCodec ff_hevc_decoder = {
3456 .long_name = NULL_IF_CONFIG_SMALL("HEVC (High Efficiency Video Coding)"),
3457 .type = AVMEDIA_TYPE_VIDEO,
3458 .id = AV_CODEC_ID_HEVC,
3459 .priv_data_size = sizeof(HEVCContext),
3460 .priv_class = &hevc_decoder_class,
3461 .init = hevc_decode_init,
3462 .close = hevc_decode_free,
3463 .decode = hevc_decode_frame,
3464 .flush = hevc_decode_flush,
3465 .update_thread_context = hevc_update_thread_context,
3466 .init_thread_copy = hevc_init_thread_copy,
3467 .capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY |
3468 CODEC_CAP_SLICE_THREADS | CODEC_CAP_FRAME_THREADS,
3469 .profiles = NULL_IF_CONFIG_SMALL(profiles),