26 #include "config_components.h"
61 static const uint8_t
hevc_pel_weight[65] = { [2] = 0, [4] = 1, [6] = 2, [8] = 3, [12] = 4, [16] = 5, [24] = 6, [32] = 7, [48] = 8, [64] = 9 };
92 for (
int i = 0;
i < 3;
i++) {
104 int log2_min_cb_size =
sps->log2_min_cb_size;
107 int pic_size_in_ctb = ((
width >> log2_min_cb_size) + 1) *
108 ((
height >> log2_min_cb_size) + 1);
109 int ctb_count =
sps->ctb_width *
sps->ctb_height;
110 int min_pu_size =
sps->min_pu_width *
sps->min_pu_height;
149 if (
sps->sao_enabled) {
150 int c_count = (
sps->chroma_format_idc != 0) ? 3 : 1;
152 for (
int c_idx = 0; c_idx < c_count; c_idx++) {
153 int w =
sps->width >>
sps->hshift[c_idx];
154 int h =
sps->height >>
sps->vshift[c_idx];
179 int luma_log2_weight_denom;
180 unsigned luma_weight_flags, chroma_weight_flags;
183 if (luma_log2_weight_denom < 0 || luma_log2_weight_denom > 7) {
184 av_log(logctx,
AV_LOG_ERROR,
"luma_log2_weight_denom %d is invalid\n", luma_log2_weight_denom);
188 if (
sps->chroma_format_idc != 0) {
190 if (chroma_log2_weight_denom < 0 || chroma_log2_weight_denom > 7) {
191 av_log(logctx,
AV_LOG_ERROR,
"chroma_log2_weight_denom %"PRId64
" is invalid\n", chroma_log2_weight_denom);
200 unsigned flag_bit = 1 << (sh->
nb_refs[
L0] - 1 -
i);
202 if (luma_weight_flags & flag_bit) {
204 if ((int8_t)delta_luma_weight_l0 != delta_luma_weight_l0)
212 if (chroma_weight_flags & flag_bit) {
213 for (j = 0; j < 2; j++) {
217 if ( (int8_t)delta_chroma_weight_l0 != delta_chroma_weight_l0
218 || delta_chroma_offset_l0 < -(1<<17) || delta_chroma_offset_l0 > (1<<17)) {
237 unsigned flag_bit = 1 << (sh->
nb_refs[
L1] - 1 -
i);
239 if (luma_weight_flags & flag_bit) {
241 if ((int8_t)delta_luma_weight_l1 != delta_luma_weight_l1)
249 if (chroma_weight_flags & flag_bit) {
250 for (j = 0; j < 2; j++) {
254 if ( (int8_t)delta_chroma_weight_l1 != delta_chroma_weight_l1
255 || delta_chroma_offset_l1 < -(1<<17) || delta_chroma_offset_l1 > (1<<17)) {
277 int max_poc_lsb = 1 <<
sps->log2_max_poc_lsb;
278 int prev_delta_msb = 0;
279 unsigned int nb_sps = 0, nb_sh;
283 if (!
sps->long_term_ref_pics_present)
286 if (
sps->num_long_term_ref_pics_sps > 0)
290 if (nb_sps >
sps->num_long_term_ref_pics_sps)
300 uint8_t lt_idx_sps = 0;
302 if (
sps->num_long_term_ref_pics_sps > 1)
305 rps->
poc[
i] =
sps->lt_ref_pic_poc_lsb_sps[lt_idx_sps];
306 rps->
used[
i] = !!(
sps->used_by_curr_pic_lt & (1
U << lt_idx_sps));
317 if (
i &&
i != nb_sps)
318 delta += prev_delta_msb;
320 poc = rps->
poc[
i] + cur_poc -
delta * max_poc_lsb - poc_lsb;
324 prev_delta_msb =
delta;
336 unsigned int num = 0, den = 0;
344 avctx->
profile =
sps->ptl.general_ptl.profile_idc;
345 avctx->
level =
sps->ptl.general_ptl.level_idc;
349 if (
sps->vui.common.video_signal_type_present_flag)
355 if (
sps->vui.common.colour_description_present_flag) {
357 avctx->
color_trc =
sps->vui.common.transfer_characteristics;
366 if (
sps->chroma_format_idc == 1) {
367 if (
sps->vui.common.chroma_loc_info_present_flag) {
368 if (
sps->vui.common.chroma_sample_loc_type_top_field <= 5)
374 if (
vps->vps_timing_info_present_flag) {
375 num =
vps->vps_num_units_in_tick;
376 den =
vps->vps_time_scale;
377 }
else if (
sps->vui.vui_timing_info_present_flag) {
378 num =
sps->vui.vui_num_units_in_tick;
379 den =
sps->vui.vui_time_scale;
382 if (num > 0 && den > 0)
391 #if FF_API_CODEC_PROPS
393 if (
s->sei.common.a53_caption.buf_ref)
398 if (
s->sei.common.alternative_transfer.present &&
401 avctx->
color_trc =
s->sei.common.alternative_transfer.preferred_transfer_characteristics;
404 #if FF_API_CODEC_PROPS
406 if ((
s->sei.common.film_grain_characteristics &&
s->sei.common.film_grain_characteristics->present) ||
407 s->sei.common.aom_film_grain.enable)
420 s->nb_view_ids_available = 0;
422 s->nb_view_pos_available = 0;
425 if (
vps->nb_layers < 2 && !
vps->view_id[0])
428 s->view_ids_available =
av_calloc(
vps->nb_layers,
sizeof(*
s->view_ids_available));
429 if (!
s->view_ids_available)
433 s->view_pos_available =
av_calloc(
vps->nb_layers,
sizeof(*
s->view_pos_available));
434 if (!
s->view_pos_available)
438 for (
int i = 0;
i <
vps->nb_layers;
i++) {
439 s->view_ids_available[
i] =
vps->view_id[
i];
441 if (
s->view_pos_available) {
448 s->nb_view_ids_available =
vps->nb_layers;
449 s->nb_view_pos_available =
s->view_pos_available ?
vps->nb_layers : 0;
459 if (
vps->nb_layers != 2 || !
vps->layer_id_in_nuh[1])
475 unsigned layers_active_output = 0, highest_layer;
477 s->layers_active_output = 1;
478 s->layers_active_decode = 1;
486 s->layers_active_decode = (1 <<
vps->nb_layers) - 1;
487 s->layers_active_output = 1;
496 if (
s->nb_view_ids == 1 &&
s->view_ids[0] == -1) {
497 layers_active_output = (1 <<
vps->nb_layers) - 1;
499 for (
int i = 0;
i <
s->nb_view_ids;
i++) {
500 int view_id =
s->view_ids[
i];
505 "Invalid view ID requested: %d\n", view_id);
509 for (
int j = 0; j <
vps->nb_layers; j++) {
510 if (
vps->view_id[j] == view_id) {
517 "View ID %d not present in VPS\n", view_id);
520 layers_active_output |= 1 << layer_idx;
524 if (!layers_active_output) {
529 highest_layer =
ff_log2(layers_active_output);
532 "Too many layers requested: %u\n", layers_active_output);
540 s->layers_active_decode = (1 << (highest_layer + 1)) - 1;
541 s->layers_active_output = layers_active_output;
544 s->layers_active_decode,
s->layers_active_output);
579 #define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \
580 CONFIG_HEVC_D3D11VA_HWACCEL * 2 + \
581 CONFIG_HEVC_D3D12VA_HWACCEL + \
582 CONFIG_HEVC_NVDEC_HWACCEL + \
583 CONFIG_HEVC_VAAPI_HWACCEL + \
584 CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \
585 CONFIG_HEVC_VDPAU_HWACCEL + \
586 CONFIG_HEVC_VULKAN_HWACCEL)
594 switch (
sps->pix_fmt) {
597 #if CONFIG_HEVC_DXVA2_HWACCEL
600 #if CONFIG_HEVC_D3D11VA_HWACCEL
604 #if CONFIG_HEVC_D3D12VA_HWACCEL
607 #if CONFIG_HEVC_VAAPI_HWACCEL
610 #if CONFIG_HEVC_VDPAU_HWACCEL
613 #if CONFIG_HEVC_NVDEC_HWACCEL
616 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
619 #if CONFIG_HEVC_VULKAN_HWACCEL
624 #if CONFIG_HEVC_DXVA2_HWACCEL
627 #if CONFIG_HEVC_D3D11VA_HWACCEL
631 #if CONFIG_HEVC_D3D12VA_HWACCEL
634 #if CONFIG_HEVC_VAAPI_HWACCEL
637 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
640 #if CONFIG_HEVC_VULKAN_HWACCEL
643 #if CONFIG_HEVC_VDPAU_HWACCEL
646 #if CONFIG_HEVC_NVDEC_HWACCEL
651 #if CONFIG_HEVC_VAAPI_HWACCEL
654 #if CONFIG_HEVC_VDPAU_HWACCEL
657 #if CONFIG_HEVC_NVDEC_HWACCEL
660 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
663 #if CONFIG_HEVC_VULKAN_HWACCEL
669 #if CONFIG_HEVC_VAAPI_HWACCEL
672 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
675 #if CONFIG_HEVC_VULKAN_HWACCEL
678 #if CONFIG_HEVC_NVDEC_HWACCEL
683 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
689 #if CONFIG_HEVC_VAAPI_HWACCEL
692 #if CONFIG_HEVC_VDPAU_HWACCEL
695 #if CONFIG_HEVC_VULKAN_HWACCEL
698 #if CONFIG_HEVC_NVDEC_HWACCEL
703 #if CONFIG_HEVC_VAAPI_HWACCEL
706 #if CONFIG_HEVC_VULKAN_HWACCEL
709 #if CONFIG_HEVC_NVDEC_HWACCEL
717 *fmt++ =
sps->pix_fmt;
729 s->avctx->pix_fmt =
ret;
774 unsigned pps_id, layer_idx;
795 pps =
s->ps.pps_list[pps_id];
798 layer_idx =
vps->layer_idx[
s->nuh_layer_id];
805 int slice_address_length;
807 if (
pps->dependent_slice_segments_enabled_flag)
819 "Invalid slice segment address: %u.\n",
832 for (
i = 0;
i <
pps->num_extra_slice_header_bits;
i++)
844 !
pps->pps_curr_pic_ref_enabled_flag &&
845 s->nuh_layer_id == 0) {
852 if (
pps->output_flag_present_flag)
855 if (
sps->separate_colour_plane)
859 (
s->nuh_layer_id > 0 &&
860 !(
vps->poc_lsb_not_present & (1 << layer_idx)))) {
867 "Ignoring POC change between slices: %d -> %d\n", poc, sh->
poc);
887 int numbits, rps_idx;
889 if (!
sps->nb_st_rps) {
895 rps_idx = numbits > 0 ?
get_bits(gb, numbits) : 0;
909 if (
sps->temporal_mvp_enabled)
924 if (
s->nuh_layer_id > 0) {
925 int num_direct_ref_layers =
vps->num_direct_ref_layers[layer_idx];
927 if (
vps->default_ref_layers_active)
929 else if (num_direct_ref_layers) {
934 "NumDirectRefLayers>1 not supported\n");
940 if (
sps->sao_enabled) {
942 if (
sps->chroma_format_idc) {
979 if (
pps->lists_modification_present_flag && nb_refs > 1) {
997 if (
pps->cabac_init_present_flag)
1012 "Invalid collocated_ref_idx: %d.\n",
1029 "Invalid number of merging MVP candidates: %d.\n",
1035 if (
sps->motion_vector_resolution_control_idc == 2)
1045 if (
pps->pic_slice_level_chroma_qp_offsets_present_flag) {
1058 if (
pps->pps_slice_act_qp_offsets_present_flag) {
1064 if (
pps->chroma_qp_offset_list_enabled_flag)
1069 if (
pps->deblocking_filter_control_present_flag) {
1070 int deblocking_filter_override_flag = 0;
1072 if (
pps->deblocking_filter_override_enabled_flag)
1073 deblocking_filter_override_flag =
get_bits1(gb);
1075 if (deblocking_filter_override_flag) {
1080 if (beta_offset_div2 < -6 || beta_offset_div2 > 6 ||
1081 tc_offset_div2 < -6 || tc_offset_div2 > 6) {
1083 "Invalid deblock filter offsets: %d, %d\n",
1084 beta_offset_div2, tc_offset_div2);
1101 if (
pps->seq_loop_filter_across_slices_enabled_flag &&
1112 if (
pps->tiles_enabled_flag ||
pps->entropy_coding_sync_enabled_flag) {
1115 if (num_entry_point_offsets >
get_bits_left(gb) || num_entry_point_offsets > UINT16_MAX) {
1116 av_log(
s->avctx,
AV_LOG_ERROR,
"num_entry_point_offsets %d is invalid\n", num_entry_point_offsets);
1124 if (offset_len < 1 || offset_len > 32) {
1148 if (
pps->slice_header_extension_present_flag) {
1154 for (
i = 0;
i < length;
i++)
1176 "The slice_qp %d is outside the valid range "
1179 -
sps->qp_bd_offset);
1194 #define CTB(tab, x, y) ((tab)[(y) * sps->ctb_width + (x)])
1196 #define SET_SAO(elem, value) \
1198 if (!sao_merge_up_flag && !sao_merge_left_flag) \
1199 sao->elem = value; \
1200 else if (sao_merge_left_flag) \
1201 sao->elem = CTB(l->sao, rx-1, ry).elem; \
1202 else if (sao_merge_up_flag) \
1203 sao->elem = CTB(l->sao, rx, ry-1).elem; \
1213 int sao_merge_left_flag = 0;
1214 int sao_merge_up_flag = 0;
1218 if (
s->sh.slice_sample_adaptive_offset_flag[0] ||
1219 s->sh.slice_sample_adaptive_offset_flag[1]) {
1224 if (ry > 0 && !sao_merge_left_flag) {
1230 for (c_idx = 0; c_idx < (
sps->chroma_format_idc ? 3 : 1); c_idx++) {
1231 int log2_sao_offset_scale = c_idx == 0 ?
pps->log2_sao_offset_scale_luma :
1232 pps->log2_sao_offset_scale_chroma;
1234 if (!
s->sh.slice_sample_adaptive_offset_flag[c_idx]) {
1249 for (
i = 0;
i < 4;
i++)
1253 for (
i = 0;
i < 4;
i++) {
1262 }
else if (c_idx != 2) {
1268 for (
i = 0;
i < 4;
i++) {
1276 sao->
offset_val[c_idx][
i + 1] *= 1 << log2_sao_offset_scale;
1288 if (log2_res_scale_abs_plus1 != 0) {
1291 (1 - 2 * res_scale_sign_flag);
1304 int xBase,
int yBase,
int cb_xBase,
int cb_yBase,
1305 int log2_cb_size,
int log2_trafo_size,
1306 int blk_idx,
int cbf_luma,
int *cbf_cb,
int *cbf_cr)
1309 const int log2_trafo_size_c = log2_trafo_size -
sps->hshift[1];
1313 int trafo_size = 1 << log2_trafo_size;
1316 s->hpc.intra_pred[log2_trafo_size - 2](lc,
pps, x0, y0, 0);
1319 if (cbf_luma || cbf_cb[0] || cbf_cr[0] ||
1320 (
sps->chroma_format_idc == 2 && (cbf_cb[1] || cbf_cr[1]))) {
1323 int cbf_chroma = cbf_cb[0] || cbf_cr[0] ||
1324 (
sps->chroma_format_idc == 2 &&
1325 (cbf_cb[1] || cbf_cr[1]));
1337 "The cu_qp_delta %d is outside the valid range "
1340 -(26 +
sps->qp_bd_offset / 2),
1341 (25 +
sps->qp_bd_offset / 2));
1348 if (
s->sh.cu_chroma_qp_offset_enabled_flag && cbf_chroma &&
1351 if (cu_chroma_qp_offset_flag) {
1352 int cu_chroma_qp_offset_idx = 0;
1353 if (
pps->chroma_qp_offset_list_len_minus1 > 0) {
1356 "cu_chroma_qp_offset_idx not yet tested.\n");
1389 if (
sps->chroma_format_idc && (log2_trafo_size > 2 ||
sps->chroma_format_idc == 3)) {
1390 int trafo_size_h = 1 << (log2_trafo_size_c +
sps->hshift[1]);
1391 int trafo_size_v = 1 << (log2_trafo_size_c +
sps->vshift[1]);
1392 lc->
tu.
cross_pf = (
pps->cross_component_prediction_enabled_flag && cbf_luma &&
1399 for (
i = 0;
i < (
sps->chroma_format_idc == 2 ? 2 : 1);
i++) {
1402 trafo_size_h, trafo_size_v,
sps->log2_ctb_size);
1403 s->hpc.intra_pred[log2_trafo_size_c - 2](lc,
pps, x0, y0 + (
i << log2_trafo_size_c), 1);
1407 log2_trafo_size_c, scan_idx_c, 1);
1410 ptrdiff_t
stride =
s->cur_frame->f->linesize[1];
1411 int hshift =
sps->hshift[1];
1412 int vshift =
sps->vshift[1];
1415 int size = 1 << log2_trafo_size_c;
1417 uint8_t *
dst = &
s->cur_frame->f->data[1][(y0 >> vshift) *
stride +
1418 ((x0 >> hshift) <<
sps->pixel_shift)];
1422 s->hevcdsp.add_residual[log2_trafo_size_c-2](
dst, coeffs,
stride);
1429 for (
i = 0;
i < (
sps->chroma_format_idc == 2 ? 2 : 1);
i++) {
1432 trafo_size_h, trafo_size_v,
sps->log2_ctb_size);
1433 s->hpc.intra_pred[log2_trafo_size_c - 2](lc,
pps, x0, y0 + (
i << log2_trafo_size_c), 2);
1437 log2_trafo_size_c, scan_idx_c, 2);
1440 ptrdiff_t
stride =
s->cur_frame->f->linesize[2];
1441 int hshift =
sps->hshift[2];
1442 int vshift =
sps->vshift[2];
1445 int size = 1 << log2_trafo_size_c;
1447 uint8_t *
dst = &
s->cur_frame->f->data[2][(y0 >> vshift) *
stride +
1448 ((x0 >> hshift) <<
sps->pixel_shift)];
1452 s->hevcdsp.add_residual[log2_trafo_size_c-2](
dst, coeffs,
stride);
1455 }
else if (
sps->chroma_format_idc && blk_idx == 3) {
1456 int trafo_size_h = 1 << (log2_trafo_size + 1);
1457 int trafo_size_v = 1 << (log2_trafo_size +
sps->vshift[1]);
1458 for (
i = 0;
i < (
sps->chroma_format_idc == 2 ? 2 : 1);
i++) {
1461 trafo_size_h, trafo_size_v,
sps->log2_ctb_size);
1462 s->hpc.intra_pred[log2_trafo_size - 2](lc,
pps, xBase, yBase + (
i << log2_trafo_size), 1);
1466 log2_trafo_size, scan_idx_c, 1);
1468 for (
i = 0;
i < (
sps->chroma_format_idc == 2 ? 2 : 1);
i++) {
1471 trafo_size_h, trafo_size_v,
sps->log2_ctb_size);
1472 s->hpc.intra_pred[log2_trafo_size - 2](lc,
pps, xBase, yBase + (
i << log2_trafo_size), 2);
1476 log2_trafo_size, scan_idx_c, 2);
1480 if (log2_trafo_size > 2 ||
sps->chroma_format_idc == 3) {
1481 int trafo_size_h = 1 << (log2_trafo_size_c +
sps->hshift[1]);
1482 int trafo_size_v = 1 << (log2_trafo_size_c +
sps->vshift[1]);
1484 sps->log2_ctb_size);
1485 s->hpc.intra_pred[log2_trafo_size_c - 2](lc,
pps, x0, y0, 1);
1486 s->hpc.intra_pred[log2_trafo_size_c - 2](lc,
pps, x0, y0, 2);
1487 if (
sps->chroma_format_idc == 2) {
1489 trafo_size_h, trafo_size_v,
sps->log2_ctb_size);
1490 s->hpc.intra_pred[log2_trafo_size_c - 2](lc,
pps, x0, y0 + (1 << log2_trafo_size_c), 1);
1491 s->hpc.intra_pred[log2_trafo_size_c - 2](lc,
pps, x0, y0 + (1 << log2_trafo_size_c), 2);
1493 }
else if (blk_idx == 3) {
1494 int trafo_size_h = 1 << (log2_trafo_size + 1);
1495 int trafo_size_v = 1 << (log2_trafo_size +
sps->vshift[1]);
1497 trafo_size_h, trafo_size_v,
sps->log2_ctb_size);
1498 s->hpc.intra_pred[log2_trafo_size - 2](lc,
pps, xBase, yBase, 1);
1499 s->hpc.intra_pred[log2_trafo_size - 2](lc,
pps, xBase, yBase, 2);
1500 if (
sps->chroma_format_idc == 2) {
1502 trafo_size_h, trafo_size_v,
sps->log2_ctb_size);
1503 s->hpc.intra_pred[log2_trafo_size - 2](lc,
pps, xBase, yBase + (1 << log2_trafo_size), 1);
1504 s->hpc.intra_pred[log2_trafo_size - 2](lc,
pps, xBase, yBase + (1 << log2_trafo_size), 2);
1513 int x0,
int y0,
int log2_cb_size)
1515 int cb_size = 1 << log2_cb_size;
1516 int log2_min_pu_size =
sps->log2_min_pu_size;
1518 int min_pu_width =
sps->min_pu_width;
1519 int x_end =
FFMIN(x0 + cb_size,
sps->width);
1520 int y_end =
FFMIN(y0 + cb_size,
sps->height);
1523 for (j = (y0 >> log2_min_pu_size); j < (y_end >> log2_min_pu_size); j++)
1524 for (
i = (x0 >> log2_min_pu_size);
i < (x_end >> log2_min_pu_size);
i++)
1525 is_pcm[
i + j * min_pu_width] = 2;
1532 int xBase,
int yBase,
int cb_xBase,
int cb_yBase,
1533 int log2_cb_size,
int log2_trafo_size,
1534 int trafo_depth,
int blk_idx,
1535 const int *base_cbf_cb,
const int *base_cbf_cr)
1538 uint8_t split_transform_flag;
1543 cbf_cb[0] = base_cbf_cb[0];
1544 cbf_cb[1] = base_cbf_cb[1];
1545 cbf_cr[0] = base_cbf_cr[0];
1546 cbf_cr[1] = base_cbf_cr[1];
1549 if (trafo_depth == 1) {
1551 if (
sps->chroma_format_idc == 3) {
1565 if (log2_trafo_size <= sps->log2_max_trafo_size &&
1566 log2_trafo_size >
sps->log2_min_tb_size &&
1567 trafo_depth < lc->cu.max_trafo_depth &&
1571 int inter_split =
sps->max_transform_hierarchy_depth_inter == 0 &&
1576 split_transform_flag = log2_trafo_size >
sps->log2_max_trafo_size ||
1581 if (
sps->chroma_format_idc && (log2_trafo_size > 2 ||
sps->chroma_format_idc == 3)) {
1582 if (trafo_depth == 0 || cbf_cb[0]) {
1584 if (
sps->chroma_format_idc == 2 && (!split_transform_flag || log2_trafo_size == 3)) {
1589 if (trafo_depth == 0 || cbf_cr[0]) {
1591 if (
sps->chroma_format_idc == 2 && (!split_transform_flag || log2_trafo_size == 3)) {
1597 if (split_transform_flag) {
1598 const int trafo_size_split = 1 << (log2_trafo_size - 1);
1599 const int x1 = x0 + trafo_size_split;
1600 const int y1 = y0 + trafo_size_split;
1602 #define SUBDIVIDE(x, y, idx) \
1604 ret = hls_transform_tree(lc, l, pps, sps, \
1605 x, y, x0, y0, cb_xBase, cb_yBase, log2_cb_size, \
1606 log2_trafo_size - 1, trafo_depth + 1, idx, \
1619 int min_tu_size = 1 <<
sps->log2_min_tb_size;
1620 int log2_min_tu_size =
sps->log2_min_tb_size;
1621 int min_tu_width =
sps->min_tb_width;
1625 cbf_cb[0] || cbf_cr[0] ||
1626 (
sps->chroma_format_idc == 2 && (cbf_cb[1] || cbf_cr[1]))) {
1631 x0, y0, xBase, yBase, cb_xBase, cb_yBase,
1632 log2_cb_size, log2_trafo_size,
1633 blk_idx, cbf_luma, cbf_cb, cbf_cr);
1639 for (
i = 0;
i < (1 << log2_trafo_size);
i += min_tu_size)
1640 for (j = 0; j < (1 << log2_trafo_size); j += min_tu_size) {
1641 int x_tu = (x0 + j) >> log2_min_tu_size;
1642 int y_tu = (y0 +
i) >> log2_min_tu_size;
1643 l->
cbf_luma[y_tu * min_tu_width + x_tu] = 1;
1646 if (!
s->sh.disable_deblocking_filter_flag) {
1648 if (
pps->transquant_bypass_enable_flag &&
1657 const HEVCPPS *
pps,
int x0,
int y0,
int log2_cb_size)
1662 int cb_size = 1 << log2_cb_size;
1663 ptrdiff_t stride0 =
s->cur_frame->f->linesize[0];
1664 ptrdiff_t stride1 =
s->cur_frame->f->linesize[1];
1665 ptrdiff_t stride2 =
s->cur_frame->f->linesize[2];
1666 uint8_t *dst0 = &
s->cur_frame->f->data[0][y0 * stride0 + (x0 <<
sps->pixel_shift)];
1667 uint8_t *dst1 = &
s->cur_frame->f->data[1][(y0 >>
sps->vshift[1]) * stride1 + ((x0 >>
sps->hshift[1]) <<
sps->pixel_shift)];
1668 uint8_t *dst2 = &
s->cur_frame->f->data[2][(y0 >>
sps->vshift[2]) * stride2 + ((x0 >>
sps->hshift[2]) <<
sps->pixel_shift)];
1670 int length = cb_size * cb_size *
sps->pcm.bit_depth +
1671 (((cb_size >>
sps->hshift[1]) * (cb_size >>
sps->vshift[1])) +
1672 ((cb_size >>
sps->hshift[2]) * (cb_size >>
sps->vshift[2]))) *
1673 sps->pcm.bit_depth_chroma;
1674 const uint8_t *pcm =
skip_bytes(&lc->
cc, (length + 7) >> 3);
1677 if (!
s->sh.disable_deblocking_filter_flag)
1684 s->hevcdsp.put_pcm(dst0, stride0, cb_size, cb_size, &gb,
sps->pcm.bit_depth);
1685 if (
sps->chroma_format_idc) {
1686 s->hevcdsp.put_pcm(dst1, stride1,
1687 cb_size >>
sps->hshift[1],
1688 cb_size >>
sps->vshift[1],
1689 &gb,
sps->pcm.bit_depth_chroma);
1690 s->hevcdsp.put_pcm(dst2, stride2,
1691 cb_size >>
sps->hshift[2],
1692 cb_size >>
sps->vshift[2],
1693 &gb,
sps->pcm.bit_depth_chroma);
1717 uint8_t *
dst, ptrdiff_t dststride,
1719 int block_w,
int block_h,
int luma_weight,
int luma_offset)
1722 const uint8_t *
src =
ref->data[0];
1724 int pic_width =
sps->width;
1725 int pic_height =
sps->height;
1728 int weight_flag = (
s->sh.slice_type ==
HEVC_SLICE_P &&
pps->weighted_pred_flag) ||
1732 x_off +=
mv->x >> 2;
1733 y_off +=
mv->y >> 2;
1739 ref ==
s->cur_frame->f) {
1749 pic_width, pic_height);
1756 block_h,
mx,
my, block_w);
1759 block_h,
s->sh.luma_log2_weight_denom,
1760 luma_weight, luma_offset,
mx,
my, block_w);
1781 uint8_t *
dst, ptrdiff_t dststride,
1782 const AVFrame *ref0,
const Mv *mv0,
int x_off,
int y_off,
1783 int block_w,
int block_h,
const AVFrame *ref1,
1784 const Mv *mv1,
struct MvField *current_mv)
1787 ptrdiff_t src0stride = ref0->
linesize[0];
1788 ptrdiff_t src1stride = ref1->
linesize[0];
1789 int pic_width =
sps->width;
1790 int pic_height =
sps->height;
1791 int mx0 = mv0->
x & 3;
1792 int my0 = mv0->
y & 3;
1793 int mx1 = mv1->
x & 3;
1794 int my1 = mv1->
y & 3;
1795 int weight_flag = (
s->sh.slice_type ==
HEVC_SLICE_P &&
pps->weighted_pred_flag) ||
1797 int x_off0 = x_off + (mv0->
x >> 2);
1798 int y_off0 = y_off + (mv0->
y >> 2);
1799 int x_off1 = x_off + (mv1->
x >> 2);
1800 int y_off1 = y_off + (mv1->
y >> 2);
1803 const uint8_t *
src0 = ref0->
data[0] + y_off0 * src0stride + (int)((
unsigned)x_off0 <<
sps->pixel_shift);
1804 const uint8_t *
src1 = ref1->
data[0] + y_off1 * src1stride + (int)((
unsigned)x_off1 <<
sps->pixel_shift);
1814 edge_emu_stride, src0stride,
1818 pic_width, pic_height);
1820 src0stride = edge_emu_stride;
1831 edge_emu_stride, src1stride,
1835 pic_width, pic_height);
1837 src1stride = edge_emu_stride;
1840 s->hevcdsp.put_hevc_qpel[idx][!!my0][!!mx0](lc->
tmp,
src0, src0stride,
1841 block_h, mx0, my0, block_w);
1843 s->hevcdsp.put_hevc_qpel_bi[idx][!!my1][!!mx1](
dst, dststride,
src1, src1stride, lc->
tmp,
1844 block_h, mx1, my1, block_w);
1846 s->hevcdsp.put_hevc_qpel_bi_w[idx][!!my1][!!mx1](
dst, dststride,
src1, src1stride, lc->
tmp,
1847 block_h,
s->sh.luma_log2_weight_denom,
1848 s->sh.luma_weight_l0[current_mv->
ref_idx[0]],
1849 s->sh.luma_weight_l1[current_mv->
ref_idx[1]],
1850 s->sh.luma_offset_l0[current_mv->
ref_idx[0]],
1851 s->sh.luma_offset_l1[current_mv->
ref_idx[1]],
1876 ptrdiff_t dststride,
const uint8_t *
src0, ptrdiff_t
srcstride,
int reflist,
1877 int x_off,
int y_off,
int block_w,
int block_h,
1878 const struct MvField *current_mv,
int chroma_weight,
int chroma_offset)
1881 int pic_width =
sps->width >>
sps->hshift[1];
1882 int pic_height =
sps->height >>
sps->vshift[1];
1883 const Mv *
mv = ¤t_mv->
mv[reflist];
1884 int weight_flag = (
s->sh.slice_type ==
HEVC_SLICE_P &&
pps->weighted_pred_flag) ||
1887 int hshift =
sps->hshift[1];
1888 int vshift =
sps->vshift[1];
1891 intptr_t _mx =
mx << (1 - hshift);
1892 intptr_t _my =
my << (1 - vshift);
1893 int emu =
src0 ==
s->cur_frame->f->data[1] ||
src0 ==
s->cur_frame->f->data[2];
1895 x_off +=
mv->x >> (2 + hshift);
1896 y_off +=
mv->y >> (2 + vshift);
1906 (edge_emu_stride + (1 <<
sps->pixel_shift));
1912 pic_width, pic_height);
1919 block_h, _mx, _my, block_w);
1922 block_h,
s->sh.chroma_log2_weight_denom,
1923 chroma_weight, chroma_offset, _mx, _my, block_w);
1945 uint8_t *dst0, ptrdiff_t dststride,
1947 int x_off,
int y_off,
int block_w,
int block_h,
const MvField *current_mv,
int cidx)
1950 const uint8_t *
src1 = ref0->
data[cidx+1];
1951 const uint8_t *
src2 = ref1->
data[cidx+1];
1952 ptrdiff_t src1stride = ref0->
linesize[cidx+1];
1953 ptrdiff_t src2stride = ref1->
linesize[cidx+1];
1954 int weight_flag = (
s->sh.slice_type ==
HEVC_SLICE_P &&
pps->weighted_pred_flag) ||
1956 int pic_width =
sps->width >>
sps->hshift[1];
1957 int pic_height =
sps->height >>
sps->vshift[1];
1958 const Mv *
const mv0 = ¤t_mv->
mv[0];
1959 const Mv *
const mv1 = ¤t_mv->
mv[1];
1960 int hshift =
sps->hshift[1];
1961 int vshift =
sps->vshift[1];
1967 intptr_t _mx0 = mx0 << (1 - hshift);
1968 intptr_t _my0 = my0 << (1 - vshift);
1969 intptr_t _mx1 = mx1 << (1 - hshift);
1970 intptr_t _my1 = my1 << (1 - vshift);
1972 int x_off0 = x_off + (mv0->
x >> (2 + hshift));
1973 int y_off0 = y_off + (mv0->
y >> (2 + vshift));
1974 int x_off1 = x_off + (mv1->
x >> (2 + hshift));
1975 int y_off1 = y_off + (mv1->
y >> (2 + vshift));
1977 src1 += y_off0 * src1stride + (int)((
unsigned)x_off0 <<
sps->pixel_shift);
1978 src2 += y_off1 * src2stride + (int)((
unsigned)x_off1 <<
sps->pixel_shift);
1986 (edge_emu_stride + (1 <<
sps->pixel_shift));
1989 edge_emu_stride, src1stride,
1993 pic_width, pic_height);
1996 src1stride = edge_emu_stride;
2005 (edge_emu_stride + (1 <<
sps->pixel_shift));
2008 edge_emu_stride, src2stride,
2012 pic_width, pic_height);
2015 src2stride = edge_emu_stride;
2018 s->hevcdsp.put_hevc_epel[idx][!!my0][!!mx0](lc->
tmp,
src1, src1stride,
2019 block_h, _mx0, _my0, block_w);
2021 s->hevcdsp.put_hevc_epel_bi[idx][!!my1][!!mx1](dst0,
s->cur_frame->f->linesize[cidx+1],
2023 block_h, _mx1, _my1, block_w);
2025 s->hevcdsp.put_hevc_epel_bi_w[idx][!!my1][!!mx1](dst0,
s->cur_frame->f->linesize[cidx+1],
2028 s->sh.chroma_log2_weight_denom,
2029 s->sh.chroma_weight_l0[current_mv->
ref_idx[0]][cidx],
2030 s->sh.chroma_weight_l1[current_mv->
ref_idx[1]][cidx],
2031 s->sh.chroma_offset_l0[current_mv->
ref_idx[0]][cidx],
2032 s->sh.chroma_offset_l1[current_mv->
ref_idx[1]][cidx],
2033 _mx1, _my1, block_w);
2048 int x0,
int y0,
int nPbW,
2049 int nPbH,
int log2_cb_size,
int part_idx,
2061 if (inter_pred_idc !=
PRED_L1) {
2062 if (
s->sh.nb_refs[
L0])
2069 part_idx, merge_idx,
mv, mvp_flag, 0);
2074 if (inter_pred_idc !=
PRED_L0) {
2075 if (
s->sh.nb_refs[
L1])
2078 if (
s->sh.mvd_l1_zero_flag == 1 && inter_pred_idc ==
PRED_BI) {
2087 part_idx, merge_idx,
mv, mvp_flag, 1);
2096 int x0,
int y0,
int nPbW,
int nPbH,
2097 int log2_cb_size,
int partIdx,
int idx)
2099 #define POS(c_idx, x, y) \
2100 s->cur_frame->f->data[c_idx] ? \
2101 &s->cur_frame->f->data[c_idx][((y) >> sps->vshift[c_idx]) * linesize[c_idx] + \
2102 (((x) >> sps->hshift[c_idx]) << sps->pixel_shift)] : NULL
2105 struct MvField current_mv = {{{ 0 }}};
2107 int min_pu_width =
sps->min_pu_width;
2109 MvField *tab_mvf =
s->cur_frame->tab_mvf;
2110 const RefPicList *refPicList =
s->cur_frame->refPicList;
2112 const int *linesize =
s->cur_frame->f->linesize;
2113 uint8_t *dst0 =
s->cur_frame->f->data[0] + y0 * linesize[0] + (x0 <<
sps->pixel_shift);
2114 uint8_t *dst1 =
POS(1, x0, y0);
2115 uint8_t *dst2 =
POS(2, x0, y0);
2116 int log2_min_cb_size =
sps->log2_min_cb_size;
2117 int min_cb_width =
sps->min_cb_width;
2118 int x_cb = x0 >> log2_min_cb_size;
2119 int y_cb = y0 >> log2_min_cb_size;
2129 if (
s->sh.max_num_merge_cand > 1)
2135 partIdx, merge_idx, ¤t_mv);
2138 partIdx, merge_idx, ¤t_mv);
2141 x_pu = x0 >>
sps->log2_min_pu_size;
2142 y_pu = y0 >>
sps->log2_min_pu_size;
2144 for (j = 0; j < nPbH >>
sps->log2_min_pu_size; j++)
2145 for (
i = 0; i < nPbW >>
sps->log2_min_pu_size;
i++)
2146 tab_mvf[(y_pu + j) * min_pu_width + x_pu +
i] = current_mv;
2149 ref0 = refPicList[0].
ref[current_mv.
ref_idx[0]];
2150 if (!ref0 || !ref0->
f)
2155 ref1 = refPicList[1].
ref[current_mv.
ref_idx[1]];
2156 if (!ref1 || !ref1->f)
2162 int x0_c = x0 >>
sps->hshift[1];
2163 int y0_c = y0 >>
sps->vshift[1];
2164 int nPbW_c = nPbW >>
sps->hshift[1];
2165 int nPbH_c = nPbH >>
sps->vshift[1];
2168 ¤t_mv.
mv[0], x0, y0, nPbW, nPbH,
2169 s->sh.luma_weight_l0[current_mv.
ref_idx[0]],
2170 s->sh.luma_offset_l0[current_mv.
ref_idx[0]]);
2172 if (
sps->chroma_format_idc) {
2174 0, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
2175 s->sh.chroma_weight_l0[current_mv.
ref_idx[0]][0],
s->sh.chroma_offset_l0[current_mv.
ref_idx[0]][0]);
2177 0, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
2178 s->sh.chroma_weight_l0[current_mv.
ref_idx[0]][1],
s->sh.chroma_offset_l0[current_mv.
ref_idx[0]][1]);
2181 int x0_c = x0 >>
sps->hshift[1];
2182 int y0_c = y0 >>
sps->vshift[1];
2183 int nPbW_c = nPbW >>
sps->hshift[1];
2184 int nPbH_c = nPbH >>
sps->vshift[1];
2187 ¤t_mv.
mv[1], x0, y0, nPbW, nPbH,
2188 s->sh.luma_weight_l1[current_mv.
ref_idx[1]],
2189 s->sh.luma_offset_l1[current_mv.
ref_idx[1]]);
2191 if (
sps->chroma_format_idc) {
2193 1, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
2194 s->sh.chroma_weight_l1[current_mv.
ref_idx[1]][0],
s->sh.chroma_offset_l1[current_mv.
ref_idx[1]][0]);
2197 1, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
2198 s->sh.chroma_weight_l1[current_mv.
ref_idx[1]][1],
s->sh.chroma_offset_l1[current_mv.
ref_idx[1]][1]);
2201 int x0_c = x0 >>
sps->hshift[1];
2202 int y0_c = y0 >>
sps->vshift[1];
2203 int nPbW_c = nPbW >>
sps->hshift[1];
2204 int nPbH_c = nPbH >>
sps->vshift[1];
2207 ¤t_mv.
mv[0], x0, y0, nPbW, nPbH,
2208 ref1->f, ¤t_mv.
mv[1], ¤t_mv);
2210 if (
sps->chroma_format_idc) {
2212 x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv, 0);
2215 x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv, 1);
2225 int x0,
int y0,
int pu_size,
2226 int prev_intra_luma_pred_flag)
2229 int x_pu = x0 >>
sps->log2_min_pu_size;
2230 int y_pu = y0 >>
sps->log2_min_pu_size;
2231 int min_pu_width =
sps->min_pu_width;
2232 int size_in_pus = pu_size >>
sps->log2_min_pu_size;
2241 int y_ctb = (y0 >> (
sps->log2_ctb_size)) << (
sps->log2_ctb_size);
2243 MvField *tab_mvf =
s->cur_frame->tab_mvf;
2244 int intra_pred_mode;
2249 if ((y0 - 1) < y_ctb)
2252 if (cand_left == cand_up) {
2253 if (cand_left < 2) {
2258 candidate[0] = cand_left;
2259 candidate[1] = 2 + ((cand_left - 2 - 1 + 32) & 31);
2260 candidate[2] = 2 + ((cand_left - 2 + 1) & 31);
2263 candidate[0] = cand_left;
2264 candidate[1] = cand_up;
2274 if (prev_intra_luma_pred_flag) {
2275 intra_pred_mode = candidate[lc->
pu.
mpm_idx];
2277 if (candidate[0] > candidate[1])
2278 FFSWAP(uint8_t, candidate[0], candidate[1]);
2279 if (candidate[0] > candidate[2])
2280 FFSWAP(uint8_t, candidate[0], candidate[2]);
2281 if (candidate[1] > candidate[2])
2282 FFSWAP(uint8_t, candidate[1], candidate[2]);
2285 for (
i = 0;
i < 3;
i++)
2286 if (intra_pred_mode >= candidate[
i])
2293 for (
i = 0;
i < size_in_pus;
i++) {
2294 memset(&l->
tab_ipm[(y_pu +
i) * min_pu_width + x_pu],
2295 intra_pred_mode, size_in_pus);
2297 for (j = 0; j < size_in_pus; j++) {
2302 return intra_pred_mode;
2307 int log2_cb_size,
int ct_depth)
2309 int length = (1 << log2_cb_size) >>
sps->log2_min_cb_size;
2310 int x_cb = x0 >>
sps->log2_min_cb_size;
2311 int y_cb = y0 >>
sps->log2_min_cb_size;
2314 for (y = 0; y < length; y++)
2315 memset(&tab_ct_depth[(y_cb + y) *
sps->min_cb_width + x_cb],
2320 0, 1, 2, 2, 2, 2, 3, 5, 7, 8, 10, 12, 13, 15, 17, 18, 19, 20,
2321 21, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 29, 29, 30, 31};
2328 static const uint8_t intra_chroma_table[4] = { 0, 26, 10, 1 };
2329 uint8_t prev_intra_luma_pred_flag[4];
2331 int pb_size = (1 << log2_cb_size) >>
split;
2332 int side =
split + 1;
2336 for (
i = 0;
i < side;
i++)
2337 for (j = 0; j < side; j++)
2340 for (
i = 0;
i < side;
i++) {
2341 for (j = 0; j < side; j++) {
2342 if (prev_intra_luma_pred_flag[2 *
i + j])
2349 x0 + pb_size * j, y0 + pb_size *
i, pb_size,
2350 prev_intra_luma_pred_flag[2 *
i + j]);
2354 if (
sps->chroma_format_idc == 3) {
2355 for (
i = 0;
i < side;
i++) {
2356 for (j = 0; j < side; j++) {
2358 if (chroma_mode != 4) {
2368 }
else if (
sps->chroma_format_idc == 2) {
2371 if (chroma_mode != 4) {
2375 mode_idx = intra_chroma_table[chroma_mode];
2380 }
else if (
sps->chroma_format_idc != 0) {
2382 if (chroma_mode != 4) {
2400 int pb_size = 1 << log2_cb_size;
2401 int size_in_pus = pb_size >>
sps->log2_min_pu_size;
2402 int min_pu_width =
sps->min_pu_width;
2403 MvField *tab_mvf =
s->cur_frame->tab_mvf;
2404 int x_pu = x0 >>
sps->log2_min_pu_size;
2405 int y_pu = y0 >>
sps->log2_min_pu_size;
2408 if (size_in_pus == 0)
2410 for (j = 0; j < size_in_pus; j++)
2411 memset(&l->
tab_ipm[(y_pu + j) * min_pu_width + x_pu],
INTRA_DC, size_in_pus);
2413 for (j = 0; j < size_in_pus; j++)
2414 for (k = 0; k < size_in_pus; k++)
2421 int x0,
int y0,
int log2_cb_size)
2423 int cb_size = 1 << log2_cb_size;
2424 int log2_min_cb_size =
sps->log2_min_cb_size;
2425 int length = cb_size >> log2_min_cb_size;
2426 int min_cb_width =
sps->min_cb_width;
2427 int x_cb = x0 >> log2_min_cb_size;
2428 int y_cb = y0 >> log2_min_cb_size;
2429 int idx = log2_cb_size - 2;
2430 int qp_block_mask = (1 << (
sps->log2_ctb_size -
pps->diff_cu_qp_delta_depth)) - 1;
2440 for (x = 0; x < 4; x++)
2442 if (
pps->transquant_bypass_enable_flag) {
2453 x0b, y0b, x_cb, y_cb,
2456 x = y_cb * min_cb_width + x_cb;
2457 for (y = 0; y < length; y++) {
2458 memset(&l->
skip_flag[x], skip_flag, length);
2463 x = y_cb * min_cb_width + x_cb;
2464 for (y = 0; y < length; y++) {
2472 x0, y0, cb_size, cb_size, log2_cb_size, 0, idx);
2475 if (!
s->sh.disable_deblocking_filter_flag)
2483 log2_cb_size ==
sps->log2_min_cb_size) {
2491 log2_cb_size >=
sps->pcm.log2_min_pcm_cb_size &&
2492 log2_cb_size <= sps->pcm.log2_max_pcm_cb_size) {
2498 if (
sps->pcm_loop_filter_disabled)
2511 x0, y0, cb_size, cb_size, log2_cb_size, 0, idx);
2515 x0, y0, cb_size, cb_size / 2, log2_cb_size, 0, idx);
2517 x0, y0 + cb_size / 2, cb_size, cb_size / 2, log2_cb_size, 1, idx);
2521 x0, y0, cb_size / 2, cb_size, log2_cb_size, 0, idx - 1);
2523 x0 + cb_size / 2, y0, cb_size / 2, cb_size, log2_cb_size, 1, idx - 1);
2527 x0, y0, cb_size, cb_size / 4, log2_cb_size, 0, idx);
2529 x0, y0 + cb_size / 4, cb_size, cb_size * 3 / 4, log2_cb_size, 1, idx);
2533 x0, y0, cb_size, cb_size * 3 / 4, log2_cb_size, 0, idx);
2535 x0, y0 + cb_size * 3 / 4, cb_size, cb_size / 4, log2_cb_size, 1, idx);
2539 x0, y0, cb_size / 4, cb_size, log2_cb_size, 0, idx - 2);
2541 x0 + cb_size / 4, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 1, idx - 2);
2545 x0, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 0, idx - 2);
2547 x0 + cb_size * 3 / 4, y0, cb_size / 4, cb_size, log2_cb_size, 1, idx - 2);
2551 x0, y0, cb_size / 2, cb_size / 2, log2_cb_size, 0, idx - 1);
2553 x0 + cb_size / 2, y0, cb_size / 2, cb_size / 2, log2_cb_size, 1, idx - 1);
2555 x0, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 2, idx - 1);
2557 x0 + cb_size / 2, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 3, idx - 1);
2563 int rqt_root_cbf = 1;
2570 const static int cbf[2] = { 0 };
2573 sps->max_transform_hierarchy_depth_inter;
2574 ret =
hls_transform_tree(lc, l,
pps,
sps, x0, y0, x0, y0, x0, y0,
2576 log2_cb_size, 0, 0, cbf, cbf);
2580 if (!
s->sh.disable_deblocking_filter_flag)
2589 x = y_cb * min_cb_width + x_cb;
2590 for (y = 0; y < length; y++) {
2595 if(((x0 + (1<<log2_cb_size)) & qp_block_mask) == 0 &&
2596 ((y0 + (1<<log2_cb_size)) & qp_block_mask) == 0) {
2609 int log2_cb_size,
int cb_depth)
2612 const int cb_size = 1 << log2_cb_size;
2617 if (x0 + cb_size <= sps->
width &&
2618 y0 + cb_size <= sps->
height &&
2619 log2_cb_size >
sps->log2_min_cb_size) {
2621 sps, cb_depth, x0, y0);
2623 split_cu = (log2_cb_size >
sps->log2_min_cb_size);
2625 if (
pps->cu_qp_delta_enabled_flag &&
2626 log2_cb_size >=
sps->log2_ctb_size -
pps->diff_cu_qp_delta_depth) {
2631 if (
s->sh.cu_chroma_qp_offset_enabled_flag &&
2632 log2_cb_size >=
sps->log2_ctb_size -
pps->diff_cu_chroma_qp_offset_depth) {
2637 int qp_block_mask = (1 << (
sps->log2_ctb_size -
pps->diff_cu_qp_delta_depth)) - 1;
2638 const int cb_size_split = cb_size >> 1;
2639 const int x1 = x0 + cb_size_split;
2640 const int y1 = y0 + cb_size_split;
2645 x0, y0, log2_cb_size - 1, cb_depth + 1);
2649 if (more_data && x1 < sps->
width) {
2651 x1, y0, log2_cb_size - 1, cb_depth + 1);
2655 if (more_data && y1 < sps->
height) {
2657 x0, y1, log2_cb_size - 1, cb_depth + 1);
2661 if (more_data && x1 < sps->
width &&
2664 x1, y1, log2_cb_size - 1, cb_depth + 1);
2669 if(((x0 + (1<<log2_cb_size)) & qp_block_mask) == 0 &&
2670 ((y0 + (1<<log2_cb_size)) & qp_block_mask) == 0)
2674 return ((x1 + cb_size_split) <
sps->width ||
2675 (y1 + cb_size_split) <
sps->height);
2682 if ((!((x0 + cb_size) %
2683 (1 << (
sps->log2_ctb_size))) ||
2684 (x0 + cb_size >=
sps->width)) &&
2686 (1 << (
sps->log2_ctb_size))) ||
2687 (y0 + cb_size >=
sps->height))) {
2689 return !end_of_slice_flag;
2701 int x_ctb,
int y_ctb,
int ctb_addr_ts)
2704 int ctb_size = 1 <<
sps->log2_ctb_size;
2705 int ctb_addr_rs =
pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2706 int ctb_addr_in_slice = ctb_addr_rs -
s->sh.slice_addr;
2710 if (
pps->entropy_coding_sync_enabled_flag) {
2711 if (x_ctb == 0 && (y_ctb & (ctb_size - 1)) == 0)
2714 }
else if (
pps->tiles_enabled_flag) {
2715 if (ctb_addr_ts &&
pps->tile_id[ctb_addr_ts] !=
pps->tile_id[ctb_addr_ts - 1]) {
2716 int idxX =
pps->col_idxX[x_ctb >>
sps->log2_ctb_size];
2727 if (
pps->tiles_enabled_flag) {
2728 if (x_ctb > 0 &&
pps->tile_id[ctb_addr_ts] !=
pps->tile_id[
pps->ctb_addr_rs_to_ts[ctb_addr_rs - 1]])
2732 if (y_ctb > 0 &&
pps->tile_id[ctb_addr_ts] !=
pps->tile_id[
pps->ctb_addr_rs_to_ts[ctb_addr_rs -
sps->ctb_width]])
2737 if (ctb_addr_in_slice <= 0)
2739 if (ctb_addr_in_slice < sps->ctb_width)
2745 lc->
ctb_up_right_flag = ((y_ctb > 0) && (ctb_addr_in_slice+1 >=
sps->ctb_width) && (
pps->tile_id[ctb_addr_ts] ==
pps->tile_id[
pps->ctb_addr_rs_to_ts[ctb_addr_rs+1 -
sps->ctb_width]]));
2746 lc->
ctb_up_left_flag = ((x_ctb > 0) && (y_ctb > 0) && (ctb_addr_in_slice-1 >=
sps->ctb_width) && (
pps->tile_id[ctb_addr_ts] ==
pps->tile_id[
pps->ctb_addr_rs_to_ts[ctb_addr_rs-1 -
sps->ctb_width]]));
2755 const uint8_t *slice_data = gb->
buffer +
s->sh.data_offset;
2757 int ctb_size = 1 <<
sps->log2_ctb_size;
2761 int ctb_addr_ts =
pps->ctb_addr_rs_to_ts[
s->sh.slice_ctb_addr_rs];
2764 while (more_data && ctb_addr_ts < sps->ctb_size) {
2765 int ctb_addr_rs =
pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2767 x_ctb = (ctb_addr_rs % ((
sps->width + ctb_size - 1) >>
sps->log2_ctb_size)) <<
sps->log2_ctb_size;
2768 y_ctb = (ctb_addr_rs / ((
sps->width + ctb_size - 1) >>
sps->log2_ctb_size)) <<
sps->log2_ctb_size;
2778 x_ctb >>
sps->log2_ctb_size, y_ctb >>
sps->log2_ctb_size);
2785 if (more_data < 0) {
2796 if (x_ctb + ctb_size >=
sps->width &&
2797 y_ctb + ctb_size >=
sps->height)
2804 int job,
int thread)
2811 int ctb_size = 1 <<
sps->log2_ctb_size;
2814 int ctb_addr_rs =
s->sh.slice_ctb_addr_rs + ctb_row * ((
sps->width + ctb_size - 1) >>
sps->log2_ctb_size);
2815 int ctb_addr_ts =
pps->ctb_addr_rs_to_ts[ctb_addr_rs];
2817 const uint8_t *
data =
s->data +
s->sh.offset[ctb_row];
2818 const size_t data_size =
s->sh.size[ctb_row];
2827 while(more_data && ctb_addr_ts < sps->ctb_size) {
2828 int x_ctb = (ctb_addr_rs %
sps->ctb_width) <<
sps->log2_ctb_size;
2829 int y_ctb = (ctb_addr_rs /
sps->ctb_width) <<
sps->log2_ctb_size;
2849 x_ctb >>
sps->log2_ctb_size, y_ctb >>
sps->log2_ctb_size);
2857 if (more_data < 0) {
2868 if (!more_data && (x_ctb+ctb_size) <
sps->width && ctb_row !=
s->sh.num_entry_point_offsets) {
2875 if ((x_ctb+ctb_size) >=
sps->width && (y_ctb+ctb_size) >=
sps->height ) {
2880 ctb_addr_rs =
pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2883 if(x_ctb >=
sps->width) {
2900 if (
s->nb_wpp_progress < count) {
2902 sizeof(*
s->wpp_progress));
2906 s->wpp_progress =
tmp;
2907 memset(
s->wpp_progress +
s->nb_wpp_progress, 0,
2908 (count -
s->nb_wpp_progress) *
sizeof(*
s->wpp_progress));
2910 for (
int i =
s->nb_wpp_progress;
i < count;
i++) {
2914 s->nb_wpp_progress =
i + 1;
2918 for (
int i = 0;
i < count;
i++)
2929 int length = nal->
size;
2932 int64_t startheader, cmpt = 0;
2935 if (
s->sh.slice_ctb_addr_rs +
s->sh.num_entry_point_offsets *
sps->ctb_width >=
sps->ctb_width *
sps->ctb_height) {
2937 s->sh.slice_ctb_addr_rs,
s->sh.num_entry_point_offsets,
2938 sps->ctb_width,
sps->ctb_height
2943 if (
s->avctx->thread_count >
s->nb_local_ctx) {
2949 memcpy(
tmp,
s->local_ctx,
sizeof(*
s->local_ctx) *
s->nb_local_ctx);
2953 for (
unsigned i =
s->nb_local_ctx; i < s->avctx->thread_count;
i++) {
2954 tmp = &
s->local_ctx[
i];
2956 memset(
tmp, 0,
sizeof(*
tmp));
2958 tmp->logctx =
s->avctx;
2960 tmp->common_cabac_state = &
s->cabac;
2963 s->nb_local_ctx =
s->avctx->thread_count;
2968 for (j = 0, cmpt = 0, startheader =
offset +
s->sh.entry_point_offset[0]; j < nal->skipped_bytes; j++) {
2975 for (
i = 1;
i <
s->sh.num_entry_point_offsets;
i++) {
2976 offset += (
s->sh.entry_point_offset[
i - 1] - cmpt);
2977 for (j = 0, cmpt = 0, startheader =
offset
2978 +
s->sh.entry_point_offset[
i]; j < nal->skipped_bytes; j++) {
2984 s->sh.size[
i] =
s->sh.entry_point_offset[
i] - cmpt;
2989 offset +=
s->sh.entry_point_offset[
s->sh.num_entry_point_offsets - 1] - cmpt;
2994 s->sh.size [
s->sh.num_entry_point_offsets] = length -
offset;
2995 s->sh.offset[
s->sh.num_entry_point_offsets] =
offset;
2997 s->sh.offset[0] =
s->sh.data_offset;
2998 s->sh.size[0] =
s->sh.offset[1] -
s->sh.offset[0];
3002 for (
i = 1;
i <
s->nb_local_ctx;
i++) {
3003 s->local_ctx[
i].first_qp_group = 1;
3004 s->local_ctx[
i].qp_y =
s->local_ctx[0].qp_y;
3016 if (
pps->entropy_coding_sync_enabled_flag)
3019 for (
i = 0;
i <=
s->sh.num_entry_point_offsets;
i++)
3032 if (!
s->sh.first_slice_in_pic_flag)
3033 s->slice_idx += !
s->sh.dependent_slice_segment_flag;
3035 if (!
s->sh.dependent_slice_segment_flag &&
s->sh.slice_type !=
HEVC_SLICE_I) {
3039 "Error constructing the reference lists for the current slice.\n");
3044 s->slice_initialized = 1;
3046 if (
s->avctx->hwaccel)
3051 "SCC profile is not yet implemented in hevc native decoder.\n");
3055 if (
s->sh.dependent_slice_segment_flag) {
3056 int ctb_addr_ts =
pps->ctb_addr_rs_to_ts[
s->sh.slice_ctb_addr_rs];
3057 int prev_rs =
pps->ctb_addr_ts_to_rs[ctb_addr_ts - 1];
3064 s->local_ctx[0].first_qp_group = !
s->sh.dependent_slice_segment_flag;
3066 if (!
pps->cu_qp_delta_enabled_flag)
3067 s->local_ctx[0].qp_y =
s->sh.slice_qp;
3069 s->local_ctx[0].tu.cu_qp_offset_cb = 0;
3070 s->local_ctx[0].tu.cu_qp_offset_cr = 0;
3073 s->sh.num_entry_point_offsets > 0 &&
3074 pps->num_tile_rows == 1 &&
pps->num_tile_columns == 1)
3089 if (
IS_IRAP(
s) &&
s->no_rasl_output_flag) {
3090 if (
s->sei.common.mastering_display.present > 0)
3091 s->sei.common.mastering_display.present--;
3093 if (
s->sei.common.content_light.present > 0)
3094 s->sei.common.content_light.present--;
3099 sps->bit_depth,
sps->bit_depth_chroma,
3100 s->cur_frame->poc );
3104 if (
s->sei.timecode.present) {
3109 sizeof(uint32_t) * 4, &tcside);
3114 tc_sd = (uint32_t*)tcside->
data;
3115 tc_sd[0] =
s->sei.timecode.num_clock_ts;
3117 for (
int i = 0;
i < tc_sd[0];
i++) {
3118 int drop =
s->sei.timecode.cnt_dropped_flag[
i];
3119 int hh =
s->sei.timecode.hours_value[
i];
3120 int mm =
s->sei.timecode.minutes_value[
i];
3121 int ss =
s->sei.timecode.seconds_value[
i];
3122 int ff =
s->sei.timecode.n_frames[
i];
3130 s->sei.timecode.num_clock_ts = 0;
3133 if (
s->sei.common.dynamic_hdr_plus.info) {
3154 if (
s->sei.common.dynamic_hdr_vivid.info) {
3157 &
s->sei.common.dynamic_hdr_vivid.info,
3169 for (
int i = nal_idx;
i <
s->pkt.nb_nals;
i++) {
3175 !(
s->layers_active_decode & (1 <<
s->vps->layer_idx[layer_id])))
3178 switch (nal->
type) {
3211 const HEVCPPS *
const pps =
s->ps.pps_list[
s->sh.pps_id];
3213 int pic_size_in_ctb = ((
sps->width >>
sps->log2_min_cb_size) + 1) *
3214 ((
sps->height >>
sps->log2_min_cb_size) + 1);
3215 int new_sequence = (l == &
s->layers[0]) &&
3217 int prev_layers_active_decode =
s->layers_active_decode;
3218 int prev_layers_active_output =
s->layers_active_output;
3221 if (
sps->vps !=
s->vps && l != &
s->layers[0]) {
3229 const HEVCSPS *sps_base =
s->layers[0].sps;
3232 if (l != &
s->layers[0]) {
3235 "Access unit starts with a non-base layer frame\n");
3244 !
sps->vui.common.video_signal_type_present_flag)
3257 "Base/non-base layer SPS have unsupported parameter combination\n");
3268 if (l == &
s->layers[0]) {
3284 memset(l->
is_pcm, 0, (
sps->min_pu_width + 1) * (
sps->min_pu_height + 1));
3291 s->first_nal_type =
s->nal_unit_type;
3301 s->sei.recovery_point.has_recovery_poc) {
3303 s->recovery_poc =
s->poc +
s->sei.recovery_point.recovery_poc_cnt;
3304 else if (
s->poc >=
s->recovery_poc)
3309 if (
s->temporal_id == 0 &&
3317 s->poc_tid0 =
s->poc;
3319 if (
pps->tiles_enabled_flag)
3320 s->local_ctx[0].end_of_tiles_x =
pps->column_width[0] <<
sps->log2_ctb_size;
3324 0, 0,
s->sh.no_output_of_prior_pics_flag);
3348 s->cur_frame->needs_fg = ((
s->sei.common.film_grain_characteristics &&
3349 s->sei.common.film_grain_characteristics->present) ||
3350 s->sei.common.aom_film_grain.enable) &&
3358 if (
s->cur_frame->needs_fg &&
3359 (
s->sei.common.film_grain_characteristics &&
s->sei.common.film_grain_characteristics->present &&
3361 s->cur_frame->f->format) ||
3364 "Unsupported film grain parameters. Ignoring film grain.\n");
3365 s->cur_frame->needs_fg = 0;
3368 if (
s->cur_frame->needs_fg) {
3369 s->cur_frame->frame_grain->format =
s->cur_frame->f->format;
3370 s->cur_frame->frame_grain->width =
s->cur_frame->f->width;
3371 s->cur_frame->frame_grain->height =
s->cur_frame->f->height;
3380 s->cur_frame->f->pict_type = 3 -
s->sh.slice_type;
3383 sps->temporal_layer[
sps->max_sub_layers - 1].num_reorder_pics,
3384 sps->temporal_layer[
sps->max_sub_layers - 1].max_dec_pic_buffering, 0);
3388 if (
s->avctx->hwaccel) {
3400 if (l == &
s->layers[0])
3403 if (nal_idx >=
s->finish_setup_nal_idx)
3412 s->cur_frame =
s->collocated_ref =
NULL;
3413 s->slice_initialized = 0;
3420 char msg_buf[4 * (50 + 2 * 2 * 16 )];
3428 pixel_shift =
desc->comp[0].depth > 8;
3433 if (pixel_shift && !
s->checksum_buf) {
3436 frame->linesize[2]));
3437 if (!
s->checksum_buf)
3444 int width =
s->avctx->coded_width;
3445 int height =
s->avctx->coded_height;
3451 for (j = 0; j <
h; j++) {
3455 s->bdsp.bswap16_buf((uint16_t *)
s->checksum_buf,
3456 (
const uint16_t *)
src,
w);
3457 src =
s->checksum_buf;
3464 #define MD5_PRI "%016" PRIx64 "%016" PRIx64
3465 #define MD5_PRI_ARG(buf) AV_RB64(buf), AV_RB64((const uint8_t*)(buf) + 8)
3467 if (!memcmp(
md5,
s->sei.picture_hash.md5[
i], 16)) {
3469 "plane %d - correct " MD5_PRI "; ",
3473 "mismatching checksum of plane %d - " MD5_PRI " != " MD5_PRI "; ",
3480 "Verifying checksum for frame with POC %d: %s\n",
3492 if (
out->needs_fg) {
3495 switch (fgp->
type) {
3509 if (
s->avctx->hwaccel) {
3513 "hardware accelerator failed to decode picture\n");
3518 s->sei.picture_hash.is_md5) {
3524 s->sei.picture_hash.is_md5 = 0;
3527 l -
s->layers,
s->poc);
3534 const int layer_idx =
s->vps ?
s->vps->layer_idx[
s->nuh_layer_id] : 0;
3541 if (layer_idx < 0 ||
3542 (
s->nuh_layer_id > 0 && !(
s->layers_active_decode & (1 << layer_idx))))
3548 s->slice_initialized = 0;
3556 s->no_rasl_output_flag)) {
3561 if (
s->cur_layer != layer_idx &&
3562 s->layers[
s->cur_layer].cur_frame &&
3566 s->cur_layer = layer_idx;
3567 l = &
s->layers[
s->cur_layer];
3569 if (
s->sh.first_slice_in_pic_flag) {
3571 av_log(
s->avctx,
AV_LOG_ERROR,
"Two slices reporting being the first in the same frame.\n");
3583 if (
s->nal_unit_type !=
s->first_nal_type) {
3585 "Non-matching NAL types of the VCL NALUs: %d %d\n",
3586 s->first_nal_type,
s->nal_unit_type);
3603 s->nal_unit_type = nal->
type;
3619 switch (
s->nal_unit_type) {
3670 "Skipping NAL unit %d\n",
s->nal_unit_type);
3678 "Skipping invalid undecodable NALU: %d\n",
s->nal_unit_type);
3687 s->sei.recovery_point.has_recovery_poc = 0;
3693 int eos_at_start = 1;
3696 s->cur_frame =
s->collocated_ref =
NULL;
3697 s->last_eos =
s->eos;
3699 s->slice_initialized = 0;
3711 s->nal_length_size,
s->avctx->codec_id,
flags);
3714 "Error splitting the input into NAL units.\n");
3718 for (
i = 0;
i <
s->pkt.nb_nals;
i++) {
3741 s->pkt.nals[
s->pkt.nb_nals - 1].size > 2 && !
s->pkt.nals[
s->pkt.nb_nals - 1].nuh_layer_id
3742 && !
s->pkt.nals[
s->pkt.nb_nals - 1].temporal_id) {
3743 H2645NAL *nal = &
s->pkt.nals[
s->pkt.nb_nals - 1];
3746 av_log(
s->avctx,
AV_LOG_WARNING,
"Multiple Dolby Vision RPUs found in one AU. Skipping previous.\n");
3757 s->avctx->err_recognition);
3766 for (
i = 0;
i <
s->pkt.nb_nals;
i++) {
3776 "Error parsing NAL unit #%d.\n",
i);
3803 &
s->nal_length_size,
s->avctx->err_recognition,
3804 s->apply_defdispwin,
s->avctx);
3810 if (
first &&
s->ps.sps_list[
i]) {
3849 s->layers_active_output, 0, 0, 0);
3856 s->pkt_dts = avpkt->
dts;
3859 if (sd && sd_size > 0) {
3866 if (sd && sd_size >=
sizeof(
s->dovi_ctx.cfg)) {
3867 int old =
s->dovi_ctx.cfg.dv_profile;
3871 "New DOVI configuration record from input packet (profile %d -> %u).\n",
3872 old,
s->dovi_ctx.cfg.dv_profile);
3896 if (
src->needs_fg) {
3909 dst->nb_rpl_elems =
src->nb_rpl_elems;
3912 dst->ctb_count =
src->ctb_count;
3915 dst->base_layer_frame =
src->base_layer_frame;
3918 src->hwaccel_picture_private);
3952 for (
int i = 0;
i <
s->nb_wpp_progress;
i++)
3978 s->nb_local_ctx = 1;
3980 s->local_ctx[0].parent =
s;
3981 s->local_ctx[0].logctx = avctx;
3982 s->local_ctx[0].common_cabac_state = &
s->cabac;
3985 if (!
s->output_fifo)
4003 s->dovi_ctx.logctx = avctx;
4062 memcmp(
s->view_ids, s0->
view_ids,
sizeof(*
s->view_ids) *
s->nb_view_ids)) {
4109 if (
sei->tdrdi.present) {
4123 tdrdi->prec_ref_display_width =
sei->tdrdi.prec_ref_display_width;
4124 tdrdi->ref_viewing_distance_flag =
sei->tdrdi.ref_viewing_distance_flag;
4125 tdrdi->prec_ref_viewing_dist =
sei->tdrdi.prec_ref_viewing_dist;
4126 tdrdi->num_ref_displays =
sei->tdrdi.num_ref_displays;
4127 for (
int i = 0;
i <
sei->tdrdi.num_ref_displays;
i++) {
4163 s->sei.picture_timing.picture_struct = 0;
4183 if (sd && sd->
size >=
sizeof(
s->dovi_ctx.cfg))
4203 #define OFFSET(x) offsetof(HEVCContext, x)
4204 #define PAR (AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
4207 {
"apply_defdispwin",
"Apply default display window from VUI",
OFFSET(apply_defdispwin),
4209 {
"strict-displaywin",
"strictly apply default display window size",
OFFSET(apply_defdispwin),
4211 {
"view_ids",
"Array of view IDs that should be decoded and output; a single -1 to decode all views",
4213 .min = -1, .max = INT_MAX, .flags =
PAR },
4214 {
"view_ids_available",
"Array of available view IDs is exported here",
4217 {
"view_pos_available",
"Array of view positions for view_ids_available is exported here, as AVStereo3DView",
4253 #if CONFIG_HEVC_DXVA2_HWACCEL
4256 #if CONFIG_HEVC_D3D11VA_HWACCEL
4259 #if CONFIG_HEVC_D3D11VA2_HWACCEL
4262 #if CONFIG_HEVC_D3D12VA_HWACCEL
4265 #if CONFIG_HEVC_NVDEC_HWACCEL
4268 #if CONFIG_HEVC_VAAPI_HWACCEL
4271 #if CONFIG_HEVC_VDPAU_HWACCEL
4274 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
4277 #if CONFIG_HEVC_VULKAN_HWACCEL