26 #include "config_components.h"
62 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 };
93 for (
int i = 0;
i < 3;
i++) {
105 int log2_min_cb_size =
sps->log2_min_cb_size;
108 int pic_size_in_ctb = ((
width >> log2_min_cb_size) + 1) *
109 ((
height >> log2_min_cb_size) + 1);
110 int ctb_count =
sps->ctb_width *
sps->ctb_height;
111 int min_pu_size =
sps->min_pu_width *
sps->min_pu_height;
150 if (
sps->sao_enabled) {
151 int c_count = (
sps->chroma_format_idc != 0) ? 3 : 1;
153 for (
int c_idx = 0; c_idx < c_count; c_idx++) {
154 int w =
sps->width >>
sps->hshift[c_idx];
155 int h =
sps->height >>
sps->vshift[c_idx];
180 int luma_log2_weight_denom;
181 unsigned luma_weight_flags, chroma_weight_flags;
184 if (luma_log2_weight_denom < 0 || luma_log2_weight_denom > 7) {
185 av_log(logctx,
AV_LOG_ERROR,
"luma_log2_weight_denom %d is invalid\n", luma_log2_weight_denom);
189 if (
sps->chroma_format_idc != 0) {
191 if (chroma_log2_weight_denom < 0 || chroma_log2_weight_denom > 7) {
192 av_log(logctx,
AV_LOG_ERROR,
"chroma_log2_weight_denom %"PRId64
" is invalid\n", chroma_log2_weight_denom);
201 unsigned flag_bit = 1 << (sh->
nb_refs[
L0] - 1 -
i);
203 if (luma_weight_flags & flag_bit) {
205 if ((int8_t)delta_luma_weight_l0 != delta_luma_weight_l0)
213 if (chroma_weight_flags & flag_bit) {
214 for (j = 0; j < 2; j++) {
218 if ( (int8_t)delta_chroma_weight_l0 != delta_chroma_weight_l0
219 || delta_chroma_offset_l0 < -(1<<17) || delta_chroma_offset_l0 > (1<<17)) {
238 unsigned flag_bit = 1 << (sh->
nb_refs[
L1] - 1 -
i);
240 if (luma_weight_flags & flag_bit) {
242 if ((int8_t)delta_luma_weight_l1 != delta_luma_weight_l1)
250 if (chroma_weight_flags & flag_bit) {
251 for (j = 0; j < 2; j++) {
255 if ( (int8_t)delta_chroma_weight_l1 != delta_chroma_weight_l1
256 || delta_chroma_offset_l1 < -(1<<17) || delta_chroma_offset_l1 > (1<<17)) {
278 int max_poc_lsb = 1 <<
sps->log2_max_poc_lsb;
279 int prev_delta_msb = 0;
280 unsigned int nb_sps = 0, nb_sh;
284 if (!
sps->long_term_ref_pics_present)
287 if (
sps->num_long_term_ref_pics_sps > 0)
291 if (nb_sps >
sps->num_long_term_ref_pics_sps)
301 uint8_t lt_idx_sps = 0;
303 if (
sps->num_long_term_ref_pics_sps > 1)
306 rps->
poc[
i] =
sps->lt_ref_pic_poc_lsb_sps[lt_idx_sps];
307 rps->
used[
i] = !!(
sps->used_by_curr_pic_lt & (1
U << lt_idx_sps));
318 if (
i &&
i != nb_sps)
319 delta += prev_delta_msb;
321 poc = rps->
poc[
i] + cur_poc -
delta * max_poc_lsb - poc_lsb;
325 prev_delta_msb =
delta;
337 unsigned int num = 0, den = 0;
345 avctx->
profile =
sps->ptl.general_ptl.profile_idc;
346 avctx->
level =
sps->ptl.general_ptl.level_idc;
350 if (
sps->vui.common.video_signal_type_present_flag)
356 if (
sps->vui.common.colour_description_present_flag) {
358 avctx->
color_trc =
sps->vui.common.transfer_characteristics;
367 if (
sps->chroma_format_idc == 1) {
368 if (
sps->vui.common.chroma_loc_info_present_flag) {
369 if (
sps->vui.common.chroma_sample_loc_type_top_field <= 5)
375 if (
vps->vps_timing_info_present_flag) {
376 num =
vps->vps_num_units_in_tick;
377 den =
vps->vps_time_scale;
378 }
else if (
sps->vui.vui_timing_info_present_flag) {
379 num =
sps->vui.vui_num_units_in_tick;
380 den =
sps->vui.vui_time_scale;
383 if (num > 0 && den > 0)
392 if (
s->sei.common.alternative_transfer.present &&
395 avctx->
color_trc =
s->sei.common.alternative_transfer.preferred_transfer_characteristics;
406 s->nb_view_ids_available = 0;
408 s->nb_view_pos_available = 0;
411 if (
vps->nb_layers < 2 && !
vps->view_id[0])
414 s->view_ids_available =
av_calloc(
vps->nb_layers,
sizeof(*
s->view_ids_available));
415 if (!
s->view_ids_available)
419 s->view_pos_available =
av_calloc(
vps->nb_layers,
sizeof(*
s->view_pos_available));
420 if (!
s->view_pos_available)
424 for (
int i = 0;
i <
vps->nb_layers;
i++) {
425 s->view_ids_available[
i] =
vps->view_id[
i];
427 if (
s->view_pos_available) {
434 s->nb_view_ids_available =
vps->nb_layers;
435 s->nb_view_pos_available =
s->view_pos_available ?
vps->nb_layers : 0;
445 if (
vps->nb_layers != 2 || !
vps->layer_id_in_nuh[1])
461 unsigned layers_active_output = 0, highest_layer;
463 s->layers_active_output = 1;
464 s->layers_active_decode = 1;
472 s->layers_active_decode = (1 <<
vps->nb_layers) - 1;
473 s->layers_active_output = 1;
482 if (
s->nb_view_ids == 1 &&
s->view_ids[0] == -1) {
483 layers_active_output = (1 <<
vps->nb_layers) - 1;
485 for (
int i = 0;
i <
s->nb_view_ids;
i++) {
486 int view_id =
s->view_ids[
i];
491 "Invalid view ID requested: %d\n", view_id);
495 for (
int j = 0; j <
vps->nb_layers; j++) {
496 if (
vps->view_id[j] == view_id) {
503 "View ID %d not present in VPS\n", view_id);
506 layers_active_output |= 1 << layer_idx;
510 if (!layers_active_output) {
515 highest_layer =
ff_log2(layers_active_output);
518 "Too many layers requested: %u\n", layers_active_output);
526 s->layers_active_decode = (1 << (highest_layer + 1)) - 1;
527 s->layers_active_output = layers_active_output;
530 s->layers_active_decode,
s->layers_active_output);
565 #define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \
566 CONFIG_HEVC_D3D11VA_HWACCEL * 2 + \
567 CONFIG_HEVC_D3D12VA_HWACCEL + \
568 CONFIG_HEVC_NVDEC_HWACCEL + \
569 CONFIG_HEVC_NVDEC_CUARRAY_HWACCEL + \
570 CONFIG_HEVC_VAAPI_HWACCEL + \
571 CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \
572 CONFIG_HEVC_VDPAU_HWACCEL + \
573 CONFIG_HEVC_VULKAN_HWACCEL)
581 switch (
sps->pix_fmt) {
584 #if CONFIG_HEVC_DXVA2_HWACCEL
587 #if CONFIG_HEVC_D3D11VA_HWACCEL
591 #if CONFIG_HEVC_D3D12VA_HWACCEL
594 #if CONFIG_HEVC_VAAPI_HWACCEL
597 #if CONFIG_HEVC_VDPAU_HWACCEL
600 #if CONFIG_HEVC_NVDEC_HWACCEL
603 #if CONFIG_HEVC_NVDEC_CUARRAY_HWACCEL
606 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
609 #if CONFIG_HEVC_VULKAN_HWACCEL
614 #if CONFIG_HEVC_DXVA2_HWACCEL
617 #if CONFIG_HEVC_D3D11VA_HWACCEL
621 #if CONFIG_HEVC_D3D12VA_HWACCEL
624 #if CONFIG_HEVC_VAAPI_HWACCEL
627 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
630 #if CONFIG_HEVC_VULKAN_HWACCEL
633 #if CONFIG_HEVC_VDPAU_HWACCEL
636 #if CONFIG_HEVC_NVDEC_HWACCEL
639 #if CONFIG_HEVC_NVDEC_CUARRAY_HWACCEL
644 #if CONFIG_HEVC_VAAPI_HWACCEL
647 #if CONFIG_HEVC_VDPAU_HWACCEL
650 #if CONFIG_HEVC_NVDEC_HWACCEL
653 #if CONFIG_HEVC_NVDEC_CUARRAY_HWACCEL
656 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
659 #if CONFIG_HEVC_VULKAN_HWACCEL
665 #if CONFIG_HEVC_VAAPI_HWACCEL
668 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
671 #if CONFIG_HEVC_VULKAN_HWACCEL
674 #if CONFIG_HEVC_NVDEC_HWACCEL
677 #if CONFIG_HEVC_NVDEC_CUARRAY_HWACCEL
682 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
688 #if CONFIG_HEVC_VAAPI_HWACCEL
691 #if CONFIG_HEVC_VDPAU_HWACCEL
694 #if CONFIG_HEVC_VULKAN_HWACCEL
697 #if CONFIG_HEVC_NVDEC_HWACCEL
700 #if CONFIG_HEVC_NVDEC_CUARRAY_HWACCEL
705 #if CONFIG_HEVC_VAAPI_HWACCEL
708 #if CONFIG_HEVC_VULKAN_HWACCEL
711 #if CONFIG_HEVC_NVDEC_HWACCEL
714 #if CONFIG_HEVC_NVDEC_CUARRAY_HWACCEL
722 *fmt++ =
sps->pix_fmt;
734 s->avctx->pix_fmt =
ret;
779 unsigned pps_id, layer_idx;
800 pps =
s->ps.pps_list[pps_id];
803 layer_idx =
vps->layer_idx[
s->nuh_layer_id];
810 int slice_address_length;
812 if (
pps->dependent_slice_segments_enabled_flag)
824 "Invalid slice segment address: %u.\n",
837 for (
i = 0;
i <
pps->num_extra_slice_header_bits;
i++)
849 !
pps->pps_curr_pic_ref_enabled_flag &&
850 s->nuh_layer_id == 0) {
857 if (
pps->output_flag_present_flag)
860 if (
sps->separate_colour_plane)
864 (
s->nuh_layer_id > 0 &&
865 !(
vps->poc_lsb_not_present & (1 << layer_idx)))) {
872 "Ignoring POC change between slices: %d -> %d\n", poc, sh->
poc);
892 int numbits, rps_idx;
894 if (!
sps->nb_st_rps) {
900 rps_idx = numbits > 0 ?
get_bits(gb, numbits) : 0;
914 if (
sps->temporal_mvp_enabled)
930 if (
s->nuh_layer_id > 0) {
931 int num_direct_ref_layers =
vps->num_direct_ref_layers[layer_idx];
933 if (
vps->default_ref_layers_active)
935 else if (num_direct_ref_layers) {
940 "NumDirectRefLayers>1 not supported\n");
946 if (
sps->sao_enabled) {
948 if (
sps->chroma_format_idc) {
985 if (
pps->lists_modification_present_flag && nb_refs > 1) {
1003 if (
pps->cabac_init_present_flag)
1018 "Invalid collocated_ref_idx: %d.\n",
1035 "Invalid number of merging MVP candidates: %d.\n",
1041 if (
sps->motion_vector_resolution_control_idc == 2)
1051 if (
pps->pic_slice_level_chroma_qp_offsets_present_flag) {
1064 if (
pps->pps_slice_act_qp_offsets_present_flag) {
1070 if (
pps->chroma_qp_offset_list_enabled_flag)
1075 if (
pps->deblocking_filter_control_present_flag) {
1076 int deblocking_filter_override_flag = 0;
1078 if (
pps->deblocking_filter_override_enabled_flag)
1079 deblocking_filter_override_flag =
get_bits1(gb);
1081 if (deblocking_filter_override_flag) {
1086 if (beta_offset_div2 < -6 || beta_offset_div2 > 6 ||
1087 tc_offset_div2 < -6 || tc_offset_div2 > 6) {
1089 "Invalid deblock filter offsets: %d, %d\n",
1090 beta_offset_div2, tc_offset_div2);
1107 if (
pps->seq_loop_filter_across_slices_enabled_flag &&
1118 if (
pps->tiles_enabled_flag ||
pps->entropy_coding_sync_enabled_flag) {
1121 if (num_entry_point_offsets >
get_bits_left(gb) || num_entry_point_offsets > UINT16_MAX) {
1122 av_log(
s->avctx,
AV_LOG_ERROR,
"num_entry_point_offsets %d is invalid\n", num_entry_point_offsets);
1130 if (offset_len < 1 || offset_len > 32) {
1154 if (
pps->slice_header_extension_present_flag) {
1160 for (
i = 0;
i < length;
i++)
1182 "The slice_qp %d is outside the valid range "
1185 -
sps->qp_bd_offset);
1200 #define CTB(tab, x, y) ((tab)[(y) * sps->ctb_width + (x)])
1202 #define SET_SAO(elem, value) \
1204 if (!sao_merge_up_flag && !sao_merge_left_flag) \
1205 sao->elem = value; \
1206 else if (sao_merge_left_flag) \
1207 sao->elem = CTB(l->sao, rx-1, ry).elem; \
1208 else if (sao_merge_up_flag) \
1209 sao->elem = CTB(l->sao, rx, ry-1).elem; \
1219 int sao_merge_left_flag = 0;
1220 int sao_merge_up_flag = 0;
1224 if (
s->sh.slice_sample_adaptive_offset_flag[0] ||
1225 s->sh.slice_sample_adaptive_offset_flag[1]) {
1230 if (ry > 0 && !sao_merge_left_flag) {
1236 for (c_idx = 0; c_idx < (
sps->chroma_format_idc ? 3 : 1); c_idx++) {
1237 int log2_sao_offset_scale = c_idx == 0 ?
pps->log2_sao_offset_scale_luma :
1238 pps->log2_sao_offset_scale_chroma;
1240 if (!
s->sh.slice_sample_adaptive_offset_flag[c_idx]) {
1255 for (
i = 0;
i < 4;
i++)
1259 for (
i = 0;
i < 4;
i++) {
1268 }
else if (c_idx != 2) {
1274 for (
i = 0;
i < 4;
i++) {
1282 sao->
offset_val[c_idx][
i + 1] *= 1 << log2_sao_offset_scale;
1294 if (log2_res_scale_abs_plus1 != 0) {
1297 (1 - 2 * res_scale_sign_flag);
1310 int xBase,
int yBase,
int cb_xBase,
int cb_yBase,
1311 int log2_cb_size,
int log2_trafo_size,
1312 int blk_idx,
int cbf_luma,
int *cbf_cb,
int *cbf_cr)
1315 const int log2_trafo_size_c = log2_trafo_size -
sps->hshift[1];
1319 int trafo_size = 1 << log2_trafo_size;
1322 s->hpc.intra_pred[log2_trafo_size - 2](lc,
pps, x0, y0, 0);
1325 if (cbf_luma || cbf_cb[0] || cbf_cr[0] ||
1326 (
sps->chroma_format_idc == 2 && (cbf_cb[1] || cbf_cr[1]))) {
1329 int cbf_chroma = cbf_cb[0] || cbf_cr[0] ||
1330 (
sps->chroma_format_idc == 2 &&
1331 (cbf_cb[1] || cbf_cr[1]));
1343 "The cu_qp_delta %d is outside the valid range "
1346 -(26 +
sps->qp_bd_offset / 2),
1347 (25 +
sps->qp_bd_offset / 2));
1354 if (
s->sh.cu_chroma_qp_offset_enabled_flag && cbf_chroma &&
1357 if (cu_chroma_qp_offset_flag) {
1358 int cu_chroma_qp_offset_idx = 0;
1359 if (
pps->chroma_qp_offset_list_len_minus1 > 0) {
1362 "cu_chroma_qp_offset_idx not yet tested.\n");
1395 if (
sps->chroma_format_idc && (log2_trafo_size > 2 ||
sps->chroma_format_idc == 3)) {
1396 int trafo_size_h = 1 << (log2_trafo_size_c +
sps->hshift[1]);
1397 int trafo_size_v = 1 << (log2_trafo_size_c +
sps->vshift[1]);
1398 lc->
tu.
cross_pf = (
pps->cross_component_prediction_enabled_flag && cbf_luma &&
1405 for (
i = 0;
i < (
sps->chroma_format_idc == 2 ? 2 : 1);
i++) {
1408 trafo_size_h, trafo_size_v,
sps->log2_ctb_size);
1409 s->hpc.intra_pred[log2_trafo_size_c - 2](lc,
pps, x0, y0 + (
i << log2_trafo_size_c), 1);
1413 log2_trafo_size_c, scan_idx_c, 1);
1416 ptrdiff_t
stride =
s->cur_frame->f->linesize[1];
1417 int hshift =
sps->hshift[1];
1418 int vshift =
sps->vshift[1];
1421 int size = 1 << log2_trafo_size_c;
1423 uint8_t *
dst = &
s->cur_frame->f->data[1][(y0 >> vshift) *
stride +
1424 ((x0 >> hshift) <<
sps->pixel_shift)];
1428 s->hevcdsp.add_residual[log2_trafo_size_c-2](
dst, coeffs,
stride);
1435 for (
i = 0;
i < (
sps->chroma_format_idc == 2 ? 2 : 1);
i++) {
1438 trafo_size_h, trafo_size_v,
sps->log2_ctb_size);
1439 s->hpc.intra_pred[log2_trafo_size_c - 2](lc,
pps, x0, y0 + (
i << log2_trafo_size_c), 2);
1443 log2_trafo_size_c, scan_idx_c, 2);
1446 ptrdiff_t
stride =
s->cur_frame->f->linesize[2];
1447 int hshift =
sps->hshift[2];
1448 int vshift =
sps->vshift[2];
1451 int size = 1 << log2_trafo_size_c;
1453 uint8_t *
dst = &
s->cur_frame->f->data[2][(y0 >> vshift) *
stride +
1454 ((x0 >> hshift) <<
sps->pixel_shift)];
1458 s->hevcdsp.add_residual[log2_trafo_size_c-2](
dst, coeffs,
stride);
1461 }
else if (
sps->chroma_format_idc && blk_idx == 3) {
1462 int trafo_size_h = 1 << (log2_trafo_size + 1);
1463 int trafo_size_v = 1 << (log2_trafo_size +
sps->vshift[1]);
1464 for (
i = 0;
i < (
sps->chroma_format_idc == 2 ? 2 : 1);
i++) {
1467 trafo_size_h, trafo_size_v,
sps->log2_ctb_size);
1468 s->hpc.intra_pred[log2_trafo_size - 2](lc,
pps, xBase, yBase + (
i << log2_trafo_size), 1);
1472 log2_trafo_size, scan_idx_c, 1);
1474 for (
i = 0;
i < (
sps->chroma_format_idc == 2 ? 2 : 1);
i++) {
1477 trafo_size_h, trafo_size_v,
sps->log2_ctb_size);
1478 s->hpc.intra_pred[log2_trafo_size - 2](lc,
pps, xBase, yBase + (
i << log2_trafo_size), 2);
1482 log2_trafo_size, scan_idx_c, 2);
1486 if (log2_trafo_size > 2 ||
sps->chroma_format_idc == 3) {
1487 int trafo_size_h = 1 << (log2_trafo_size_c +
sps->hshift[1]);
1488 int trafo_size_v = 1 << (log2_trafo_size_c +
sps->vshift[1]);
1490 sps->log2_ctb_size);
1491 s->hpc.intra_pred[log2_trafo_size_c - 2](lc,
pps, x0, y0, 1);
1492 s->hpc.intra_pred[log2_trafo_size_c - 2](lc,
pps, x0, y0, 2);
1493 if (
sps->chroma_format_idc == 2) {
1495 trafo_size_h, trafo_size_v,
sps->log2_ctb_size);
1496 s->hpc.intra_pred[log2_trafo_size_c - 2](lc,
pps, x0, y0 + (1 << log2_trafo_size_c), 1);
1497 s->hpc.intra_pred[log2_trafo_size_c - 2](lc,
pps, x0, y0 + (1 << log2_trafo_size_c), 2);
1499 }
else if (blk_idx == 3) {
1500 int trafo_size_h = 1 << (log2_trafo_size + 1);
1501 int trafo_size_v = 1 << (log2_trafo_size +
sps->vshift[1]);
1503 trafo_size_h, trafo_size_v,
sps->log2_ctb_size);
1504 s->hpc.intra_pred[log2_trafo_size - 2](lc,
pps, xBase, yBase, 1);
1505 s->hpc.intra_pred[log2_trafo_size - 2](lc,
pps, xBase, yBase, 2);
1506 if (
sps->chroma_format_idc == 2) {
1508 trafo_size_h, trafo_size_v,
sps->log2_ctb_size);
1509 s->hpc.intra_pred[log2_trafo_size - 2](lc,
pps, xBase, yBase + (1 << log2_trafo_size), 1);
1510 s->hpc.intra_pred[log2_trafo_size - 2](lc,
pps, xBase, yBase + (1 << log2_trafo_size), 2);
1519 int x0,
int y0,
int log2_cb_size)
1521 int cb_size = 1 << log2_cb_size;
1522 int log2_min_pu_size =
sps->log2_min_pu_size;
1524 int min_pu_width =
sps->min_pu_width;
1525 int x_end =
FFMIN(x0 + cb_size,
sps->width);
1526 int y_end =
FFMIN(y0 + cb_size,
sps->height);
1529 for (j = (y0 >> log2_min_pu_size); j < (y_end >> log2_min_pu_size); j++)
1530 for (
i = (x0 >> log2_min_pu_size);
i < (x_end >> log2_min_pu_size);
i++)
1531 is_pcm[
i + j * min_pu_width] = 2;
1538 int xBase,
int yBase,
int cb_xBase,
int cb_yBase,
1539 int log2_cb_size,
int log2_trafo_size,
1540 int trafo_depth,
int blk_idx,
1541 const int *base_cbf_cb,
const int *base_cbf_cr)
1544 uint8_t split_transform_flag;
1549 cbf_cb[0] = base_cbf_cb[0];
1550 cbf_cb[1] = base_cbf_cb[1];
1551 cbf_cr[0] = base_cbf_cr[0];
1552 cbf_cr[1] = base_cbf_cr[1];
1555 if (trafo_depth == 1) {
1557 if (
sps->chroma_format_idc == 3) {
1571 if (log2_trafo_size <= sps->log2_max_trafo_size &&
1572 log2_trafo_size >
sps->log2_min_tb_size &&
1573 trafo_depth < lc->cu.max_trafo_depth &&
1577 int inter_split =
sps->max_transform_hierarchy_depth_inter == 0 &&
1582 split_transform_flag = log2_trafo_size >
sps->log2_max_trafo_size ||
1587 if (
sps->chroma_format_idc && (log2_trafo_size > 2 ||
sps->chroma_format_idc == 3)) {
1588 if (trafo_depth == 0 || cbf_cb[0]) {
1590 if (
sps->chroma_format_idc == 2 && (!split_transform_flag || log2_trafo_size == 3)) {
1595 if (trafo_depth == 0 || cbf_cr[0]) {
1597 if (
sps->chroma_format_idc == 2 && (!split_transform_flag || log2_trafo_size == 3)) {
1603 if (split_transform_flag) {
1604 const int trafo_size_split = 1 << (log2_trafo_size - 1);
1605 const int x1 = x0 + trafo_size_split;
1606 const int y1 = y0 + trafo_size_split;
1608 #define SUBDIVIDE(x, y, idx) \
1610 ret = hls_transform_tree(lc, l, pps, sps, \
1611 x, y, x0, y0, cb_xBase, cb_yBase, log2_cb_size, \
1612 log2_trafo_size - 1, trafo_depth + 1, idx, \
1625 int min_tu_size = 1 <<
sps->log2_min_tb_size;
1626 int log2_min_tu_size =
sps->log2_min_tb_size;
1627 int min_tu_width =
sps->min_tb_width;
1631 cbf_cb[0] || cbf_cr[0] ||
1632 (
sps->chroma_format_idc == 2 && (cbf_cb[1] || cbf_cr[1]))) {
1637 x0, y0, xBase, yBase, cb_xBase, cb_yBase,
1638 log2_cb_size, log2_trafo_size,
1639 blk_idx, cbf_luma, cbf_cb, cbf_cr);
1645 for (
i = 0;
i < (1 << log2_trafo_size);
i += min_tu_size)
1646 for (j = 0; j < (1 << log2_trafo_size); j += min_tu_size) {
1647 int x_tu = (x0 + j) >> log2_min_tu_size;
1648 int y_tu = (y0 +
i) >> log2_min_tu_size;
1649 l->
cbf_luma[y_tu * min_tu_width + x_tu] = 1;
1652 if (!
s->sh.disable_deblocking_filter_flag) {
1654 if (
pps->transquant_bypass_enable_flag &&
1663 const HEVCPPS *
pps,
int x0,
int y0,
int log2_cb_size)
1668 int cb_size = 1 << log2_cb_size;
1669 ptrdiff_t stride0 =
s->cur_frame->f->linesize[0];
1670 uint8_t *dst0 = &
s->cur_frame->f->data[0][y0 * stride0 + (x0 <<
sps->pixel_shift)];
1672 int length = cb_size * cb_size *
sps->pcm.bit_depth + (
sps->chroma_format_idc != 0 ?
1673 (((cb_size >>
sps->hshift[1]) * (cb_size >>
sps->vshift[1])) +
1674 ((cb_size >>
sps->hshift[2]) * (cb_size >>
sps->vshift[2]))) *
1675 sps->pcm.bit_depth_chroma : 0);
1676 const uint8_t *pcm =
skip_bytes(&lc->
cc, (length + 7) >> 3);
1679 if (!
s->sh.disable_deblocking_filter_flag)
1686 s->hevcdsp.put_pcm(dst0, stride0, cb_size, cb_size, &gb,
sps->pcm.bit_depth);
1687 if (
sps->chroma_format_idc) {
1688 ptrdiff_t stride1 =
s->cur_frame->f->linesize[1];
1689 ptrdiff_t stride2 =
s->cur_frame->f->linesize[2];
1690 uint8_t *dst1 = &
s->cur_frame->f->data[1][(y0 >>
sps->vshift[1]) * stride1 + ((x0 >>
sps->hshift[1]) <<
sps->pixel_shift)];
1691 uint8_t *dst2 = &
s->cur_frame->f->data[2][(y0 >>
sps->vshift[2]) * stride2 + ((x0 >>
sps->hshift[2]) <<
sps->pixel_shift)];
1693 s->hevcdsp.put_pcm(dst1, stride1,
1694 cb_size >>
sps->hshift[1],
1695 cb_size >>
sps->vshift[1],
1696 &gb,
sps->pcm.bit_depth_chroma);
1697 s->hevcdsp.put_pcm(dst2, stride2,
1698 cb_size >>
sps->hshift[2],
1699 cb_size >>
sps->vshift[2],
1700 &gb,
sps->pcm.bit_depth_chroma);
1724 uint8_t *
dst, ptrdiff_t dststride,
1726 int block_w,
int block_h,
int luma_weight,
int luma_offset)
1729 const uint8_t *
src =
ref->data[0];
1731 int pic_width =
sps->width;
1732 int pic_height =
sps->height;
1735 int weight_flag = (
s->sh.slice_type ==
HEVC_SLICE_P &&
pps->weighted_pred_flag) ||
1739 x_off +=
mv->x >> 2;
1740 y_off +=
mv->y >> 2;
1746 ref ==
s->cur_frame->f) {
1756 pic_width, pic_height);
1763 block_h,
mx,
my, block_w);
1766 block_h,
s->sh.luma_log2_weight_denom,
1767 luma_weight, luma_offset,
mx,
my, block_w);
1788 uint8_t *
dst, ptrdiff_t dststride,
1789 const AVFrame *ref0,
const Mv *mv0,
int x_off,
int y_off,
1790 int block_w,
int block_h,
const AVFrame *ref1,
1791 const Mv *mv1,
struct MvField *current_mv)
1794 ptrdiff_t src0stride = ref0->
linesize[0];
1795 ptrdiff_t src1stride = ref1->
linesize[0];
1796 int pic_width =
sps->width;
1797 int pic_height =
sps->height;
1798 int mx0 = mv0->
x & 3;
1799 int my0 = mv0->
y & 3;
1800 int mx1 = mv1->
x & 3;
1801 int my1 = mv1->
y & 3;
1802 int weight_flag = (
s->sh.slice_type ==
HEVC_SLICE_P &&
pps->weighted_pred_flag) ||
1804 int x_off0 = x_off + (mv0->
x >> 2);
1805 int y_off0 = y_off + (mv0->
y >> 2);
1806 int x_off1 = x_off + (mv1->
x >> 2);
1807 int y_off1 = y_off + (mv1->
y >> 2);
1810 const uint8_t *
src0 = ref0->
data[0] + y_off0 * src0stride + (int)((
unsigned)x_off0 <<
sps->pixel_shift);
1811 const uint8_t *
src1 = ref1->
data[0] + y_off1 * src1stride + (int)((
unsigned)x_off1 <<
sps->pixel_shift);
1821 edge_emu_stride, src0stride,
1825 pic_width, pic_height);
1827 src0stride = edge_emu_stride;
1838 edge_emu_stride, src1stride,
1842 pic_width, pic_height);
1844 src1stride = edge_emu_stride;
1847 s->hevcdsp.put_hevc_qpel[idx][!!my0][!!mx0](lc->
tmp,
src0, src0stride,
1848 block_h, mx0, my0, block_w);
1850 s->hevcdsp.put_hevc_qpel_bi[idx][!!my1][!!mx1](
dst, dststride,
src1, src1stride, lc->
tmp,
1851 block_h, mx1, my1, block_w);
1853 s->hevcdsp.put_hevc_qpel_bi_w[idx][!!my1][!!mx1](
dst, dststride,
src1, src1stride, lc->
tmp,
1854 block_h,
s->sh.luma_log2_weight_denom,
1855 s->sh.luma_weight_l0[current_mv->
ref_idx[0]],
1856 s->sh.luma_weight_l1[current_mv->
ref_idx[1]],
1857 s->sh.luma_offset_l0[current_mv->
ref_idx[0]] +
1858 s->sh.luma_offset_l1[current_mv->
ref_idx[1]],
1883 ptrdiff_t dststride,
const uint8_t *
src0, ptrdiff_t
srcstride,
int reflist,
1884 int x_off,
int y_off,
int block_w,
int block_h,
1885 const struct MvField *current_mv,
int chroma_weight,
int chroma_offset)
1888 int pic_width =
sps->width >>
sps->hshift[1];
1889 int pic_height =
sps->height >>
sps->vshift[1];
1890 const Mv *
mv = ¤t_mv->
mv[reflist];
1891 int weight_flag = (
s->sh.slice_type ==
HEVC_SLICE_P &&
pps->weighted_pred_flag) ||
1894 int hshift =
sps->hshift[1];
1895 int vshift =
sps->vshift[1];
1898 intptr_t _mx =
mx << (1 - hshift);
1899 intptr_t _my =
my << (1 - vshift);
1900 int emu =
src0 ==
s->cur_frame->f->data[1] ||
src0 ==
s->cur_frame->f->data[2];
1902 x_off +=
mv->x >> (2 + hshift);
1903 y_off +=
mv->y >> (2 + vshift);
1913 (edge_emu_stride + (1 <<
sps->pixel_shift));
1919 pic_width, pic_height);
1926 block_h, _mx, _my, block_w);
1929 block_h,
s->sh.chroma_log2_weight_denom,
1930 chroma_weight, chroma_offset, _mx, _my, block_w);
1952 uint8_t *dst0, ptrdiff_t dststride,
1954 int x_off,
int y_off,
int block_w,
int block_h,
const MvField *current_mv,
int cidx)
1957 const uint8_t *
src1 = ref0->
data[cidx+1];
1958 const uint8_t *
src2 = ref1->
data[cidx+1];
1959 ptrdiff_t src1stride = ref0->
linesize[cidx+1];
1960 ptrdiff_t src2stride = ref1->
linesize[cidx+1];
1961 int weight_flag = (
s->sh.slice_type ==
HEVC_SLICE_P &&
pps->weighted_pred_flag) ||
1963 int pic_width =
sps->width >>
sps->hshift[1];
1964 int pic_height =
sps->height >>
sps->vshift[1];
1965 const Mv *
const mv0 = ¤t_mv->
mv[0];
1966 const Mv *
const mv1 = ¤t_mv->
mv[1];
1967 int hshift =
sps->hshift[1];
1968 int vshift =
sps->vshift[1];
1974 intptr_t _mx0 = mx0 << (1 - hshift);
1975 intptr_t _my0 = my0 << (1 - vshift);
1976 intptr_t _mx1 = mx1 << (1 - hshift);
1977 intptr_t _my1 = my1 << (1 - vshift);
1979 int x_off0 = x_off + (mv0->
x >> (2 + hshift));
1980 int y_off0 = y_off + (mv0->
y >> (2 + vshift));
1981 int x_off1 = x_off + (mv1->
x >> (2 + hshift));
1982 int y_off1 = y_off + (mv1->
y >> (2 + vshift));
1984 src1 += y_off0 * src1stride + (int)((
unsigned)x_off0 <<
sps->pixel_shift);
1985 src2 += y_off1 * src2stride + (int)((
unsigned)x_off1 <<
sps->pixel_shift);
1993 (edge_emu_stride + (1 <<
sps->pixel_shift));
1996 edge_emu_stride, src1stride,
2000 pic_width, pic_height);
2003 src1stride = edge_emu_stride;
2012 (edge_emu_stride + (1 <<
sps->pixel_shift));
2015 edge_emu_stride, src2stride,
2019 pic_width, pic_height);
2022 src2stride = edge_emu_stride;
2025 s->hevcdsp.put_hevc_epel[idx][!!my0][!!mx0](lc->
tmp,
src1, src1stride,
2026 block_h, _mx0, _my0, block_w);
2028 s->hevcdsp.put_hevc_epel_bi[idx][!!my1][!!mx1](dst0,
s->cur_frame->f->linesize[cidx+1],
2030 block_h, _mx1, _my1, block_w);
2032 s->hevcdsp.put_hevc_epel_bi_w[idx][!!my1][!!mx1](dst0,
s->cur_frame->f->linesize[cidx+1],
2035 s->sh.chroma_log2_weight_denom,
2036 s->sh.chroma_weight_l0[current_mv->
ref_idx[0]][cidx],
2037 s->sh.chroma_weight_l1[current_mv->
ref_idx[1]][cidx],
2038 s->sh.chroma_offset_l0[current_mv->
ref_idx[0]][cidx] +
2039 s->sh.chroma_offset_l1[current_mv->
ref_idx[1]][cidx],
2040 _mx1, _my1, block_w);
2055 int x0,
int y0,
int nPbW,
2056 int nPbH,
int log2_cb_size,
int part_idx,
2068 if (inter_pred_idc !=
PRED_L1) {
2069 if (
s->sh.nb_refs[
L0])
2076 part_idx, merge_idx,
mv, mvp_flag, 0);
2081 if (inter_pred_idc !=
PRED_L0) {
2082 if (
s->sh.nb_refs[
L1])
2085 if (
s->sh.mvd_l1_zero_flag == 1 && inter_pred_idc ==
PRED_BI) {
2094 part_idx, merge_idx,
mv, mvp_flag, 1);
2103 int x0,
int y0,
int nPbW,
int nPbH,
2104 int log2_cb_size,
int partIdx,
int idx)
2106 #define POS(c_idx, x, y) \
2107 s->cur_frame->f->data[c_idx] ? \
2108 &s->cur_frame->f->data[c_idx][((y) >> sps->vshift[c_idx]) * linesize[c_idx] + \
2109 (((x) >> sps->hshift[c_idx]) << sps->pixel_shift)] : NULL
2112 struct MvField current_mv = {{{ 0 }}};
2114 int min_pu_width =
sps->min_pu_width;
2116 MvField *tab_mvf =
s->cur_frame->tab_mvf;
2117 const RefPicList *refPicList =
s->cur_frame->refPicList;
2119 const int *linesize =
s->cur_frame->f->linesize;
2120 uint8_t *dst0 =
s->cur_frame->f->data[0] + y0 * linesize[0] + (x0 <<
sps->pixel_shift);
2121 uint8_t *dst1 =
POS(1, x0, y0);
2122 uint8_t *dst2 =
POS(2, x0, y0);
2123 int log2_min_cb_size =
sps->log2_min_cb_size;
2124 int min_cb_width =
sps->min_cb_width;
2125 int x_cb = x0 >> log2_min_cb_size;
2126 int y_cb = y0 >> log2_min_cb_size;
2136 if (
s->sh.max_num_merge_cand > 1)
2142 partIdx, merge_idx, ¤t_mv);
2145 partIdx, merge_idx, ¤t_mv);
2148 x_pu = x0 >>
sps->log2_min_pu_size;
2149 y_pu = y0 >>
sps->log2_min_pu_size;
2151 for (j = 0; j < nPbH >>
sps->log2_min_pu_size; j++)
2152 for (
i = 0; i < nPbW >>
sps->log2_min_pu_size;
i++)
2153 tab_mvf[(y_pu + j) * min_pu_width + x_pu +
i] = current_mv;
2156 ref0 = refPicList[0].
ref[current_mv.
ref_idx[0]];
2157 if (!ref0 || !ref0->
f)
2162 ref1 = refPicList[1].
ref[current_mv.
ref_idx[1]];
2163 if (!ref1 || !ref1->f)
2169 int x0_c = x0 >>
sps->hshift[1];
2170 int y0_c = y0 >>
sps->vshift[1];
2171 int nPbW_c = nPbW >>
sps->hshift[1];
2172 int nPbH_c = nPbH >>
sps->vshift[1];
2175 ¤t_mv.
mv[0], x0, y0, nPbW, nPbH,
2176 s->sh.luma_weight_l0[current_mv.
ref_idx[0]],
2177 s->sh.luma_offset_l0[current_mv.
ref_idx[0]]);
2179 if (
sps->chroma_format_idc) {
2181 0, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
2182 s->sh.chroma_weight_l0[current_mv.
ref_idx[0]][0],
s->sh.chroma_offset_l0[current_mv.
ref_idx[0]][0]);
2184 0, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
2185 s->sh.chroma_weight_l0[current_mv.
ref_idx[0]][1],
s->sh.chroma_offset_l0[current_mv.
ref_idx[0]][1]);
2188 int x0_c = x0 >>
sps->hshift[1];
2189 int y0_c = y0 >>
sps->vshift[1];
2190 int nPbW_c = nPbW >>
sps->hshift[1];
2191 int nPbH_c = nPbH >>
sps->vshift[1];
2194 ¤t_mv.
mv[1], x0, y0, nPbW, nPbH,
2195 s->sh.luma_weight_l1[current_mv.
ref_idx[1]],
2196 s->sh.luma_offset_l1[current_mv.
ref_idx[1]]);
2198 if (
sps->chroma_format_idc) {
2200 1, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
2201 s->sh.chroma_weight_l1[current_mv.
ref_idx[1]][0],
s->sh.chroma_offset_l1[current_mv.
ref_idx[1]][0]);
2204 1, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
2205 s->sh.chroma_weight_l1[current_mv.
ref_idx[1]][1],
s->sh.chroma_offset_l1[current_mv.
ref_idx[1]][1]);
2208 int x0_c = x0 >>
sps->hshift[1];
2209 int y0_c = y0 >>
sps->vshift[1];
2210 int nPbW_c = nPbW >>
sps->hshift[1];
2211 int nPbH_c = nPbH >>
sps->vshift[1];
2214 ¤t_mv.
mv[0], x0, y0, nPbW, nPbH,
2215 ref1->f, ¤t_mv.
mv[1], ¤t_mv);
2217 if (
sps->chroma_format_idc) {
2219 x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv, 0);
2222 x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv, 1);
2232 int x0,
int y0,
int pu_size,
2233 int prev_intra_luma_pred_flag)
2236 int x_pu = x0 >>
sps->log2_min_pu_size;
2237 int y_pu = y0 >>
sps->log2_min_pu_size;
2238 int min_pu_width =
sps->min_pu_width;
2239 int size_in_pus = pu_size >>
sps->log2_min_pu_size;
2248 int y_ctb = (y0 >> (
sps->log2_ctb_size)) << (
sps->log2_ctb_size);
2250 MvField *tab_mvf =
s->cur_frame->tab_mvf;
2251 int intra_pred_mode;
2256 if ((y0 - 1) < y_ctb)
2259 if (cand_left == cand_up) {
2260 if (cand_left < 2) {
2265 candidate[0] = cand_left;
2266 candidate[1] = 2 + ((cand_left - 2 - 1 + 32) & 31);
2267 candidate[2] = 2 + ((cand_left - 2 + 1) & 31);
2270 candidate[0] = cand_left;
2271 candidate[1] = cand_up;
2281 if (prev_intra_luma_pred_flag) {
2282 intra_pred_mode = candidate[lc->
pu.
mpm_idx];
2284 if (candidate[0] > candidate[1])
2285 FFSWAP(uint8_t, candidate[0], candidate[1]);
2286 if (candidate[0] > candidate[2])
2287 FFSWAP(uint8_t, candidate[0], candidate[2]);
2288 if (candidate[1] > candidate[2])
2289 FFSWAP(uint8_t, candidate[1], candidate[2]);
2292 for (
i = 0;
i < 3;
i++)
2293 if (intra_pred_mode >= candidate[
i])
2300 for (
i = 0;
i < size_in_pus;
i++) {
2301 memset(&l->
tab_ipm[(y_pu +
i) * min_pu_width + x_pu],
2302 intra_pred_mode, size_in_pus);
2304 for (j = 0; j < size_in_pus; j++) {
2309 return intra_pred_mode;
2314 int log2_cb_size,
int ct_depth)
2316 int length = (1 << log2_cb_size) >>
sps->log2_min_cb_size;
2317 int x_cb = x0 >>
sps->log2_min_cb_size;
2318 int y_cb = y0 >>
sps->log2_min_cb_size;
2321 for (y = 0; y < length; y++)
2322 memset(&tab_ct_depth[(y_cb + y) *
sps->min_cb_width + x_cb],
2327 0, 1, 2, 2, 2, 2, 3, 5, 7, 8, 10, 12, 13, 15, 17, 18, 19, 20,
2328 21, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 29, 29, 30, 31};
2335 static const uint8_t intra_chroma_table[4] = { 0, 26, 10, 1 };
2336 uint8_t prev_intra_luma_pred_flag[4];
2338 int pb_size = (1 << log2_cb_size) >>
split;
2339 int side =
split + 1;
2343 for (
i = 0;
i < side;
i++)
2344 for (j = 0; j < side; j++)
2347 for (
i = 0;
i < side;
i++) {
2348 for (j = 0; j < side; j++) {
2349 if (prev_intra_luma_pred_flag[2 *
i + j])
2356 x0 + pb_size * j, y0 + pb_size *
i, pb_size,
2357 prev_intra_luma_pred_flag[2 *
i + j]);
2361 if (
sps->chroma_format_idc == 3) {
2362 for (
i = 0;
i < side;
i++) {
2363 for (j = 0; j < side; j++) {
2365 if (chroma_mode != 4) {
2375 }
else if (
sps->chroma_format_idc == 2) {
2378 if (chroma_mode != 4) {
2382 mode_idx = intra_chroma_table[chroma_mode];
2387 }
else if (
sps->chroma_format_idc != 0) {
2389 if (chroma_mode != 4) {
2407 int pb_size = 1 << log2_cb_size;
2408 int size_in_pus = pb_size >>
sps->log2_min_pu_size;
2409 int min_pu_width =
sps->min_pu_width;
2410 MvField *tab_mvf =
s->cur_frame->tab_mvf;
2411 int x_pu = x0 >>
sps->log2_min_pu_size;
2412 int y_pu = y0 >>
sps->log2_min_pu_size;
2415 if (size_in_pus == 0)
2417 for (j = 0; j < size_in_pus; j++)
2418 memset(&l->
tab_ipm[(y_pu + j) * min_pu_width + x_pu],
INTRA_DC, size_in_pus);
2420 for (j = 0; j < size_in_pus; j++)
2421 for (k = 0; k < size_in_pus; k++)
2428 int x0,
int y0,
int log2_cb_size)
2430 int cb_size = 1 << log2_cb_size;
2431 int log2_min_cb_size =
sps->log2_min_cb_size;
2432 int length = cb_size >> log2_min_cb_size;
2433 int min_cb_width =
sps->min_cb_width;
2434 int x_cb = x0 >> log2_min_cb_size;
2435 int y_cb = y0 >> log2_min_cb_size;
2436 int idx = log2_cb_size - 2;
2437 int qp_block_mask = (1 << (
sps->log2_ctb_size -
pps->diff_cu_qp_delta_depth)) - 1;
2447 for (x = 0; x < 4; x++)
2449 if (
pps->transquant_bypass_enable_flag) {
2460 x0b, y0b, x_cb, y_cb,
2463 x = y_cb * min_cb_width + x_cb;
2464 for (y = 0; y < length; y++) {
2465 memset(&l->
skip_flag[x], skip_flag, length);
2470 x = y_cb * min_cb_width + x_cb;
2471 for (y = 0; y < length; y++) {
2479 x0, y0, cb_size, cb_size, log2_cb_size, 0, idx);
2482 if (!
s->sh.disable_deblocking_filter_flag)
2490 log2_cb_size ==
sps->log2_min_cb_size) {
2498 log2_cb_size >=
sps->pcm.log2_min_pcm_cb_size &&
2499 log2_cb_size <= sps->pcm.log2_max_pcm_cb_size) {
2505 if (
sps->pcm_loop_filter_disabled)
2518 x0, y0, cb_size, cb_size, log2_cb_size, 0, idx);
2522 x0, y0, cb_size, cb_size / 2, log2_cb_size, 0, idx);
2524 x0, y0 + cb_size / 2, cb_size, cb_size / 2, log2_cb_size, 1, idx);
2528 x0, y0, cb_size / 2, cb_size, log2_cb_size, 0, idx - 1);
2530 x0 + cb_size / 2, y0, cb_size / 2, cb_size, log2_cb_size, 1, idx - 1);
2534 x0, y0, cb_size, cb_size / 4, log2_cb_size, 0, idx);
2536 x0, y0 + cb_size / 4, cb_size, cb_size * 3 / 4, log2_cb_size, 1, idx);
2540 x0, y0, cb_size, cb_size * 3 / 4, log2_cb_size, 0, idx);
2542 x0, y0 + cb_size * 3 / 4, cb_size, cb_size / 4, log2_cb_size, 1, idx);
2546 x0, y0, cb_size / 4, cb_size, log2_cb_size, 0, idx - 2);
2548 x0 + cb_size / 4, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 1, idx - 2);
2552 x0, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 0, idx - 2);
2554 x0 + cb_size * 3 / 4, y0, cb_size / 4, cb_size, log2_cb_size, 1, idx - 2);
2558 x0, y0, cb_size / 2, cb_size / 2, log2_cb_size, 0, idx - 1);
2560 x0 + cb_size / 2, y0, cb_size / 2, cb_size / 2, log2_cb_size, 1, idx - 1);
2562 x0, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 2, idx - 1);
2564 x0 + cb_size / 2, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 3, idx - 1);
2570 int rqt_root_cbf = 1;
2577 const static int cbf[2] = { 0 };
2580 sps->max_transform_hierarchy_depth_inter;
2581 ret =
hls_transform_tree(lc, l,
pps,
sps, x0, y0, x0, y0, x0, y0,
2583 log2_cb_size, 0, 0, cbf, cbf);
2587 if (!
s->sh.disable_deblocking_filter_flag)
2596 x = y_cb * min_cb_width + x_cb;
2597 for (y = 0; y < length; y++) {
2602 if(((x0 + (1<<log2_cb_size)) & qp_block_mask) == 0 &&
2603 ((y0 + (1<<log2_cb_size)) & qp_block_mask) == 0) {
2616 int log2_cb_size,
int cb_depth)
2619 const int cb_size = 1 << log2_cb_size;
2624 if (x0 + cb_size <= sps->
width &&
2625 y0 + cb_size <= sps->
height &&
2626 log2_cb_size >
sps->log2_min_cb_size) {
2628 sps, cb_depth, x0, y0);
2630 split_cu = (log2_cb_size >
sps->log2_min_cb_size);
2632 if (
pps->cu_qp_delta_enabled_flag &&
2633 log2_cb_size >=
sps->log2_ctb_size -
pps->diff_cu_qp_delta_depth) {
2638 if (
s->sh.cu_chroma_qp_offset_enabled_flag &&
2639 log2_cb_size >=
sps->log2_ctb_size -
pps->diff_cu_chroma_qp_offset_depth) {
2644 int qp_block_mask = (1 << (
sps->log2_ctb_size -
pps->diff_cu_qp_delta_depth)) - 1;
2645 const int cb_size_split = cb_size >> 1;
2646 const int x1 = x0 + cb_size_split;
2647 const int y1 = y0 + cb_size_split;
2652 x0, y0, log2_cb_size - 1, cb_depth + 1);
2656 if (more_data && x1 < sps->
width) {
2658 x1, y0, log2_cb_size - 1, cb_depth + 1);
2662 if (more_data && y1 < sps->
height) {
2664 x0, y1, log2_cb_size - 1, cb_depth + 1);
2668 if (more_data && x1 < sps->
width &&
2671 x1, y1, log2_cb_size - 1, cb_depth + 1);
2676 if(((x0 + (1<<log2_cb_size)) & qp_block_mask) == 0 &&
2677 ((y0 + (1<<log2_cb_size)) & qp_block_mask) == 0)
2681 return ((x1 + cb_size_split) <
sps->width ||
2682 (y1 + cb_size_split) <
sps->height);
2689 if ((!((x0 + cb_size) %
2690 (1 << (
sps->log2_ctb_size))) ||
2691 (x0 + cb_size >=
sps->width)) &&
2693 (1 << (
sps->log2_ctb_size))) ||
2694 (y0 + cb_size >=
sps->height))) {
2696 return !end_of_slice_flag;
2708 int x_ctb,
int y_ctb,
int ctb_addr_ts)
2711 int ctb_size = 1 <<
sps->log2_ctb_size;
2712 int ctb_addr_rs =
pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2713 int ctb_addr_in_slice = ctb_addr_rs -
s->sh.slice_addr;
2717 if (
pps->entropy_coding_sync_enabled_flag) {
2718 if (x_ctb == 0 && (y_ctb & (ctb_size - 1)) == 0)
2721 }
else if (
pps->tiles_enabled_flag) {
2722 if (ctb_addr_ts &&
pps->tile_id[ctb_addr_ts] !=
pps->tile_id[ctb_addr_ts - 1]) {
2723 int idxX =
pps->col_idxX[x_ctb >>
sps->log2_ctb_size];
2734 if (
pps->tiles_enabled_flag) {
2735 if (x_ctb > 0 &&
pps->tile_id[ctb_addr_ts] !=
pps->tile_id[
pps->ctb_addr_rs_to_ts[ctb_addr_rs - 1]])
2739 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]])
2744 if (ctb_addr_in_slice <= 0)
2746 if (ctb_addr_in_slice < sps->ctb_width)
2752 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]]));
2753 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]]));
2762 const uint8_t *slice_data = gb->
buffer +
s->sh.data_offset;
2764 int ctb_size = 1 <<
sps->log2_ctb_size;
2768 int ctb_addr_ts =
pps->ctb_addr_rs_to_ts[
s->sh.slice_ctb_addr_rs];
2771 while (more_data && ctb_addr_ts < sps->ctb_size) {
2772 int ctb_addr_rs =
pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2774 x_ctb = (ctb_addr_rs % ((
sps->width + ctb_size - 1) >>
sps->log2_ctb_size)) <<
sps->log2_ctb_size;
2775 y_ctb = (ctb_addr_rs / ((
sps->width + ctb_size - 1) >>
sps->log2_ctb_size)) <<
sps->log2_ctb_size;
2785 x_ctb >>
sps->log2_ctb_size, y_ctb >>
sps->log2_ctb_size);
2792 if (more_data < 0) {
2803 if (x_ctb + ctb_size >=
sps->width &&
2804 y_ctb + ctb_size >=
sps->height)
2811 int job,
int thread)
2818 int ctb_size = 1 <<
sps->log2_ctb_size;
2821 int ctb_addr_rs =
s->sh.slice_ctb_addr_rs + ctb_row * ((
sps->width + ctb_size - 1) >>
sps->log2_ctb_size);
2822 int ctb_addr_ts =
pps->ctb_addr_rs_to_ts[ctb_addr_rs];
2824 const uint8_t *
data =
s->data +
s->sh.offset[ctb_row];
2825 const size_t data_size =
s->sh.size[ctb_row];
2834 while(more_data && ctb_addr_ts < sps->ctb_size) {
2835 int x_ctb = (ctb_addr_rs %
sps->ctb_width) <<
sps->log2_ctb_size;
2836 int y_ctb = (ctb_addr_rs /
sps->ctb_width) <<
sps->log2_ctb_size;
2856 x_ctb >>
sps->log2_ctb_size, y_ctb >>
sps->log2_ctb_size);
2864 if (more_data < 0) {
2875 if (!more_data && (x_ctb+ctb_size) <
sps->width && ctb_row !=
s->sh.num_entry_point_offsets) {
2882 if ((x_ctb+ctb_size) >=
sps->width && (y_ctb+ctb_size) >=
sps->height ) {
2887 ctb_addr_rs =
pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2890 if(x_ctb >=
sps->width) {
2907 if (
s->nb_wpp_progress < count) {
2909 sizeof(*
s->wpp_progress));
2913 s->wpp_progress =
tmp;
2914 memset(
s->wpp_progress +
s->nb_wpp_progress, 0,
2915 (count -
s->nb_wpp_progress) *
sizeof(*
s->wpp_progress));
2917 for (
int i =
s->nb_wpp_progress;
i < count;
i++) {
2921 s->nb_wpp_progress =
i + 1;
2925 for (
int i = 0;
i < count;
i++)
2935 const uint8_t *
data =
nal->data;
2936 int length =
nal->size;
2939 int64_t startheader, cmpt = 0;
2942 if (
s->sh.slice_ctb_addr_rs +
s->sh.num_entry_point_offsets * (
int64_t)
sps->ctb_width >=
sps->ctb_width * (
int64_t)
sps->ctb_height) {
2944 s->sh.slice_ctb_addr_rs,
s->sh.num_entry_point_offsets,
2945 sps->ctb_width,
sps->ctb_height
2950 if (
s->avctx->thread_count >
s->nb_local_ctx) {
2956 memcpy(
tmp,
s->local_ctx,
sizeof(*
s->local_ctx) *
s->nb_local_ctx);
2960 for (
unsigned i =
s->nb_local_ctx; i < s->avctx->thread_count;
i++) {
2961 tmp = &
s->local_ctx[
i];
2963 memset(
tmp, 0,
sizeof(*
tmp));
2965 tmp->logctx =
s->avctx;
2967 tmp->common_cabac_state = &
s->cabac;
2970 s->nb_local_ctx =
s->avctx->thread_count;
2975 for (j = 0, cmpt = 0, startheader =
offset +
s->sh.entry_point_offset[0]; j < nal->skipped_bytes; j++) {
2976 if (
nal->skipped_bytes_pos[j] >=
offset &&
nal->skipped_bytes_pos[j] < startheader) {
2982 for (
int i = 1;
i <
s->sh.num_entry_point_offsets;
i++) {
2983 offset += (
s->sh.entry_point_offset[
i - 1] - cmpt);
2984 for (j = 0, cmpt = 0, startheader =
offset
2985 +
s->sh.entry_point_offset[
i]; j < nal->skipped_bytes; j++) {
2986 if (
nal->skipped_bytes_pos[j] >=
offset &&
nal->skipped_bytes_pos[j] < startheader) {
2991 s->sh.size[
i] =
s->sh.entry_point_offset[
i] - cmpt;
2996 offset +=
s->sh.entry_point_offset[
s->sh.num_entry_point_offsets - 1] - cmpt;
3001 s->sh.size [
s->sh.num_entry_point_offsets] = length -
offset;
3002 s->sh.offset[
s->sh.num_entry_point_offsets] =
offset;
3004 s->sh.offset[0] =
s->sh.data_offset;
3005 s->sh.size[0] =
s->sh.offset[1] -
s->sh.offset[0];
3009 for (
unsigned i = 1;
i <
s->nb_local_ctx;
i++) {
3010 s->local_ctx[
i].first_qp_group = 1;
3011 s->local_ctx[
i].qp_y =
s->local_ctx[0].qp_y;
3023 if (
pps->entropy_coding_sync_enabled_flag)
3026 for (
int i = 0;
i <=
s->sh.num_entry_point_offsets;
i++)
3039 if (!
s->sh.first_slice_in_pic_flag)
3040 s->slice_idx += !
s->sh.dependent_slice_segment_flag;
3042 if (!
s->sh.dependent_slice_segment_flag &&
s->sh.slice_type !=
HEVC_SLICE_I) {
3046 "Error constructing the reference lists for the current slice.\n");
3051 s->slice_initialized = 1;
3053 if (
s->avctx->hwaccel)
3058 "SCC profile is not yet implemented in hevc native decoder.\n");
3062 if (
s->sh.dependent_slice_segment_flag) {
3063 int ctb_addr_ts =
pps->ctb_addr_rs_to_ts[
s->sh.slice_ctb_addr_rs];
3064 int prev_rs =
pps->ctb_addr_ts_to_rs[ctb_addr_ts - 1];
3071 s->local_ctx[0].first_qp_group = !
s->sh.dependent_slice_segment_flag;
3073 if (!
pps->cu_qp_delta_enabled_flag)
3074 s->local_ctx[0].qp_y =
s->sh.slice_qp;
3076 s->local_ctx[0].tu.cu_qp_offset_cb = 0;
3077 s->local_ctx[0].tu.cu_qp_offset_cr = 0;
3080 s->sh.num_entry_point_offsets > 0 &&
3081 pps->num_tile_rows == 1 &&
pps->num_tile_columns == 1)
3096 if (
IS_IRAP(
s) &&
s->no_rasl_output_flag) {
3097 if (
s->sei.common.mastering_display.present > 0)
3098 s->sei.common.mastering_display.present--;
3100 if (
s->sei.common.content_light.present > 0)
3101 s->sei.common.content_light.present--;
3106 sps->bit_depth,
sps->bit_depth_chroma,
3107 s->cur_frame->poc );
3111 if (
s->sei.timecode.present) {
3116 sizeof(uint32_t) * 4, &tcside);
3121 tc_sd = (uint32_t*)tcside->
data;
3122 tc_sd[0] =
s->sei.timecode.num_clock_ts;
3124 for (
int i = 0;
i < tc_sd[0];
i++) {
3125 int drop =
s->sei.timecode.cnt_dropped_flag[
i];
3126 int hh =
s->sei.timecode.hours_value[
i];
3127 int mm =
s->sei.timecode.minutes_value[
i];
3128 int ss =
s->sei.timecode.seconds_value[
i];
3129 int ff =
s->sei.timecode.n_frames[
i];
3137 s->sei.timecode.num_clock_ts = 0;
3140 if (
s->sei.common.itut_t35.hdr_plus) {
3161 if (
s->sei.common.itut_t35.hdr_vivid) {
3164 &
s->sei.common.itut_t35.hdr_vivid,
3176 for (
int i = nal_idx;
i <
s->pkt.nb_nals;
i++) {
3178 const int layer_id =
nal->nuh_layer_id;
3182 !(
s->layers_active_decode & (1 <<
s->vps->layer_idx[layer_id])))
3185 switch (
nal->type) {
3219 const HEVCPPS *
const pps =
s->ps.pps_list[
s->sh.pps_id];
3221 int pic_size_in_ctb = ((
sps->width >>
sps->log2_min_cb_size) + 1) *
3222 ((
sps->height >>
sps->log2_min_cb_size) + 1);
3223 int new_sequence = (l == &
s->layers[0]) &&
3225 int prev_layers_active_decode =
s->layers_active_decode;
3226 int prev_layers_active_output =
s->layers_active_output;
3229 if (
sps->vps !=
s->vps && l != &
s->layers[0]) {
3237 const HEVCSPS *sps_base =
s->layers[0].sps;
3240 if (l != &
s->layers[0]) {
3243 "Access unit starts with a non-base layer frame\n");
3252 !
sps->vui.common.video_signal_type_present_flag)
3265 "Base/non-base layer SPS have unsupported parameter combination\n");
3276 if (l == &
s->layers[0]) {
3292 memset(l->
is_pcm, 0, (
sps->min_pu_width + 1) * (
sps->min_pu_height + 1));
3299 s->first_nal_type =
s->nal_unit_type;
3309 s->sei.recovery_point.has_recovery_poc) {
3311 s->recovery_poc =
s->poc +
s->sei.recovery_point.recovery_poc_cnt;
3312 else if (
s->poc >=
s->recovery_poc)
3317 if (
s->temporal_id == 0 &&
3325 s->poc_tid0 =
s->poc;
3327 if (
pps->tiles_enabled_flag)
3328 s->local_ctx[0].end_of_tiles_x =
pps->column_width[0] <<
sps->log2_ctb_size;
3332 0, 0,
s->sh.no_output_of_prior_pics_flag);
3356 s->cur_frame->needs_fg = ((
s->sei.common.film_grain_characteristics &&
3357 s->sei.common.film_grain_characteristics->present) ||
3358 s->sei.common.itut_t35.aom_film_grain.enable) &&
3366 if (
s->cur_frame->needs_fg &&
3367 (
s->sei.common.film_grain_characteristics &&
s->sei.common.film_grain_characteristics->present &&
3369 s->cur_frame->f->format) ||
3372 "Unsupported film grain parameters. Ignoring film grain.\n");
3373 s->cur_frame->needs_fg = 0;
3376 if (
s->cur_frame->needs_fg) {
3377 s->cur_frame->frame_grain->format =
s->cur_frame->f->format;
3378 s->cur_frame->frame_grain->width =
s->cur_frame->f->width;
3379 s->cur_frame->frame_grain->height =
s->cur_frame->f->height;
3388 s->cur_frame->f->pict_type = 3 -
s->sh.slice_type;
3391 sps->temporal_layer[
sps->max_sub_layers - 1].num_reorder_pics,
3392 sps->temporal_layer[
sps->max_sub_layers - 1].max_dec_pic_buffering, 0);
3396 if (
s->avctx->hwaccel) {
3408 if (l == &
s->layers[0])
3411 if (nal_idx >=
s->finish_setup_nal_idx)
3420 s->cur_frame =
s->collocated_ref =
NULL;
3427 char msg_buf[4 * (50 + 2 * 2 * 16 )];
3435 pixel_shift =
desc->comp[0].depth > 8;
3440 if (pixel_shift && !
s->checksum_buf) {
3443 frame->linesize[2]));
3444 if (!
s->checksum_buf)
3451 int width =
s->avctx->coded_width;
3452 int height =
s->avctx->coded_height;
3458 for (j = 0; j <
h; j++) {
3462 s->bdsp.bswap16_buf((uint16_t *)
s->checksum_buf,
3463 (
const uint16_t *)
src,
w);
3464 src =
s->checksum_buf;
3471 #define MD5_PRI "%016" PRIx64 "%016" PRIx64
3472 #define MD5_PRI_ARG(buf) AV_RB64(buf), AV_RB64((const uint8_t*)(buf) + 8)
3474 if (!memcmp(
md5,
s->sei.picture_hash.md5[
i], 16)) {
3476 "plane %d - correct " MD5_PRI "; ",
3480 "mismatching checksum of plane %d - " MD5_PRI " != " MD5_PRI "; ",
3487 "Verifying checksum for frame with POC %d: %s\n",
3499 if (
out->needs_fg) {
3502 switch (fgp->
type) {
3516 if (
s->avctx->hwaccel) {
3520 "hardware accelerator failed to decode picture\n");
3525 s->sei.picture_hash.is_md5) {
3531 s->sei.picture_hash.is_md5 = 0;
3534 l -
s->layers,
s->poc);
3541 const int layer_idx =
s->vps ?
s->vps->layer_idx[
s->nuh_layer_id] : 0;
3548 if (layer_idx < 0 ||
3549 (
s->nuh_layer_id > 0 && !(
s->layers_active_decode & (1 << layer_idx))))
3556 s->slice_initialized = 0;
3565 s->no_rasl_output_flag)) {
3570 if (
s->cur_layer != layer_idx &&
3571 s->layers[
s->cur_layer].cur_frame &&
3575 s->cur_layer = layer_idx;
3576 l = &
s->layers[
s->cur_layer];
3578 if (
s->sh.first_slice_in_pic_flag) {
3580 av_log(
s->avctx,
AV_LOG_ERROR,
"Two slices reporting being the first in the same frame.\n");
3592 if (
s->nal_unit_type !=
s->first_nal_type) {
3594 "Non-matching NAL types of the VCL NALUs: %d %d\n",
3595 s->first_nal_type,
s->nal_unit_type);
3612 s->nal_unit_type =
nal->type;
3613 s->nuh_layer_id =
nal->nuh_layer_id;
3614 s->temporal_id =
nal->temporal_id;
3623 nal->type,
nal->raw_data,
nal->raw_size);
3628 switch (
s->nal_unit_type) {
3636 nal->nuh_layer_id,
s->apply_defdispwin);
3680 "Skipping NAL unit %d\n",
s->nal_unit_type);
3688 "Skipping invalid undecodable NALU: %d\n",
s->nal_unit_type);
3697 s->sei.recovery_point.has_recovery_poc = 0;
3703 int eos_at_start = 1;
3706 s->cur_frame =
s->collocated_ref =
NULL;
3707 s->last_eos =
s->eos;
3709 s->slice_initialized = 0;
3721 s->nal_length_size,
s->avctx->codec_id,
flags);
3724 "Error splitting the input into NAL units.\n");
3728 for (
int i = 0;
i <
s->pkt.nb_nals;
i++) {
3751 for (
int i =
s->pkt.nb_nals - 1;
i > 0 ;
i--) {
3753 && !
s->pkt.nals[
i].nuh_layer_id && !
s->pkt.nals[
i].temporal_id) {
3754 rpu_nal = &
s->pkt.nals[
i];
3762 av_log(
s->avctx,
AV_LOG_WARNING,
"Multiple Dolby Vision RPUs found in one AU. Skipping previous.\n");
3773 s->avctx->err_recognition);
3782 for (
int i = 0;
i <
s->pkt.nb_nals;
i++) {
3792 "Error parsing NAL unit #%d.\n",
i);
3819 &
s->nal_length_size,
s->avctx->err_recognition,
3820 s->apply_defdispwin,
s->avctx);
3826 if (
first &&
s->ps.sps_list[
i]) {
3865 s->layers_active_output, 0, 0, 0);
3872 s->pkt_dts = avpkt->
dts;
3875 if (sd && sd_size > 0) {
3882 if (sd && sd_size >=
sizeof(
s->dovi_ctx.cfg)) {
3883 int old =
s->dovi_ctx.cfg.dv_profile;
3887 "New DOVI configuration record from input packet (profile %d -> %u).\n",
3888 old,
s->dovi_ctx.cfg.dv_profile);
3912 if (
src->needs_fg) {
3925 dst->nb_rpl_elems =
src->nb_rpl_elems;
3928 dst->ctb_count =
src->ctb_count;
3931 dst->base_layer_frame =
src->base_layer_frame;
3934 src->hwaccel_picture_private);
3968 for (
int i = 0;
i <
s->nb_wpp_progress;
i++)
3994 s->nb_local_ctx = 1;
3996 s->local_ctx[0].parent =
s;
3997 s->local_ctx[0].logctx = avctx;
3998 s->local_ctx[0].common_cabac_state = &
s->cabac;
4001 if (!
s->output_fifo)
4019 s->dovi_ctx.logctx = avctx;
4078 memcmp(
s->view_ids, s0->
view_ids,
sizeof(*
s->view_ids) *
s->nb_view_ids)) {
4125 if (
sei->tdrdi.present) {
4139 tdrdi->prec_ref_display_width =
sei->tdrdi.prec_ref_display_width;
4140 tdrdi->ref_viewing_distance_flag =
sei->tdrdi.ref_viewing_distance_flag;
4141 tdrdi->prec_ref_viewing_dist =
sei->tdrdi.prec_ref_viewing_dist;
4142 tdrdi->num_ref_displays =
sei->tdrdi.num_ref_displays;
4143 for (
int i = 0;
i <
sei->tdrdi.num_ref_displays;
i++) {
4179 s->sei.picture_timing.picture_struct = 0;
4199 if (sd && sd->
size >=
sizeof(
s->dovi_ctx.cfg))
4219 #define OFFSET(x) offsetof(HEVCContext, x)
4220 #define PAR (AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
4223 {
"apply_defdispwin",
"Apply default display window from VUI",
OFFSET(apply_defdispwin),
4225 {
"strict-displaywin",
"strictly apply default display window size",
OFFSET(apply_defdispwin),
4227 {
"view_ids",
"Array of view IDs that should be decoded and output; a single -1 to decode all views",
4229 .min = -1, .max = INT_MAX, .flags =
PAR },
4230 {
"view_ids_available",
"Array of available view IDs is exported here",
4233 {
"view_pos_available",
"Array of view positions for view_ids_available is exported here, as AVStereo3DView",
4269 #if CONFIG_HEVC_DXVA2_HWACCEL
4272 #if CONFIG_HEVC_D3D11VA_HWACCEL
4275 #if CONFIG_HEVC_D3D11VA2_HWACCEL
4278 #if CONFIG_HEVC_D3D12VA_HWACCEL
4281 #if CONFIG_HEVC_NVDEC_HWACCEL
4284 #if CONFIG_HEVC_NVDEC_CUARRAY_HWACCEL
4287 #if CONFIG_HEVC_VAAPI_HWACCEL
4290 #if CONFIG_HEVC_VDPAU_HWACCEL
4293 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
4296 #if CONFIG_HEVC_VULKAN_HWACCEL