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/attributes.h"
27 #include "libavutil/common.h"
28 #include "libavutil/display.h"
29 #include "libavutil/internal.h"
30 #include "libavutil/mastering_display_metadata.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"
41 #include "hevc_data.h"
42 #include "hevc_parse.h"
47 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 };
50 * NOTE: Each function hls_foo correspond to the function foo in the
51 * specification (HLS stands for High Level Syntax).
58 /* free everything allocated by pic_arrays_init() */
59 static void pic_arrays_free(HEVCContext *s)
62 av_freep(&s->deblock);
64 av_freep(&s->skip_flag);
65 av_freep(&s->tab_ct_depth);
67 av_freep(&s->tab_ipm);
68 av_freep(&s->cbf_luma);
71 av_freep(&s->qp_y_tab);
72 av_freep(&s->tab_slice_address);
73 av_freep(&s->filter_slice_edges);
75 av_freep(&s->horizontal_bs);
76 av_freep(&s->vertical_bs);
78 av_freep(&s->sh.entry_point_offset);
79 av_freep(&s->sh.size);
80 av_freep(&s->sh.offset);
82 av_buffer_pool_uninit(&s->tab_mvf_pool);
83 av_buffer_pool_uninit(&s->rpl_tab_pool);
86 /* allocate arrays that depend on frame dimensions */
87 static int pic_arrays_init(HEVCContext *s, const HEVCSPS *sps)
89 int log2_min_cb_size = sps->log2_min_cb_size;
90 int width = sps->width;
91 int height = sps->height;
92 int pic_size_in_ctb = ((width >> log2_min_cb_size) + 1) *
93 ((height >> log2_min_cb_size) + 1);
94 int ctb_count = sps->ctb_width * sps->ctb_height;
95 int min_pu_size = sps->min_pu_width * sps->min_pu_height;
97 s->bs_width = (width >> 2) + 1;
98 s->bs_height = (height >> 2) + 1;
100 s->sao = av_mallocz_array(ctb_count, sizeof(*s->sao));
101 s->deblock = av_mallocz_array(ctb_count, sizeof(*s->deblock));
102 if (!s->sao || !s->deblock)
105 s->skip_flag = av_malloc_array(sps->min_cb_height, sps->min_cb_width);
106 s->tab_ct_depth = av_malloc_array(sps->min_cb_height, sps->min_cb_width);
107 if (!s->skip_flag || !s->tab_ct_depth)
110 s->cbf_luma = av_malloc_array(sps->min_tb_width, sps->min_tb_height);
111 s->tab_ipm = av_mallocz(min_pu_size);
112 s->is_pcm = av_malloc_array(sps->min_pu_width + 1, sps->min_pu_height + 1);
113 if (!s->tab_ipm || !s->cbf_luma || !s->is_pcm)
116 s->filter_slice_edges = av_mallocz(ctb_count);
117 s->tab_slice_address = av_malloc_array(pic_size_in_ctb,
118 sizeof(*s->tab_slice_address));
119 s->qp_y_tab = av_malloc_array(pic_size_in_ctb,
120 sizeof(*s->qp_y_tab));
121 if (!s->qp_y_tab || !s->filter_slice_edges || !s->tab_slice_address)
124 s->horizontal_bs = av_mallocz_array(s->bs_width, s->bs_height);
125 s->vertical_bs = av_mallocz_array(s->bs_width, s->bs_height);
126 if (!s->horizontal_bs || !s->vertical_bs)
129 s->tab_mvf_pool = av_buffer_pool_init(min_pu_size * sizeof(MvField),
131 s->rpl_tab_pool = av_buffer_pool_init(ctb_count * sizeof(RefPicListTab),
133 if (!s->tab_mvf_pool || !s->rpl_tab_pool)
140 return AVERROR(ENOMEM);
143 static int pred_weight_table(HEVCContext *s, GetBitContext *gb)
147 uint8_t luma_weight_l0_flag[16];
148 uint8_t chroma_weight_l0_flag[16];
149 uint8_t luma_weight_l1_flag[16];
150 uint8_t chroma_weight_l1_flag[16];
151 int luma_log2_weight_denom;
153 luma_log2_weight_denom = get_ue_golomb_long(gb);
154 if (luma_log2_weight_denom < 0 || luma_log2_weight_denom > 7) {
155 av_log(s->avctx, AV_LOG_ERROR, "luma_log2_weight_denom %d is invalid\n", luma_log2_weight_denom);
156 return AVERROR_INVALIDDATA;
158 s->sh.luma_log2_weight_denom = av_clip_uintp2(luma_log2_weight_denom, 3);
159 if (s->ps.sps->chroma_format_idc != 0) {
160 int64_t chroma_log2_weight_denom = luma_log2_weight_denom + (int64_t)get_se_golomb(gb);
161 if (chroma_log2_weight_denom < 0 || chroma_log2_weight_denom > 7) {
162 av_log(s->avctx, AV_LOG_ERROR, "chroma_log2_weight_denom %"PRId64" is invalid\n", chroma_log2_weight_denom);
163 return AVERROR_INVALIDDATA;
165 s->sh.chroma_log2_weight_denom = chroma_log2_weight_denom;
168 for (i = 0; i < s->sh.nb_refs[L0]; i++) {
169 luma_weight_l0_flag[i] = get_bits1(gb);
170 if (!luma_weight_l0_flag[i]) {
171 s->sh.luma_weight_l0[i] = 1 << s->sh.luma_log2_weight_denom;
172 s->sh.luma_offset_l0[i] = 0;
175 if (s->ps.sps->chroma_format_idc != 0) {
176 for (i = 0; i < s->sh.nb_refs[L0]; i++)
177 chroma_weight_l0_flag[i] = get_bits1(gb);
179 for (i = 0; i < s->sh.nb_refs[L0]; i++)
180 chroma_weight_l0_flag[i] = 0;
182 for (i = 0; i < s->sh.nb_refs[L0]; i++) {
183 if (luma_weight_l0_flag[i]) {
184 int delta_luma_weight_l0 = get_se_golomb(gb);
185 s->sh.luma_weight_l0[i] = (1 << s->sh.luma_log2_weight_denom) + delta_luma_weight_l0;
186 s->sh.luma_offset_l0[i] = get_se_golomb(gb);
188 if (chroma_weight_l0_flag[i]) {
189 for (j = 0; j < 2; j++) {
190 int delta_chroma_weight_l0 = get_se_golomb(gb);
191 int delta_chroma_offset_l0 = get_se_golomb(gb);
193 if ( (int8_t)delta_chroma_weight_l0 != delta_chroma_weight_l0
194 || delta_chroma_offset_l0 < -(1<<17) || delta_chroma_offset_l0 > (1<<17)) {
195 return AVERROR_INVALIDDATA;
198 s->sh.chroma_weight_l0[i][j] = (1 << s->sh.chroma_log2_weight_denom) + delta_chroma_weight_l0;
199 s->sh.chroma_offset_l0[i][j] = av_clip((delta_chroma_offset_l0 - ((128 * s->sh.chroma_weight_l0[i][j])
200 >> s->sh.chroma_log2_weight_denom) + 128), -128, 127);
203 s->sh.chroma_weight_l0[i][0] = 1 << s->sh.chroma_log2_weight_denom;
204 s->sh.chroma_offset_l0[i][0] = 0;
205 s->sh.chroma_weight_l0[i][1] = 1 << s->sh.chroma_log2_weight_denom;
206 s->sh.chroma_offset_l0[i][1] = 0;
209 if (s->sh.slice_type == HEVC_SLICE_B) {
210 for (i = 0; i < s->sh.nb_refs[L1]; i++) {
211 luma_weight_l1_flag[i] = get_bits1(gb);
212 if (!luma_weight_l1_flag[i]) {
213 s->sh.luma_weight_l1[i] = 1 << s->sh.luma_log2_weight_denom;
214 s->sh.luma_offset_l1[i] = 0;
217 if (s->ps.sps->chroma_format_idc != 0) {
218 for (i = 0; i < s->sh.nb_refs[L1]; i++)
219 chroma_weight_l1_flag[i] = get_bits1(gb);
221 for (i = 0; i < s->sh.nb_refs[L1]; i++)
222 chroma_weight_l1_flag[i] = 0;
224 for (i = 0; i < s->sh.nb_refs[L1]; i++) {
225 if (luma_weight_l1_flag[i]) {
226 int delta_luma_weight_l1 = get_se_golomb(gb);
227 s->sh.luma_weight_l1[i] = (1 << s->sh.luma_log2_weight_denom) + delta_luma_weight_l1;
228 s->sh.luma_offset_l1[i] = get_se_golomb(gb);
230 if (chroma_weight_l1_flag[i]) {
231 for (j = 0; j < 2; j++) {
232 int delta_chroma_weight_l1 = get_se_golomb(gb);
233 int delta_chroma_offset_l1 = get_se_golomb(gb);
235 if ( (int8_t)delta_chroma_weight_l1 != delta_chroma_weight_l1
236 || delta_chroma_offset_l1 < -(1<<17) || delta_chroma_offset_l1 > (1<<17)) {
237 return AVERROR_INVALIDDATA;
240 s->sh.chroma_weight_l1[i][j] = (1 << s->sh.chroma_log2_weight_denom) + delta_chroma_weight_l1;
241 s->sh.chroma_offset_l1[i][j] = av_clip((delta_chroma_offset_l1 - ((128 * s->sh.chroma_weight_l1[i][j])
242 >> s->sh.chroma_log2_weight_denom) + 128), -128, 127);
245 s->sh.chroma_weight_l1[i][0] = 1 << s->sh.chroma_log2_weight_denom;
246 s->sh.chroma_offset_l1[i][0] = 0;
247 s->sh.chroma_weight_l1[i][1] = 1 << s->sh.chroma_log2_weight_denom;
248 s->sh.chroma_offset_l1[i][1] = 0;
255 static int decode_lt_rps(HEVCContext *s, LongTermRPS *rps, GetBitContext *gb)
257 const HEVCSPS *sps = s->ps.sps;
258 int max_poc_lsb = 1 << sps->log2_max_poc_lsb;
259 int prev_delta_msb = 0;
260 unsigned int nb_sps = 0, nb_sh;
264 if (!sps->long_term_ref_pics_present_flag)
267 if (sps->num_long_term_ref_pics_sps > 0)
268 nb_sps = get_ue_golomb_long(gb);
269 nb_sh = get_ue_golomb_long(gb);
271 if (nb_sps > sps->num_long_term_ref_pics_sps)
272 return AVERROR_INVALIDDATA;
273 if (nb_sh + (uint64_t)nb_sps > FF_ARRAY_ELEMS(rps->poc))
274 return AVERROR_INVALIDDATA;
276 rps->nb_refs = nb_sh + nb_sps;
278 for (i = 0; i < rps->nb_refs; i++) {
279 uint8_t delta_poc_msb_present;
282 uint8_t lt_idx_sps = 0;
284 if (sps->num_long_term_ref_pics_sps > 1)
285 lt_idx_sps = get_bits(gb, av_ceil_log2(sps->num_long_term_ref_pics_sps));
287 rps->poc[i] = sps->lt_ref_pic_poc_lsb_sps[lt_idx_sps];
288 rps->used[i] = sps->used_by_curr_pic_lt_sps_flag[lt_idx_sps];
290 rps->poc[i] = get_bits(gb, sps->log2_max_poc_lsb);
291 rps->used[i] = get_bits1(gb);
294 delta_poc_msb_present = get_bits1(gb);
295 if (delta_poc_msb_present) {
296 int64_t delta = get_ue_golomb_long(gb);
299 if (i && i != nb_sps)
300 delta += prev_delta_msb;
302 poc = rps->poc[i] + s->poc - delta * max_poc_lsb - s->sh.pic_order_cnt_lsb;
303 if (poc != (int32_t)poc)
304 return AVERROR_INVALIDDATA;
306 prev_delta_msb = delta;
313 static void export_stream_params(HEVCContext *s, const HEVCSPS *sps)
315 AVCodecContext *avctx = s->avctx;
316 const HEVCParamSets *ps = &s->ps;
317 const HEVCVPS *vps = (const HEVCVPS*)ps->vps_list[sps->vps_id]->data;
318 const HEVCWindow *ow = &sps->output_window;
319 unsigned int num = 0, den = 0;
321 avctx->pix_fmt = sps->pix_fmt;
322 avctx->coded_width = sps->width;
323 avctx->coded_height = sps->height;
324 avctx->width = sps->width - ow->left_offset - ow->right_offset;
325 avctx->height = sps->height - ow->top_offset - ow->bottom_offset;
326 avctx->has_b_frames = sps->temporal_layer[sps->max_sub_layers - 1].num_reorder_pics;
327 avctx->profile = sps->ptl.general_ptl.profile_idc;
328 avctx->level = sps->ptl.general_ptl.level_idc;
330 ff_set_sar(avctx, sps->vui.sar);
332 if (sps->vui.video_signal_type_present_flag)
333 avctx->color_range = sps->vui.video_full_range_flag ? AVCOL_RANGE_JPEG
336 avctx->color_range = AVCOL_RANGE_MPEG;
338 if (sps->vui.colour_description_present_flag) {
339 avctx->color_primaries = sps->vui.colour_primaries;
340 avctx->color_trc = sps->vui.transfer_characteristic;
341 avctx->colorspace = sps->vui.matrix_coeffs;
343 avctx->color_primaries = AVCOL_PRI_UNSPECIFIED;
344 avctx->color_trc = AVCOL_TRC_UNSPECIFIED;
345 avctx->colorspace = AVCOL_SPC_UNSPECIFIED;
348 if (vps->vps_timing_info_present_flag) {
349 num = vps->vps_num_units_in_tick;
350 den = vps->vps_time_scale;
351 } else if (sps->vui.vui_timing_info_present_flag) {
352 num = sps->vui.vui_num_units_in_tick;
353 den = sps->vui.vui_time_scale;
356 if (num != 0 && den != 0)
357 av_reduce(&avctx->framerate.den, &avctx->framerate.num,
360 if (s->sei.alternative_transfer.present &&
361 av_color_transfer_name(s->sei.alternative_transfer.preferred_transfer_characteristics) &&
362 s->sei.alternative_transfer.preferred_transfer_characteristics != AVCOL_TRC_UNSPECIFIED) {
363 avctx->color_trc = s->sei.alternative_transfer.preferred_transfer_characteristics;
367 static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
369 #define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \
370 CONFIG_HEVC_D3D11VA_HWACCEL * 2 + \
371 CONFIG_HEVC_NVDEC_HWACCEL + \
372 CONFIG_HEVC_VAAPI_HWACCEL + \
373 CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \
374 CONFIG_HEVC_VDPAU_HWACCEL)
375 enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmt = pix_fmts;
377 switch (sps->pix_fmt) {
378 case AV_PIX_FMT_YUV420P:
379 case AV_PIX_FMT_YUVJ420P:
380 #if CONFIG_HEVC_DXVA2_HWACCEL
381 *fmt++ = AV_PIX_FMT_DXVA2_VLD;
383 #if CONFIG_HEVC_D3D11VA_HWACCEL
384 *fmt++ = AV_PIX_FMT_D3D11VA_VLD;
385 *fmt++ = AV_PIX_FMT_D3D11;
387 #if CONFIG_HEVC_VAAPI_HWACCEL
388 *fmt++ = AV_PIX_FMT_VAAPI;
390 #if CONFIG_HEVC_VDPAU_HWACCEL
391 *fmt++ = AV_PIX_FMT_VDPAU;
393 #if CONFIG_HEVC_NVDEC_HWACCEL
394 *fmt++ = AV_PIX_FMT_CUDA;
396 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
397 *fmt++ = AV_PIX_FMT_VIDEOTOOLBOX;
400 case AV_PIX_FMT_YUV420P10:
401 #if CONFIG_HEVC_DXVA2_HWACCEL
402 *fmt++ = AV_PIX_FMT_DXVA2_VLD;
404 #if CONFIG_HEVC_D3D11VA_HWACCEL
405 *fmt++ = AV_PIX_FMT_D3D11VA_VLD;
406 *fmt++ = AV_PIX_FMT_D3D11;
408 #if CONFIG_HEVC_VAAPI_HWACCEL
409 *fmt++ = AV_PIX_FMT_VAAPI;
411 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
412 *fmt++ = AV_PIX_FMT_VIDEOTOOLBOX;
414 #if CONFIG_HEVC_NVDEC_HWACCEL
415 *fmt++ = AV_PIX_FMT_CUDA;
418 case AV_PIX_FMT_YUV444P:
419 #if CONFIG_HEVC_VDPAU_HWACCEL
420 *fmt++ = AV_PIX_FMT_VDPAU;
422 #if CONFIG_HEVC_NVDEC_HWACCEL
423 *fmt++ = AV_PIX_FMT_CUDA;
426 case AV_PIX_FMT_YUV420P12:
427 case AV_PIX_FMT_YUV444P10:
428 case AV_PIX_FMT_YUV444P12:
429 #if CONFIG_HEVC_NVDEC_HWACCEL
430 *fmt++ = AV_PIX_FMT_CUDA;
435 *fmt++ = sps->pix_fmt;
436 *fmt = AV_PIX_FMT_NONE;
438 return ff_thread_get_format(s->avctx, pix_fmts);
441 static int set_sps(HEVCContext *s, const HEVCSPS *sps,
442 enum AVPixelFormat pix_fmt)
453 ret = pic_arrays_init(s, sps);
457 export_stream_params(s, sps);
459 s->avctx->pix_fmt = pix_fmt;
461 ff_hevc_pred_init(&s->hpc, sps->bit_depth);
462 ff_hevc_dsp_init (&s->hevcdsp, sps->bit_depth);
463 ff_videodsp_init (&s->vdsp, sps->bit_depth);
465 for (i = 0; i < 3; i++) {
466 av_freep(&s->sao_pixel_buffer_h[i]);
467 av_freep(&s->sao_pixel_buffer_v[i]);
470 if (sps->sao_enabled && !s->avctx->hwaccel) {
471 int c_count = (sps->chroma_format_idc != 0) ? 3 : 1;
474 for(c_idx = 0; c_idx < c_count; c_idx++) {
475 int w = sps->width >> sps->hshift[c_idx];
476 int h = sps->height >> sps->vshift[c_idx];
477 s->sao_pixel_buffer_h[c_idx] =
478 av_malloc((w * 2 * sps->ctb_height) <<
480 s->sao_pixel_buffer_v[c_idx] =
481 av_malloc((h * 2 * sps->ctb_width) <<
487 s->ps.vps = (HEVCVPS*) s->ps.vps_list[s->ps.sps->vps_id]->data;
497 static int hls_slice_header(HEVCContext *s)
499 GetBitContext *gb = &s->HEVClc->gb;
500 SliceHeader *sh = &s->sh;
504 sh->first_slice_in_pic_flag = get_bits1(gb);
505 if (s->ref && sh->first_slice_in_pic_flag) {
506 av_log(s->avctx, AV_LOG_ERROR, "Two slices reporting being the first in the same frame.\n");
507 return 1; // This slice will be skiped later, do not corrupt state
510 if ((IS_IDR(s) || IS_BLA(s)) && sh->first_slice_in_pic_flag) {
511 s->seq_decode = (s->seq_decode + 1) & 0xff;
514 ff_hevc_clear_refs(s);
516 sh->no_output_of_prior_pics_flag = 0;
518 sh->no_output_of_prior_pics_flag = get_bits1(gb);
520 sh->pps_id = get_ue_golomb_long(gb);
521 if (sh->pps_id >= HEVC_MAX_PPS_COUNT || !s->ps.pps_list[sh->pps_id]) {
522 av_log(s->avctx, AV_LOG_ERROR, "PPS id out of range: %d\n", sh->pps_id);
523 return AVERROR_INVALIDDATA;
525 if (!sh->first_slice_in_pic_flag &&
526 s->ps.pps != (HEVCPPS*)s->ps.pps_list[sh->pps_id]->data) {
527 av_log(s->avctx, AV_LOG_ERROR, "PPS changed between slices.\n");
528 return AVERROR_INVALIDDATA;
530 s->ps.pps = (HEVCPPS*)s->ps.pps_list[sh->pps_id]->data;
531 if (s->nal_unit_type == HEVC_NAL_CRA_NUT && s->last_eos == 1)
532 sh->no_output_of_prior_pics_flag = 1;
534 if (s->ps.sps != (HEVCSPS*)s->ps.sps_list[s->ps.pps->sps_id]->data) {
535 const HEVCSPS *sps = (HEVCSPS*)s->ps.sps_list[s->ps.pps->sps_id]->data;
536 const HEVCSPS *last_sps = s->ps.sps;
537 enum AVPixelFormat pix_fmt;
539 if (last_sps && IS_IRAP(s) && s->nal_unit_type != HEVC_NAL_CRA_NUT) {
540 if (sps->width != last_sps->width || sps->height != last_sps->height ||
541 sps->temporal_layer[sps->max_sub_layers - 1].max_dec_pic_buffering !=
542 last_sps->temporal_layer[last_sps->max_sub_layers - 1].max_dec_pic_buffering)
543 sh->no_output_of_prior_pics_flag = 0;
545 ff_hevc_clear_refs(s);
547 ret = set_sps(s, sps, sps->pix_fmt);
551 pix_fmt = get_format(s, sps);
554 s->avctx->pix_fmt = pix_fmt;
556 s->seq_decode = (s->seq_decode + 1) & 0xff;
560 sh->dependent_slice_segment_flag = 0;
561 if (!sh->first_slice_in_pic_flag) {
562 int slice_address_length;
564 if (s->ps.pps->dependent_slice_segments_enabled_flag)
565 sh->dependent_slice_segment_flag = get_bits1(gb);
567 slice_address_length = av_ceil_log2(s->ps.sps->ctb_width *
568 s->ps.sps->ctb_height);
569 sh->slice_segment_addr = get_bitsz(gb, slice_address_length);
570 if (sh->slice_segment_addr >= s->ps.sps->ctb_width * s->ps.sps->ctb_height) {
571 av_log(s->avctx, AV_LOG_ERROR,
572 "Invalid slice segment address: %u.\n",
573 sh->slice_segment_addr);
574 return AVERROR_INVALIDDATA;
577 if (!sh->dependent_slice_segment_flag) {
578 sh->slice_addr = sh->slice_segment_addr;
582 sh->slice_segment_addr = sh->slice_addr = 0;
584 s->slice_initialized = 0;
587 if (!sh->dependent_slice_segment_flag) {
588 s->slice_initialized = 0;
590 for (i = 0; i < s->ps.pps->num_extra_slice_header_bits; i++)
591 skip_bits(gb, 1); // slice_reserved_undetermined_flag[]
593 sh->slice_type = get_ue_golomb_long(gb);
594 if (!(sh->slice_type == HEVC_SLICE_I ||
595 sh->slice_type == HEVC_SLICE_P ||
596 sh->slice_type == HEVC_SLICE_B)) {
597 av_log(s->avctx, AV_LOG_ERROR, "Unknown slice type: %d.\n",
599 return AVERROR_INVALIDDATA;
601 if (IS_IRAP(s) && sh->slice_type != HEVC_SLICE_I) {
602 av_log(s->avctx, AV_LOG_ERROR, "Inter slices in an IRAP frame.\n");
603 return AVERROR_INVALIDDATA;
606 // when flag is not present, picture is inferred to be output
607 sh->pic_output_flag = 1;
608 if (s->ps.pps->output_flag_present_flag)
609 sh->pic_output_flag = get_bits1(gb);
611 if (s->ps.sps->separate_colour_plane_flag)
612 sh->colour_plane_id = get_bits(gb, 2);
617 sh->pic_order_cnt_lsb = get_bits(gb, s->ps.sps->log2_max_poc_lsb);
618 poc = ff_hevc_compute_poc(s->ps.sps, s->pocTid0, sh->pic_order_cnt_lsb, s->nal_unit_type);
619 if (!sh->first_slice_in_pic_flag && poc != s->poc) {
620 av_log(s->avctx, AV_LOG_WARNING,
621 "Ignoring POC change between slices: %d -> %d\n", s->poc, poc);
622 if (s->avctx->err_recognition & AV_EF_EXPLODE)
623 return AVERROR_INVALIDDATA;
628 sh->short_term_ref_pic_set_sps_flag = get_bits1(gb);
629 pos = get_bits_left(gb);
630 if (!sh->short_term_ref_pic_set_sps_flag) {
631 ret = ff_hevc_decode_short_term_rps(gb, s->avctx, &sh->slice_rps, s->ps.sps, 1);
635 sh->short_term_rps = &sh->slice_rps;
637 int numbits, rps_idx;
639 if (!s->ps.sps->nb_st_rps) {
640 av_log(s->avctx, AV_LOG_ERROR, "No ref lists in the SPS.\n");
641 return AVERROR_INVALIDDATA;
644 numbits = av_ceil_log2(s->ps.sps->nb_st_rps);
645 rps_idx = numbits > 0 ? get_bits(gb, numbits) : 0;
646 sh->short_term_rps = &s->ps.sps->st_rps[rps_idx];
648 sh->short_term_ref_pic_set_size = pos - get_bits_left(gb);
650 pos = get_bits_left(gb);
651 ret = decode_lt_rps(s, &sh->long_term_rps, gb);
653 av_log(s->avctx, AV_LOG_WARNING, "Invalid long term RPS.\n");
654 if (s->avctx->err_recognition & AV_EF_EXPLODE)
655 return AVERROR_INVALIDDATA;
657 sh->long_term_ref_pic_set_size = pos - get_bits_left(gb);
659 if (s->ps.sps->sps_temporal_mvp_enabled_flag)
660 sh->slice_temporal_mvp_enabled_flag = get_bits1(gb);
662 sh->slice_temporal_mvp_enabled_flag = 0;
664 s->sh.short_term_rps = NULL;
669 if (sh->first_slice_in_pic_flag && s->temporal_id == 0 &&
670 s->nal_unit_type != HEVC_NAL_TRAIL_N &&
671 s->nal_unit_type != HEVC_NAL_TSA_N &&
672 s->nal_unit_type != HEVC_NAL_STSA_N &&
673 s->nal_unit_type != HEVC_NAL_RADL_N &&
674 s->nal_unit_type != HEVC_NAL_RADL_R &&
675 s->nal_unit_type != HEVC_NAL_RASL_N &&
676 s->nal_unit_type != HEVC_NAL_RASL_R)
679 if (s->ps.sps->sao_enabled) {
680 sh->slice_sample_adaptive_offset_flag[0] = get_bits1(gb);
681 if (s->ps.sps->chroma_format_idc) {
682 sh->slice_sample_adaptive_offset_flag[1] =
683 sh->slice_sample_adaptive_offset_flag[2] = get_bits1(gb);
686 sh->slice_sample_adaptive_offset_flag[0] = 0;
687 sh->slice_sample_adaptive_offset_flag[1] = 0;
688 sh->slice_sample_adaptive_offset_flag[2] = 0;
691 sh->nb_refs[L0] = sh->nb_refs[L1] = 0;
692 if (sh->slice_type == HEVC_SLICE_P || sh->slice_type == HEVC_SLICE_B) {
695 sh->nb_refs[L0] = s->ps.pps->num_ref_idx_l0_default_active;
696 if (sh->slice_type == HEVC_SLICE_B)
697 sh->nb_refs[L1] = s->ps.pps->num_ref_idx_l1_default_active;
699 if (get_bits1(gb)) { // num_ref_idx_active_override_flag
700 sh->nb_refs[L0] = get_ue_golomb_long(gb) + 1;
701 if (sh->slice_type == HEVC_SLICE_B)
702 sh->nb_refs[L1] = get_ue_golomb_long(gb) + 1;
704 if (sh->nb_refs[L0] > HEVC_MAX_REFS || sh->nb_refs[L1] > HEVC_MAX_REFS) {
705 av_log(s->avctx, AV_LOG_ERROR, "Too many refs: %d/%d.\n",
706 sh->nb_refs[L0], sh->nb_refs[L1]);
707 return AVERROR_INVALIDDATA;
710 sh->rpl_modification_flag[0] = 0;
711 sh->rpl_modification_flag[1] = 0;
712 nb_refs = ff_hevc_frame_nb_refs(s);
714 av_log(s->avctx, AV_LOG_ERROR, "Zero refs for a frame with P or B slices.\n");
715 return AVERROR_INVALIDDATA;
718 if (s->ps.pps->lists_modification_present_flag && nb_refs > 1) {
719 sh->rpl_modification_flag[0] = get_bits1(gb);
720 if (sh->rpl_modification_flag[0]) {
721 for (i = 0; i < sh->nb_refs[L0]; i++)
722 sh->list_entry_lx[0][i] = get_bits(gb, av_ceil_log2(nb_refs));
725 if (sh->slice_type == HEVC_SLICE_B) {
726 sh->rpl_modification_flag[1] = get_bits1(gb);
727 if (sh->rpl_modification_flag[1] == 1)
728 for (i = 0; i < sh->nb_refs[L1]; i++)
729 sh->list_entry_lx[1][i] = get_bits(gb, av_ceil_log2(nb_refs));
733 if (sh->slice_type == HEVC_SLICE_B)
734 sh->mvd_l1_zero_flag = get_bits1(gb);
736 if (s->ps.pps->cabac_init_present_flag)
737 sh->cabac_init_flag = get_bits1(gb);
739 sh->cabac_init_flag = 0;
741 sh->collocated_ref_idx = 0;
742 if (sh->slice_temporal_mvp_enabled_flag) {
743 sh->collocated_list = L0;
744 if (sh->slice_type == HEVC_SLICE_B)
745 sh->collocated_list = !get_bits1(gb);
747 if (sh->nb_refs[sh->collocated_list] > 1) {
748 sh->collocated_ref_idx = get_ue_golomb_long(gb);
749 if (sh->collocated_ref_idx >= sh->nb_refs[sh->collocated_list]) {
750 av_log(s->avctx, AV_LOG_ERROR,
751 "Invalid collocated_ref_idx: %d.\n",
752 sh->collocated_ref_idx);
753 return AVERROR_INVALIDDATA;
758 if ((s->ps.pps->weighted_pred_flag && sh->slice_type == HEVC_SLICE_P) ||
759 (s->ps.pps->weighted_bipred_flag && sh->slice_type == HEVC_SLICE_B)) {
760 int ret = pred_weight_table(s, gb);
765 sh->max_num_merge_cand = 5 - get_ue_golomb_long(gb);
766 if (sh->max_num_merge_cand < 1 || sh->max_num_merge_cand > 5) {
767 av_log(s->avctx, AV_LOG_ERROR,
768 "Invalid number of merging MVP candidates: %d.\n",
769 sh->max_num_merge_cand);
770 return AVERROR_INVALIDDATA;
774 sh->slice_qp_delta = get_se_golomb(gb);
776 if (s->ps.pps->pic_slice_level_chroma_qp_offsets_present_flag) {
777 sh->slice_cb_qp_offset = get_se_golomb(gb);
778 sh->slice_cr_qp_offset = get_se_golomb(gb);
780 sh->slice_cb_qp_offset = 0;
781 sh->slice_cr_qp_offset = 0;
784 if (s->ps.pps->chroma_qp_offset_list_enabled_flag)
785 sh->cu_chroma_qp_offset_enabled_flag = get_bits1(gb);
787 sh->cu_chroma_qp_offset_enabled_flag = 0;
789 if (s->ps.pps->deblocking_filter_control_present_flag) {
790 int deblocking_filter_override_flag = 0;
792 if (s->ps.pps->deblocking_filter_override_enabled_flag)
793 deblocking_filter_override_flag = get_bits1(gb);
795 if (deblocking_filter_override_flag) {
796 sh->disable_deblocking_filter_flag = get_bits1(gb);
797 if (!sh->disable_deblocking_filter_flag) {
798 int beta_offset_div2 = get_se_golomb(gb);
799 int tc_offset_div2 = get_se_golomb(gb) ;
800 if (beta_offset_div2 < -6 || beta_offset_div2 > 6 ||
801 tc_offset_div2 < -6 || tc_offset_div2 > 6) {
802 av_log(s->avctx, AV_LOG_ERROR,
803 "Invalid deblock filter offsets: %d, %d\n",
804 beta_offset_div2, tc_offset_div2);
805 return AVERROR_INVALIDDATA;
807 sh->beta_offset = beta_offset_div2 * 2;
808 sh->tc_offset = tc_offset_div2 * 2;
811 sh->disable_deblocking_filter_flag = s->ps.pps->disable_dbf;
812 sh->beta_offset = s->ps.pps->beta_offset;
813 sh->tc_offset = s->ps.pps->tc_offset;
816 sh->disable_deblocking_filter_flag = 0;
821 if (s->ps.pps->seq_loop_filter_across_slices_enabled_flag &&
822 (sh->slice_sample_adaptive_offset_flag[0] ||
823 sh->slice_sample_adaptive_offset_flag[1] ||
824 !sh->disable_deblocking_filter_flag)) {
825 sh->slice_loop_filter_across_slices_enabled_flag = get_bits1(gb);
827 sh->slice_loop_filter_across_slices_enabled_flag = s->ps.pps->seq_loop_filter_across_slices_enabled_flag;
829 } else if (!s->slice_initialized) {
830 av_log(s->avctx, AV_LOG_ERROR, "Independent slice segment missing.\n");
831 return AVERROR_INVALIDDATA;
834 sh->num_entry_point_offsets = 0;
835 if (s->ps.pps->tiles_enabled_flag || s->ps.pps->entropy_coding_sync_enabled_flag) {
836 unsigned num_entry_point_offsets = get_ue_golomb_long(gb);
837 // It would be possible to bound this tighter but this here is simpler
838 if (num_entry_point_offsets > get_bits_left(gb)) {
839 av_log(s->avctx, AV_LOG_ERROR, "num_entry_point_offsets %d is invalid\n", num_entry_point_offsets);
840 return AVERROR_INVALIDDATA;
843 sh->num_entry_point_offsets = num_entry_point_offsets;
844 if (sh->num_entry_point_offsets > 0) {
845 int offset_len = get_ue_golomb_long(gb) + 1;
847 if (offset_len < 1 || offset_len > 32) {
848 sh->num_entry_point_offsets = 0;
849 av_log(s->avctx, AV_LOG_ERROR, "offset_len %d is invalid\n", offset_len);
850 return AVERROR_INVALIDDATA;
853 av_freep(&sh->entry_point_offset);
854 av_freep(&sh->offset);
856 sh->entry_point_offset = av_malloc_array(sh->num_entry_point_offsets, sizeof(unsigned));
857 sh->offset = av_malloc_array(sh->num_entry_point_offsets, sizeof(int));
858 sh->size = av_malloc_array(sh->num_entry_point_offsets, sizeof(int));
859 if (!sh->entry_point_offset || !sh->offset || !sh->size) {
860 sh->num_entry_point_offsets = 0;
861 av_log(s->avctx, AV_LOG_ERROR, "Failed to allocate memory\n");
862 return AVERROR(ENOMEM);
864 for (i = 0; i < sh->num_entry_point_offsets; i++) {
865 unsigned val = get_bits_long(gb, offset_len);
866 sh->entry_point_offset[i] = val + 1; // +1; // +1 to get the size
868 if (s->threads_number > 1 && (s->ps.pps->num_tile_rows > 1 || s->ps.pps->num_tile_columns > 1)) {
869 s->enable_parallel_tiles = 0; // TODO: you can enable tiles in parallel here
870 s->threads_number = 1;
872 s->enable_parallel_tiles = 0;
874 s->enable_parallel_tiles = 0;
877 if (s->ps.pps->slice_header_extension_present_flag) {
878 unsigned int length = get_ue_golomb_long(gb);
879 if (length*8LL > get_bits_left(gb)) {
880 av_log(s->avctx, AV_LOG_ERROR, "too many slice_header_extension_data_bytes\n");
881 return AVERROR_INVALIDDATA;
883 for (i = 0; i < length; i++)
884 skip_bits(gb, 8); // slice_header_extension_data_byte
887 // Inferred parameters
888 sh->slice_qp = 26U + s->ps.pps->pic_init_qp_minus26 + sh->slice_qp_delta;
889 if (sh->slice_qp > 51 ||
890 sh->slice_qp < -s->ps.sps->qp_bd_offset) {
891 av_log(s->avctx, AV_LOG_ERROR,
892 "The slice_qp %d is outside the valid range "
895 -s->ps.sps->qp_bd_offset);
896 return AVERROR_INVALIDDATA;
899 sh->slice_ctb_addr_rs = sh->slice_segment_addr;
901 if (!s->sh.slice_ctb_addr_rs && s->sh.dependent_slice_segment_flag) {
902 av_log(s->avctx, AV_LOG_ERROR, "Impossible slice segment.\n");
903 return AVERROR_INVALIDDATA;
906 if (get_bits_left(gb) < 0) {
907 av_log(s->avctx, AV_LOG_ERROR,
908 "Overread slice header by %d bits\n", -get_bits_left(gb));
909 return AVERROR_INVALIDDATA;
912 s->HEVClc->first_qp_group = !s->sh.dependent_slice_segment_flag;
914 if (!s->ps.pps->cu_qp_delta_enabled_flag)
915 s->HEVClc->qp_y = s->sh.slice_qp;
917 s->slice_initialized = 1;
918 s->HEVClc->tu.cu_qp_offset_cb = 0;
919 s->HEVClc->tu.cu_qp_offset_cr = 0;
924 #define CTB(tab, x, y) ((tab)[(y) * s->ps.sps->ctb_width + (x)])
926 #define SET_SAO(elem, value) \
928 if (!sao_merge_up_flag && !sao_merge_left_flag) \
930 else if (sao_merge_left_flag) \
931 sao->elem = CTB(s->sao, rx-1, ry).elem; \
932 else if (sao_merge_up_flag) \
933 sao->elem = CTB(s->sao, rx, ry-1).elem; \
938 static void hls_sao_param(HEVCContext *s, int rx, int ry)
940 HEVCLocalContext *lc = s->HEVClc;
941 int sao_merge_left_flag = 0;
942 int sao_merge_up_flag = 0;
943 SAOParams *sao = &CTB(s->sao, rx, ry);
946 if (s->sh.slice_sample_adaptive_offset_flag[0] ||
947 s->sh.slice_sample_adaptive_offset_flag[1]) {
949 if (lc->ctb_left_flag)
950 sao_merge_left_flag = ff_hevc_sao_merge_flag_decode(s);
952 if (ry > 0 && !sao_merge_left_flag) {
954 sao_merge_up_flag = ff_hevc_sao_merge_flag_decode(s);
958 for (c_idx = 0; c_idx < (s->ps.sps->chroma_format_idc ? 3 : 1); c_idx++) {
959 int log2_sao_offset_scale = c_idx == 0 ? s->ps.pps->log2_sao_offset_scale_luma :
960 s->ps.pps->log2_sao_offset_scale_chroma;
962 if (!s->sh.slice_sample_adaptive_offset_flag[c_idx]) {
963 sao->type_idx[c_idx] = SAO_NOT_APPLIED;
968 sao->type_idx[2] = sao->type_idx[1];
969 sao->eo_class[2] = sao->eo_class[1];
971 SET_SAO(type_idx[c_idx], ff_hevc_sao_type_idx_decode(s));
974 if (sao->type_idx[c_idx] == SAO_NOT_APPLIED)
977 for (i = 0; i < 4; i++)
978 SET_SAO(offset_abs[c_idx][i], ff_hevc_sao_offset_abs_decode(s));
980 if (sao->type_idx[c_idx] == SAO_BAND) {
981 for (i = 0; i < 4; i++) {
982 if (sao->offset_abs[c_idx][i]) {
983 SET_SAO(offset_sign[c_idx][i],
984 ff_hevc_sao_offset_sign_decode(s));
986 sao->offset_sign[c_idx][i] = 0;
989 SET_SAO(band_position[c_idx], ff_hevc_sao_band_position_decode(s));
990 } else if (c_idx != 2) {
991 SET_SAO(eo_class[c_idx], ff_hevc_sao_eo_class_decode(s));
994 // Inferred parameters
995 sao->offset_val[c_idx][0] = 0;
996 for (i = 0; i < 4; i++) {
997 sao->offset_val[c_idx][i + 1] = sao->offset_abs[c_idx][i];
998 if (sao->type_idx[c_idx] == SAO_EDGE) {
1000 sao->offset_val[c_idx][i + 1] = -sao->offset_val[c_idx][i + 1];
1001 } else if (sao->offset_sign[c_idx][i]) {
1002 sao->offset_val[c_idx][i + 1] = -sao->offset_val[c_idx][i + 1];
1004 sao->offset_val[c_idx][i + 1] *= 1 << log2_sao_offset_scale;
1012 static int hls_cross_component_pred(HEVCContext *s, int idx) {
1013 HEVCLocalContext *lc = s->HEVClc;
1014 int log2_res_scale_abs_plus1 = ff_hevc_log2_res_scale_abs(s, idx);
1016 if (log2_res_scale_abs_plus1 != 0) {
1017 int res_scale_sign_flag = ff_hevc_res_scale_sign_flag(s, idx);
1018 lc->tu.res_scale_val = (1 << (log2_res_scale_abs_plus1 - 1)) *
1019 (1 - 2 * res_scale_sign_flag);
1021 lc->tu.res_scale_val = 0;
1028 static int hls_transform_unit(HEVCContext *s, int x0, int y0,
1029 int xBase, int yBase, int cb_xBase, int cb_yBase,
1030 int log2_cb_size, int log2_trafo_size,
1031 int blk_idx, int cbf_luma, int *cbf_cb, int *cbf_cr)
1033 HEVCLocalContext *lc = s->HEVClc;
1034 const int log2_trafo_size_c = log2_trafo_size - s->ps.sps->hshift[1];
1037 if (lc->cu.pred_mode == MODE_INTRA) {
1038 int trafo_size = 1 << log2_trafo_size;
1039 ff_hevc_set_neighbour_available(s, x0, y0, trafo_size, trafo_size);
1041 s->hpc.intra_pred[log2_trafo_size - 2](s, x0, y0, 0);
1044 if (cbf_luma || cbf_cb[0] || cbf_cr[0] ||
1045 (s->ps.sps->chroma_format_idc == 2 && (cbf_cb[1] || cbf_cr[1]))) {
1046 int scan_idx = SCAN_DIAG;
1047 int scan_idx_c = SCAN_DIAG;
1048 int cbf_chroma = cbf_cb[0] || cbf_cr[0] ||
1049 (s->ps.sps->chroma_format_idc == 2 &&
1050 (cbf_cb[1] || cbf_cr[1]));
1052 if (s->ps.pps->cu_qp_delta_enabled_flag && !lc->tu.is_cu_qp_delta_coded) {
1053 lc->tu.cu_qp_delta = ff_hevc_cu_qp_delta_abs(s);
1054 if (lc->tu.cu_qp_delta != 0)
1055 if (ff_hevc_cu_qp_delta_sign_flag(s) == 1)
1056 lc->tu.cu_qp_delta = -lc->tu.cu_qp_delta;
1057 lc->tu.is_cu_qp_delta_coded = 1;
1059 if (lc->tu.cu_qp_delta < -(26 + s->ps.sps->qp_bd_offset / 2) ||
1060 lc->tu.cu_qp_delta > (25 + s->ps.sps->qp_bd_offset / 2)) {
1061 av_log(s->avctx, AV_LOG_ERROR,
1062 "The cu_qp_delta %d is outside the valid range "
1065 -(26 + s->ps.sps->qp_bd_offset / 2),
1066 (25 + s->ps.sps->qp_bd_offset / 2));
1067 return AVERROR_INVALIDDATA;
1070 ff_hevc_set_qPy(s, cb_xBase, cb_yBase, log2_cb_size);
1073 if (s->sh.cu_chroma_qp_offset_enabled_flag && cbf_chroma &&
1074 !lc->cu.cu_transquant_bypass_flag && !lc->tu.is_cu_chroma_qp_offset_coded) {
1075 int cu_chroma_qp_offset_flag = ff_hevc_cu_chroma_qp_offset_flag(s);
1076 if (cu_chroma_qp_offset_flag) {
1077 int cu_chroma_qp_offset_idx = 0;
1078 if (s->ps.pps->chroma_qp_offset_list_len_minus1 > 0) {
1079 cu_chroma_qp_offset_idx = ff_hevc_cu_chroma_qp_offset_idx(s);
1080 av_log(s->avctx, AV_LOG_ERROR,
1081 "cu_chroma_qp_offset_idx not yet tested.\n");
1083 lc->tu.cu_qp_offset_cb = s->ps.pps->cb_qp_offset_list[cu_chroma_qp_offset_idx];
1084 lc->tu.cu_qp_offset_cr = s->ps.pps->cr_qp_offset_list[cu_chroma_qp_offset_idx];
1086 lc->tu.cu_qp_offset_cb = 0;
1087 lc->tu.cu_qp_offset_cr = 0;
1089 lc->tu.is_cu_chroma_qp_offset_coded = 1;
1092 if (lc->cu.pred_mode == MODE_INTRA && log2_trafo_size < 4) {
1093 if (lc->tu.intra_pred_mode >= 6 &&
1094 lc->tu.intra_pred_mode <= 14) {
1095 scan_idx = SCAN_VERT;
1096 } else if (lc->tu.intra_pred_mode >= 22 &&
1097 lc->tu.intra_pred_mode <= 30) {
1098 scan_idx = SCAN_HORIZ;
1101 if (lc->tu.intra_pred_mode_c >= 6 &&
1102 lc->tu.intra_pred_mode_c <= 14) {
1103 scan_idx_c = SCAN_VERT;
1104 } else if (lc->tu.intra_pred_mode_c >= 22 &&
1105 lc->tu.intra_pred_mode_c <= 30) {
1106 scan_idx_c = SCAN_HORIZ;
1110 lc->tu.cross_pf = 0;
1113 ff_hevc_hls_residual_coding(s, x0, y0, log2_trafo_size, scan_idx, 0);
1114 if (s->ps.sps->chroma_format_idc && (log2_trafo_size > 2 || s->ps.sps->chroma_format_idc == 3)) {
1115 int trafo_size_h = 1 << (log2_trafo_size_c + s->ps.sps->hshift[1]);
1116 int trafo_size_v = 1 << (log2_trafo_size_c + s->ps.sps->vshift[1]);
1117 lc->tu.cross_pf = (s->ps.pps->cross_component_prediction_enabled_flag && cbf_luma &&
1118 (lc->cu.pred_mode == MODE_INTER ||
1119 (lc->tu.chroma_mode_c == 4)));
1121 if (lc->tu.cross_pf) {
1122 hls_cross_component_pred(s, 0);
1124 for (i = 0; i < (s->ps.sps->chroma_format_idc == 2 ? 2 : 1); i++) {
1125 if (lc->cu.pred_mode == MODE_INTRA) {
1126 ff_hevc_set_neighbour_available(s, x0, y0 + (i << log2_trafo_size_c), trafo_size_h, trafo_size_v);
1127 s->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0 + (i << log2_trafo_size_c), 1);
1130 ff_hevc_hls_residual_coding(s, x0, y0 + (i << log2_trafo_size_c),
1131 log2_trafo_size_c, scan_idx_c, 1);
1133 if (lc->tu.cross_pf) {
1134 ptrdiff_t stride = s->frame->linesize[1];
1135 int hshift = s->ps.sps->hshift[1];
1136 int vshift = s->ps.sps->vshift[1];
1137 int16_t *coeffs_y = (int16_t*)lc->edge_emu_buffer;
1138 int16_t *coeffs = (int16_t*)lc->edge_emu_buffer2;
1139 int size = 1 << log2_trafo_size_c;
1141 uint8_t *dst = &s->frame->data[1][(y0 >> vshift) * stride +
1142 ((x0 >> hshift) << s->ps.sps->pixel_shift)];
1143 for (i = 0; i < (size * size); i++) {
1144 coeffs[i] = ((lc->tu.res_scale_val * coeffs_y[i]) >> 3);
1146 s->hevcdsp.add_residual[log2_trafo_size_c-2](dst, coeffs, stride);
1150 if (lc->tu.cross_pf) {
1151 hls_cross_component_pred(s, 1);
1153 for (i = 0; i < (s->ps.sps->chroma_format_idc == 2 ? 2 : 1); i++) {
1154 if (lc->cu.pred_mode == MODE_INTRA) {
1155 ff_hevc_set_neighbour_available(s, x0, y0 + (i << log2_trafo_size_c), trafo_size_h, trafo_size_v);
1156 s->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0 + (i << log2_trafo_size_c), 2);
1159 ff_hevc_hls_residual_coding(s, x0, y0 + (i << log2_trafo_size_c),
1160 log2_trafo_size_c, scan_idx_c, 2);
1162 if (lc->tu.cross_pf) {
1163 ptrdiff_t stride = s->frame->linesize[2];
1164 int hshift = s->ps.sps->hshift[2];
1165 int vshift = s->ps.sps->vshift[2];
1166 int16_t *coeffs_y = (int16_t*)lc->edge_emu_buffer;
1167 int16_t *coeffs = (int16_t*)lc->edge_emu_buffer2;
1168 int size = 1 << log2_trafo_size_c;
1170 uint8_t *dst = &s->frame->data[2][(y0 >> vshift) * stride +
1171 ((x0 >> hshift) << s->ps.sps->pixel_shift)];
1172 for (i = 0; i < (size * size); i++) {
1173 coeffs[i] = ((lc->tu.res_scale_val * coeffs_y[i]) >> 3);
1175 s->hevcdsp.add_residual[log2_trafo_size_c-2](dst, coeffs, stride);
1178 } else if (s->ps.sps->chroma_format_idc && blk_idx == 3) {
1179 int trafo_size_h = 1 << (log2_trafo_size + 1);
1180 int trafo_size_v = 1 << (log2_trafo_size + s->ps.sps->vshift[1]);
1181 for (i = 0; i < (s->ps.sps->chroma_format_idc == 2 ? 2 : 1); i++) {
1182 if (lc->cu.pred_mode == MODE_INTRA) {
1183 ff_hevc_set_neighbour_available(s, xBase, yBase + (i << log2_trafo_size),
1184 trafo_size_h, trafo_size_v);
1185 s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase + (i << log2_trafo_size), 1);
1188 ff_hevc_hls_residual_coding(s, xBase, yBase + (i << log2_trafo_size),
1189 log2_trafo_size, scan_idx_c, 1);
1191 for (i = 0; i < (s->ps.sps->chroma_format_idc == 2 ? 2 : 1); i++) {
1192 if (lc->cu.pred_mode == MODE_INTRA) {
1193 ff_hevc_set_neighbour_available(s, xBase, yBase + (i << log2_trafo_size),
1194 trafo_size_h, trafo_size_v);
1195 s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase + (i << log2_trafo_size), 2);
1198 ff_hevc_hls_residual_coding(s, xBase, yBase + (i << log2_trafo_size),
1199 log2_trafo_size, scan_idx_c, 2);
1202 } else if (s->ps.sps->chroma_format_idc && lc->cu.pred_mode == MODE_INTRA) {
1203 if (log2_trafo_size > 2 || s->ps.sps->chroma_format_idc == 3) {
1204 int trafo_size_h = 1 << (log2_trafo_size_c + s->ps.sps->hshift[1]);
1205 int trafo_size_v = 1 << (log2_trafo_size_c + s->ps.sps->vshift[1]);
1206 ff_hevc_set_neighbour_available(s, x0, y0, trafo_size_h, trafo_size_v);
1207 s->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0, 1);
1208 s->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0, 2);
1209 if (s->ps.sps->chroma_format_idc == 2) {
1210 ff_hevc_set_neighbour_available(s, x0, y0 + (1 << log2_trafo_size_c),
1211 trafo_size_h, trafo_size_v);
1212 s->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0 + (1 << log2_trafo_size_c), 1);
1213 s->hpc.intra_pred[log2_trafo_size_c - 2](s, x0, y0 + (1 << log2_trafo_size_c), 2);
1215 } else if (blk_idx == 3) {
1216 int trafo_size_h = 1 << (log2_trafo_size + 1);
1217 int trafo_size_v = 1 << (log2_trafo_size + s->ps.sps->vshift[1]);
1218 ff_hevc_set_neighbour_available(s, xBase, yBase,
1219 trafo_size_h, trafo_size_v);
1220 s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase, 1);
1221 s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase, 2);
1222 if (s->ps.sps->chroma_format_idc == 2) {
1223 ff_hevc_set_neighbour_available(s, xBase, yBase + (1 << (log2_trafo_size)),
1224 trafo_size_h, trafo_size_v);
1225 s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase + (1 << (log2_trafo_size)), 1);
1226 s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase + (1 << (log2_trafo_size)), 2);
1234 static void set_deblocking_bypass(HEVCContext *s, int x0, int y0, int log2_cb_size)
1236 int cb_size = 1 << log2_cb_size;
1237 int log2_min_pu_size = s->ps.sps->log2_min_pu_size;
1239 int min_pu_width = s->ps.sps->min_pu_width;
1240 int x_end = FFMIN(x0 + cb_size, s->ps.sps->width);
1241 int y_end = FFMIN(y0 + cb_size, s->ps.sps->height);
1244 for (j = (y0 >> log2_min_pu_size); j < (y_end >> log2_min_pu_size); j++)
1245 for (i = (x0 >> log2_min_pu_size); i < (x_end >> log2_min_pu_size); i++)
1246 s->is_pcm[i + j * min_pu_width] = 2;
1249 static int hls_transform_tree(HEVCContext *s, int x0, int y0,
1250 int xBase, int yBase, int cb_xBase, int cb_yBase,
1251 int log2_cb_size, int log2_trafo_size,
1252 int trafo_depth, int blk_idx,
1253 const int *base_cbf_cb, const int *base_cbf_cr)
1255 HEVCLocalContext *lc = s->HEVClc;
1256 uint8_t split_transform_flag;
1261 cbf_cb[0] = base_cbf_cb[0];
1262 cbf_cb[1] = base_cbf_cb[1];
1263 cbf_cr[0] = base_cbf_cr[0];
1264 cbf_cr[1] = base_cbf_cr[1];
1266 if (lc->cu.intra_split_flag) {
1267 if (trafo_depth == 1) {
1268 lc->tu.intra_pred_mode = lc->pu.intra_pred_mode[blk_idx];
1269 if (s->ps.sps->chroma_format_idc == 3) {
1270 lc->tu.intra_pred_mode_c = lc->pu.intra_pred_mode_c[blk_idx];
1271 lc->tu.chroma_mode_c = lc->pu.chroma_mode_c[blk_idx];
1273 lc->tu.intra_pred_mode_c = lc->pu.intra_pred_mode_c[0];
1274 lc->tu.chroma_mode_c = lc->pu.chroma_mode_c[0];
1278 lc->tu.intra_pred_mode = lc->pu.intra_pred_mode[0];
1279 lc->tu.intra_pred_mode_c = lc->pu.intra_pred_mode_c[0];
1280 lc->tu.chroma_mode_c = lc->pu.chroma_mode_c[0];
1283 if (log2_trafo_size <= s->ps.sps->log2_max_trafo_size &&
1284 log2_trafo_size > s->ps.sps->log2_min_tb_size &&
1285 trafo_depth < lc->cu.max_trafo_depth &&
1286 !(lc->cu.intra_split_flag && trafo_depth == 0)) {
1287 split_transform_flag = ff_hevc_split_transform_flag_decode(s, log2_trafo_size);
1289 int inter_split = s->ps.sps->max_transform_hierarchy_depth_inter == 0 &&
1290 lc->cu.pred_mode == MODE_INTER &&
1291 lc->cu.part_mode != PART_2Nx2N &&
1294 split_transform_flag = log2_trafo_size > s->ps.sps->log2_max_trafo_size ||
1295 (lc->cu.intra_split_flag && trafo_depth == 0) ||
1299 if (s->ps.sps->chroma_format_idc && (log2_trafo_size > 2 || s->ps.sps->chroma_format_idc == 3)) {
1300 if (trafo_depth == 0 || cbf_cb[0]) {
1301 cbf_cb[0] = ff_hevc_cbf_cb_cr_decode(s, trafo_depth);
1302 if (s->ps.sps->chroma_format_idc == 2 && (!split_transform_flag || log2_trafo_size == 3)) {
1303 cbf_cb[1] = ff_hevc_cbf_cb_cr_decode(s, trafo_depth);
1307 if (trafo_depth == 0 || cbf_cr[0]) {
1308 cbf_cr[0] = ff_hevc_cbf_cb_cr_decode(s, trafo_depth);
1309 if (s->ps.sps->chroma_format_idc == 2 && (!split_transform_flag || log2_trafo_size == 3)) {
1310 cbf_cr[1] = ff_hevc_cbf_cb_cr_decode(s, trafo_depth);
1315 if (split_transform_flag) {
1316 const int trafo_size_split = 1 << (log2_trafo_size - 1);
1317 const int x1 = x0 + trafo_size_split;
1318 const int y1 = y0 + trafo_size_split;
1320 #define SUBDIVIDE(x, y, idx) \
1322 ret = hls_transform_tree(s, x, y, x0, y0, cb_xBase, cb_yBase, log2_cb_size, \
1323 log2_trafo_size - 1, trafo_depth + 1, idx, \
1329 SUBDIVIDE(x0, y0, 0);
1330 SUBDIVIDE(x1, y0, 1);
1331 SUBDIVIDE(x0, y1, 2);
1332 SUBDIVIDE(x1, y1, 3);
1336 int min_tu_size = 1 << s->ps.sps->log2_min_tb_size;
1337 int log2_min_tu_size = s->ps.sps->log2_min_tb_size;
1338 int min_tu_width = s->ps.sps->min_tb_width;
1341 if (lc->cu.pred_mode == MODE_INTRA || trafo_depth != 0 ||
1342 cbf_cb[0] || cbf_cr[0] ||
1343 (s->ps.sps->chroma_format_idc == 2 && (cbf_cb[1] || cbf_cr[1]))) {
1344 cbf_luma = ff_hevc_cbf_luma_decode(s, trafo_depth);
1347 ret = hls_transform_unit(s, x0, y0, xBase, yBase, cb_xBase, cb_yBase,
1348 log2_cb_size, log2_trafo_size,
1349 blk_idx, cbf_luma, cbf_cb, cbf_cr);
1352 // TODO: store cbf_luma somewhere else
1355 for (i = 0; i < (1 << log2_trafo_size); i += min_tu_size)
1356 for (j = 0; j < (1 << log2_trafo_size); j += min_tu_size) {
1357 int x_tu = (x0 + j) >> log2_min_tu_size;
1358 int y_tu = (y0 + i) >> log2_min_tu_size;
1359 s->cbf_luma[y_tu * min_tu_width + x_tu] = 1;
1362 if (!s->sh.disable_deblocking_filter_flag) {
1363 ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_trafo_size);
1364 if (s->ps.pps->transquant_bypass_enable_flag &&
1365 lc->cu.cu_transquant_bypass_flag)
1366 set_deblocking_bypass(s, x0, y0, log2_trafo_size);
1372 static int hls_pcm_sample(HEVCContext *s, int x0, int y0, int log2_cb_size)
1374 HEVCLocalContext *lc = s->HEVClc;
1376 int cb_size = 1 << log2_cb_size;
1377 ptrdiff_t stride0 = s->frame->linesize[0];
1378 ptrdiff_t stride1 = s->frame->linesize[1];
1379 ptrdiff_t stride2 = s->frame->linesize[2];
1380 uint8_t *dst0 = &s->frame->data[0][y0 * stride0 + (x0 << s->ps.sps->pixel_shift)];
1381 uint8_t *dst1 = &s->frame->data[1][(y0 >> s->ps.sps->vshift[1]) * stride1 + ((x0 >> s->ps.sps->hshift[1]) << s->ps.sps->pixel_shift)];
1382 uint8_t *dst2 = &s->frame->data[2][(y0 >> s->ps.sps->vshift[2]) * stride2 + ((x0 >> s->ps.sps->hshift[2]) << s->ps.sps->pixel_shift)];
1384 int length = cb_size * cb_size * s->ps.sps->pcm.bit_depth +
1385 (((cb_size >> s->ps.sps->hshift[1]) * (cb_size >> s->ps.sps->vshift[1])) +
1386 ((cb_size >> s->ps.sps->hshift[2]) * (cb_size >> s->ps.sps->vshift[2]))) *
1387 s->ps.sps->pcm.bit_depth_chroma;
1388 const uint8_t *pcm = skip_bytes(&lc->cc, (length + 7) >> 3);
1391 if (!s->sh.disable_deblocking_filter_flag)
1392 ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_cb_size);
1394 ret = init_get_bits(&gb, pcm, length);
1398 s->hevcdsp.put_pcm(dst0, stride0, cb_size, cb_size, &gb, s->ps.sps->pcm.bit_depth);
1399 if (s->ps.sps->chroma_format_idc) {
1400 s->hevcdsp.put_pcm(dst1, stride1,
1401 cb_size >> s->ps.sps->hshift[1],
1402 cb_size >> s->ps.sps->vshift[1],
1403 &gb, s->ps.sps->pcm.bit_depth_chroma);
1404 s->hevcdsp.put_pcm(dst2, stride2,
1405 cb_size >> s->ps.sps->hshift[2],
1406 cb_size >> s->ps.sps->vshift[2],
1407 &gb, s->ps.sps->pcm.bit_depth_chroma);
1414 * 8.5.3.2.2.1 Luma sample unidirectional interpolation process
1416 * @param s HEVC decoding context
1417 * @param dst target buffer for block data at block position
1418 * @param dststride stride of the dst buffer
1419 * @param ref reference picture buffer at origin (0, 0)
1420 * @param mv motion vector (relative to block position) to get pixel data from
1421 * @param x_off horizontal position of block from origin (0, 0)
1422 * @param y_off vertical position of block from origin (0, 0)
1423 * @param block_w width of block
1424 * @param block_h height of block
1425 * @param luma_weight weighting factor applied to the luma prediction
1426 * @param luma_offset additive offset applied to the luma prediction value
1429 static void luma_mc_uni(HEVCContext *s, uint8_t *dst, ptrdiff_t dststride,
1430 AVFrame *ref, const Mv *mv, int x_off, int y_off,
1431 int block_w, int block_h, int luma_weight, int luma_offset)
1433 HEVCLocalContext *lc = s->HEVClc;
1434 uint8_t *src = ref->data[0];
1435 ptrdiff_t srcstride = ref->linesize[0];
1436 int pic_width = s->ps.sps->width;
1437 int pic_height = s->ps.sps->height;
1440 int weight_flag = (s->sh.slice_type == HEVC_SLICE_P && s->ps.pps->weighted_pred_flag) ||
1441 (s->sh.slice_type == HEVC_SLICE_B && s->ps.pps->weighted_bipred_flag);
1442 int idx = ff_hevc_pel_weight[block_w];
1444 x_off += mv->x >> 2;
1445 y_off += mv->y >> 2;
1446 src += y_off * srcstride + (x_off * (1 << s->ps.sps->pixel_shift));
1448 if (x_off < QPEL_EXTRA_BEFORE || y_off < QPEL_EXTRA_AFTER ||
1449 x_off >= pic_width - block_w - QPEL_EXTRA_AFTER ||
1450 y_off >= pic_height - block_h - QPEL_EXTRA_AFTER) {
1451 const ptrdiff_t edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->ps.sps->pixel_shift;
1452 int offset = QPEL_EXTRA_BEFORE * srcstride + (QPEL_EXTRA_BEFORE << s->ps.sps->pixel_shift);
1453 int buf_offset = QPEL_EXTRA_BEFORE * edge_emu_stride + (QPEL_EXTRA_BEFORE << s->ps.sps->pixel_shift);
1455 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src - offset,
1456 edge_emu_stride, srcstride,
1457 block_w + QPEL_EXTRA,
1458 block_h + QPEL_EXTRA,
1459 x_off - QPEL_EXTRA_BEFORE, y_off - QPEL_EXTRA_BEFORE,
1460 pic_width, pic_height);
1461 src = lc->edge_emu_buffer + buf_offset;
1462 srcstride = edge_emu_stride;
1466 s->hevcdsp.put_hevc_qpel_uni[idx][!!my][!!mx](dst, dststride, src, srcstride,
1467 block_h, mx, my, block_w);
1469 s->hevcdsp.put_hevc_qpel_uni_w[idx][!!my][!!mx](dst, dststride, src, srcstride,
1470 block_h, s->sh.luma_log2_weight_denom,
1471 luma_weight, luma_offset, mx, my, block_w);
1475 * 8.5.3.2.2.1 Luma sample bidirectional interpolation process
1477 * @param s HEVC decoding context
1478 * @param dst target buffer for block data at block position
1479 * @param dststride stride of the dst buffer
1480 * @param ref0 reference picture0 buffer at origin (0, 0)
1481 * @param mv0 motion vector0 (relative to block position) to get pixel data from
1482 * @param x_off horizontal position of block from origin (0, 0)
1483 * @param y_off vertical position of block from origin (0, 0)
1484 * @param block_w width of block
1485 * @param block_h height of block
1486 * @param ref1 reference picture1 buffer at origin (0, 0)
1487 * @param mv1 motion vector1 (relative to block position) to get pixel data from
1488 * @param current_mv current motion vector structure
1490 static void luma_mc_bi(HEVCContext *s, uint8_t *dst, ptrdiff_t dststride,
1491 AVFrame *ref0, const Mv *mv0, int x_off, int y_off,
1492 int block_w, int block_h, AVFrame *ref1, const Mv *mv1, struct MvField *current_mv)
1494 HEVCLocalContext *lc = s->HEVClc;
1495 ptrdiff_t src0stride = ref0->linesize[0];
1496 ptrdiff_t src1stride = ref1->linesize[0];
1497 int pic_width = s->ps.sps->width;
1498 int pic_height = s->ps.sps->height;
1499 int mx0 = mv0->x & 3;
1500 int my0 = mv0->y & 3;
1501 int mx1 = mv1->x & 3;
1502 int my1 = mv1->y & 3;
1503 int weight_flag = (s->sh.slice_type == HEVC_SLICE_P && s->ps.pps->weighted_pred_flag) ||
1504 (s->sh.slice_type == HEVC_SLICE_B && s->ps.pps->weighted_bipred_flag);
1505 int x_off0 = x_off + (mv0->x >> 2);
1506 int y_off0 = y_off + (mv0->y >> 2);
1507 int x_off1 = x_off + (mv1->x >> 2);
1508 int y_off1 = y_off + (mv1->y >> 2);
1509 int idx = ff_hevc_pel_weight[block_w];
1511 uint8_t *src0 = ref0->data[0] + y_off0 * src0stride + (int)((unsigned)x_off0 << s->ps.sps->pixel_shift);
1512 uint8_t *src1 = ref1->data[0] + y_off1 * src1stride + (int)((unsigned)x_off1 << s->ps.sps->pixel_shift);
1514 if (x_off0 < QPEL_EXTRA_BEFORE || y_off0 < QPEL_EXTRA_AFTER ||
1515 x_off0 >= pic_width - block_w - QPEL_EXTRA_AFTER ||
1516 y_off0 >= pic_height - block_h - QPEL_EXTRA_AFTER) {
1517 const ptrdiff_t edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->ps.sps->pixel_shift;
1518 int offset = QPEL_EXTRA_BEFORE * src0stride + (QPEL_EXTRA_BEFORE << s->ps.sps->pixel_shift);
1519 int buf_offset = QPEL_EXTRA_BEFORE * edge_emu_stride + (QPEL_EXTRA_BEFORE << s->ps.sps->pixel_shift);
1521 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src0 - offset,
1522 edge_emu_stride, src0stride,
1523 block_w + QPEL_EXTRA,
1524 block_h + QPEL_EXTRA,
1525 x_off0 - QPEL_EXTRA_BEFORE, y_off0 - QPEL_EXTRA_BEFORE,
1526 pic_width, pic_height);
1527 src0 = lc->edge_emu_buffer + buf_offset;
1528 src0stride = edge_emu_stride;
1531 if (x_off1 < QPEL_EXTRA_BEFORE || y_off1 < QPEL_EXTRA_AFTER ||
1532 x_off1 >= pic_width - block_w - QPEL_EXTRA_AFTER ||
1533 y_off1 >= pic_height - block_h - QPEL_EXTRA_AFTER) {
1534 const ptrdiff_t edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->ps.sps->pixel_shift;
1535 int offset = QPEL_EXTRA_BEFORE * src1stride + (QPEL_EXTRA_BEFORE << s->ps.sps->pixel_shift);
1536 int buf_offset = QPEL_EXTRA_BEFORE * edge_emu_stride + (QPEL_EXTRA_BEFORE << s->ps.sps->pixel_shift);
1538 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer2, src1 - offset,
1539 edge_emu_stride, src1stride,
1540 block_w + QPEL_EXTRA,
1541 block_h + QPEL_EXTRA,
1542 x_off1 - QPEL_EXTRA_BEFORE, y_off1 - QPEL_EXTRA_BEFORE,
1543 pic_width, pic_height);
1544 src1 = lc->edge_emu_buffer2 + buf_offset;
1545 src1stride = edge_emu_stride;
1548 s->hevcdsp.put_hevc_qpel[idx][!!my0][!!mx0](lc->tmp, src0, src0stride,
1549 block_h, mx0, my0, block_w);
1551 s->hevcdsp.put_hevc_qpel_bi[idx][!!my1][!!mx1](dst, dststride, src1, src1stride, lc->tmp,
1552 block_h, mx1, my1, block_w);
1554 s->hevcdsp.put_hevc_qpel_bi_w[idx][!!my1][!!mx1](dst, dststride, src1, src1stride, lc->tmp,
1555 block_h, s->sh.luma_log2_weight_denom,
1556 s->sh.luma_weight_l0[current_mv->ref_idx[0]],
1557 s->sh.luma_weight_l1[current_mv->ref_idx[1]],
1558 s->sh.luma_offset_l0[current_mv->ref_idx[0]],
1559 s->sh.luma_offset_l1[current_mv->ref_idx[1]],
1565 * 8.5.3.2.2.2 Chroma sample uniprediction interpolation process
1567 * @param s HEVC decoding context
1568 * @param dst1 target buffer for block data at block position (U plane)
1569 * @param dst2 target buffer for block data at block position (V plane)
1570 * @param dststride stride of the dst1 and dst2 buffers
1571 * @param ref reference picture buffer at origin (0, 0)
1572 * @param mv motion vector (relative to block position) to get pixel data from
1573 * @param x_off horizontal position of block from origin (0, 0)
1574 * @param y_off vertical position of block from origin (0, 0)
1575 * @param block_w width of block
1576 * @param block_h height of block
1577 * @param chroma_weight weighting factor applied to the chroma prediction
1578 * @param chroma_offset additive offset applied to the chroma prediction value
1581 static void chroma_mc_uni(HEVCContext *s, uint8_t *dst0,
1582 ptrdiff_t dststride, uint8_t *src0, ptrdiff_t srcstride, int reflist,
1583 int x_off, int y_off, int block_w, int block_h, struct MvField *current_mv, int chroma_weight, int chroma_offset)
1585 HEVCLocalContext *lc = s->HEVClc;
1586 int pic_width = s->ps.sps->width >> s->ps.sps->hshift[1];
1587 int pic_height = s->ps.sps->height >> s->ps.sps->vshift[1];
1588 const Mv *mv = ¤t_mv->mv[reflist];
1589 int weight_flag = (s->sh.slice_type == HEVC_SLICE_P && s->ps.pps->weighted_pred_flag) ||
1590 (s->sh.slice_type == HEVC_SLICE_B && s->ps.pps->weighted_bipred_flag);
1591 int idx = ff_hevc_pel_weight[block_w];
1592 int hshift = s->ps.sps->hshift[1];
1593 int vshift = s->ps.sps->vshift[1];
1594 intptr_t mx = av_mod_uintp2(mv->x, 2 + hshift);
1595 intptr_t my = av_mod_uintp2(mv->y, 2 + vshift);
1596 intptr_t _mx = mx << (1 - hshift);
1597 intptr_t _my = my << (1 - vshift);
1599 x_off += mv->x >> (2 + hshift);
1600 y_off += mv->y >> (2 + vshift);
1601 src0 += y_off * srcstride + (x_off * (1 << s->ps.sps->pixel_shift));
1603 if (x_off < EPEL_EXTRA_BEFORE || y_off < EPEL_EXTRA_AFTER ||
1604 x_off >= pic_width - block_w - EPEL_EXTRA_AFTER ||
1605 y_off >= pic_height - block_h - EPEL_EXTRA_AFTER) {
1606 const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->ps.sps->pixel_shift;
1607 int offset0 = EPEL_EXTRA_BEFORE * (srcstride + (1 << s->ps.sps->pixel_shift));
1608 int buf_offset0 = EPEL_EXTRA_BEFORE *
1609 (edge_emu_stride + (1 << s->ps.sps->pixel_shift));
1610 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src0 - offset0,
1611 edge_emu_stride, srcstride,
1612 block_w + EPEL_EXTRA, block_h + EPEL_EXTRA,
1613 x_off - EPEL_EXTRA_BEFORE,
1614 y_off - EPEL_EXTRA_BEFORE,
1615 pic_width, pic_height);
1617 src0 = lc->edge_emu_buffer + buf_offset0;
1618 srcstride = edge_emu_stride;
1621 s->hevcdsp.put_hevc_epel_uni[idx][!!my][!!mx](dst0, dststride, src0, srcstride,
1622 block_h, _mx, _my, block_w);
1624 s->hevcdsp.put_hevc_epel_uni_w[idx][!!my][!!mx](dst0, dststride, src0, srcstride,
1625 block_h, s->sh.chroma_log2_weight_denom,
1626 chroma_weight, chroma_offset, _mx, _my, block_w);
1630 * 8.5.3.2.2.2 Chroma sample bidirectional interpolation process
1632 * @param s HEVC decoding context
1633 * @param dst target buffer for block data at block position
1634 * @param dststride stride of the dst buffer
1635 * @param ref0 reference picture0 buffer at origin (0, 0)
1636 * @param mv0 motion vector0 (relative to block position) to get pixel data from
1637 * @param x_off horizontal position of block from origin (0, 0)
1638 * @param y_off vertical position of block from origin (0, 0)
1639 * @param block_w width of block
1640 * @param block_h height of block
1641 * @param ref1 reference picture1 buffer at origin (0, 0)
1642 * @param mv1 motion vector1 (relative to block position) to get pixel data from
1643 * @param current_mv current motion vector structure
1644 * @param cidx chroma component(cb, cr)
1646 static void chroma_mc_bi(HEVCContext *s, uint8_t *dst0, ptrdiff_t dststride, AVFrame *ref0, AVFrame *ref1,
1647 int x_off, int y_off, int block_w, int block_h, struct MvField *current_mv, int cidx)
1649 HEVCLocalContext *lc = s->HEVClc;
1650 uint8_t *src1 = ref0->data[cidx+1];
1651 uint8_t *src2 = ref1->data[cidx+1];
1652 ptrdiff_t src1stride = ref0->linesize[cidx+1];
1653 ptrdiff_t src2stride = ref1->linesize[cidx+1];
1654 int weight_flag = (s->sh.slice_type == HEVC_SLICE_P && s->ps.pps->weighted_pred_flag) ||
1655 (s->sh.slice_type == HEVC_SLICE_B && s->ps.pps->weighted_bipred_flag);
1656 int pic_width = s->ps.sps->width >> s->ps.sps->hshift[1];
1657 int pic_height = s->ps.sps->height >> s->ps.sps->vshift[1];
1658 Mv *mv0 = ¤t_mv->mv[0];
1659 Mv *mv1 = ¤t_mv->mv[1];
1660 int hshift = s->ps.sps->hshift[1];
1661 int vshift = s->ps.sps->vshift[1];
1663 intptr_t mx0 = av_mod_uintp2(mv0->x, 2 + hshift);
1664 intptr_t my0 = av_mod_uintp2(mv0->y, 2 + vshift);
1665 intptr_t mx1 = av_mod_uintp2(mv1->x, 2 + hshift);
1666 intptr_t my1 = av_mod_uintp2(mv1->y, 2 + vshift);
1667 intptr_t _mx0 = mx0 << (1 - hshift);
1668 intptr_t _my0 = my0 << (1 - vshift);
1669 intptr_t _mx1 = mx1 << (1 - hshift);
1670 intptr_t _my1 = my1 << (1 - vshift);
1672 int x_off0 = x_off + (mv0->x >> (2 + hshift));
1673 int y_off0 = y_off + (mv0->y >> (2 + vshift));
1674 int x_off1 = x_off + (mv1->x >> (2 + hshift));
1675 int y_off1 = y_off + (mv1->y >> (2 + vshift));
1676 int idx = ff_hevc_pel_weight[block_w];
1677 src1 += y_off0 * src1stride + (int)((unsigned)x_off0 << s->ps.sps->pixel_shift);
1678 src2 += y_off1 * src2stride + (int)((unsigned)x_off1 << s->ps.sps->pixel_shift);
1680 if (x_off0 < EPEL_EXTRA_BEFORE || y_off0 < EPEL_EXTRA_AFTER ||
1681 x_off0 >= pic_width - block_w - EPEL_EXTRA_AFTER ||
1682 y_off0 >= pic_height - block_h - EPEL_EXTRA_AFTER) {
1683 const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->ps.sps->pixel_shift;
1684 int offset1 = EPEL_EXTRA_BEFORE * (src1stride + (1 << s->ps.sps->pixel_shift));
1685 int buf_offset1 = EPEL_EXTRA_BEFORE *
1686 (edge_emu_stride + (1 << s->ps.sps->pixel_shift));
1688 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer, src1 - offset1,
1689 edge_emu_stride, src1stride,
1690 block_w + EPEL_EXTRA, block_h + EPEL_EXTRA,
1691 x_off0 - EPEL_EXTRA_BEFORE,
1692 y_off0 - EPEL_EXTRA_BEFORE,
1693 pic_width, pic_height);
1695 src1 = lc->edge_emu_buffer + buf_offset1;
1696 src1stride = edge_emu_stride;
1699 if (x_off1 < EPEL_EXTRA_BEFORE || y_off1 < EPEL_EXTRA_AFTER ||
1700 x_off1 >= pic_width - block_w - EPEL_EXTRA_AFTER ||
1701 y_off1 >= pic_height - block_h - EPEL_EXTRA_AFTER) {
1702 const int edge_emu_stride = EDGE_EMU_BUFFER_STRIDE << s->ps.sps->pixel_shift;
1703 int offset1 = EPEL_EXTRA_BEFORE * (src2stride + (1 << s->ps.sps->pixel_shift));
1704 int buf_offset1 = EPEL_EXTRA_BEFORE *
1705 (edge_emu_stride + (1 << s->ps.sps->pixel_shift));
1707 s->vdsp.emulated_edge_mc(lc->edge_emu_buffer2, src2 - offset1,
1708 edge_emu_stride, src2stride,
1709 block_w + EPEL_EXTRA, block_h + EPEL_EXTRA,
1710 x_off1 - EPEL_EXTRA_BEFORE,
1711 y_off1 - EPEL_EXTRA_BEFORE,
1712 pic_width, pic_height);
1714 src2 = lc->edge_emu_buffer2 + buf_offset1;
1715 src2stride = edge_emu_stride;
1718 s->hevcdsp.put_hevc_epel[idx][!!my0][!!mx0](lc->tmp, src1, src1stride,
1719 block_h, _mx0, _my0, block_w);
1721 s->hevcdsp.put_hevc_epel_bi[idx][!!my1][!!mx1](dst0, s->frame->linesize[cidx+1],
1722 src2, src2stride, lc->tmp,
1723 block_h, _mx1, _my1, block_w);
1725 s->hevcdsp.put_hevc_epel_bi_w[idx][!!my1][!!mx1](dst0, s->frame->linesize[cidx+1],
1726 src2, src2stride, lc->tmp,
1728 s->sh.chroma_log2_weight_denom,
1729 s->sh.chroma_weight_l0[current_mv->ref_idx[0]][cidx],
1730 s->sh.chroma_weight_l1[current_mv->ref_idx[1]][cidx],
1731 s->sh.chroma_offset_l0[current_mv->ref_idx[0]][cidx],
1732 s->sh.chroma_offset_l1[current_mv->ref_idx[1]][cidx],
1733 _mx1, _my1, block_w);
1736 static void hevc_await_progress(HEVCContext *s, HEVCFrame *ref,
1737 const Mv *mv, int y0, int height)
1739 if (s->threads_type == FF_THREAD_FRAME ) {
1740 int y = FFMAX(0, (mv->y >> 2) + y0 + height + 9);
1742 ff_thread_await_progress(&ref->tf, y, 0);
1746 static void hevc_luma_mv_mvp_mode(HEVCContext *s, int x0, int y0, int nPbW,
1747 int nPbH, int log2_cb_size, int part_idx,
1748 int merge_idx, MvField *mv)
1750 HEVCLocalContext *lc = s->HEVClc;
1751 enum InterPredIdc inter_pred_idc = PRED_L0;
1754 ff_hevc_set_neighbour_available(s, x0, y0, nPbW, nPbH);
1756 if (s->sh.slice_type == HEVC_SLICE_B)
1757 inter_pred_idc = ff_hevc_inter_pred_idc_decode(s, nPbW, nPbH);
1759 if (inter_pred_idc != PRED_L1) {
1760 if (s->sh.nb_refs[L0])
1761 mv->ref_idx[0]= ff_hevc_ref_idx_lx_decode(s, s->sh.nb_refs[L0]);
1763 mv->pred_flag = PF_L0;
1764 ff_hevc_hls_mvd_coding(s, x0, y0, 0);
1765 mvp_flag = ff_hevc_mvp_lx_flag_decode(s);
1766 ff_hevc_luma_mv_mvp_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
1767 part_idx, merge_idx, mv, mvp_flag, 0);
1768 mv->mv[0].x += lc->pu.mvd.x;
1769 mv->mv[0].y += lc->pu.mvd.y;
1772 if (inter_pred_idc != PRED_L0) {
1773 if (s->sh.nb_refs[L1])
1774 mv->ref_idx[1]= ff_hevc_ref_idx_lx_decode(s, s->sh.nb_refs[L1]);
1776 if (s->sh.mvd_l1_zero_flag == 1 && inter_pred_idc == PRED_BI) {
1777 AV_ZERO32(&lc->pu.mvd);
1779 ff_hevc_hls_mvd_coding(s, x0, y0, 1);
1782 mv->pred_flag += PF_L1;
1783 mvp_flag = ff_hevc_mvp_lx_flag_decode(s);
1784 ff_hevc_luma_mv_mvp_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
1785 part_idx, merge_idx, mv, mvp_flag, 1);
1786 mv->mv[1].x += lc->pu.mvd.x;
1787 mv->mv[1].y += lc->pu.mvd.y;
1791 static void hls_prediction_unit(HEVCContext *s, int x0, int y0,
1793 int log2_cb_size, int partIdx, int idx)
1795 #define POS(c_idx, x, y) \
1796 &s->frame->data[c_idx][((y) >> s->ps.sps->vshift[c_idx]) * s->frame->linesize[c_idx] + \
1797 (((x) >> s->ps.sps->hshift[c_idx]) << s->ps.sps->pixel_shift)]
1798 HEVCLocalContext *lc = s->HEVClc;
1800 struct MvField current_mv = {{{ 0 }}};
1802 int min_pu_width = s->ps.sps->min_pu_width;
1804 MvField *tab_mvf = s->ref->tab_mvf;
1805 RefPicList *refPicList = s->ref->refPicList;
1806 HEVCFrame *ref0 = NULL, *ref1 = NULL;
1807 uint8_t *dst0 = POS(0, x0, y0);
1808 uint8_t *dst1 = POS(1, x0, y0);
1809 uint8_t *dst2 = POS(2, x0, y0);
1810 int log2_min_cb_size = s->ps.sps->log2_min_cb_size;
1811 int min_cb_width = s->ps.sps->min_cb_width;
1812 int x_cb = x0 >> log2_min_cb_size;
1813 int y_cb = y0 >> log2_min_cb_size;
1817 int skip_flag = SAMPLE_CTB(s->skip_flag, x_cb, y_cb);
1820 lc->pu.merge_flag = ff_hevc_merge_flag_decode(s);
1822 if (skip_flag || lc->pu.merge_flag) {
1823 if (s->sh.max_num_merge_cand > 1)
1824 merge_idx = ff_hevc_merge_idx_decode(s);
1828 ff_hevc_luma_mv_merge_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
1829 partIdx, merge_idx, ¤t_mv);
1831 hevc_luma_mv_mvp_mode(s, x0, y0, nPbW, nPbH, log2_cb_size,
1832 partIdx, merge_idx, ¤t_mv);
1835 x_pu = x0 >> s->ps.sps->log2_min_pu_size;
1836 y_pu = y0 >> s->ps.sps->log2_min_pu_size;
1838 for (j = 0; j < nPbH >> s->ps.sps->log2_min_pu_size; j++)
1839 for (i = 0; i < nPbW >> s->ps.sps->log2_min_pu_size; i++)
1840 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i] = current_mv;
1842 if (current_mv.pred_flag & PF_L0) {
1843 ref0 = refPicList[0].ref[current_mv.ref_idx[0]];
1846 hevc_await_progress(s, ref0, ¤t_mv.mv[0], y0, nPbH);
1848 if (current_mv.pred_flag & PF_L1) {
1849 ref1 = refPicList[1].ref[current_mv.ref_idx[1]];
1852 hevc_await_progress(s, ref1, ¤t_mv.mv[1], y0, nPbH);
1855 if (current_mv.pred_flag == PF_L0) {
1856 int x0_c = x0 >> s->ps.sps->hshift[1];
1857 int y0_c = y0 >> s->ps.sps->vshift[1];
1858 int nPbW_c = nPbW >> s->ps.sps->hshift[1];
1859 int nPbH_c = nPbH >> s->ps.sps->vshift[1];
1861 luma_mc_uni(s, dst0, s->frame->linesize[0], ref0->frame,
1862 ¤t_mv.mv[0], x0, y0, nPbW, nPbH,
1863 s->sh.luma_weight_l0[current_mv.ref_idx[0]],
1864 s->sh.luma_offset_l0[current_mv.ref_idx[0]]);
1866 if (s->ps.sps->chroma_format_idc) {
1867 chroma_mc_uni(s, dst1, s->frame->linesize[1], ref0->frame->data[1], ref0->frame->linesize[1],
1868 0, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
1869 s->sh.chroma_weight_l0[current_mv.ref_idx[0]][0], s->sh.chroma_offset_l0[current_mv.ref_idx[0]][0]);
1870 chroma_mc_uni(s, dst2, s->frame->linesize[2], ref0->frame->data[2], ref0->frame->linesize[2],
1871 0, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
1872 s->sh.chroma_weight_l0[current_mv.ref_idx[0]][1], s->sh.chroma_offset_l0[current_mv.ref_idx[0]][1]);
1874 } else if (current_mv.pred_flag == PF_L1) {
1875 int x0_c = x0 >> s->ps.sps->hshift[1];
1876 int y0_c = y0 >> s->ps.sps->vshift[1];
1877 int nPbW_c = nPbW >> s->ps.sps->hshift[1];
1878 int nPbH_c = nPbH >> s->ps.sps->vshift[1];
1880 luma_mc_uni(s, dst0, s->frame->linesize[0], ref1->frame,
1881 ¤t_mv.mv[1], x0, y0, nPbW, nPbH,
1882 s->sh.luma_weight_l1[current_mv.ref_idx[1]],
1883 s->sh.luma_offset_l1[current_mv.ref_idx[1]]);
1885 if (s->ps.sps->chroma_format_idc) {
1886 chroma_mc_uni(s, dst1, s->frame->linesize[1], ref1->frame->data[1], ref1->frame->linesize[1],
1887 1, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
1888 s->sh.chroma_weight_l1[current_mv.ref_idx[1]][0], s->sh.chroma_offset_l1[current_mv.ref_idx[1]][0]);
1890 chroma_mc_uni(s, dst2, s->frame->linesize[2], ref1->frame->data[2], ref1->frame->linesize[2],
1891 1, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
1892 s->sh.chroma_weight_l1[current_mv.ref_idx[1]][1], s->sh.chroma_offset_l1[current_mv.ref_idx[1]][1]);
1894 } else if (current_mv.pred_flag == PF_BI) {
1895 int x0_c = x0 >> s->ps.sps->hshift[1];
1896 int y0_c = y0 >> s->ps.sps->vshift[1];
1897 int nPbW_c = nPbW >> s->ps.sps->hshift[1];
1898 int nPbH_c = nPbH >> s->ps.sps->vshift[1];
1900 luma_mc_bi(s, dst0, s->frame->linesize[0], ref0->frame,
1901 ¤t_mv.mv[0], x0, y0, nPbW, nPbH,
1902 ref1->frame, ¤t_mv.mv[1], ¤t_mv);
1904 if (s->ps.sps->chroma_format_idc) {
1905 chroma_mc_bi(s, dst1, s->frame->linesize[1], ref0->frame, ref1->frame,
1906 x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv, 0);
1908 chroma_mc_bi(s, dst2, s->frame->linesize[2], ref0->frame, ref1->frame,
1909 x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv, 1);
1917 static int luma_intra_pred_mode(HEVCContext *s, int x0, int y0, int pu_size,
1918 int prev_intra_luma_pred_flag)
1920 HEVCLocalContext *lc = s->HEVClc;
1921 int x_pu = x0 >> s->ps.sps->log2_min_pu_size;
1922 int y_pu = y0 >> s->ps.sps->log2_min_pu_size;
1923 int min_pu_width = s->ps.sps->min_pu_width;
1924 int size_in_pus = pu_size >> s->ps.sps->log2_min_pu_size;
1925 int x0b = av_mod_uintp2(x0, s->ps.sps->log2_ctb_size);
1926 int y0b = av_mod_uintp2(y0, s->ps.sps->log2_ctb_size);
1928 int cand_up = (lc->ctb_up_flag || y0b) ?
1929 s->tab_ipm[(y_pu - 1) * min_pu_width + x_pu] : INTRA_DC;
1930 int cand_left = (lc->ctb_left_flag || x0b) ?
1931 s->tab_ipm[y_pu * min_pu_width + x_pu - 1] : INTRA_DC;
1933 int y_ctb = (y0 >> (s->ps.sps->log2_ctb_size)) << (s->ps.sps->log2_ctb_size);
1935 MvField *tab_mvf = s->ref->tab_mvf;
1936 int intra_pred_mode;
1940 // intra_pred_mode prediction does not cross vertical CTB boundaries
1941 if ((y0 - 1) < y_ctb)
1944 if (cand_left == cand_up) {
1945 if (cand_left < 2) {
1946 candidate[0] = INTRA_PLANAR;
1947 candidate[1] = INTRA_DC;
1948 candidate[2] = INTRA_ANGULAR_26;
1950 candidate[0] = cand_left;
1951 candidate[1] = 2 + ((cand_left - 2 - 1 + 32) & 31);
1952 candidate[2] = 2 + ((cand_left - 2 + 1) & 31);
1955 candidate[0] = cand_left;
1956 candidate[1] = cand_up;
1957 if (candidate[0] != INTRA_PLANAR && candidate[1] != INTRA_PLANAR) {
1958 candidate[2] = INTRA_PLANAR;
1959 } else if (candidate[0] != INTRA_DC && candidate[1] != INTRA_DC) {
1960 candidate[2] = INTRA_DC;
1962 candidate[2] = INTRA_ANGULAR_26;
1966 if (prev_intra_luma_pred_flag) {
1967 intra_pred_mode = candidate[lc->pu.mpm_idx];
1969 if (candidate[0] > candidate[1])
1970 FFSWAP(uint8_t, candidate[0], candidate[1]);
1971 if (candidate[0] > candidate[2])
1972 FFSWAP(uint8_t, candidate[0], candidate[2]);
1973 if (candidate[1] > candidate[2])
1974 FFSWAP(uint8_t, candidate[1], candidate[2]);
1976 intra_pred_mode = lc->pu.rem_intra_luma_pred_mode;
1977 for (i = 0; i < 3; i++)
1978 if (intra_pred_mode >= candidate[i])
1982 /* write the intra prediction units into the mv array */
1985 for (i = 0; i < size_in_pus; i++) {
1986 memset(&s->tab_ipm[(y_pu + i) * min_pu_width + x_pu],
1987 intra_pred_mode, size_in_pus);
1989 for (j = 0; j < size_in_pus; j++) {
1990 tab_mvf[(y_pu + j) * min_pu_width + x_pu + i].pred_flag = PF_INTRA;
1994 return intra_pred_mode;
1997 static av_always_inline void set_ct_depth(HEVCContext *s, int x0, int y0,
1998 int log2_cb_size, int ct_depth)
2000 int length = (1 << log2_cb_size) >> s->ps.sps->log2_min_cb_size;
2001 int x_cb = x0 >> s->ps.sps->log2_min_cb_size;
2002 int y_cb = y0 >> s->ps.sps->log2_min_cb_size;
2005 for (y = 0; y < length; y++)
2006 memset(&s->tab_ct_depth[(y_cb + y) * s->ps.sps->min_cb_width + x_cb],
2010 static const uint8_t tab_mode_idx[] = {
2011 0, 1, 2, 2, 2, 2, 3, 5, 7, 8, 10, 12, 13, 15, 17, 18, 19, 20,
2012 21, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 29, 29, 30, 31};
2014 static void intra_prediction_unit(HEVCContext *s, int x0, int y0,
2017 HEVCLocalContext *lc = s->HEVClc;
2018 static const uint8_t intra_chroma_table[4] = { 0, 26, 10, 1 };
2019 uint8_t prev_intra_luma_pred_flag[4];
2020 int split = lc->cu.part_mode == PART_NxN;
2021 int pb_size = (1 << log2_cb_size) >> split;
2022 int side = split + 1;
2026 for (i = 0; i < side; i++)
2027 for (j = 0; j < side; j++)
2028 prev_intra_luma_pred_flag[2 * i + j] = ff_hevc_prev_intra_luma_pred_flag_decode(s);
2030 for (i = 0; i < side; i++) {
2031 for (j = 0; j < side; j++) {
2032 if (prev_intra_luma_pred_flag[2 * i + j])
2033 lc->pu.mpm_idx = ff_hevc_mpm_idx_decode(s);
2035 lc->pu.rem_intra_luma_pred_mode = ff_hevc_rem_intra_luma_pred_mode_decode(s);
2037 lc->pu.intra_pred_mode[2 * i + j] =
2038 luma_intra_pred_mode(s, x0 + pb_size * j, y0 + pb_size * i, pb_size,
2039 prev_intra_luma_pred_flag[2 * i + j]);
2043 if (s->ps.sps->chroma_format_idc == 3) {
2044 for (i = 0; i < side; i++) {
2045 for (j = 0; j < side; j++) {
2046 lc->pu.chroma_mode_c[2 * i + j] = chroma_mode = ff_hevc_intra_chroma_pred_mode_decode(s);
2047 if (chroma_mode != 4) {
2048 if (lc->pu.intra_pred_mode[2 * i + j] == intra_chroma_table[chroma_mode])
2049 lc->pu.intra_pred_mode_c[2 * i + j] = 34;
2051 lc->pu.intra_pred_mode_c[2 * i + j] = intra_chroma_table[chroma_mode];
2053 lc->pu.intra_pred_mode_c[2 * i + j] = lc->pu.intra_pred_mode[2 * i + j];
2057 } else if (s->ps.sps->chroma_format_idc == 2) {
2059 lc->pu.chroma_mode_c[0] = chroma_mode = ff_hevc_intra_chroma_pred_mode_decode(s);
2060 if (chroma_mode != 4) {
2061 if (lc->pu.intra_pred_mode[0] == intra_chroma_table[chroma_mode])
2064 mode_idx = intra_chroma_table[chroma_mode];
2066 mode_idx = lc->pu.intra_pred_mode[0];
2068 lc->pu.intra_pred_mode_c[0] = tab_mode_idx[mode_idx];
2069 } else if (s->ps.sps->chroma_format_idc != 0) {
2070 chroma_mode = ff_hevc_intra_chroma_pred_mode_decode(s);
2071 if (chroma_mode != 4) {
2072 if (lc->pu.intra_pred_mode[0] == intra_chroma_table[chroma_mode])
2073 lc->pu.intra_pred_mode_c[0] = 34;
2075 lc->pu.intra_pred_mode_c[0] = intra_chroma_table[chroma_mode];
2077 lc->pu.intra_pred_mode_c[0] = lc->pu.intra_pred_mode[0];
2082 static void intra_prediction_unit_default_value(HEVCContext *s,
2086 HEVCLocalContext *lc = s->HEVClc;
2087 int pb_size = 1 << log2_cb_size;
2088 int size_in_pus = pb_size >> s->ps.sps->log2_min_pu_size;
2089 int min_pu_width = s->ps.sps->min_pu_width;
2090 MvField *tab_mvf = s->ref->tab_mvf;
2091 int x_pu = x0 >> s->ps.sps->log2_min_pu_size;
2092 int y_pu = y0 >> s->ps.sps->log2_min_pu_size;
2095 if (size_in_pus == 0)
2097 for (j = 0; j < size_in_pus; j++)
2098 memset(&s->tab_ipm[(y_pu + j) * min_pu_width + x_pu], INTRA_DC, size_in_pus);
2099 if (lc->cu.pred_mode == MODE_INTRA)
2100 for (j = 0; j < size_in_pus; j++)
2101 for (k = 0; k < size_in_pus; k++)
2102 tab_mvf[(y_pu + j) * min_pu_width + x_pu + k].pred_flag = PF_INTRA;
2105 static int hls_coding_unit(HEVCContext *s, int x0, int y0, int log2_cb_size)
2107 int cb_size = 1 << log2_cb_size;
2108 HEVCLocalContext *lc = s->HEVClc;
2109 int log2_min_cb_size = s->ps.sps->log2_min_cb_size;
2110 int length = cb_size >> log2_min_cb_size;
2111 int min_cb_width = s->ps.sps->min_cb_width;
2112 int x_cb = x0 >> log2_min_cb_size;
2113 int y_cb = y0 >> log2_min_cb_size;
2114 int idx = log2_cb_size - 2;
2115 int qp_block_mask = (1<<(s->ps.sps->log2_ctb_size - s->ps.pps->diff_cu_qp_delta_depth)) - 1;
2120 lc->cu.pred_mode = MODE_INTRA;
2121 lc->cu.part_mode = PART_2Nx2N;
2122 lc->cu.intra_split_flag = 0;
2124 SAMPLE_CTB(s->skip_flag, x_cb, y_cb) = 0;
2125 for (x = 0; x < 4; x++)
2126 lc->pu.intra_pred_mode[x] = 1;
2127 if (s->ps.pps->transquant_bypass_enable_flag) {
2128 lc->cu.cu_transquant_bypass_flag = ff_hevc_cu_transquant_bypass_flag_decode(s);
2129 if (lc->cu.cu_transquant_bypass_flag)
2130 set_deblocking_bypass(s, x0, y0, log2_cb_size);
2132 lc->cu.cu_transquant_bypass_flag = 0;
2134 if (s->sh.slice_type != HEVC_SLICE_I) {
2135 uint8_t skip_flag = ff_hevc_skip_flag_decode(s, x0, y0, x_cb, y_cb);
2137 x = y_cb * min_cb_width + x_cb;
2138 for (y = 0; y < length; y++) {
2139 memset(&s->skip_flag[x], skip_flag, length);
2142 lc->cu.pred_mode = skip_flag ? MODE_SKIP : MODE_INTER;
2144 x = y_cb * min_cb_width + x_cb;
2145 for (y = 0; y < length; y++) {
2146 memset(&s->skip_flag[x], 0, length);
2151 if (SAMPLE_CTB(s->skip_flag, x_cb, y_cb)) {
2152 hls_prediction_unit(s, x0, y0, cb_size, cb_size, log2_cb_size, 0, idx);
2153 intra_prediction_unit_default_value(s, x0, y0, log2_cb_size);
2155 if (!s->sh.disable_deblocking_filter_flag)
2156 ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_cb_size);
2160 if (s->sh.slice_type != HEVC_SLICE_I)
2161 lc->cu.pred_mode = ff_hevc_pred_mode_decode(s);
2162 if (lc->cu.pred_mode != MODE_INTRA ||
2163 log2_cb_size == s->ps.sps->log2_min_cb_size) {
2164 lc->cu.part_mode = ff_hevc_part_mode_decode(s, log2_cb_size);
2165 lc->cu.intra_split_flag = lc->cu.part_mode == PART_NxN &&
2166 lc->cu.pred_mode == MODE_INTRA;
2169 if (lc->cu.pred_mode == MODE_INTRA) {
2170 if (lc->cu.part_mode == PART_2Nx2N && s->ps.sps->pcm_enabled_flag &&
2171 log2_cb_size >= s->ps.sps->pcm.log2_min_pcm_cb_size &&
2172 log2_cb_size <= s->ps.sps->pcm.log2_max_pcm_cb_size) {
2173 pcm_flag = ff_hevc_pcm_flag_decode(s);
2176 intra_prediction_unit_default_value(s, x0, y0, log2_cb_size);
2177 ret = hls_pcm_sample(s, x0, y0, log2_cb_size);
2178 if (s->ps.sps->pcm.loop_filter_disable_flag)
2179 set_deblocking_bypass(s, x0, y0, log2_cb_size);
2184 intra_prediction_unit(s, x0, y0, log2_cb_size);
2187 intra_prediction_unit_default_value(s, x0, y0, log2_cb_size);
2188 switch (lc->cu.part_mode) {
2190 hls_prediction_unit(s, x0, y0, cb_size, cb_size, log2_cb_size, 0, idx);
2193 hls_prediction_unit(s, x0, y0, cb_size, cb_size / 2, log2_cb_size, 0, idx);
2194 hls_prediction_unit(s, x0, y0 + cb_size / 2, cb_size, cb_size / 2, log2_cb_size, 1, idx);
2197 hls_prediction_unit(s, x0, y0, cb_size / 2, cb_size, log2_cb_size, 0, idx - 1);
2198 hls_prediction_unit(s, x0 + cb_size / 2, y0, cb_size / 2, cb_size, log2_cb_size, 1, idx - 1);
2201 hls_prediction_unit(s, x0, y0, cb_size, cb_size / 4, log2_cb_size, 0, idx);
2202 hls_prediction_unit(s, x0, y0 + cb_size / 4, cb_size, cb_size * 3 / 4, log2_cb_size, 1, idx);
2205 hls_prediction_unit(s, x0, y0, cb_size, cb_size * 3 / 4, log2_cb_size, 0, idx);
2206 hls_prediction_unit(s, x0, y0 + cb_size * 3 / 4, cb_size, cb_size / 4, log2_cb_size, 1, idx);
2209 hls_prediction_unit(s, x0, y0, cb_size / 4, cb_size, log2_cb_size, 0, idx - 2);
2210 hls_prediction_unit(s, x0 + cb_size / 4, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 1, idx - 2);
2213 hls_prediction_unit(s, x0, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 0, idx - 2);
2214 hls_prediction_unit(s, x0 + cb_size * 3 / 4, y0, cb_size / 4, cb_size, log2_cb_size, 1, idx - 2);
2217 hls_prediction_unit(s, x0, y0, cb_size / 2, cb_size / 2, log2_cb_size, 0, idx - 1);
2218 hls_prediction_unit(s, x0 + cb_size / 2, y0, cb_size / 2, cb_size / 2, log2_cb_size, 1, idx - 1);
2219 hls_prediction_unit(s, x0, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 2, idx - 1);
2220 hls_prediction_unit(s, x0 + cb_size / 2, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 3, idx - 1);
2226 int rqt_root_cbf = 1;
2228 if (lc->cu.pred_mode != MODE_INTRA &&
2229 !(lc->cu.part_mode == PART_2Nx2N && lc->pu.merge_flag)) {
2230 rqt_root_cbf = ff_hevc_no_residual_syntax_flag_decode(s);
2233 const static int cbf[2] = { 0 };
2234 lc->cu.max_trafo_depth = lc->cu.pred_mode == MODE_INTRA ?
2235 s->ps.sps->max_transform_hierarchy_depth_intra + lc->cu.intra_split_flag :
2236 s->ps.sps->max_transform_hierarchy_depth_inter;
2237 ret = hls_transform_tree(s, x0, y0, x0, y0, x0, y0,
2239 log2_cb_size, 0, 0, cbf, cbf);
2243 if (!s->sh.disable_deblocking_filter_flag)
2244 ff_hevc_deblocking_boundary_strengths(s, x0, y0, log2_cb_size);
2249 if (s->ps.pps->cu_qp_delta_enabled_flag && lc->tu.is_cu_qp_delta_coded == 0)
2250 ff_hevc_set_qPy(s, x0, y0, log2_cb_size);
2252 x = y_cb * min_cb_width + x_cb;
2253 for (y = 0; y < length; y++) {
2254 memset(&s->qp_y_tab[x], lc->qp_y, length);
2258 if(((x0 + (1<<log2_cb_size)) & qp_block_mask) == 0 &&
2259 ((y0 + (1<<log2_cb_size)) & qp_block_mask) == 0) {
2260 lc->qPy_pred = lc->qp_y;
2263 set_ct_depth(s, x0, y0, log2_cb_size, lc->ct_depth);
2268 static int hls_coding_quadtree(HEVCContext *s, int x0, int y0,
2269 int log2_cb_size, int cb_depth)
2271 HEVCLocalContext *lc = s->HEVClc;
2272 const int cb_size = 1 << log2_cb_size;
2276 lc->ct_depth = cb_depth;
2277 if (x0 + cb_size <= s->ps.sps->width &&
2278 y0 + cb_size <= s->ps.sps->height &&
2279 log2_cb_size > s->ps.sps->log2_min_cb_size) {
2280 split_cu = ff_hevc_split_coding_unit_flag_decode(s, cb_depth, x0, y0);
2282 split_cu = (log2_cb_size > s->ps.sps->log2_min_cb_size);
2284 if (s->ps.pps->cu_qp_delta_enabled_flag &&
2285 log2_cb_size >= s->ps.sps->log2_ctb_size - s->ps.pps->diff_cu_qp_delta_depth) {
2286 lc->tu.is_cu_qp_delta_coded = 0;
2287 lc->tu.cu_qp_delta = 0;
2290 if (s->sh.cu_chroma_qp_offset_enabled_flag &&
2291 log2_cb_size >= s->ps.sps->log2_ctb_size - s->ps.pps->diff_cu_chroma_qp_offset_depth) {
2292 lc->tu.is_cu_chroma_qp_offset_coded = 0;
2296 int qp_block_mask = (1<<(s->ps.sps->log2_ctb_size - s->ps.pps->diff_cu_qp_delta_depth)) - 1;
2297 const int cb_size_split = cb_size >> 1;
2298 const int x1 = x0 + cb_size_split;
2299 const int y1 = y0 + cb_size_split;
2303 more_data = hls_coding_quadtree(s, x0, y0, log2_cb_size - 1, cb_depth + 1);
2307 if (more_data && x1 < s->ps.sps->width) {
2308 more_data = hls_coding_quadtree(s, x1, y0, log2_cb_size - 1, cb_depth + 1);
2312 if (more_data && y1 < s->ps.sps->height) {
2313 more_data = hls_coding_quadtree(s, x0, y1, log2_cb_size - 1, cb_depth + 1);
2317 if (more_data && x1 < s->ps.sps->width &&
2318 y1 < s->ps.sps->height) {
2319 more_data = hls_coding_quadtree(s, x1, y1, log2_cb_size - 1, cb_depth + 1);
2324 if(((x0 + (1<<log2_cb_size)) & qp_block_mask) == 0 &&
2325 ((y0 + (1<<log2_cb_size)) & qp_block_mask) == 0)
2326 lc->qPy_pred = lc->qp_y;
2329 return ((x1 + cb_size_split) < s->ps.sps->width ||
2330 (y1 + cb_size_split) < s->ps.sps->height);
2334 ret = hls_coding_unit(s, x0, y0, log2_cb_size);
2337 if ((!((x0 + cb_size) %
2338 (1 << (s->ps.sps->log2_ctb_size))) ||
2339 (x0 + cb_size >= s->ps.sps->width)) &&
2341 (1 << (s->ps.sps->log2_ctb_size))) ||
2342 (y0 + cb_size >= s->ps.sps->height))) {
2343 int end_of_slice_flag = ff_hevc_end_of_slice_flag_decode(s);
2344 return !end_of_slice_flag;
2353 static void hls_decode_neighbour(HEVCContext *s, int x_ctb, int y_ctb,
2356 HEVCLocalContext *lc = s->HEVClc;
2357 int ctb_size = 1 << s->ps.sps->log2_ctb_size;
2358 int ctb_addr_rs = s->ps.pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2359 int ctb_addr_in_slice = ctb_addr_rs - s->sh.slice_addr;
2361 s->tab_slice_address[ctb_addr_rs] = s->sh.slice_addr;
2363 if (s->ps.pps->entropy_coding_sync_enabled_flag) {
2364 if (x_ctb == 0 && (y_ctb & (ctb_size - 1)) == 0)
2365 lc->first_qp_group = 1;
2366 lc->end_of_tiles_x = s->ps.sps->width;
2367 } else if (s->ps.pps->tiles_enabled_flag) {
2368 if (ctb_addr_ts && s->ps.pps->tile_id[ctb_addr_ts] != s->ps.pps->tile_id[ctb_addr_ts - 1]) {
2369 int idxX = s->ps.pps->col_idxX[x_ctb >> s->ps.sps->log2_ctb_size];
2370 lc->end_of_tiles_x = x_ctb + (s->ps.pps->column_width[idxX] << s->ps.sps->log2_ctb_size);
2371 lc->first_qp_group = 1;
2374 lc->end_of_tiles_x = s->ps.sps->width;
2377 lc->end_of_tiles_y = FFMIN(y_ctb + ctb_size, s->ps.sps->height);
2379 lc->boundary_flags = 0;
2380 if (s->ps.pps->tiles_enabled_flag) {
2381 if (x_ctb > 0 && s->ps.pps->tile_id[ctb_addr_ts] != s->ps.pps->tile_id[s->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs - 1]])
2382 lc->boundary_flags |= BOUNDARY_LEFT_TILE;
2383 if (x_ctb > 0 && s->tab_slice_address[ctb_addr_rs] != s->tab_slice_address[ctb_addr_rs - 1])
2384 lc->boundary_flags |= BOUNDARY_LEFT_SLICE;
2385 if (y_ctb > 0 && s->ps.pps->tile_id[ctb_addr_ts] != s->ps.pps->tile_id[s->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs - s->ps.sps->ctb_width]])
2386 lc->boundary_flags |= BOUNDARY_UPPER_TILE;
2387 if (y_ctb > 0 && s->tab_slice_address[ctb_addr_rs] != s->tab_slice_address[ctb_addr_rs - s->ps.sps->ctb_width])
2388 lc->boundary_flags |= BOUNDARY_UPPER_SLICE;
2390 if (ctb_addr_in_slice <= 0)
2391 lc->boundary_flags |= BOUNDARY_LEFT_SLICE;
2392 if (ctb_addr_in_slice < s->ps.sps->ctb_width)
2393 lc->boundary_flags |= BOUNDARY_UPPER_SLICE;
2396 lc->ctb_left_flag = ((x_ctb > 0) && (ctb_addr_in_slice > 0) && !(lc->boundary_flags & BOUNDARY_LEFT_TILE));
2397 lc->ctb_up_flag = ((y_ctb > 0) && (ctb_addr_in_slice >= s->ps.sps->ctb_width) && !(lc->boundary_flags & BOUNDARY_UPPER_TILE));
2398 lc->ctb_up_right_flag = ((y_ctb > 0) && (ctb_addr_in_slice+1 >= s->ps.sps->ctb_width) && (s->ps.pps->tile_id[ctb_addr_ts] == s->ps.pps->tile_id[s->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs+1 - s->ps.sps->ctb_width]]));
2399 lc->ctb_up_left_flag = ((x_ctb > 0) && (y_ctb > 0) && (ctb_addr_in_slice-1 >= s->ps.sps->ctb_width) && (s->ps.pps->tile_id[ctb_addr_ts] == s->ps.pps->tile_id[s->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs-1 - s->ps.sps->ctb_width]]));
2402 static int hls_decode_entry(AVCodecContext *avctxt, void *isFilterThread)
2404 HEVCContext *s = avctxt->priv_data;
2405 int ctb_size = 1 << s->ps.sps->log2_ctb_size;
2409 int ctb_addr_ts = s->ps.pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs];
2412 if (!ctb_addr_ts && s->sh.dependent_slice_segment_flag) {
2413 av_log(s->avctx, AV_LOG_ERROR, "Impossible initial tile.\n");
2414 return AVERROR_INVALIDDATA;
2417 if (s->sh.dependent_slice_segment_flag) {
2418 int prev_rs = s->ps.pps->ctb_addr_ts_to_rs[ctb_addr_ts - 1];
2419 if (s->tab_slice_address[prev_rs] != s->sh.slice_addr) {
2420 av_log(s->avctx, AV_LOG_ERROR, "Previous slice segment missing\n");
2421 return AVERROR_INVALIDDATA;
2425 while (more_data && ctb_addr_ts < s->ps.sps->ctb_size) {
2426 int ctb_addr_rs = s->ps.pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2428 x_ctb = (ctb_addr_rs % ((s->ps.sps->width + ctb_size - 1) >> s->ps.sps->log2_ctb_size)) << s->ps.sps->log2_ctb_size;
2429 y_ctb = (ctb_addr_rs / ((s->ps.sps->width + ctb_size - 1) >> s->ps.sps->log2_ctb_size)) << s->ps.sps->log2_ctb_size;
2430 hls_decode_neighbour(s, x_ctb, y_ctb, ctb_addr_ts);
2432 ret = ff_hevc_cabac_init(s, ctb_addr_ts);
2434 s->tab_slice_address[ctb_addr_rs] = -1;
2438 hls_sao_param(s, x_ctb >> s->ps.sps->log2_ctb_size, y_ctb >> s->ps.sps->log2_ctb_size);
2440 s->deblock[ctb_addr_rs].beta_offset = s->sh.beta_offset;
2441 s->deblock[ctb_addr_rs].tc_offset = s->sh.tc_offset;
2442 s->filter_slice_edges[ctb_addr_rs] = s->sh.slice_loop_filter_across_slices_enabled_flag;
2444 more_data = hls_coding_quadtree(s, x_ctb, y_ctb, s->ps.sps->log2_ctb_size, 0);
2445 if (more_data < 0) {
2446 s->tab_slice_address[ctb_addr_rs] = -1;
2452 ff_hevc_save_states(s, ctb_addr_ts);
2453 ff_hevc_hls_filters(s, x_ctb, y_ctb, ctb_size);
2456 if (x_ctb + ctb_size >= s->ps.sps->width &&
2457 y_ctb + ctb_size >= s->ps.sps->height)
2458 ff_hevc_hls_filter(s, x_ctb, y_ctb, ctb_size);
2463 static int hls_slice_data(HEVCContext *s)
2471 s->avctx->execute(s->avctx, hls_decode_entry, arg, ret , 1, sizeof(int));
2474 static int hls_decode_entry_wpp(AVCodecContext *avctxt, void *input_ctb_row, int job, int self_id)
2476 HEVCContext *s1 = avctxt->priv_data, *s;
2477 HEVCLocalContext *lc;
2478 int ctb_size = 1<< s1->ps.sps->log2_ctb_size;
2480 int *ctb_row_p = input_ctb_row;
2481 int ctb_row = ctb_row_p[job];
2482 int ctb_addr_rs = s1->sh.slice_ctb_addr_rs + ctb_row * ((s1->ps.sps->width + ctb_size - 1) >> s1->ps.sps->log2_ctb_size);
2483 int ctb_addr_ts = s1->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs];
2484 int thread = ctb_row % s1->threads_number;
2487 s = s1->sList[self_id];
2491 ret = init_get_bits8(&lc->gb, s->data + s->sh.offset[ctb_row - 1], s->sh.size[ctb_row - 1]);
2494 ff_init_cabac_decoder(&lc->cc, s->data + s->sh.offset[(ctb_row)-1], s->sh.size[ctb_row - 1]);
2497 while(more_data && ctb_addr_ts < s->ps.sps->ctb_size) {
2498 int x_ctb = (ctb_addr_rs % s->ps.sps->ctb_width) << s->ps.sps->log2_ctb_size;
2499 int y_ctb = (ctb_addr_rs / s->ps.sps->ctb_width) << s->ps.sps->log2_ctb_size;
2501 hls_decode_neighbour(s, x_ctb, y_ctb, ctb_addr_ts);
2503 ff_thread_await_progress2(s->avctx, ctb_row, thread, SHIFT_CTB_WPP);
2505 if (atomic_load(&s1->wpp_err)) {
2506 ff_thread_report_progress2(s->avctx, ctb_row , thread, SHIFT_CTB_WPP);
2510 ret = ff_hevc_cabac_init(s, ctb_addr_ts);
2513 hls_sao_param(s, x_ctb >> s->ps.sps->log2_ctb_size, y_ctb >> s->ps.sps->log2_ctb_size);
2514 more_data = hls_coding_quadtree(s, x_ctb, y_ctb, s->ps.sps->log2_ctb_size, 0);
2516 if (more_data < 0) {
2523 ff_hevc_save_states(s, ctb_addr_ts);
2524 ff_thread_report_progress2(s->avctx, ctb_row, thread, 1);
2525 ff_hevc_hls_filters(s, x_ctb, y_ctb, ctb_size);
2527 if (!more_data && (x_ctb+ctb_size) < s->ps.sps->width && ctb_row != s->sh.num_entry_point_offsets) {
2528 atomic_store(&s1->wpp_err, 1);
2529 ff_thread_report_progress2(s->avctx, ctb_row ,thread, SHIFT_CTB_WPP);
2533 if ((x_ctb+ctb_size) >= s->ps.sps->width && (y_ctb+ctb_size) >= s->ps.sps->height ) {
2534 ff_hevc_hls_filter(s, x_ctb, y_ctb, ctb_size);
2535 ff_thread_report_progress2(s->avctx, ctb_row , thread, SHIFT_CTB_WPP);
2538 ctb_addr_rs = s->ps.pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2541 if(x_ctb >= s->ps.sps->width) {
2545 ff_thread_report_progress2(s->avctx, ctb_row ,thread, SHIFT_CTB_WPP);
2549 s->tab_slice_address[ctb_addr_rs] = -1;
2550 atomic_store(&s1->wpp_err, 1);
2551 ff_thread_report_progress2(s->avctx, ctb_row ,thread, SHIFT_CTB_WPP);
2555 static int hls_slice_data_wpp(HEVCContext *s, const H2645NAL *nal)
2557 const uint8_t *data = nal->data;
2558 int length = nal->size;
2559 HEVCLocalContext *lc = s->HEVClc;
2560 int *ret = av_malloc_array(s->sh.num_entry_point_offsets + 1, sizeof(int));
2561 int *arg = av_malloc_array(s->sh.num_entry_point_offsets + 1, sizeof(int));
2563 int64_t startheader, cmpt = 0;
2569 return AVERROR(ENOMEM);
2572 if (s->sh.slice_ctb_addr_rs + s->sh.num_entry_point_offsets * s->ps.sps->ctb_width >= s->ps.sps->ctb_width * s->ps.sps->ctb_height) {
2573 av_log(s->avctx, AV_LOG_ERROR, "WPP ctb addresses are wrong (%d %d %d %d)\n",
2574 s->sh.slice_ctb_addr_rs, s->sh.num_entry_point_offsets,
2575 s->ps.sps->ctb_width, s->ps.sps->ctb_height
2577 res = AVERROR_INVALIDDATA;
2581 ff_alloc_entries(s->avctx, s->sh.num_entry_point_offsets + 1);
2584 for (i = 1; i < s->threads_number; i++) {
2585 s->sList[i] = av_malloc(sizeof(HEVCContext));
2586 memcpy(s->sList[i], s, sizeof(HEVCContext));
2587 s->HEVClcList[i] = av_mallocz(sizeof(HEVCLocalContext));
2588 s->sList[i]->HEVClc = s->HEVClcList[i];
2592 offset = (lc->gb.index >> 3);
2594 for (j = 0, cmpt = 0, startheader = offset + s->sh.entry_point_offset[0]; j < nal->skipped_bytes; j++) {
2595 if (nal->skipped_bytes_pos[j] >= offset && nal->skipped_bytes_pos[j] < startheader) {
2601 for (i = 1; i < s->sh.num_entry_point_offsets; i++) {
2602 offset += (s->sh.entry_point_offset[i - 1] - cmpt);
2603 for (j = 0, cmpt = 0, startheader = offset
2604 + s->sh.entry_point_offset[i]; j < nal->skipped_bytes; j++) {
2605 if (nal->skipped_bytes_pos[j] >= offset && nal->skipped_bytes_pos[j] < startheader) {
2610 s->sh.size[i - 1] = s->sh.entry_point_offset[i] - cmpt;
2611 s->sh.offset[i - 1] = offset;
2614 if (s->sh.num_entry_point_offsets != 0) {
2615 offset += s->sh.entry_point_offset[s->sh.num_entry_point_offsets - 1] - cmpt;
2616 if (length < offset) {
2617 av_log(s->avctx, AV_LOG_ERROR, "entry_point_offset table is corrupted\n");
2618 res = AVERROR_INVALIDDATA;
2621 s->sh.size[s->sh.num_entry_point_offsets - 1] = length - offset;
2622 s->sh.offset[s->sh.num_entry_point_offsets - 1] = offset;
2627 for (i = 1; i < s->threads_number; i++) {
2628 s->sList[i]->HEVClc->first_qp_group = 1;
2629 s->sList[i]->HEVClc->qp_y = s->sList[0]->HEVClc->qp_y;
2630 memcpy(s->sList[i], s, sizeof(HEVCContext));
2631 s->sList[i]->HEVClc = s->HEVClcList[i];
2634 atomic_store(&s->wpp_err, 0);
2635 ff_reset_entries(s->avctx);
2637 for (i = 0; i <= s->sh.num_entry_point_offsets; i++) {
2642 if (s->ps.pps->entropy_coding_sync_enabled_flag)
2643 s->avctx->execute2(s->avctx, hls_decode_entry_wpp, arg, ret, s->sh.num_entry_point_offsets + 1);
2645 for (i = 0; i <= s->sh.num_entry_point_offsets; i++)
2653 static int set_side_data(HEVCContext *s)
2655 AVFrame *out = s->ref->frame;
2657 if (s->sei.frame_packing.present &&
2658 s->sei.frame_packing.arrangement_type >= 3 &&
2659 s->sei.frame_packing.arrangement_type <= 5 &&
2660 s->sei.frame_packing.content_interpretation_type > 0 &&
2661 s->sei.frame_packing.content_interpretation_type < 3) {
2662 AVStereo3D *stereo = av_stereo3d_create_side_data(out);
2664 return AVERROR(ENOMEM);
2666 switch (s->sei.frame_packing.arrangement_type) {
2668 if (s->sei.frame_packing.quincunx_subsampling)
2669 stereo->type = AV_STEREO3D_SIDEBYSIDE_QUINCUNX;
2671 stereo->type = AV_STEREO3D_SIDEBYSIDE;
2674 stereo->type = AV_STEREO3D_TOPBOTTOM;
2677 stereo->type = AV_STEREO3D_FRAMESEQUENCE;
2681 if (s->sei.frame_packing.content_interpretation_type == 2)
2682 stereo->flags = AV_STEREO3D_FLAG_INVERT;
2684 if (s->sei.frame_packing.arrangement_type == 5) {
2685 if (s->sei.frame_packing.current_frame_is_frame0_flag)
2686 stereo->view = AV_STEREO3D_VIEW_LEFT;
2688 stereo->view = AV_STEREO3D_VIEW_RIGHT;
2692 if (s->sei.display_orientation.present &&
2693 (s->sei.display_orientation.anticlockwise_rotation ||
2694 s->sei.display_orientation.hflip || s->sei.display_orientation.vflip)) {
2695 double angle = s->sei.display_orientation.anticlockwise_rotation * 360 / (double) (1 << 16);
2696 AVFrameSideData *rotation = av_frame_new_side_data(out,
2697 AV_FRAME_DATA_DISPLAYMATRIX,
2698 sizeof(int32_t) * 9);
2700 return AVERROR(ENOMEM);
2702 av_display_rotation_set((int32_t *)rotation->data, angle);
2703 av_display_matrix_flip((int32_t *)rotation->data,
2704 s->sei.display_orientation.hflip,
2705 s->sei.display_orientation.vflip);
2708 // Decrement the mastering display flag when IRAP frame has no_rasl_output_flag=1
2709 // so the side data persists for the entire coded video sequence.
2710 if (s->sei.mastering_display.present > 0 &&
2711 IS_IRAP(s) && s->no_rasl_output_flag) {
2712 s->sei.mastering_display.present--;
2714 if (s->sei.mastering_display.present) {
2715 // HEVC uses a g,b,r ordering, which we convert to a more natural r,g,b
2716 const int mapping[3] = {2, 0, 1};
2717 const int chroma_den = 50000;
2718 const int luma_den = 10000;
2720 AVMasteringDisplayMetadata *metadata =
2721 av_mastering_display_metadata_create_side_data(out);
2723 return AVERROR(ENOMEM);
2725 for (i = 0; i < 3; i++) {
2726 const int j = mapping[i];
2727 metadata->display_primaries[i][0].num = s->sei.mastering_display.display_primaries[j][0];
2728 metadata->display_primaries[i][0].den = chroma_den;
2729 metadata->display_primaries[i][1].num = s->sei.mastering_display.display_primaries[j][1];
2730 metadata->display_primaries[i][1].den = chroma_den;
2732 metadata->white_point[0].num = s->sei.mastering_display.white_point[0];
2733 metadata->white_point[0].den = chroma_den;
2734 metadata->white_point[1].num = s->sei.mastering_display.white_point[1];
2735 metadata->white_point[1].den = chroma_den;
2737 metadata->max_luminance.num = s->sei.mastering_display.max_luminance;
2738 metadata->max_luminance.den = luma_den;
2739 metadata->min_luminance.num = s->sei.mastering_display.min_luminance;
2740 metadata->min_luminance.den = luma_den;
2741 metadata->has_luminance = 1;
2742 metadata->has_primaries = 1;
2744 av_log(s->avctx, AV_LOG_DEBUG, "Mastering Display Metadata:\n");
2745 av_log(s->avctx, AV_LOG_DEBUG,
2746 "r(%5.4f,%5.4f) g(%5.4f,%5.4f) b(%5.4f %5.4f) wp(%5.4f, %5.4f)\n",
2747 av_q2d(metadata->display_primaries[0][0]),
2748 av_q2d(metadata->display_primaries[0][1]),
2749 av_q2d(metadata->display_primaries[1][0]),
2750 av_q2d(metadata->display_primaries[1][1]),
2751 av_q2d(metadata->display_primaries[2][0]),
2752 av_q2d(metadata->display_primaries[2][1]),
2753 av_q2d(metadata->white_point[0]), av_q2d(metadata->white_point[1]));
2754 av_log(s->avctx, AV_LOG_DEBUG,
2755 "min_luminance=%f, max_luminance=%f\n",
2756 av_q2d(metadata->min_luminance), av_q2d(metadata->max_luminance));
2758 // Decrement the mastering display flag when IRAP frame has no_rasl_output_flag=1
2759 // so the side data persists for the entire coded video sequence.
2760 if (s->sei.content_light.present > 0 &&
2761 IS_IRAP(s) && s->no_rasl_output_flag) {
2762 s->sei.content_light.present--;
2764 if (s->sei.content_light.present) {
2765 AVContentLightMetadata *metadata =
2766 av_content_light_metadata_create_side_data(out);
2768 return AVERROR(ENOMEM);
2769 metadata->MaxCLL = s->sei.content_light.max_content_light_level;
2770 metadata->MaxFALL = s->sei.content_light.max_pic_average_light_level;
2772 av_log(s->avctx, AV_LOG_DEBUG, "Content Light Level Metadata:\n");
2773 av_log(s->avctx, AV_LOG_DEBUG, "MaxCLL=%d, MaxFALL=%d\n",
2774 metadata->MaxCLL, metadata->MaxFALL);
2777 if (s->sei.a53_caption.a53_caption) {
2778 AVFrameSideData* sd = av_frame_new_side_data(out,
2779 AV_FRAME_DATA_A53_CC,
2780 s->sei.a53_caption.a53_caption_size);
2782 memcpy(sd->data, s->sei.a53_caption.a53_caption, s->sei.a53_caption.a53_caption_size);
2783 av_freep(&s->sei.a53_caption.a53_caption);
2784 s->sei.a53_caption.a53_caption_size = 0;
2785 s->avctx->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS;
2791 static int hevc_frame_start(HEVCContext *s)
2793 HEVCLocalContext *lc = s->HEVClc;
2794 int pic_size_in_ctb = ((s->ps.sps->width >> s->ps.sps->log2_min_cb_size) + 1) *
2795 ((s->ps.sps->height >> s->ps.sps->log2_min_cb_size) + 1);
2798 memset(s->horizontal_bs, 0, s->bs_width * s->bs_height);
2799 memset(s->vertical_bs, 0, s->bs_width * s->bs_height);
2800 memset(s->cbf_luma, 0, s->ps.sps->min_tb_width * s->ps.sps->min_tb_height);
2801 memset(s->is_pcm, 0, (s->ps.sps->min_pu_width + 1) * (s->ps.sps->min_pu_height + 1));
2802 memset(s->tab_slice_address, -1, pic_size_in_ctb * sizeof(*s->tab_slice_address));
2805 s->first_nal_type = s->nal_unit_type;
2807 s->no_rasl_output_flag = IS_IDR(s) || IS_BLA(s) || (s->nal_unit_type == HEVC_NAL_CRA_NUT && s->last_eos);
2809 if (s->ps.pps->tiles_enabled_flag)
2810 lc->end_of_tiles_x = s->ps.pps->column_width[0] << s->ps.sps->log2_ctb_size;
2812 ret = ff_hevc_set_new_ref(s, &s->frame, s->poc);
2816 ret = ff_hevc_frame_rps(s);
2818 av_log(s->avctx, AV_LOG_ERROR, "Error constructing the frame RPS.\n");
2822 s->ref->frame->key_frame = IS_IRAP(s);
2824 ret = set_side_data(s);
2828 s->frame->pict_type = 3 - s->sh.slice_type;
2831 ff_hevc_bump_frame(s);
2833 av_frame_unref(s->output_frame);
2834 ret = ff_hevc_output_frame(s, s->output_frame, 0);
2838 if (!s->avctx->hwaccel)
2839 ff_thread_finish_setup(s->avctx);
2845 ff_hevc_unref_frame(s, s->ref, ~0);
2850 static int decode_nal_unit(HEVCContext *s, const H2645NAL *nal)
2852 HEVCLocalContext *lc = s->HEVClc;
2853 GetBitContext *gb = &lc->gb;
2854 int ctb_addr_ts, ret;
2857 s->nal_unit_type = nal->type;
2858 s->temporal_id = nal->temporal_id;
2860 switch (s->nal_unit_type) {
2862 if (s->avctx->hwaccel && s->avctx->hwaccel->decode_params) {
2863 ret = s->avctx->hwaccel->decode_params(s->avctx,
2870 ret = ff_hevc_decode_nal_vps(gb, s->avctx, &s->ps);
2875 if (s->avctx->hwaccel && s->avctx->hwaccel->decode_params) {
2876 ret = s->avctx->hwaccel->decode_params(s->avctx,
2883 ret = ff_hevc_decode_nal_sps(gb, s->avctx, &s->ps,
2884 s->apply_defdispwin);
2889 if (s->avctx->hwaccel && s->avctx->hwaccel->decode_params) {
2890 ret = s->avctx->hwaccel->decode_params(s->avctx,
2897 ret = ff_hevc_decode_nal_pps(gb, s->avctx, &s->ps);
2901 case HEVC_NAL_SEI_PREFIX:
2902 case HEVC_NAL_SEI_SUFFIX:
2903 if (s->avctx->hwaccel && s->avctx->hwaccel->decode_params) {
2904 ret = s->avctx->hwaccel->decode_params(s->avctx,
2911 ret = ff_hevc_decode_nal_sei(gb, s->avctx, &s->sei, &s->ps, s->nal_unit_type);
2915 case HEVC_NAL_TRAIL_R:
2916 case HEVC_NAL_TRAIL_N:
2917 case HEVC_NAL_TSA_N:
2918 case HEVC_NAL_TSA_R:
2919 case HEVC_NAL_STSA_N:
2920 case HEVC_NAL_STSA_R:
2921 case HEVC_NAL_BLA_W_LP:
2922 case HEVC_NAL_BLA_W_RADL:
2923 case HEVC_NAL_BLA_N_LP:
2924 case HEVC_NAL_IDR_W_RADL:
2925 case HEVC_NAL_IDR_N_LP:
2926 case HEVC_NAL_CRA_NUT:
2927 case HEVC_NAL_RADL_N:
2928 case HEVC_NAL_RADL_R:
2929 case HEVC_NAL_RASL_N:
2930 case HEVC_NAL_RASL_R:
2931 ret = hls_slice_header(s);
2935 ret = AVERROR_INVALIDDATA;
2941 (s->avctx->skip_frame >= AVDISCARD_BIDIR && s->sh.slice_type == HEVC_SLICE_B) ||
2942 (s->avctx->skip_frame >= AVDISCARD_NONINTRA && s->sh.slice_type != HEVC_SLICE_I) ||
2943 (s->avctx->skip_frame >= AVDISCARD_NONKEY && !IS_IRAP(s))) {
2947 if (s->sh.first_slice_in_pic_flag) {
2948 if (s->max_ra == INT_MAX) {
2949 if (s->nal_unit_type == HEVC_NAL_CRA_NUT || IS_BLA(s)) {
2953 s->max_ra = INT_MIN;
2957 if ((s->nal_unit_type == HEVC_NAL_RASL_R || s->nal_unit_type == HEVC_NAL_RASL_N) &&
2958 s->poc <= s->max_ra) {
2962 if (s->nal_unit_type == HEVC_NAL_RASL_R && s->poc > s->max_ra)
2963 s->max_ra = INT_MIN;
2967 ret = hevc_frame_start(s);
2970 } else if (!s->ref) {
2971 av_log(s->avctx, AV_LOG_ERROR, "First slice in a frame missing.\n");
2975 if (s->nal_unit_type != s->first_nal_type) {
2976 av_log(s->avctx, AV_LOG_ERROR,
2977 "Non-matching NAL types of the VCL NALUs: %d %d\n",
2978 s->first_nal_type, s->nal_unit_type);
2979 return AVERROR_INVALIDDATA;
2982 if (!s->sh.dependent_slice_segment_flag &&
2983 s->sh.slice_type != HEVC_SLICE_I) {
2984 ret = ff_hevc_slice_rpl(s);
2986 av_log(s->avctx, AV_LOG_WARNING,
2987 "Error constructing the reference lists for the current slice.\n");
2992 if (s->sh.first_slice_in_pic_flag && s->avctx->hwaccel) {
2993 ret = s->avctx->hwaccel->start_frame(s->avctx, NULL, 0);
2998 if (s->avctx->hwaccel) {
2999 ret = s->avctx->hwaccel->decode_slice(s->avctx, nal->raw_data, nal->raw_size);
3003 if (s->threads_number > 1 && s->sh.num_entry_point_offsets > 0)
3004 ctb_addr_ts = hls_slice_data_wpp(s, nal);
3006 ctb_addr_ts = hls_slice_data(s);
3007 if (ctb_addr_ts >= (s->ps.sps->ctb_width * s->ps.sps->ctb_height)) {
3011 if (ctb_addr_ts < 0) {
3017 case HEVC_NAL_EOS_NUT:
3018 case HEVC_NAL_EOB_NUT:
3019 s->seq_decode = (s->seq_decode + 1) & 0xff;
3020 s->max_ra = INT_MAX;
3023 case HEVC_NAL_FD_NUT:
3026 av_log(s->avctx, AV_LOG_INFO,
3027 "Skipping NAL unit %d\n", s->nal_unit_type);
3032 if (s->avctx->err_recognition & AV_EF_EXPLODE)
3037 static int decode_nal_units(HEVCContext *s, const uint8_t *buf, int length)
3040 int eos_at_start = 1;
3043 s->last_eos = s->eos;
3047 /* split the input packet into NAL units, so we know the upper bound on the
3048 * number of slices in the frame */
3049 ret = ff_h2645_packet_split(&s->pkt, buf, length, s->avctx, s->is_nalff,
3050 s->nal_length_size, s->avctx->codec_id, 1, 0);
3052 av_log(s->avctx, AV_LOG_ERROR,
3053 "Error splitting the input into NAL units.\n");
3057 for (i = 0; i < s->pkt.nb_nals; i++) {
3058 if (s->pkt.nals[i].type == HEVC_NAL_EOB_NUT ||
3059 s->pkt.nals[i].type == HEVC_NAL_EOS_NUT) {
3070 /* decode the NAL units */
3071 for (i = 0; i < s->pkt.nb_nals; i++) {
3072 H2645NAL *nal = &s->pkt.nals[i];
3074 if (s->avctx->skip_frame >= AVDISCARD_ALL ||
3075 (s->avctx->skip_frame >= AVDISCARD_NONREF
3076 && ff_hevc_nal_is_nonref(nal->type)))
3079 ret = decode_nal_unit(s, nal);
3080 if (ret >= 0 && s->overlap > 2)
3081 ret = AVERROR_INVALIDDATA;
3083 av_log(s->avctx, AV_LOG_WARNING,
3084 "Error parsing NAL unit #%d.\n", i);
3090 if (s->ref && s->threads_type == FF_THREAD_FRAME)
3091 ff_thread_report_progress(&s->ref->tf, INT_MAX, 0);
3096 static void print_md5(void *log_ctx, int level, uint8_t md5[16])
3099 for (i = 0; i < 16; i++)
3100 av_log(log_ctx, level, "%02"PRIx8, md5[i]);
3103 static int verify_md5(HEVCContext *s, AVFrame *frame)
3105 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format);
3110 return AVERROR(EINVAL);
3112 pixel_shift = desc->comp[0].depth > 8;
3114 av_log(s->avctx, AV_LOG_DEBUG, "Verifying checksum for frame with POC %d: ",
3117 /* the checksums are LE, so we have to byteswap for >8bpp formats
3120 if (pixel_shift && !s->checksum_buf) {
3121 av_fast_malloc(&s->checksum_buf, &s->checksum_buf_size,
3122 FFMAX3(frame->linesize[0], frame->linesize[1],
3123 frame->linesize[2]));
3124 if (!s->checksum_buf)
3125 return AVERROR(ENOMEM);
3129 for (i = 0; frame->data[i]; i++) {
3130 int width = s->avctx->coded_width;
3131 int height = s->avctx->coded_height;
3132 int w = (i == 1 || i == 2) ? (width >> desc->log2_chroma_w) : width;
3133 int h = (i == 1 || i == 2) ? (height >> desc->log2_chroma_h) : height;
3136 av_md5_init(s->md5_ctx);
3137 for (j = 0; j < h; j++) {
3138 const uint8_t *src = frame->data[i] + j * frame->linesize[i];
3141 s->bdsp.bswap16_buf((uint16_t *) s->checksum_buf,
3142 (const uint16_t *) src, w);
3143 src = s->checksum_buf;
3146 av_md5_update(s->md5_ctx, src, w << pixel_shift);
3148 av_md5_final(s->md5_ctx, md5);
3150 if (!memcmp(md5, s->sei.picture_hash.md5[i], 16)) {
3151 av_log (s->avctx, AV_LOG_DEBUG, "plane %d - correct ", i);
3152 print_md5(s->avctx, AV_LOG_DEBUG, md5);
3153 av_log (s->avctx, AV_LOG_DEBUG, "; ");
3155 av_log (s->avctx, AV_LOG_ERROR, "mismatching checksum of plane %d - ", i);
3156 print_md5(s->avctx, AV_LOG_ERROR, md5);
3157 av_log (s->avctx, AV_LOG_ERROR, " != ");
3158 print_md5(s->avctx, AV_LOG_ERROR, s->sei.picture_hash.md5[i]);
3159 av_log (s->avctx, AV_LOG_ERROR, "\n");
3160 return AVERROR_INVALIDDATA;
3164 av_log(s->avctx, AV_LOG_DEBUG, "\n");
3169 static int hevc_decode_extradata(HEVCContext *s, uint8_t *buf, int length, int first)
3173 ret = ff_hevc_decode_extradata(buf, length, &s->ps, &s->sei, &s->is_nalff,
3174 &s->nal_length_size, s->avctx->err_recognition,
3175 s->apply_defdispwin, s->avctx);
3179 /* export stream parameters from the first SPS */
3180 for (i = 0; i < FF_ARRAY_ELEMS(s->ps.sps_list); i++) {
3181 if (first && s->ps.sps_list[i]) {
3182 const HEVCSPS *sps = (const HEVCSPS*)s->ps.sps_list[i]->data;
3183 export_stream_params(s, sps);
3191 static int hevc_decode_frame(AVCodecContext *avctx, void *data, int *got_output,
3195 int new_extradata_size;
3196 uint8_t *new_extradata;
3197 HEVCContext *s = avctx->priv_data;
3200 ret = ff_hevc_output_frame(s, data, 1);
3208 new_extradata = av_packet_get_side_data(avpkt, AV_PKT_DATA_NEW_EXTRADATA,
3209 &new_extradata_size);
3210 if (new_extradata && new_extradata_size > 0) {
3211 ret = hevc_decode_extradata(s, new_extradata, new_extradata_size, 0);
3217 ret = decode_nal_units(s, avpkt->data, avpkt->size);
3221 if (avctx->hwaccel) {
3222 if (s->ref && (ret = avctx->hwaccel->end_frame(avctx)) < 0) {
3223 av_log(avctx, AV_LOG_ERROR,
3224 "hardware accelerator failed to decode picture\n");
3225 ff_hevc_unref_frame(s, s->ref, ~0);
3229 /* verify the SEI checksum */
3230 if (avctx->err_recognition & AV_EF_CRCCHECK && s->is_decoded &&
3231 s->sei.picture_hash.is_md5) {
3232 ret = verify_md5(s, s->ref->frame);
3233 if (ret < 0 && avctx->err_recognition & AV_EF_EXPLODE) {
3234 ff_hevc_unref_frame(s, s->ref, ~0);
3239 s->sei.picture_hash.is_md5 = 0;
3241 if (s->is_decoded) {
3242 av_log(avctx, AV_LOG_DEBUG, "Decoded frame with POC %d.\n", s->poc);
3246 if (s->output_frame->buf[0]) {
3247 av_frame_move_ref(data, s->output_frame);
3254 static int hevc_ref_frame(HEVCContext *s, HEVCFrame *dst, HEVCFrame *src)
3258 ret = ff_thread_ref_frame(&dst->tf, &src->tf);
3262 dst->tab_mvf_buf = av_buffer_ref(src->tab_mvf_buf);
3263 if (!dst->tab_mvf_buf)
3265 dst->tab_mvf = src->tab_mvf;
3267 dst->rpl_tab_buf = av_buffer_ref(src->rpl_tab_buf);
3268 if (!dst->rpl_tab_buf)
3270 dst->rpl_tab = src->rpl_tab;
3272 dst->rpl_buf = av_buffer_ref(src->rpl_buf);
3276 dst->poc = src->poc;
3277 dst->ctb_count = src->ctb_count;
3278 dst->flags = src->flags;
3279 dst->sequence = src->sequence;
3281 if (src->hwaccel_picture_private) {
3282 dst->hwaccel_priv_buf = av_buffer_ref(src->hwaccel_priv_buf);
3283 if (!dst->hwaccel_priv_buf)
3285 dst->hwaccel_picture_private = dst->hwaccel_priv_buf->data;
3290 ff_hevc_unref_frame(s, dst, ~0);
3291 return AVERROR(ENOMEM);
3294 static av_cold int hevc_decode_free(AVCodecContext *avctx)
3296 HEVCContext *s = avctx->priv_data;
3301 av_freep(&s->md5_ctx);
3303 av_freep(&s->cabac_state);
3305 for (i = 0; i < 3; i++) {
3306 av_freep(&s->sao_pixel_buffer_h[i]);
3307 av_freep(&s->sao_pixel_buffer_v[i]);
3309 av_frame_free(&s->output_frame);
3311 for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
3312 ff_hevc_unref_frame(s, &s->DPB[i], ~0);
3313 av_frame_free(&s->DPB[i].frame);
3316 ff_hevc_ps_uninit(&s->ps);
3318 av_freep(&s->sh.entry_point_offset);
3319 av_freep(&s->sh.offset);
3320 av_freep(&s->sh.size);
3322 for (i = 1; i < s->threads_number; i++) {
3323 HEVCLocalContext *lc = s->HEVClcList[i];
3325 av_freep(&s->HEVClcList[i]);
3326 av_freep(&s->sList[i]);
3329 if (s->HEVClc == s->HEVClcList[0])
3331 av_freep(&s->HEVClcList[0]);
3333 ff_h2645_packet_uninit(&s->pkt);
3338 static av_cold int hevc_init_context(AVCodecContext *avctx)
3340 HEVCContext *s = avctx->priv_data;
3345 s->HEVClc = av_mallocz(sizeof(HEVCLocalContext));
3348 s->HEVClcList[0] = s->HEVClc;
3351 s->cabac_state = av_malloc(HEVC_CONTEXTS);
3352 if (!s->cabac_state)
3355 s->output_frame = av_frame_alloc();
3356 if (!s->output_frame)
3359 for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
3360 s->DPB[i].frame = av_frame_alloc();
3361 if (!s->DPB[i].frame)
3363 s->DPB[i].tf.f = s->DPB[i].frame;
3366 s->max_ra = INT_MAX;
3368 s->md5_ctx = av_md5_alloc();
3372 ff_bswapdsp_init(&s->bdsp);
3374 s->context_initialized = 1;
3377 ff_hevc_reset_sei(&s->sei);
3382 hevc_decode_free(avctx);
3383 return AVERROR(ENOMEM);
3387 static int hevc_update_thread_context(AVCodecContext *dst,
3388 const AVCodecContext *src)
3390 HEVCContext *s = dst->priv_data;
3391 HEVCContext *s0 = src->priv_data;
3394 if (!s->context_initialized) {
3395 ret = hevc_init_context(dst);
3400 for (i = 0; i < FF_ARRAY_ELEMS(s->DPB); i++) {
3401 ff_hevc_unref_frame(s, &s->DPB[i], ~0);
3402 if (s0->DPB[i].frame->buf[0]) {
3403 ret = hevc_ref_frame(s, &s->DPB[i], &s0->DPB[i]);
3409 if (s->ps.sps != s0->ps.sps)
3411 for (i = 0; i < FF_ARRAY_ELEMS(s->ps.vps_list); i++) {
3412 av_buffer_unref(&s->ps.vps_list[i]);
3413 if (s0->ps.vps_list[i]) {
3414 s->ps.vps_list[i] = av_buffer_ref(s0->ps.vps_list[i]);
3415 if (!s->ps.vps_list[i])
3416 return AVERROR(ENOMEM);
3420 for (i = 0; i < FF_ARRAY_ELEMS(s->ps.sps_list); i++) {
3421 av_buffer_unref(&s->ps.sps_list[i]);
3422 if (s0->ps.sps_list[i]) {
3423 s->ps.sps_list[i] = av_buffer_ref(s0->ps.sps_list[i]);
3424 if (!s->ps.sps_list[i])
3425 return AVERROR(ENOMEM);
3429 for (i = 0; i < FF_ARRAY_ELEMS(s->ps.pps_list); i++) {
3430 av_buffer_unref(&s->ps.pps_list[i]);
3431 if (s0->ps.pps_list[i]) {
3432 s->ps.pps_list[i] = av_buffer_ref(s0->ps.pps_list[i]);
3433 if (!s->ps.pps_list[i])
3434 return AVERROR(ENOMEM);
3438 if (s->ps.sps != s0->ps.sps)
3439 if ((ret = set_sps(s, s0->ps.sps, src->pix_fmt)) < 0)
3442 s->seq_decode = s0->seq_decode;
3443 s->seq_output = s0->seq_output;
3444 s->pocTid0 = s0->pocTid0;
3445 s->max_ra = s0->max_ra;
3447 s->no_rasl_output_flag = s0->no_rasl_output_flag;
3449 s->is_nalff = s0->is_nalff;
3450 s->nal_length_size = s0->nal_length_size;
3452 s->threads_number = s0->threads_number;
3453 s->threads_type = s0->threads_type;
3456 s->seq_decode = (s->seq_decode + 1) & 0xff;
3457 s->max_ra = INT_MAX;
3460 s->sei.frame_packing = s0->sei.frame_packing;
3461 s->sei.display_orientation = s0->sei.display_orientation;
3462 s->sei.mastering_display = s0->sei.mastering_display;
3463 s->sei.content_light = s0->sei.content_light;
3464 s->sei.alternative_transfer = s0->sei.alternative_transfer;
3470 static av_cold int hevc_decode_init(AVCodecContext *avctx)
3472 HEVCContext *s = avctx->priv_data;
3475 avctx->internal->allocate_progress = 1;
3477 ret = hevc_init_context(avctx);
3481 s->enable_parallel_tiles = 0;
3482 s->sei.picture_timing.picture_struct = 0;
3485 atomic_init(&s->wpp_err, 0);
3487 if(avctx->active_thread_type & FF_THREAD_SLICE)
3488 s->threads_number = avctx->thread_count;
3490 s->threads_number = 1;
3492 if (avctx->extradata_size > 0 && avctx->extradata) {
3493 ret = hevc_decode_extradata(s, avctx->extradata, avctx->extradata_size, 1);
3495 hevc_decode_free(avctx);
3500 if((avctx->active_thread_type & FF_THREAD_FRAME) && avctx->thread_count > 1)
3501 s->threads_type = FF_THREAD_FRAME;
3503 s->threads_type = FF_THREAD_SLICE;
3509 static av_cold int hevc_init_thread_copy(AVCodecContext *avctx)
3511 HEVCContext *s = avctx->priv_data;
3514 memset(s, 0, sizeof(*s));
3516 ret = hevc_init_context(avctx);
3524 static void hevc_decode_flush(AVCodecContext *avctx)
3526 HEVCContext *s = avctx->priv_data;
3527 ff_hevc_flush_dpb(s);
3528 s->max_ra = INT_MAX;
3532 #define OFFSET(x) offsetof(HEVCContext, x)
3533 #define PAR (AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
3535 static const AVOption options[] = {
3536 { "apply_defdispwin", "Apply default display window from VUI", OFFSET(apply_defdispwin),
3537 AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, PAR },
3538 { "strict-displaywin", "stricly apply default display window size", OFFSET(apply_defdispwin),
3539 AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, PAR },
3543 static const AVClass hevc_decoder_class = {
3544 .class_name = "HEVC decoder",
3545 .item_name = av_default_item_name,
3547 .version = LIBAVUTIL_VERSION_INT,
3550 AVCodec ff_hevc_decoder = {
3552 .long_name = NULL_IF_CONFIG_SMALL("HEVC (High Efficiency Video Coding)"),
3553 .type = AVMEDIA_TYPE_VIDEO,
3554 .id = AV_CODEC_ID_HEVC,
3555 .priv_data_size = sizeof(HEVCContext),
3556 .priv_class = &hevc_decoder_class,
3557 .init = hevc_decode_init,
3558 .close = hevc_decode_free,
3559 .decode = hevc_decode_frame,
3560 .flush = hevc_decode_flush,
3561 .update_thread_context = ONLY_IF_THREADS_ENABLED(hevc_update_thread_context),
3562 .init_thread_copy = ONLY_IF_THREADS_ENABLED(hevc_init_thread_copy),
3563 .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY |
3564 AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_FRAME_THREADS,
3565 .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_EXPORTS_CROPPING,
3566 .profiles = NULL_IF_CONFIG_SMALL(ff_hevc_profiles),
3567 .hw_configs = (const AVCodecHWConfigInternal*[]) {
3568 #if CONFIG_HEVC_DXVA2_HWACCEL
3569 HWACCEL_DXVA2(hevc),
3571 #if CONFIG_HEVC_D3D11VA_HWACCEL
3572 HWACCEL_D3D11VA(hevc),
3574 #if CONFIG_HEVC_D3D11VA2_HWACCEL
3575 HWACCEL_D3D11VA2(hevc),
3577 #if CONFIG_HEVC_NVDEC_HWACCEL
3578 HWACCEL_NVDEC(hevc),
3580 #if CONFIG_HEVC_VAAPI_HWACCEL
3581 HWACCEL_VAAPI(hevc),
3583 #if CONFIG_HEVC_VDPAU_HWACCEL
3584 HWACCEL_VDPAU(hevc),
3586 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
3587 HWACCEL_VIDEOTOOLBOX(hevc),