26 #include "config_components.h"
59 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 };
90 for (
int i = 0;
i < 3;
i++) {
102 int log2_min_cb_size =
sps->log2_min_cb_size;
105 int pic_size_in_ctb = ((
width >> log2_min_cb_size) + 1) *
106 ((
height >> log2_min_cb_size) + 1);
107 int ctb_count =
sps->ctb_width *
sps->ctb_height;
108 int min_pu_size =
sps->min_pu_width *
sps->min_pu_height;
147 if (
sps->sao_enabled) {
148 int c_count = (
sps->chroma_format_idc != 0) ? 3 : 1;
150 for (
int c_idx = 0; c_idx < c_count; c_idx++) {
151 int w =
sps->width >>
sps->hshift[c_idx];
152 int h =
sps->height >>
sps->vshift[c_idx];
177 uint8_t luma_weight_l0_flag[16];
178 uint8_t chroma_weight_l0_flag[16];
179 uint8_t luma_weight_l1_flag[16];
180 uint8_t chroma_weight_l1_flag[16];
181 int luma_log2_weight_denom;
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);
200 if (!luma_weight_l0_flag[
i]) {
205 if (
sps->chroma_format_idc != 0) {
210 chroma_weight_l0_flag[
i] = 0;
213 if (luma_weight_l0_flag[
i]) {
215 if ((int8_t)delta_luma_weight_l0 != delta_luma_weight_l0)
220 if (chroma_weight_l0_flag[
i]) {
221 for (j = 0; j < 2; j++) {
225 if ( (int8_t)delta_chroma_weight_l0 != delta_chroma_weight_l0
226 || delta_chroma_offset_l0 < -(1<<17) || delta_chroma_offset_l0 > (1<<17)) {
244 if (!luma_weight_l1_flag[
i]) {
249 if (
sps->chroma_format_idc != 0) {
254 chroma_weight_l1_flag[
i] = 0;
257 if (luma_weight_l1_flag[
i]) {
259 if ((int8_t)delta_luma_weight_l1 != delta_luma_weight_l1)
264 if (chroma_weight_l1_flag[
i]) {
265 for (j = 0; j < 2; j++) {
269 if ( (int8_t)delta_chroma_weight_l1 != delta_chroma_weight_l1
270 || delta_chroma_offset_l1 < -(1<<17) || delta_chroma_offset_l1 > (1<<17)) {
292 int max_poc_lsb = 1 <<
sps->log2_max_poc_lsb;
293 int prev_delta_msb = 0;
294 unsigned int nb_sps = 0, nb_sh;
298 if (!
sps->long_term_ref_pics_present)
301 if (
sps->num_long_term_ref_pics_sps > 0)
305 if (nb_sps >
sps->num_long_term_ref_pics_sps)
315 uint8_t lt_idx_sps = 0;
317 if (
sps->num_long_term_ref_pics_sps > 1)
320 rps->
poc[
i] =
sps->lt_ref_pic_poc_lsb_sps[lt_idx_sps];
321 rps->
used[
i] = !!(
sps->used_by_curr_pic_lt & (1
U << lt_idx_sps));
332 if (
i &&
i != nb_sps)
333 delta += prev_delta_msb;
335 poc = rps->
poc[
i] + cur_poc -
delta * max_poc_lsb - poc_lsb;
339 prev_delta_msb =
delta;
351 unsigned int num = 0, den = 0;
359 avctx->
profile =
sps->ptl.general_ptl.profile_idc;
360 avctx->
level =
sps->ptl.general_ptl.level_idc;
364 if (
sps->vui.common.video_signal_type_present_flag)
370 if (
sps->vui.common.colour_description_present_flag) {
372 avctx->
color_trc =
sps->vui.common.transfer_characteristics;
381 if (
sps->chroma_format_idc == 1) {
382 if (
sps->vui.common.chroma_loc_info_present_flag) {
383 if (
sps->vui.common.chroma_sample_loc_type_top_field <= 5)
389 if (
vps->vps_timing_info_present_flag) {
390 num =
vps->vps_num_units_in_tick;
391 den =
vps->vps_time_scale;
392 }
else if (
sps->vui.vui_timing_info_present_flag) {
393 num =
sps->vui.vui_num_units_in_tick;
394 den =
sps->vui.vui_time_scale;
397 if (num > 0 && den > 0)
406 #if FF_API_CODEC_PROPS
408 if (
s->sei.common.a53_caption.buf_ref)
413 if (
s->sei.common.alternative_transfer.present &&
416 avctx->
color_trc =
s->sei.common.alternative_transfer.preferred_transfer_characteristics;
419 #if FF_API_CODEC_PROPS
421 if ((
s->sei.common.film_grain_characteristics &&
s->sei.common.film_grain_characteristics->present) ||
422 s->sei.common.aom_film_grain.enable)
435 s->nb_view_ids_available = 0;
437 s->nb_view_pos_available = 0;
440 if (
vps->nb_layers < 2 && !
vps->view_id[0])
443 s->view_ids_available =
av_calloc(
vps->nb_layers,
sizeof(*
s->view_ids_available));
444 if (!
s->view_ids_available)
448 s->view_pos_available =
av_calloc(
vps->nb_layers,
sizeof(*
s->view_pos_available));
449 if (!
s->view_pos_available)
453 for (
int i = 0;
i <
vps->nb_layers;
i++) {
454 s->view_ids_available[
i] =
vps->view_id[
i];
456 if (
s->view_pos_available) {
463 s->nb_view_ids_available =
vps->nb_layers;
464 s->nb_view_pos_available =
s->view_pos_available ?
vps->nb_layers : 0;
474 if (
vps->nb_layers != 2 || !
vps->layer_id_in_nuh[1])
490 unsigned layers_active_output = 0, highest_layer;
492 s->layers_active_output = 1;
493 s->layers_active_decode = 1;
501 s->layers_active_decode = (1 <<
vps->nb_layers) - 1;
502 s->layers_active_output = 1;
511 if (
s->nb_view_ids == 1 &&
s->view_ids[0] == -1) {
512 layers_active_output = (1 <<
vps->nb_layers) - 1;
514 for (
int i = 0;
i <
s->nb_view_ids;
i++) {
515 int view_id =
s->view_ids[
i];
520 "Invalid view ID requested: %d\n", view_id);
524 for (
int j = 0; j <
vps->nb_layers; j++) {
525 if (
vps->view_id[j] == view_id) {
532 "View ID %d not present in VPS\n", view_id);
535 layers_active_output |= 1 << layer_idx;
539 if (!layers_active_output) {
544 highest_layer =
ff_log2(layers_active_output);
547 "Too many layers requested: %u\n", layers_active_output);
555 s->layers_active_decode = (1 << (highest_layer + 1)) - 1;
556 s->layers_active_output = layers_active_output;
559 s->layers_active_decode,
s->layers_active_output);
594 #define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \
595 CONFIG_HEVC_D3D11VA_HWACCEL * 2 + \
596 CONFIG_HEVC_D3D12VA_HWACCEL + \
597 CONFIG_HEVC_NVDEC_HWACCEL + \
598 CONFIG_HEVC_VAAPI_HWACCEL + \
599 CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \
600 CONFIG_HEVC_VDPAU_HWACCEL + \
601 CONFIG_HEVC_VULKAN_HWACCEL)
609 switch (
sps->pix_fmt) {
612 #if CONFIG_HEVC_DXVA2_HWACCEL
615 #if CONFIG_HEVC_D3D11VA_HWACCEL
619 #if CONFIG_HEVC_D3D12VA_HWACCEL
622 #if CONFIG_HEVC_VAAPI_HWACCEL
625 #if CONFIG_HEVC_VDPAU_HWACCEL
628 #if CONFIG_HEVC_NVDEC_HWACCEL
631 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
634 #if CONFIG_HEVC_VULKAN_HWACCEL
639 #if CONFIG_HEVC_DXVA2_HWACCEL
642 #if CONFIG_HEVC_D3D11VA_HWACCEL
646 #if CONFIG_HEVC_D3D12VA_HWACCEL
649 #if CONFIG_HEVC_VAAPI_HWACCEL
652 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
655 #if CONFIG_HEVC_VULKAN_HWACCEL
658 #if CONFIG_HEVC_VDPAU_HWACCEL
661 #if CONFIG_HEVC_NVDEC_HWACCEL
666 #if CONFIG_HEVC_VAAPI_HWACCEL
669 #if CONFIG_HEVC_VDPAU_HWACCEL
672 #if CONFIG_HEVC_NVDEC_HWACCEL
675 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
678 #if CONFIG_HEVC_VULKAN_HWACCEL
684 #if CONFIG_HEVC_VAAPI_HWACCEL
687 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
690 #if CONFIG_HEVC_VULKAN_HWACCEL
693 #if CONFIG_HEVC_NVDEC_HWACCEL
698 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
704 #if CONFIG_HEVC_VAAPI_HWACCEL
707 #if CONFIG_HEVC_VDPAU_HWACCEL
710 #if CONFIG_HEVC_VULKAN_HWACCEL
713 #if CONFIG_HEVC_NVDEC_HWACCEL
718 #if CONFIG_HEVC_VAAPI_HWACCEL
721 #if CONFIG_HEVC_VULKAN_HWACCEL
724 #if CONFIG_HEVC_NVDEC_HWACCEL
732 *fmt++ =
sps->pix_fmt;
744 s->avctx->pix_fmt =
ret;
789 unsigned pps_id, layer_idx;
810 pps =
s->ps.pps_list[pps_id];
813 layer_idx =
vps->layer_idx[
s->nuh_layer_id];
820 int slice_address_length;
822 if (
pps->dependent_slice_segments_enabled_flag)
834 "Invalid slice segment address: %u.\n",
847 for (
i = 0;
i <
pps->num_extra_slice_header_bits;
i++)
859 !
pps->pps_curr_pic_ref_enabled_flag &&
860 s->nuh_layer_id == 0) {
867 if (
pps->output_flag_present_flag)
870 if (
sps->separate_colour_plane)
874 (
s->nuh_layer_id > 0 &&
875 !(
vps->poc_lsb_not_present & (1 << layer_idx)))) {
882 "Ignoring POC change between slices: %d -> %d\n", poc, sh->
poc);
902 int numbits, rps_idx;
904 if (!
sps->nb_st_rps) {
910 rps_idx = numbits > 0 ?
get_bits(gb, numbits) : 0;
924 if (
sps->temporal_mvp_enabled)
939 if (
s->nuh_layer_id > 0) {
940 int num_direct_ref_layers =
vps->num_direct_ref_layers[layer_idx];
942 if (
vps->default_ref_layers_active)
944 else if (num_direct_ref_layers) {
949 "NumDirectRefLayers>1 not supported\n");
955 if (
sps->sao_enabled) {
957 if (
sps->chroma_format_idc) {
994 if (
pps->lists_modification_present_flag && nb_refs > 1) {
1012 if (
pps->cabac_init_present_flag)
1027 "Invalid collocated_ref_idx: %d.\n",
1044 "Invalid number of merging MVP candidates: %d.\n",
1050 if (
sps->motion_vector_resolution_control_idc == 2)
1060 if (
pps->pic_slice_level_chroma_qp_offsets_present_flag) {
1073 if (
pps->pps_slice_act_qp_offsets_present_flag) {
1079 if (
pps->chroma_qp_offset_list_enabled_flag)
1084 if (
pps->deblocking_filter_control_present_flag) {
1085 int deblocking_filter_override_flag = 0;
1087 if (
pps->deblocking_filter_override_enabled_flag)
1088 deblocking_filter_override_flag =
get_bits1(gb);
1090 if (deblocking_filter_override_flag) {
1095 if (beta_offset_div2 < -6 || beta_offset_div2 > 6 ||
1096 tc_offset_div2 < -6 || tc_offset_div2 > 6) {
1098 "Invalid deblock filter offsets: %d, %d\n",
1099 beta_offset_div2, tc_offset_div2);
1116 if (
pps->seq_loop_filter_across_slices_enabled_flag &&
1127 if (
pps->tiles_enabled_flag ||
pps->entropy_coding_sync_enabled_flag) {
1131 av_log(
s->avctx,
AV_LOG_ERROR,
"num_entry_point_offsets %d is invalid\n", num_entry_point_offsets);
1139 if (offset_len < 1 || offset_len > 32) {
1163 if (
pps->slice_header_extension_present_flag) {
1169 for (
i = 0;
i < length;
i++)
1185 "The slice_qp %d is outside the valid range "
1188 -
sps->qp_bd_offset);
1209 #define CTB(tab, x, y) ((tab)[(y) * sps->ctb_width + (x)])
1211 #define SET_SAO(elem, value) \
1213 if (!sao_merge_up_flag && !sao_merge_left_flag) \
1214 sao->elem = value; \
1215 else if (sao_merge_left_flag) \
1216 sao->elem = CTB(l->sao, rx-1, ry).elem; \
1217 else if (sao_merge_up_flag) \
1218 sao->elem = CTB(l->sao, rx, ry-1).elem; \
1228 int sao_merge_left_flag = 0;
1229 int sao_merge_up_flag = 0;
1233 if (
s->sh.slice_sample_adaptive_offset_flag[0] ||
1234 s->sh.slice_sample_adaptive_offset_flag[1]) {
1239 if (ry > 0 && !sao_merge_left_flag) {
1245 for (c_idx = 0; c_idx < (
sps->chroma_format_idc ? 3 : 1); c_idx++) {
1246 int log2_sao_offset_scale = c_idx == 0 ?
pps->log2_sao_offset_scale_luma :
1247 pps->log2_sao_offset_scale_chroma;
1249 if (!
s->sh.slice_sample_adaptive_offset_flag[c_idx]) {
1264 for (
i = 0;
i < 4;
i++)
1268 for (
i = 0;
i < 4;
i++) {
1277 }
else if (c_idx != 2) {
1283 for (
i = 0;
i < 4;
i++) {
1291 sao->
offset_val[c_idx][
i + 1] *= 1 << log2_sao_offset_scale;
1303 if (log2_res_scale_abs_plus1 != 0) {
1306 (1 - 2 * res_scale_sign_flag);
1319 int xBase,
int yBase,
int cb_xBase,
int cb_yBase,
1320 int log2_cb_size,
int log2_trafo_size,
1321 int blk_idx,
int cbf_luma,
int *cbf_cb,
int *cbf_cr)
1324 const int log2_trafo_size_c = log2_trafo_size -
sps->hshift[1];
1328 int trafo_size = 1 << log2_trafo_size;
1331 s->hpc.intra_pred[log2_trafo_size - 2](lc,
pps, x0, y0, 0);
1334 if (cbf_luma || cbf_cb[0] || cbf_cr[0] ||
1335 (
sps->chroma_format_idc == 2 && (cbf_cb[1] || cbf_cr[1]))) {
1338 int cbf_chroma = cbf_cb[0] || cbf_cr[0] ||
1339 (
sps->chroma_format_idc == 2 &&
1340 (cbf_cb[1] || cbf_cr[1]));
1352 "The cu_qp_delta %d is outside the valid range "
1355 -(26 +
sps->qp_bd_offset / 2),
1356 (25 +
sps->qp_bd_offset / 2));
1363 if (
s->sh.cu_chroma_qp_offset_enabled_flag && cbf_chroma &&
1366 if (cu_chroma_qp_offset_flag) {
1367 int cu_chroma_qp_offset_idx = 0;
1368 if (
pps->chroma_qp_offset_list_len_minus1 > 0) {
1371 "cu_chroma_qp_offset_idx not yet tested.\n");
1404 if (
sps->chroma_format_idc && (log2_trafo_size > 2 ||
sps->chroma_format_idc == 3)) {
1405 int trafo_size_h = 1 << (log2_trafo_size_c +
sps->hshift[1]);
1406 int trafo_size_v = 1 << (log2_trafo_size_c +
sps->vshift[1]);
1407 lc->
tu.
cross_pf = (
pps->cross_component_prediction_enabled_flag && cbf_luma &&
1414 for (
i = 0;
i < (
sps->chroma_format_idc == 2 ? 2 : 1);
i++) {
1417 trafo_size_h, trafo_size_v,
sps->log2_ctb_size);
1418 s->hpc.intra_pred[log2_trafo_size_c - 2](lc,
pps, x0, y0 + (
i << log2_trafo_size_c), 1);
1422 log2_trafo_size_c, scan_idx_c, 1);
1425 ptrdiff_t
stride =
s->cur_frame->f->linesize[1];
1426 int hshift =
sps->hshift[1];
1430 int size = 1 << log2_trafo_size_c;
1433 ((x0 >> hshift) <<
sps->pixel_shift)];
1437 s->hevcdsp.add_residual[log2_trafo_size_c-2](
dst, coeffs,
stride);
1444 for (
i = 0;
i < (
sps->chroma_format_idc == 2 ? 2 : 1);
i++) {
1447 trafo_size_h, trafo_size_v,
sps->log2_ctb_size);
1448 s->hpc.intra_pred[log2_trafo_size_c - 2](lc,
pps, x0, y0 + (
i << log2_trafo_size_c), 2);
1452 log2_trafo_size_c, scan_idx_c, 2);
1455 ptrdiff_t
stride =
s->cur_frame->f->linesize[2];
1456 int hshift =
sps->hshift[2];
1460 int size = 1 << log2_trafo_size_c;
1463 ((x0 >> hshift) <<
sps->pixel_shift)];
1467 s->hevcdsp.add_residual[log2_trafo_size_c-2](
dst, coeffs,
stride);
1470 }
else if (
sps->chroma_format_idc && blk_idx == 3) {
1471 int trafo_size_h = 1 << (log2_trafo_size + 1);
1472 int trafo_size_v = 1 << (log2_trafo_size +
sps->vshift[1]);
1473 for (
i = 0;
i < (
sps->chroma_format_idc == 2 ? 2 : 1);
i++) {
1476 trafo_size_h, trafo_size_v,
sps->log2_ctb_size);
1477 s->hpc.intra_pred[log2_trafo_size - 2](lc,
pps, xBase, yBase + (
i << log2_trafo_size), 1);
1481 log2_trafo_size, scan_idx_c, 1);
1483 for (
i = 0;
i < (
sps->chroma_format_idc == 2 ? 2 : 1);
i++) {
1486 trafo_size_h, trafo_size_v,
sps->log2_ctb_size);
1487 s->hpc.intra_pred[log2_trafo_size - 2](lc,
pps, xBase, yBase + (
i << log2_trafo_size), 2);
1491 log2_trafo_size, scan_idx_c, 2);
1495 if (log2_trafo_size > 2 ||
sps->chroma_format_idc == 3) {
1496 int trafo_size_h = 1 << (log2_trafo_size_c +
sps->hshift[1]);
1497 int trafo_size_v = 1 << (log2_trafo_size_c +
sps->vshift[1]);
1499 sps->log2_ctb_size);
1500 s->hpc.intra_pred[log2_trafo_size_c - 2](lc,
pps, x0, y0, 1);
1501 s->hpc.intra_pred[log2_trafo_size_c - 2](lc,
pps, x0, y0, 2);
1502 if (
sps->chroma_format_idc == 2) {
1504 trafo_size_h, trafo_size_v,
sps->log2_ctb_size);
1505 s->hpc.intra_pred[log2_trafo_size_c - 2](lc,
pps, x0, y0 + (1 << log2_trafo_size_c), 1);
1506 s->hpc.intra_pred[log2_trafo_size_c - 2](lc,
pps, x0, y0 + (1 << log2_trafo_size_c), 2);
1508 }
else if (blk_idx == 3) {
1509 int trafo_size_h = 1 << (log2_trafo_size + 1);
1510 int trafo_size_v = 1 << (log2_trafo_size +
sps->vshift[1]);
1512 trafo_size_h, trafo_size_v,
sps->log2_ctb_size);
1513 s->hpc.intra_pred[log2_trafo_size - 2](lc,
pps, xBase, yBase, 1);
1514 s->hpc.intra_pred[log2_trafo_size - 2](lc,
pps, xBase, yBase, 2);
1515 if (
sps->chroma_format_idc == 2) {
1517 trafo_size_h, trafo_size_v,
sps->log2_ctb_size);
1518 s->hpc.intra_pred[log2_trafo_size - 2](lc,
pps, xBase, yBase + (1 << log2_trafo_size), 1);
1519 s->hpc.intra_pred[log2_trafo_size - 2](lc,
pps, xBase, yBase + (1 << log2_trafo_size), 2);
1528 int x0,
int y0,
int log2_cb_size)
1530 int cb_size = 1 << log2_cb_size;
1531 int log2_min_pu_size =
sps->log2_min_pu_size;
1533 int min_pu_width =
sps->min_pu_width;
1534 int x_end =
FFMIN(x0 + cb_size,
sps->width);
1535 int y_end =
FFMIN(y0 + cb_size,
sps->height);
1538 for (j = (y0 >> log2_min_pu_size); j < (y_end >> log2_min_pu_size); j++)
1539 for (
i = (x0 >> log2_min_pu_size);
i < (x_end >> log2_min_pu_size);
i++)
1540 is_pcm[
i + j * min_pu_width] = 2;
1547 int xBase,
int yBase,
int cb_xBase,
int cb_yBase,
1548 int log2_cb_size,
int log2_trafo_size,
1549 int trafo_depth,
int blk_idx,
1550 const int *base_cbf_cb,
const int *base_cbf_cr)
1553 uint8_t split_transform_flag;
1558 cbf_cb[0] = base_cbf_cb[0];
1559 cbf_cb[1] = base_cbf_cb[1];
1560 cbf_cr[0] = base_cbf_cr[0];
1561 cbf_cr[1] = base_cbf_cr[1];
1564 if (trafo_depth == 1) {
1566 if (
sps->chroma_format_idc == 3) {
1580 if (log2_trafo_size <= sps->log2_max_trafo_size &&
1581 log2_trafo_size >
sps->log2_min_tb_size &&
1582 trafo_depth < lc->cu.max_trafo_depth &&
1586 int inter_split =
sps->max_transform_hierarchy_depth_inter == 0 &&
1591 split_transform_flag = log2_trafo_size >
sps->log2_max_trafo_size ||
1596 if (
sps->chroma_format_idc && (log2_trafo_size > 2 ||
sps->chroma_format_idc == 3)) {
1597 if (trafo_depth == 0 || cbf_cb[0]) {
1599 if (
sps->chroma_format_idc == 2 && (!split_transform_flag || log2_trafo_size == 3)) {
1604 if (trafo_depth == 0 || cbf_cr[0]) {
1606 if (
sps->chroma_format_idc == 2 && (!split_transform_flag || log2_trafo_size == 3)) {
1612 if (split_transform_flag) {
1613 const int trafo_size_split = 1 << (log2_trafo_size - 1);
1614 const int x1 = x0 + trafo_size_split;
1615 const int y1 = y0 + trafo_size_split;
1617 #define SUBDIVIDE(x, y, idx) \
1619 ret = hls_transform_tree(lc, l, pps, sps, \
1620 x, y, x0, y0, cb_xBase, cb_yBase, log2_cb_size, \
1621 log2_trafo_size - 1, trafo_depth + 1, idx, \
1634 int min_tu_size = 1 <<
sps->log2_min_tb_size;
1635 int log2_min_tu_size =
sps->log2_min_tb_size;
1636 int min_tu_width =
sps->min_tb_width;
1640 cbf_cb[0] || cbf_cr[0] ||
1641 (
sps->chroma_format_idc == 2 && (cbf_cb[1] || cbf_cr[1]))) {
1646 x0, y0, xBase, yBase, cb_xBase, cb_yBase,
1647 log2_cb_size, log2_trafo_size,
1648 blk_idx, cbf_luma, cbf_cb, cbf_cr);
1654 for (
i = 0;
i < (1 << log2_trafo_size);
i += min_tu_size)
1655 for (j = 0; j < (1 << log2_trafo_size); j += min_tu_size) {
1656 int x_tu = (x0 + j) >> log2_min_tu_size;
1657 int y_tu = (y0 +
i) >> log2_min_tu_size;
1658 l->
cbf_luma[y_tu * min_tu_width + x_tu] = 1;
1661 if (!
s->sh.disable_deblocking_filter_flag) {
1663 if (
pps->transquant_bypass_enable_flag &&
1672 const HEVCPPS *
pps,
int x0,
int y0,
int log2_cb_size)
1677 int cb_size = 1 << log2_cb_size;
1678 ptrdiff_t stride0 =
s->cur_frame->f->linesize[0];
1679 ptrdiff_t stride1 =
s->cur_frame->f->linesize[1];
1680 ptrdiff_t stride2 =
s->cur_frame->f->linesize[2];
1681 uint8_t *dst0 = &
s->cur_frame->f->data[0][y0 * stride0 + (x0 <<
sps->pixel_shift)];
1682 uint8_t *dst1 = &
s->cur_frame->f->data[1][(y0 >>
sps->vshift[1]) * stride1 + ((x0 >>
sps->hshift[1]) <<
sps->pixel_shift)];
1683 uint8_t *dst2 = &
s->cur_frame->f->data[2][(y0 >>
sps->vshift[2]) * stride2 + ((x0 >>
sps->hshift[2]) <<
sps->pixel_shift)];
1685 int length = cb_size * cb_size *
sps->pcm.bit_depth +
1686 (((cb_size >>
sps->hshift[1]) * (cb_size >>
sps->vshift[1])) +
1687 ((cb_size >>
sps->hshift[2]) * (cb_size >>
sps->vshift[2]))) *
1688 sps->pcm.bit_depth_chroma;
1689 const uint8_t *pcm =
skip_bytes(&lc->
cc, (length + 7) >> 3);
1692 if (!
s->sh.disable_deblocking_filter_flag)
1699 s->hevcdsp.put_pcm(dst0, stride0, cb_size, cb_size, &gb,
sps->pcm.bit_depth);
1700 if (
sps->chroma_format_idc) {
1701 s->hevcdsp.put_pcm(dst1, stride1,
1702 cb_size >>
sps->hshift[1],
1703 cb_size >>
sps->vshift[1],
1704 &gb,
sps->pcm.bit_depth_chroma);
1705 s->hevcdsp.put_pcm(dst2, stride2,
1706 cb_size >>
sps->hshift[2],
1707 cb_size >>
sps->vshift[2],
1708 &gb,
sps->pcm.bit_depth_chroma);
1732 uint8_t *
dst, ptrdiff_t dststride,
1734 int block_w,
int block_h,
int luma_weight,
int luma_offset)
1737 const uint8_t *
src =
ref->data[0];
1739 int pic_width =
sps->width;
1740 int pic_height =
sps->height;
1743 int weight_flag = (
s->sh.slice_type ==
HEVC_SLICE_P &&
pps->weighted_pred_flag) ||
1747 x_off +=
mv->x >> 2;
1748 y_off +=
mv->y >> 2;
1754 ref ==
s->cur_frame->f) {
1764 pic_width, pic_height);
1771 block_h,
mx,
my, block_w);
1774 block_h,
s->sh.luma_log2_weight_denom,
1775 luma_weight, luma_offset,
mx,
my, block_w);
1796 uint8_t *
dst, ptrdiff_t dststride,
1797 const AVFrame *ref0,
const Mv *mv0,
int x_off,
int y_off,
1798 int block_w,
int block_h,
const AVFrame *ref1,
1799 const Mv *mv1,
struct MvField *current_mv)
1802 ptrdiff_t src0stride = ref0->
linesize[0];
1803 ptrdiff_t src1stride = ref1->
linesize[0];
1804 int pic_width =
sps->width;
1805 int pic_height =
sps->height;
1806 int mx0 = mv0->
x & 3;
1807 int my0 = mv0->
y & 3;
1808 int mx1 = mv1->
x & 3;
1809 int my1 = mv1->
y & 3;
1810 int weight_flag = (
s->sh.slice_type ==
HEVC_SLICE_P &&
pps->weighted_pred_flag) ||
1812 int x_off0 = x_off + (mv0->
x >> 2);
1813 int y_off0 = y_off + (mv0->
y >> 2);
1814 int x_off1 = x_off + (mv1->
x >> 2);
1815 int y_off1 = y_off + (mv1->
y >> 2);
1818 const uint8_t *
src0 = ref0->
data[0] + y_off0 * src0stride + (int)((
unsigned)x_off0 <<
sps->pixel_shift);
1819 const uint8_t *
src1 = ref1->
data[0] + y_off1 * src1stride + (int)((
unsigned)x_off1 <<
sps->pixel_shift);
1829 edge_emu_stride, src0stride,
1833 pic_width, pic_height);
1835 src0stride = edge_emu_stride;
1846 edge_emu_stride, src1stride,
1850 pic_width, pic_height);
1852 src1stride = edge_emu_stride;
1855 s->hevcdsp.put_hevc_qpel[idx][!!my0][!!mx0](lc->
tmp,
src0, src0stride,
1856 block_h, mx0, my0, block_w);
1858 s->hevcdsp.put_hevc_qpel_bi[idx][!!my1][!!mx1](
dst, dststride,
src1, src1stride, lc->
tmp,
1859 block_h, mx1, my1, block_w);
1861 s->hevcdsp.put_hevc_qpel_bi_w[idx][!!my1][!!mx1](
dst, dststride,
src1, src1stride, lc->
tmp,
1862 block_h,
s->sh.luma_log2_weight_denom,
1863 s->sh.luma_weight_l0[current_mv->
ref_idx[0]],
1864 s->sh.luma_weight_l1[current_mv->
ref_idx[1]],
1865 s->sh.luma_offset_l0[current_mv->
ref_idx[0]],
1866 s->sh.luma_offset_l1[current_mv->
ref_idx[1]],
1891 ptrdiff_t dststride,
const uint8_t *
src0, ptrdiff_t
srcstride,
int reflist,
1892 int x_off,
int y_off,
int block_w,
int block_h,
1893 const struct MvField *current_mv,
int chroma_weight,
int chroma_offset)
1896 int pic_width =
sps->width >>
sps->hshift[1];
1897 int pic_height =
sps->height >>
sps->vshift[1];
1898 const Mv *
mv = ¤t_mv->
mv[reflist];
1899 int weight_flag = (
s->sh.slice_type ==
HEVC_SLICE_P &&
pps->weighted_pred_flag) ||
1902 int hshift =
sps->hshift[1];
1906 intptr_t _mx =
mx << (1 - hshift);
1908 int emu =
src0 ==
s->cur_frame->f->data[1] ||
src0 ==
s->cur_frame->f->data[2];
1910 x_off +=
mv->x >> (2 + hshift);
1921 (edge_emu_stride + (1 <<
sps->pixel_shift));
1927 pic_width, pic_height);
1934 block_h, _mx, _my, block_w);
1937 block_h,
s->sh.chroma_log2_weight_denom,
1938 chroma_weight, chroma_offset, _mx, _my, block_w);
1960 uint8_t *dst0, ptrdiff_t dststride,
1962 int x_off,
int y_off,
int block_w,
int block_h,
const MvField *current_mv,
int cidx)
1965 const uint8_t *
src1 = ref0->
data[cidx+1];
1966 const uint8_t *
src2 = ref1->
data[cidx+1];
1967 ptrdiff_t src1stride = ref0->
linesize[cidx+1];
1968 ptrdiff_t src2stride = ref1->
linesize[cidx+1];
1969 int weight_flag = (
s->sh.slice_type ==
HEVC_SLICE_P &&
pps->weighted_pred_flag) ||
1971 int pic_width =
sps->width >>
sps->hshift[1];
1972 int pic_height =
sps->height >>
sps->vshift[1];
1973 const Mv *
const mv0 = ¤t_mv->
mv[0];
1974 const Mv *
const mv1 = ¤t_mv->
mv[1];
1975 int hshift =
sps->hshift[1];
1982 intptr_t _mx0 = mx0 << (1 - hshift);
1983 intptr_t _my0 = my0 << (1 -
vshift);
1984 intptr_t _mx1 = mx1 << (1 - hshift);
1985 intptr_t _my1 = my1 << (1 -
vshift);
1987 int x_off0 = x_off + (mv0->
x >> (2 + hshift));
1988 int y_off0 = y_off + (mv0->
y >> (2 +
vshift));
1989 int x_off1 = x_off + (mv1->
x >> (2 + hshift));
1990 int y_off1 = y_off + (mv1->
y >> (2 +
vshift));
1992 src1 += y_off0 * src1stride + (int)((
unsigned)x_off0 <<
sps->pixel_shift);
1993 src2 += y_off1 * src2stride + (int)((
unsigned)x_off1 <<
sps->pixel_shift);
2001 (edge_emu_stride + (1 <<
sps->pixel_shift));
2004 edge_emu_stride, src1stride,
2008 pic_width, pic_height);
2011 src1stride = edge_emu_stride;
2020 (edge_emu_stride + (1 <<
sps->pixel_shift));
2023 edge_emu_stride, src2stride,
2027 pic_width, pic_height);
2030 src2stride = edge_emu_stride;
2033 s->hevcdsp.put_hevc_epel[idx][!!my0][!!mx0](lc->
tmp,
src1, src1stride,
2034 block_h, _mx0, _my0, block_w);
2036 s->hevcdsp.put_hevc_epel_bi[idx][!!my1][!!mx1](dst0,
s->cur_frame->f->linesize[cidx+1],
2038 block_h, _mx1, _my1, block_w);
2040 s->hevcdsp.put_hevc_epel_bi_w[idx][!!my1][!!mx1](dst0,
s->cur_frame->f->linesize[cidx+1],
2043 s->sh.chroma_log2_weight_denom,
2044 s->sh.chroma_weight_l0[current_mv->
ref_idx[0]][cidx],
2045 s->sh.chroma_weight_l1[current_mv->
ref_idx[1]][cidx],
2046 s->sh.chroma_offset_l0[current_mv->
ref_idx[0]][cidx],
2047 s->sh.chroma_offset_l1[current_mv->
ref_idx[1]][cidx],
2048 _mx1, _my1, block_w);
2063 int x0,
int y0,
int nPbW,
2064 int nPbH,
int log2_cb_size,
int part_idx,
2076 if (inter_pred_idc !=
PRED_L1) {
2077 if (
s->sh.nb_refs[
L0])
2084 part_idx, merge_idx,
mv, mvp_flag, 0);
2089 if (inter_pred_idc !=
PRED_L0) {
2090 if (
s->sh.nb_refs[
L1])
2093 if (
s->sh.mvd_l1_zero_flag == 1 && inter_pred_idc ==
PRED_BI) {
2102 part_idx, merge_idx,
mv, mvp_flag, 1);
2111 int x0,
int y0,
int nPbW,
int nPbH,
2112 int log2_cb_size,
int partIdx,
int idx)
2114 #define POS(c_idx, x, y) \
2115 &s->cur_frame->f->data[c_idx] ? \
2116 &s->cur_frame->f->data[c_idx][((y) >> sps->vshift[c_idx]) * linesize[c_idx] + \
2117 (((x) >> sps->hshift[c_idx]) << sps->pixel_shift)] : NULL
2120 struct MvField current_mv = {{{ 0 }}};
2122 int min_pu_width =
sps->min_pu_width;
2124 MvField *tab_mvf =
s->cur_frame->tab_mvf;
2125 const RefPicList *refPicList =
s->cur_frame->refPicList;
2127 const int *linesize =
s->cur_frame->f->linesize;
2128 uint8_t *dst0 =
POS(0, x0, y0);
2129 uint8_t *dst1 =
POS(1, x0, y0);
2130 uint8_t *dst2 =
POS(2, x0, y0);
2131 int log2_min_cb_size =
sps->log2_min_cb_size;
2132 int min_cb_width =
sps->min_cb_width;
2133 int x_cb = x0 >> log2_min_cb_size;
2134 int y_cb = y0 >> log2_min_cb_size;
2144 if (
s->sh.max_num_merge_cand > 1)
2150 partIdx, merge_idx, ¤t_mv);
2153 partIdx, merge_idx, ¤t_mv);
2156 x_pu = x0 >>
sps->log2_min_pu_size;
2157 y_pu = y0 >>
sps->log2_min_pu_size;
2159 for (j = 0; j < nPbH >>
sps->log2_min_pu_size; j++)
2160 for (
i = 0; i < nPbW >>
sps->log2_min_pu_size;
i++)
2161 tab_mvf[(y_pu + j) * min_pu_width + x_pu +
i] = current_mv;
2164 ref0 = refPicList[0].
ref[current_mv.
ref_idx[0]];
2165 if (!ref0 || !ref0->
f)
2170 ref1 = refPicList[1].
ref[current_mv.
ref_idx[1]];
2171 if (!ref1 || !ref1->f)
2177 int x0_c = x0 >>
sps->hshift[1];
2178 int y0_c = y0 >>
sps->vshift[1];
2179 int nPbW_c = nPbW >>
sps->hshift[1];
2180 int nPbH_c = nPbH >>
sps->vshift[1];
2183 ¤t_mv.
mv[0], x0, y0, nPbW, nPbH,
2184 s->sh.luma_weight_l0[current_mv.
ref_idx[0]],
2185 s->sh.luma_offset_l0[current_mv.
ref_idx[0]]);
2187 if (
sps->chroma_format_idc) {
2189 0, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
2190 s->sh.chroma_weight_l0[current_mv.
ref_idx[0]][0],
s->sh.chroma_offset_l0[current_mv.
ref_idx[0]][0]);
2192 0, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
2193 s->sh.chroma_weight_l0[current_mv.
ref_idx[0]][1],
s->sh.chroma_offset_l0[current_mv.
ref_idx[0]][1]);
2196 int x0_c = x0 >>
sps->hshift[1];
2197 int y0_c = y0 >>
sps->vshift[1];
2198 int nPbW_c = nPbW >>
sps->hshift[1];
2199 int nPbH_c = nPbH >>
sps->vshift[1];
2202 ¤t_mv.
mv[1], x0, y0, nPbW, nPbH,
2203 s->sh.luma_weight_l1[current_mv.
ref_idx[1]],
2204 s->sh.luma_offset_l1[current_mv.
ref_idx[1]]);
2206 if (
sps->chroma_format_idc) {
2208 1, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
2209 s->sh.chroma_weight_l1[current_mv.
ref_idx[1]][0],
s->sh.chroma_offset_l1[current_mv.
ref_idx[1]][0]);
2212 1, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
2213 s->sh.chroma_weight_l1[current_mv.
ref_idx[1]][1],
s->sh.chroma_offset_l1[current_mv.
ref_idx[1]][1]);
2216 int x0_c = x0 >>
sps->hshift[1];
2217 int y0_c = y0 >>
sps->vshift[1];
2218 int nPbW_c = nPbW >>
sps->hshift[1];
2219 int nPbH_c = nPbH >>
sps->vshift[1];
2222 ¤t_mv.
mv[0], x0, y0, nPbW, nPbH,
2223 ref1->f, ¤t_mv.
mv[1], ¤t_mv);
2225 if (
sps->chroma_format_idc) {
2227 x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv, 0);
2230 x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv, 1);
2240 int x0,
int y0,
int pu_size,
2241 int prev_intra_luma_pred_flag)
2244 int x_pu = x0 >>
sps->log2_min_pu_size;
2245 int y_pu = y0 >>
sps->log2_min_pu_size;
2246 int min_pu_width =
sps->min_pu_width;
2247 int size_in_pus = pu_size >>
sps->log2_min_pu_size;
2256 int y_ctb = (y0 >> (
sps->log2_ctb_size)) << (
sps->log2_ctb_size);
2258 MvField *tab_mvf =
s->cur_frame->tab_mvf;
2259 int intra_pred_mode;
2264 if ((y0 - 1) < y_ctb)
2267 if (cand_left == cand_up) {
2268 if (cand_left < 2) {
2273 candidate[0] = cand_left;
2274 candidate[1] = 2 + ((cand_left - 2 - 1 + 32) & 31);
2275 candidate[2] = 2 + ((cand_left - 2 + 1) & 31);
2278 candidate[0] = cand_left;
2279 candidate[1] = cand_up;
2289 if (prev_intra_luma_pred_flag) {
2290 intra_pred_mode = candidate[lc->
pu.
mpm_idx];
2292 if (candidate[0] > candidate[1])
2293 FFSWAP(uint8_t, candidate[0], candidate[1]);
2294 if (candidate[0] > candidate[2])
2295 FFSWAP(uint8_t, candidate[0], candidate[2]);
2296 if (candidate[1] > candidate[2])
2297 FFSWAP(uint8_t, candidate[1], candidate[2]);
2300 for (
i = 0;
i < 3;
i++)
2301 if (intra_pred_mode >= candidate[
i])
2308 for (
i = 0;
i < size_in_pus;
i++) {
2309 memset(&l->
tab_ipm[(y_pu +
i) * min_pu_width + x_pu],
2310 intra_pred_mode, size_in_pus);
2312 for (j = 0; j < size_in_pus; j++) {
2317 return intra_pred_mode;
2322 int log2_cb_size,
int ct_depth)
2324 int length = (1 << log2_cb_size) >>
sps->log2_min_cb_size;
2325 int x_cb = x0 >>
sps->log2_min_cb_size;
2326 int y_cb = y0 >>
sps->log2_min_cb_size;
2329 for (y = 0; y < length; y++)
2330 memset(&tab_ct_depth[(y_cb + y) *
sps->min_cb_width + x_cb],
2335 0, 1, 2, 2, 2, 2, 3, 5, 7, 8, 10, 12, 13, 15, 17, 18, 19, 20,
2336 21, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 29, 29, 30, 31};
2343 static const uint8_t intra_chroma_table[4] = { 0, 26, 10, 1 };
2344 uint8_t prev_intra_luma_pred_flag[4];
2346 int pb_size = (1 << log2_cb_size) >>
split;
2347 int side =
split + 1;
2351 for (
i = 0;
i < side;
i++)
2352 for (j = 0; j < side; j++)
2355 for (
i = 0;
i < side;
i++) {
2356 for (j = 0; j < side; j++) {
2357 if (prev_intra_luma_pred_flag[2 *
i + j])
2364 x0 + pb_size * j, y0 + pb_size *
i, pb_size,
2365 prev_intra_luma_pred_flag[2 *
i + j]);
2369 if (
sps->chroma_format_idc == 3) {
2370 for (
i = 0;
i < side;
i++) {
2371 for (j = 0; j < side; j++) {
2373 if (chroma_mode != 4) {
2383 }
else if (
sps->chroma_format_idc == 2) {
2386 if (chroma_mode != 4) {
2390 mode_idx = intra_chroma_table[chroma_mode];
2395 }
else if (
sps->chroma_format_idc != 0) {
2397 if (chroma_mode != 4) {
2415 int pb_size = 1 << log2_cb_size;
2416 int size_in_pus = pb_size >>
sps->log2_min_pu_size;
2417 int min_pu_width =
sps->min_pu_width;
2418 MvField *tab_mvf =
s->cur_frame->tab_mvf;
2419 int x_pu = x0 >>
sps->log2_min_pu_size;
2420 int y_pu = y0 >>
sps->log2_min_pu_size;
2423 if (size_in_pus == 0)
2425 for (j = 0; j < size_in_pus; j++)
2426 memset(&l->
tab_ipm[(y_pu + j) * min_pu_width + x_pu],
INTRA_DC, size_in_pus);
2428 for (j = 0; j < size_in_pus; j++)
2429 for (k = 0; k < size_in_pus; k++)
2436 int x0,
int y0,
int log2_cb_size)
2438 int cb_size = 1 << log2_cb_size;
2439 int log2_min_cb_size =
sps->log2_min_cb_size;
2440 int length = cb_size >> log2_min_cb_size;
2441 int min_cb_width =
sps->min_cb_width;
2442 int x_cb = x0 >> log2_min_cb_size;
2443 int y_cb = y0 >> log2_min_cb_size;
2444 int idx = log2_cb_size - 2;
2445 int qp_block_mask = (1 << (
sps->log2_ctb_size -
pps->diff_cu_qp_delta_depth)) - 1;
2455 for (x = 0; x < 4; x++)
2457 if (
pps->transquant_bypass_enable_flag) {
2468 x0b, y0b, x_cb, y_cb,
2471 x = y_cb * min_cb_width + x_cb;
2472 for (y = 0; y < length; y++) {
2473 memset(&l->
skip_flag[x], skip_flag, length);
2478 x = y_cb * min_cb_width + x_cb;
2479 for (y = 0; y < length; y++) {
2487 x0, y0, cb_size, cb_size, log2_cb_size, 0, idx);
2490 if (!
s->sh.disable_deblocking_filter_flag)
2498 log2_cb_size ==
sps->log2_min_cb_size) {
2506 log2_cb_size >=
sps->pcm.log2_min_pcm_cb_size &&
2507 log2_cb_size <= sps->pcm.log2_max_pcm_cb_size) {
2513 if (
sps->pcm_loop_filter_disabled)
2526 x0, y0, cb_size, cb_size, log2_cb_size, 0, idx);
2530 x0, y0, cb_size, cb_size / 2, log2_cb_size, 0, idx);
2532 x0, y0 + cb_size / 2, cb_size, cb_size / 2, log2_cb_size, 1, idx);
2536 x0, y0, cb_size / 2, cb_size, log2_cb_size, 0, idx - 1);
2538 x0 + cb_size / 2, y0, cb_size / 2, cb_size, log2_cb_size, 1, idx - 1);
2542 x0, y0, cb_size, cb_size / 4, log2_cb_size, 0, idx);
2544 x0, y0 + cb_size / 4, cb_size, cb_size * 3 / 4, log2_cb_size, 1, idx);
2548 x0, y0, cb_size, cb_size * 3 / 4, log2_cb_size, 0, idx);
2550 x0, y0 + cb_size * 3 / 4, cb_size, cb_size / 4, log2_cb_size, 1, idx);
2554 x0, y0, cb_size / 4, cb_size, log2_cb_size, 0, idx - 2);
2556 x0 + cb_size / 4, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 1, idx - 2);
2560 x0, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 0, idx - 2);
2562 x0 + cb_size * 3 / 4, y0, cb_size / 4, cb_size, log2_cb_size, 1, idx - 2);
2566 x0, y0, cb_size / 2, cb_size / 2, log2_cb_size, 0, idx - 1);
2568 x0 + cb_size / 2, y0, cb_size / 2, cb_size / 2, log2_cb_size, 1, idx - 1);
2570 x0, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 2, idx - 1);
2572 x0 + cb_size / 2, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 3, idx - 1);
2578 int rqt_root_cbf = 1;
2585 const static int cbf[2] = { 0 };
2588 sps->max_transform_hierarchy_depth_inter;
2589 ret =
hls_transform_tree(lc, l,
pps,
sps, x0, y0, x0, y0, x0, y0,
2591 log2_cb_size, 0, 0, cbf, cbf);
2595 if (!
s->sh.disable_deblocking_filter_flag)
2604 x = y_cb * min_cb_width + x_cb;
2605 for (y = 0; y < length; y++) {
2610 if(((x0 + (1<<log2_cb_size)) & qp_block_mask) == 0 &&
2611 ((y0 + (1<<log2_cb_size)) & qp_block_mask) == 0) {
2624 int log2_cb_size,
int cb_depth)
2627 const int cb_size = 1 << log2_cb_size;
2632 if (x0 + cb_size <= sps->
width &&
2633 y0 + cb_size <= sps->
height &&
2634 log2_cb_size >
sps->log2_min_cb_size) {
2636 sps, cb_depth, x0, y0);
2638 split_cu = (log2_cb_size >
sps->log2_min_cb_size);
2640 if (
pps->cu_qp_delta_enabled_flag &&
2641 log2_cb_size >=
sps->log2_ctb_size -
pps->diff_cu_qp_delta_depth) {
2646 if (
s->sh.cu_chroma_qp_offset_enabled_flag &&
2647 log2_cb_size >=
sps->log2_ctb_size -
pps->diff_cu_chroma_qp_offset_depth) {
2652 int qp_block_mask = (1 << (
sps->log2_ctb_size -
pps->diff_cu_qp_delta_depth)) - 1;
2653 const int cb_size_split = cb_size >> 1;
2654 const int x1 = x0 + cb_size_split;
2655 const int y1 = y0 + cb_size_split;
2660 x0, y0, log2_cb_size - 1, cb_depth + 1);
2664 if (more_data && x1 < sps->
width) {
2666 x1, y0, log2_cb_size - 1, cb_depth + 1);
2670 if (more_data && y1 < sps->
height) {
2672 x0, y1, log2_cb_size - 1, cb_depth + 1);
2676 if (more_data && x1 < sps->
width &&
2679 x1, y1, log2_cb_size - 1, cb_depth + 1);
2684 if(((x0 + (1<<log2_cb_size)) & qp_block_mask) == 0 &&
2685 ((y0 + (1<<log2_cb_size)) & qp_block_mask) == 0)
2689 return ((x1 + cb_size_split) <
sps->width ||
2690 (y1 + cb_size_split) <
sps->height);
2697 if ((!((x0 + cb_size) %
2698 (1 << (
sps->log2_ctb_size))) ||
2699 (x0 + cb_size >=
sps->width)) &&
2701 (1 << (
sps->log2_ctb_size))) ||
2702 (y0 + cb_size >=
sps->height))) {
2704 return !end_of_slice_flag;
2716 int x_ctb,
int y_ctb,
int ctb_addr_ts)
2719 int ctb_size = 1 <<
sps->log2_ctb_size;
2720 int ctb_addr_rs =
pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2721 int ctb_addr_in_slice = ctb_addr_rs -
s->sh.slice_addr;
2725 if (
pps->entropy_coding_sync_enabled_flag) {
2726 if (x_ctb == 0 && (y_ctb & (ctb_size - 1)) == 0)
2729 }
else if (
pps->tiles_enabled_flag) {
2730 if (ctb_addr_ts &&
pps->tile_id[ctb_addr_ts] !=
pps->tile_id[ctb_addr_ts - 1]) {
2731 int idxX =
pps->col_idxX[x_ctb >>
sps->log2_ctb_size];
2742 if (
pps->tiles_enabled_flag) {
2743 if (x_ctb > 0 &&
pps->tile_id[ctb_addr_ts] !=
pps->tile_id[
pps->ctb_addr_rs_to_ts[ctb_addr_rs - 1]])
2747 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]])
2752 if (ctb_addr_in_slice <= 0)
2754 if (ctb_addr_in_slice < sps->ctb_width)
2760 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]]));
2761 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]]));
2770 const uint8_t *slice_data = gb->
buffer +
s->sh.data_offset;
2772 int ctb_size = 1 <<
sps->log2_ctb_size;
2776 int ctb_addr_ts =
pps->ctb_addr_rs_to_ts[
s->sh.slice_ctb_addr_rs];
2779 while (more_data && ctb_addr_ts < sps->ctb_size) {
2780 int ctb_addr_rs =
pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2782 x_ctb = (ctb_addr_rs % ((
sps->width + ctb_size - 1) >>
sps->log2_ctb_size)) <<
sps->log2_ctb_size;
2783 y_ctb = (ctb_addr_rs / ((
sps->width + ctb_size - 1) >>
sps->log2_ctb_size)) <<
sps->log2_ctb_size;
2793 x_ctb >>
sps->log2_ctb_size, y_ctb >>
sps->log2_ctb_size);
2800 if (more_data < 0) {
2811 if (x_ctb + ctb_size >=
sps->width &&
2812 y_ctb + ctb_size >=
sps->height)
2819 int job,
int thread)
2826 int ctb_size = 1 <<
sps->log2_ctb_size;
2829 int ctb_addr_rs =
s->sh.slice_ctb_addr_rs + ctb_row * ((
sps->width + ctb_size - 1) >>
sps->log2_ctb_size);
2830 int ctb_addr_ts =
pps->ctb_addr_rs_to_ts[ctb_addr_rs];
2832 const uint8_t *
data =
s->data +
s->sh.offset[ctb_row];
2833 const size_t data_size =
s->sh.size[ctb_row];
2842 while(more_data && ctb_addr_ts < sps->ctb_size) {
2843 int x_ctb = (ctb_addr_rs %
sps->ctb_width) <<
sps->log2_ctb_size;
2844 int y_ctb = (ctb_addr_rs /
sps->ctb_width) <<
sps->log2_ctb_size;
2864 x_ctb >>
sps->log2_ctb_size, y_ctb >>
sps->log2_ctb_size);
2872 if (more_data < 0) {
2883 if (!more_data && (x_ctb+ctb_size) <
sps->width && ctb_row !=
s->sh.num_entry_point_offsets) {
2890 if ((x_ctb+ctb_size) >=
sps->width && (y_ctb+ctb_size) >=
sps->height ) {
2895 ctb_addr_rs =
pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2898 if(x_ctb >=
sps->width) {
2915 if (
s->nb_wpp_progress < count) {
2917 sizeof(*
s->wpp_progress));
2921 s->wpp_progress =
tmp;
2922 memset(
s->wpp_progress +
s->nb_wpp_progress, 0,
2923 (count -
s->nb_wpp_progress) *
sizeof(*
s->wpp_progress));
2925 for (
int i =
s->nb_wpp_progress;
i < count;
i++) {
2929 s->nb_wpp_progress =
i + 1;
2933 for (
int i = 0;
i < count;
i++)
2944 int length = nal->
size;
2947 int64_t startheader, cmpt = 0;
2950 if (
s->sh.slice_ctb_addr_rs +
s->sh.num_entry_point_offsets *
sps->ctb_width >=
sps->ctb_width *
sps->ctb_height) {
2952 s->sh.slice_ctb_addr_rs,
s->sh.num_entry_point_offsets,
2953 sps->ctb_width,
sps->ctb_height
2958 if (
s->avctx->thread_count >
s->nb_local_ctx) {
2964 memcpy(
tmp,
s->local_ctx,
sizeof(*
s->local_ctx) *
s->nb_local_ctx);
2968 for (
unsigned i =
s->nb_local_ctx; i < s->avctx->thread_count;
i++) {
2969 tmp = &
s->local_ctx[
i];
2971 memset(
tmp, 0,
sizeof(*
tmp));
2973 tmp->logctx =
s->avctx;
2975 tmp->common_cabac_state = &
s->cabac;
2978 s->nb_local_ctx =
s->avctx->thread_count;
2983 for (j = 0, cmpt = 0, startheader =
offset +
s->sh.entry_point_offset[0]; j < nal->skipped_bytes; j++) {
2990 for (
i = 1;
i <
s->sh.num_entry_point_offsets;
i++) {
2991 offset += (
s->sh.entry_point_offset[
i - 1] - cmpt);
2992 for (j = 0, cmpt = 0, startheader =
offset
2993 +
s->sh.entry_point_offset[
i]; j < nal->skipped_bytes; j++) {
2999 s->sh.size[
i] =
s->sh.entry_point_offset[
i] - cmpt;
3004 offset +=
s->sh.entry_point_offset[
s->sh.num_entry_point_offsets - 1] - cmpt;
3009 s->sh.size [
s->sh.num_entry_point_offsets] = length -
offset;
3010 s->sh.offset[
s->sh.num_entry_point_offsets] =
offset;
3012 s->sh.offset[0] =
s->sh.data_offset;
3013 s->sh.size[0] =
s->sh.offset[1] -
s->sh.offset[0];
3017 for (
i = 1;
i <
s->nb_local_ctx;
i++) {
3018 s->local_ctx[
i].first_qp_group = 1;
3019 s->local_ctx[
i].qp_y =
s->local_ctx[0].qp_y;
3031 if (
pps->entropy_coding_sync_enabled_flag)
3034 for (
i = 0;
i <=
s->sh.num_entry_point_offsets;
i++)
3047 if (!
s->sh.first_slice_in_pic_flag)
3048 s->slice_idx += !
s->sh.dependent_slice_segment_flag;
3050 if (!
s->sh.dependent_slice_segment_flag &&
s->sh.slice_type !=
HEVC_SLICE_I) {
3054 "Error constructing the reference lists for the current slice.\n");
3059 s->slice_initialized = 1;
3061 if (
s->avctx->hwaccel)
3066 "SCC profile is not yet implemented in hevc native decoder.\n");
3070 if (
s->sh.dependent_slice_segment_flag) {
3071 int ctb_addr_ts =
pps->ctb_addr_rs_to_ts[
s->sh.slice_ctb_addr_rs];
3072 int prev_rs =
pps->ctb_addr_ts_to_rs[ctb_addr_ts - 1];
3079 s->local_ctx[0].first_qp_group = !
s->sh.dependent_slice_segment_flag;
3081 if (!
pps->cu_qp_delta_enabled_flag)
3082 s->local_ctx[0].qp_y =
s->sh.slice_qp;
3084 s->local_ctx[0].tu.cu_qp_offset_cb = 0;
3085 s->local_ctx[0].tu.cu_qp_offset_cr = 0;
3088 s->sh.num_entry_point_offsets > 0 &&
3089 pps->num_tile_rows == 1 &&
pps->num_tile_columns == 1)
3104 if (
IS_IRAP(
s) &&
s->no_rasl_output_flag) {
3105 if (
s->sei.common.mastering_display.present > 0)
3106 s->sei.common.mastering_display.present--;
3108 if (
s->sei.common.content_light.present > 0)
3109 s->sei.common.content_light.present--;
3114 sps->bit_depth,
sps->bit_depth_chroma,
3115 s->cur_frame->poc );
3119 if (
s->sei.timecode.present) {
3124 sizeof(uint32_t) * 4, &tcside);
3129 tc_sd = (uint32_t*)tcside->
data;
3130 tc_sd[0] =
s->sei.timecode.num_clock_ts;
3132 for (
int i = 0;
i < tc_sd[0];
i++) {
3133 int drop =
s->sei.timecode.cnt_dropped_flag[
i];
3134 int hh =
s->sei.timecode.hours_value[
i];
3135 int mm =
s->sei.timecode.minutes_value[
i];
3136 int ss =
s->sei.timecode.seconds_value[
i];
3137 int ff =
s->sei.timecode.n_frames[
i];
3145 s->sei.timecode.num_clock_ts = 0;
3148 if (
s->sei.common.dynamic_hdr_plus.info) {
3169 if (
s->sei.common.dynamic_hdr_vivid.info) {
3172 &
s->sei.common.dynamic_hdr_vivid.info,
3184 for (
int i = nal_idx;
i <
s->pkt.nb_nals;
i++) {
3190 !(
s->layers_active_decode & (1 <<
s->vps->layer_idx[layer_id])))
3193 switch (nal->
type) {
3226 const HEVCPPS *
const pps =
s->ps.pps_list[
s->sh.pps_id];
3228 int pic_size_in_ctb = ((
sps->width >>
sps->log2_min_cb_size) + 1) *
3229 ((
sps->height >>
sps->log2_min_cb_size) + 1);
3230 int new_sequence = (l == &
s->layers[0]) &&
3232 int prev_layers_active_decode =
s->layers_active_decode;
3233 int prev_layers_active_output =
s->layers_active_output;
3236 if (
sps->vps !=
s->vps && l != &
s->layers[0]) {
3244 const HEVCSPS *sps_base =
s->layers[0].sps;
3247 if (l != &
s->layers[0]) {
3250 "Access unit starts with a non-base layer frame\n");
3259 !
sps->vui.common.video_signal_type_present_flag)
3272 "Base/non-base layer SPS have unsupported parameter combination\n");
3283 if (l == &
s->layers[0]) {
3299 memset(l->
is_pcm, 0, (
sps->min_pu_width + 1) * (
sps->min_pu_height + 1));
3306 s->first_nal_type =
s->nal_unit_type;
3316 s->sei.recovery_point.has_recovery_poc) {
3318 s->recovery_poc =
s->poc +
s->sei.recovery_point.recovery_poc_cnt;
3319 else if (
s->poc >=
s->recovery_poc)
3324 if (
s->temporal_id == 0 &&
3332 s->poc_tid0 =
s->poc;
3334 if (
pps->tiles_enabled_flag)
3335 s->local_ctx[0].end_of_tiles_x =
pps->column_width[0] <<
sps->log2_ctb_size;
3339 0, 0,
s->sh.no_output_of_prior_pics_flag);
3363 s->cur_frame->needs_fg = ((
s->sei.common.film_grain_characteristics &&
3364 s->sei.common.film_grain_characteristics->present) ||
3365 s->sei.common.aom_film_grain.enable) &&
3373 if (
s->cur_frame->needs_fg &&
3374 (
s->sei.common.film_grain_characteristics &&
s->sei.common.film_grain_characteristics->present &&
3376 s->cur_frame->f->format) ||
3379 "Unsupported film grain parameters. Ignoring film grain.\n");
3380 s->cur_frame->needs_fg = 0;
3383 if (
s->cur_frame->needs_fg) {
3384 s->cur_frame->frame_grain->format =
s->cur_frame->f->format;
3385 s->cur_frame->frame_grain->width =
s->cur_frame->f->width;
3386 s->cur_frame->frame_grain->height =
s->cur_frame->f->height;
3395 s->cur_frame->f->pict_type = 3 -
s->sh.slice_type;
3398 sps->temporal_layer[
sps->max_sub_layers - 1].num_reorder_pics,
3399 sps->temporal_layer[
sps->max_sub_layers - 1].max_dec_pic_buffering, 0);
3403 if (
s->avctx->hwaccel) {
3412 if (l == &
s->layers[0])
3415 if (nal_idx >=
s->finish_setup_nal_idx)
3424 s->cur_frame =
s->collocated_ref =
NULL;
3425 s->slice_initialized = 0;
3432 char msg_buf[4 * (50 + 2 * 2 * 16 )];
3440 pixel_shift =
desc->comp[0].depth > 8;
3445 if (pixel_shift && !
s->checksum_buf) {
3448 frame->linesize[2]));
3449 if (!
s->checksum_buf)
3456 int width =
s->avctx->coded_width;
3457 int height =
s->avctx->coded_height;
3463 for (j = 0; j <
h; j++) {
3467 s->bdsp.bswap16_buf((uint16_t *)
s->checksum_buf,
3468 (
const uint16_t *)
src,
w);
3469 src =
s->checksum_buf;
3476 #define MD5_PRI "%016" PRIx64 "%016" PRIx64
3477 #define MD5_PRI_ARG(buf) AV_RB64(buf), AV_RB64((const uint8_t*)(buf) + 8)
3479 if (!memcmp(
md5,
s->sei.picture_hash.md5[
i], 16)) {
3481 "plane %d - correct " MD5_PRI "; ",
3485 "mismatching checksum of plane %d - " MD5_PRI " != " MD5_PRI "; ",
3492 "Verifying checksum for frame with POC %d: %s\n",
3504 if (
out->needs_fg) {
3507 switch (fgp->
type) {
3522 if (
s->avctx->hwaccel) {
3526 "hardware accelerator failed to decode picture\n");
3531 s->sei.picture_hash.is_md5) {
3537 s->sei.picture_hash.is_md5 = 0;
3540 l -
s->layers,
s->poc);
3547 const int layer_idx =
s->vps ?
s->vps->layer_idx[
s->nuh_layer_id] : 0;
3554 if (layer_idx < 0 ||
3555 (
s->nuh_layer_id > 0 && !(
s->layers_active_decode & (1 << layer_idx))))
3561 s->slice_initialized = 0;
3569 s->no_rasl_output_flag)) {
3574 if (
s->cur_layer != layer_idx &&
3575 s->layers[
s->cur_layer].cur_frame &&
3579 s->cur_layer = layer_idx;
3580 l = &
s->layers[
s->cur_layer];
3582 if (
s->sh.first_slice_in_pic_flag) {
3584 av_log(
s->avctx,
AV_LOG_ERROR,
"Two slices reporting being the first in the same frame.\n");
3596 if (
s->nal_unit_type !=
s->first_nal_type) {
3598 "Non-matching NAL types of the VCL NALUs: %d %d\n",
3599 s->first_nal_type,
s->nal_unit_type);
3616 s->nal_unit_type = nal->
type;
3632 switch (
s->nal_unit_type) {
3683 "Skipping NAL unit %d\n",
s->nal_unit_type);
3691 "Skipping invalid undecodable NALU: %d\n",
s->nal_unit_type);
3700 s->sei.recovery_point.has_recovery_poc = 0;
3706 int eos_at_start = 1;
3709 s->cur_frame =
s->collocated_ref =
NULL;
3710 s->last_eos =
s->eos;
3712 s->slice_initialized = 0;
3724 s->nal_length_size,
s->avctx->codec_id,
flags);
3727 "Error splitting the input into NAL units.\n");
3731 for (
i = 0;
i <
s->pkt.nb_nals;
i++) {
3754 s->pkt.nals[
s->pkt.nb_nals - 1].size > 2 && !
s->pkt.nals[
s->pkt.nb_nals - 1].nuh_layer_id
3755 && !
s->pkt.nals[
s->pkt.nb_nals - 1].temporal_id) {
3756 H2645NAL *nal = &
s->pkt.nals[
s->pkt.nb_nals - 1];
3759 av_log(
s->avctx,
AV_LOG_WARNING,
"Multiple Dolby Vision RPUs found in one AU. Skipping previous.\n");
3768 s->avctx->err_recognition);
3777 for (
i = 0;
i <
s->pkt.nb_nals;
i++) {
3787 "Error parsing NAL unit #%d.\n",
i);
3814 &
s->nal_length_size,
s->avctx->err_recognition,
3815 s->apply_defdispwin,
s->avctx);
3821 if (
first &&
s->ps.sps_list[
i]) {
3860 s->layers_active_output, 0, 0, 0);
3867 s->pkt_dts = avpkt->
dts;
3870 if (sd && sd_size > 0) {
3877 if (sd && sd_size >=
sizeof(
s->dovi_ctx.cfg)) {
3878 int old =
s->dovi_ctx.cfg.dv_profile;
3882 "New DOVI configuration record from input packet (profile %d -> %u).\n",
3883 old,
s->dovi_ctx.cfg.dv_profile);
3907 if (
src->needs_fg) {
3920 dst->nb_rpl_elems =
src->nb_rpl_elems;
3923 dst->ctb_count =
src->ctb_count;
3926 dst->base_layer_frame =
src->base_layer_frame;
3929 src->hwaccel_picture_private);
3963 for (
int i = 0;
i <
s->nb_wpp_progress;
i++)
3989 s->nb_local_ctx = 1;
3991 s->local_ctx[0].parent =
s;
3992 s->local_ctx[0].logctx = avctx;
3993 s->local_ctx[0].common_cabac_state = &
s->cabac;
3996 if (!
s->output_fifo)
4014 s->dovi_ctx.logctx = avctx;
4073 memcmp(
s->view_ids, s0->
view_ids,
sizeof(*
s->view_ids) *
s->nb_view_ids)) {
4125 s->sei.picture_timing.picture_struct = 0;
4145 if (sd && sd->
size >=
sizeof(
s->dovi_ctx.cfg))
4165 #define OFFSET(x) offsetof(HEVCContext, x)
4166 #define PAR (AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
4169 {
"apply_defdispwin",
"Apply default display window from VUI",
OFFSET(apply_defdispwin),
4171 {
"strict-displaywin",
"stricly apply default display window size",
OFFSET(apply_defdispwin),
4173 {
"view_ids",
"Array of view IDs that should be decoded and output; a single -1 to decode all views",
4175 .min = -1, .max = INT_MAX, .flags =
PAR },
4176 {
"view_ids_available",
"Array of available view IDs is exported here",
4179 {
"view_pos_available",
"Array of view positions for view_ids_available is exported here, as AVStereo3DView",
4215 #if CONFIG_HEVC_DXVA2_HWACCEL
4218 #if CONFIG_HEVC_D3D11VA_HWACCEL
4221 #if CONFIG_HEVC_D3D11VA2_HWACCEL
4224 #if CONFIG_HEVC_D3D12VA_HWACCEL
4227 #if CONFIG_HEVC_NVDEC_HWACCEL
4230 #if CONFIG_HEVC_VAAPI_HWACCEL
4233 #if CONFIG_HEVC_VDPAU_HWACCEL
4236 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
4239 #if CONFIG_HEVC_VULKAN_HWACCEL