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 FF_API_CODEC_PROPS
394 if (
s->sei.common.itut_t35.a53_cc)
399 if (
s->sei.common.alternative_transfer.present &&
402 avctx->
color_trc =
s->sei.common.alternative_transfer.preferred_transfer_characteristics;
405 #if FF_API_CODEC_PROPS
407 if ((
s->sei.common.film_grain_characteristics &&
s->sei.common.film_grain_characteristics->present) ||
408 s->sei.common.itut_t35.aom_film_grain.enable)
421 s->nb_view_ids_available = 0;
423 s->nb_view_pos_available = 0;
426 if (
vps->nb_layers < 2 && !
vps->view_id[0])
429 s->view_ids_available =
av_calloc(
vps->nb_layers,
sizeof(*
s->view_ids_available));
430 if (!
s->view_ids_available)
434 s->view_pos_available =
av_calloc(
vps->nb_layers,
sizeof(*
s->view_pos_available));
435 if (!
s->view_pos_available)
439 for (
int i = 0;
i <
vps->nb_layers;
i++) {
440 s->view_ids_available[
i] =
vps->view_id[
i];
442 if (
s->view_pos_available) {
449 s->nb_view_ids_available =
vps->nb_layers;
450 s->nb_view_pos_available =
s->view_pos_available ?
vps->nb_layers : 0;
460 if (
vps->nb_layers != 2 || !
vps->layer_id_in_nuh[1])
476 unsigned layers_active_output = 0, highest_layer;
478 s->layers_active_output = 1;
479 s->layers_active_decode = 1;
487 s->layers_active_decode = (1 <<
vps->nb_layers) - 1;
488 s->layers_active_output = 1;
497 if (
s->nb_view_ids == 1 &&
s->view_ids[0] == -1) {
498 layers_active_output = (1 <<
vps->nb_layers) - 1;
500 for (
int i = 0;
i <
s->nb_view_ids;
i++) {
501 int view_id =
s->view_ids[
i];
506 "Invalid view ID requested: %d\n", view_id);
510 for (
int j = 0; j <
vps->nb_layers; j++) {
511 if (
vps->view_id[j] == view_id) {
518 "View ID %d not present in VPS\n", view_id);
521 layers_active_output |= 1 << layer_idx;
525 if (!layers_active_output) {
530 highest_layer =
ff_log2(layers_active_output);
533 "Too many layers requested: %u\n", layers_active_output);
541 s->layers_active_decode = (1 << (highest_layer + 1)) - 1;
542 s->layers_active_output = layers_active_output;
545 s->layers_active_decode,
s->layers_active_output);
580 #define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \
581 CONFIG_HEVC_D3D11VA_HWACCEL * 2 + \
582 CONFIG_HEVC_D3D12VA_HWACCEL + \
583 CONFIG_HEVC_NVDEC_HWACCEL + \
584 CONFIG_HEVC_VAAPI_HWACCEL + \
585 CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \
586 CONFIG_HEVC_VDPAU_HWACCEL + \
587 CONFIG_HEVC_VULKAN_HWACCEL)
595 switch (
sps->pix_fmt) {
598 #if CONFIG_HEVC_DXVA2_HWACCEL
601 #if CONFIG_HEVC_D3D11VA_HWACCEL
605 #if CONFIG_HEVC_D3D12VA_HWACCEL
608 #if CONFIG_HEVC_VAAPI_HWACCEL
611 #if CONFIG_HEVC_VDPAU_HWACCEL
614 #if CONFIG_HEVC_NVDEC_HWACCEL
617 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
620 #if CONFIG_HEVC_VULKAN_HWACCEL
625 #if CONFIG_HEVC_DXVA2_HWACCEL
628 #if CONFIG_HEVC_D3D11VA_HWACCEL
632 #if CONFIG_HEVC_D3D12VA_HWACCEL
635 #if CONFIG_HEVC_VAAPI_HWACCEL
638 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
641 #if CONFIG_HEVC_VULKAN_HWACCEL
644 #if CONFIG_HEVC_VDPAU_HWACCEL
647 #if CONFIG_HEVC_NVDEC_HWACCEL
652 #if CONFIG_HEVC_VAAPI_HWACCEL
655 #if CONFIG_HEVC_VDPAU_HWACCEL
658 #if CONFIG_HEVC_NVDEC_HWACCEL
661 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
664 #if CONFIG_HEVC_VULKAN_HWACCEL
670 #if CONFIG_HEVC_VAAPI_HWACCEL
673 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
676 #if CONFIG_HEVC_VULKAN_HWACCEL
679 #if CONFIG_HEVC_NVDEC_HWACCEL
684 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
690 #if CONFIG_HEVC_VAAPI_HWACCEL
693 #if CONFIG_HEVC_VDPAU_HWACCEL
696 #if CONFIG_HEVC_VULKAN_HWACCEL
699 #if CONFIG_HEVC_NVDEC_HWACCEL
704 #if CONFIG_HEVC_VAAPI_HWACCEL
707 #if CONFIG_HEVC_VULKAN_HWACCEL
710 #if CONFIG_HEVC_NVDEC_HWACCEL
718 *fmt++ =
sps->pix_fmt;
730 s->avctx->pix_fmt =
ret;
775 unsigned pps_id, layer_idx;
796 pps =
s->ps.pps_list[pps_id];
799 layer_idx =
vps->layer_idx[
s->nuh_layer_id];
806 int slice_address_length;
808 if (
pps->dependent_slice_segments_enabled_flag)
820 "Invalid slice segment address: %u.\n",
833 for (
i = 0;
i <
pps->num_extra_slice_header_bits;
i++)
845 !
pps->pps_curr_pic_ref_enabled_flag &&
846 s->nuh_layer_id == 0) {
853 if (
pps->output_flag_present_flag)
856 if (
sps->separate_colour_plane)
860 (
s->nuh_layer_id > 0 &&
861 !(
vps->poc_lsb_not_present & (1 << layer_idx)))) {
868 "Ignoring POC change between slices: %d -> %d\n", poc, sh->
poc);
888 int numbits, rps_idx;
890 if (!
sps->nb_st_rps) {
896 rps_idx = numbits > 0 ?
get_bits(gb, numbits) : 0;
910 if (
sps->temporal_mvp_enabled)
926 if (
s->nuh_layer_id > 0) {
927 int num_direct_ref_layers =
vps->num_direct_ref_layers[layer_idx];
929 if (
vps->default_ref_layers_active)
931 else if (num_direct_ref_layers) {
936 "NumDirectRefLayers>1 not supported\n");
942 if (
sps->sao_enabled) {
944 if (
sps->chroma_format_idc) {
981 if (
pps->lists_modification_present_flag && nb_refs > 1) {
999 if (
pps->cabac_init_present_flag)
1014 "Invalid collocated_ref_idx: %d.\n",
1031 "Invalid number of merging MVP candidates: %d.\n",
1037 if (
sps->motion_vector_resolution_control_idc == 2)
1047 if (
pps->pic_slice_level_chroma_qp_offsets_present_flag) {
1060 if (
pps->pps_slice_act_qp_offsets_present_flag) {
1066 if (
pps->chroma_qp_offset_list_enabled_flag)
1071 if (
pps->deblocking_filter_control_present_flag) {
1072 int deblocking_filter_override_flag = 0;
1074 if (
pps->deblocking_filter_override_enabled_flag)
1075 deblocking_filter_override_flag =
get_bits1(gb);
1077 if (deblocking_filter_override_flag) {
1082 if (beta_offset_div2 < -6 || beta_offset_div2 > 6 ||
1083 tc_offset_div2 < -6 || tc_offset_div2 > 6) {
1085 "Invalid deblock filter offsets: %d, %d\n",
1086 beta_offset_div2, tc_offset_div2);
1103 if (
pps->seq_loop_filter_across_slices_enabled_flag &&
1114 if (
pps->tiles_enabled_flag ||
pps->entropy_coding_sync_enabled_flag) {
1117 if (num_entry_point_offsets >
get_bits_left(gb) || num_entry_point_offsets > UINT16_MAX) {
1118 av_log(
s->avctx,
AV_LOG_ERROR,
"num_entry_point_offsets %d is invalid\n", num_entry_point_offsets);
1126 if (offset_len < 1 || offset_len > 32) {
1150 if (
pps->slice_header_extension_present_flag) {
1156 for (
i = 0;
i < length;
i++)
1178 "The slice_qp %d is outside the valid range "
1181 -
sps->qp_bd_offset);
1196 #define CTB(tab, x, y) ((tab)[(y) * sps->ctb_width + (x)])
1198 #define SET_SAO(elem, value) \
1200 if (!sao_merge_up_flag && !sao_merge_left_flag) \
1201 sao->elem = value; \
1202 else if (sao_merge_left_flag) \
1203 sao->elem = CTB(l->sao, rx-1, ry).elem; \
1204 else if (sao_merge_up_flag) \
1205 sao->elem = CTB(l->sao, rx, ry-1).elem; \
1215 int sao_merge_left_flag = 0;
1216 int sao_merge_up_flag = 0;
1220 if (
s->sh.slice_sample_adaptive_offset_flag[0] ||
1221 s->sh.slice_sample_adaptive_offset_flag[1]) {
1226 if (ry > 0 && !sao_merge_left_flag) {
1232 for (c_idx = 0; c_idx < (
sps->chroma_format_idc ? 3 : 1); c_idx++) {
1233 int log2_sao_offset_scale = c_idx == 0 ?
pps->log2_sao_offset_scale_luma :
1234 pps->log2_sao_offset_scale_chroma;
1236 if (!
s->sh.slice_sample_adaptive_offset_flag[c_idx]) {
1251 for (
i = 0;
i < 4;
i++)
1255 for (
i = 0;
i < 4;
i++) {
1264 }
else if (c_idx != 2) {
1270 for (
i = 0;
i < 4;
i++) {
1278 sao->
offset_val[c_idx][
i + 1] *= 1 << log2_sao_offset_scale;
1290 if (log2_res_scale_abs_plus1 != 0) {
1293 (1 - 2 * res_scale_sign_flag);
1306 int xBase,
int yBase,
int cb_xBase,
int cb_yBase,
1307 int log2_cb_size,
int log2_trafo_size,
1308 int blk_idx,
int cbf_luma,
int *cbf_cb,
int *cbf_cr)
1311 const int log2_trafo_size_c = log2_trafo_size -
sps->hshift[1];
1315 int trafo_size = 1 << log2_trafo_size;
1318 s->hpc.intra_pred[log2_trafo_size - 2](lc,
pps, x0, y0, 0);
1321 if (cbf_luma || cbf_cb[0] || cbf_cr[0] ||
1322 (
sps->chroma_format_idc == 2 && (cbf_cb[1] || cbf_cr[1]))) {
1325 int cbf_chroma = cbf_cb[0] || cbf_cr[0] ||
1326 (
sps->chroma_format_idc == 2 &&
1327 (cbf_cb[1] || cbf_cr[1]));
1339 "The cu_qp_delta %d is outside the valid range "
1342 -(26 +
sps->qp_bd_offset / 2),
1343 (25 +
sps->qp_bd_offset / 2));
1350 if (
s->sh.cu_chroma_qp_offset_enabled_flag && cbf_chroma &&
1353 if (cu_chroma_qp_offset_flag) {
1354 int cu_chroma_qp_offset_idx = 0;
1355 if (
pps->chroma_qp_offset_list_len_minus1 > 0) {
1358 "cu_chroma_qp_offset_idx not yet tested.\n");
1391 if (
sps->chroma_format_idc && (log2_trafo_size > 2 ||
sps->chroma_format_idc == 3)) {
1392 int trafo_size_h = 1 << (log2_trafo_size_c +
sps->hshift[1]);
1393 int trafo_size_v = 1 << (log2_trafo_size_c +
sps->vshift[1]);
1394 lc->
tu.
cross_pf = (
pps->cross_component_prediction_enabled_flag && cbf_luma &&
1401 for (
i = 0;
i < (
sps->chroma_format_idc == 2 ? 2 : 1);
i++) {
1404 trafo_size_h, trafo_size_v,
sps->log2_ctb_size);
1405 s->hpc.intra_pred[log2_trafo_size_c - 2](lc,
pps, x0, y0 + (
i << log2_trafo_size_c), 1);
1409 log2_trafo_size_c, scan_idx_c, 1);
1412 ptrdiff_t
stride =
s->cur_frame->f->linesize[1];
1413 int hshift =
sps->hshift[1];
1414 int vshift =
sps->vshift[1];
1417 int size = 1 << log2_trafo_size_c;
1419 uint8_t *
dst = &
s->cur_frame->f->data[1][(y0 >> vshift) *
stride +
1420 ((x0 >> hshift) <<
sps->pixel_shift)];
1424 s->hevcdsp.add_residual[log2_trafo_size_c-2](
dst, coeffs,
stride);
1431 for (
i = 0;
i < (
sps->chroma_format_idc == 2 ? 2 : 1);
i++) {
1434 trafo_size_h, trafo_size_v,
sps->log2_ctb_size);
1435 s->hpc.intra_pred[log2_trafo_size_c - 2](lc,
pps, x0, y0 + (
i << log2_trafo_size_c), 2);
1439 log2_trafo_size_c, scan_idx_c, 2);
1442 ptrdiff_t
stride =
s->cur_frame->f->linesize[2];
1443 int hshift =
sps->hshift[2];
1444 int vshift =
sps->vshift[2];
1447 int size = 1 << log2_trafo_size_c;
1449 uint8_t *
dst = &
s->cur_frame->f->data[2][(y0 >> vshift) *
stride +
1450 ((x0 >> hshift) <<
sps->pixel_shift)];
1454 s->hevcdsp.add_residual[log2_trafo_size_c-2](
dst, coeffs,
stride);
1457 }
else if (
sps->chroma_format_idc && blk_idx == 3) {
1458 int trafo_size_h = 1 << (log2_trafo_size + 1);
1459 int trafo_size_v = 1 << (log2_trafo_size +
sps->vshift[1]);
1460 for (
i = 0;
i < (
sps->chroma_format_idc == 2 ? 2 : 1);
i++) {
1463 trafo_size_h, trafo_size_v,
sps->log2_ctb_size);
1464 s->hpc.intra_pred[log2_trafo_size - 2](lc,
pps, xBase, yBase + (
i << log2_trafo_size), 1);
1468 log2_trafo_size, scan_idx_c, 1);
1470 for (
i = 0;
i < (
sps->chroma_format_idc == 2 ? 2 : 1);
i++) {
1473 trafo_size_h, trafo_size_v,
sps->log2_ctb_size);
1474 s->hpc.intra_pred[log2_trafo_size - 2](lc,
pps, xBase, yBase + (
i << log2_trafo_size), 2);
1478 log2_trafo_size, scan_idx_c, 2);
1482 if (log2_trafo_size > 2 ||
sps->chroma_format_idc == 3) {
1483 int trafo_size_h = 1 << (log2_trafo_size_c +
sps->hshift[1]);
1484 int trafo_size_v = 1 << (log2_trafo_size_c +
sps->vshift[1]);
1486 sps->log2_ctb_size);
1487 s->hpc.intra_pred[log2_trafo_size_c - 2](lc,
pps, x0, y0, 1);
1488 s->hpc.intra_pred[log2_trafo_size_c - 2](lc,
pps, x0, y0, 2);
1489 if (
sps->chroma_format_idc == 2) {
1491 trafo_size_h, trafo_size_v,
sps->log2_ctb_size);
1492 s->hpc.intra_pred[log2_trafo_size_c - 2](lc,
pps, x0, y0 + (1 << log2_trafo_size_c), 1);
1493 s->hpc.intra_pred[log2_trafo_size_c - 2](lc,
pps, x0, y0 + (1 << log2_trafo_size_c), 2);
1495 }
else if (blk_idx == 3) {
1496 int trafo_size_h = 1 << (log2_trafo_size + 1);
1497 int trafo_size_v = 1 << (log2_trafo_size +
sps->vshift[1]);
1499 trafo_size_h, trafo_size_v,
sps->log2_ctb_size);
1500 s->hpc.intra_pred[log2_trafo_size - 2](lc,
pps, xBase, yBase, 1);
1501 s->hpc.intra_pred[log2_trafo_size - 2](lc,
pps, xBase, yBase, 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 - 2](lc,
pps, xBase, yBase + (1 << log2_trafo_size), 1);
1506 s->hpc.intra_pred[log2_trafo_size - 2](lc,
pps, xBase, yBase + (1 << log2_trafo_size), 2);
1515 int x0,
int y0,
int log2_cb_size)
1517 int cb_size = 1 << log2_cb_size;
1518 int log2_min_pu_size =
sps->log2_min_pu_size;
1520 int min_pu_width =
sps->min_pu_width;
1521 int x_end =
FFMIN(x0 + cb_size,
sps->width);
1522 int y_end =
FFMIN(y0 + cb_size,
sps->height);
1525 for (j = (y0 >> log2_min_pu_size); j < (y_end >> log2_min_pu_size); j++)
1526 for (
i = (x0 >> log2_min_pu_size);
i < (x_end >> log2_min_pu_size);
i++)
1527 is_pcm[
i + j * min_pu_width] = 2;
1534 int xBase,
int yBase,
int cb_xBase,
int cb_yBase,
1535 int log2_cb_size,
int log2_trafo_size,
1536 int trafo_depth,
int blk_idx,
1537 const int *base_cbf_cb,
const int *base_cbf_cr)
1540 uint8_t split_transform_flag;
1545 cbf_cb[0] = base_cbf_cb[0];
1546 cbf_cb[1] = base_cbf_cb[1];
1547 cbf_cr[0] = base_cbf_cr[0];
1548 cbf_cr[1] = base_cbf_cr[1];
1551 if (trafo_depth == 1) {
1553 if (
sps->chroma_format_idc == 3) {
1567 if (log2_trafo_size <= sps->log2_max_trafo_size &&
1568 log2_trafo_size >
sps->log2_min_tb_size &&
1569 trafo_depth < lc->cu.max_trafo_depth &&
1573 int inter_split =
sps->max_transform_hierarchy_depth_inter == 0 &&
1578 split_transform_flag = log2_trafo_size >
sps->log2_max_trafo_size ||
1583 if (
sps->chroma_format_idc && (log2_trafo_size > 2 ||
sps->chroma_format_idc == 3)) {
1584 if (trafo_depth == 0 || cbf_cb[0]) {
1586 if (
sps->chroma_format_idc == 2 && (!split_transform_flag || log2_trafo_size == 3)) {
1591 if (trafo_depth == 0 || cbf_cr[0]) {
1593 if (
sps->chroma_format_idc == 2 && (!split_transform_flag || log2_trafo_size == 3)) {
1599 if (split_transform_flag) {
1600 const int trafo_size_split = 1 << (log2_trafo_size - 1);
1601 const int x1 = x0 + trafo_size_split;
1602 const int y1 = y0 + trafo_size_split;
1604 #define SUBDIVIDE(x, y, idx) \
1606 ret = hls_transform_tree(lc, l, pps, sps, \
1607 x, y, x0, y0, cb_xBase, cb_yBase, log2_cb_size, \
1608 log2_trafo_size - 1, trafo_depth + 1, idx, \
1621 int min_tu_size = 1 <<
sps->log2_min_tb_size;
1622 int log2_min_tu_size =
sps->log2_min_tb_size;
1623 int min_tu_width =
sps->min_tb_width;
1627 cbf_cb[0] || cbf_cr[0] ||
1628 (
sps->chroma_format_idc == 2 && (cbf_cb[1] || cbf_cr[1]))) {
1633 x0, y0, xBase, yBase, cb_xBase, cb_yBase,
1634 log2_cb_size, log2_trafo_size,
1635 blk_idx, cbf_luma, cbf_cb, cbf_cr);
1641 for (
i = 0;
i < (1 << log2_trafo_size);
i += min_tu_size)
1642 for (j = 0; j < (1 << log2_trafo_size); j += min_tu_size) {
1643 int x_tu = (x0 + j) >> log2_min_tu_size;
1644 int y_tu = (y0 +
i) >> log2_min_tu_size;
1645 l->
cbf_luma[y_tu * min_tu_width + x_tu] = 1;
1648 if (!
s->sh.disable_deblocking_filter_flag) {
1650 if (
pps->transquant_bypass_enable_flag &&
1659 const HEVCPPS *
pps,
int x0,
int y0,
int log2_cb_size)
1664 int cb_size = 1 << log2_cb_size;
1665 ptrdiff_t stride0 =
s->cur_frame->f->linesize[0];
1666 uint8_t *dst0 = &
s->cur_frame->f->data[0][y0 * stride0 + (x0 <<
sps->pixel_shift)];
1668 int length = cb_size * cb_size *
sps->pcm.bit_depth + (
sps->chroma_format_idc != 0 ?
1669 (((cb_size >>
sps->hshift[1]) * (cb_size >>
sps->vshift[1])) +
1670 ((cb_size >>
sps->hshift[2]) * (cb_size >>
sps->vshift[2]))) *
1671 sps->pcm.bit_depth_chroma : 0);
1672 const uint8_t *pcm =
skip_bytes(&lc->
cc, (length + 7) >> 3);
1675 if (!
s->sh.disable_deblocking_filter_flag)
1682 s->hevcdsp.put_pcm(dst0, stride0, cb_size, cb_size, &gb,
sps->pcm.bit_depth);
1683 if (
sps->chroma_format_idc) {
1684 ptrdiff_t stride1 =
s->cur_frame->f->linesize[1];
1685 ptrdiff_t stride2 =
s->cur_frame->f->linesize[2];
1686 uint8_t *dst1 = &
s->cur_frame->f->data[1][(y0 >>
sps->vshift[1]) * stride1 + ((x0 >>
sps->hshift[1]) <<
sps->pixel_shift)];
1687 uint8_t *dst2 = &
s->cur_frame->f->data[2][(y0 >>
sps->vshift[2]) * stride2 + ((x0 >>
sps->hshift[2]) <<
sps->pixel_shift)];
1689 s->hevcdsp.put_pcm(dst1, stride1,
1690 cb_size >>
sps->hshift[1],
1691 cb_size >>
sps->vshift[1],
1692 &gb,
sps->pcm.bit_depth_chroma);
1693 s->hevcdsp.put_pcm(dst2, stride2,
1694 cb_size >>
sps->hshift[2],
1695 cb_size >>
sps->vshift[2],
1696 &gb,
sps->pcm.bit_depth_chroma);
1720 uint8_t *
dst, ptrdiff_t dststride,
1722 int block_w,
int block_h,
int luma_weight,
int luma_offset)
1725 const uint8_t *
src =
ref->data[0];
1727 int pic_width =
sps->width;
1728 int pic_height =
sps->height;
1731 int weight_flag = (
s->sh.slice_type ==
HEVC_SLICE_P &&
pps->weighted_pred_flag) ||
1735 x_off +=
mv->x >> 2;
1736 y_off +=
mv->y >> 2;
1742 ref ==
s->cur_frame->f) {
1752 pic_width, pic_height);
1759 block_h,
mx,
my, block_w);
1762 block_h,
s->sh.luma_log2_weight_denom,
1763 luma_weight, luma_offset,
mx,
my, block_w);
1784 uint8_t *
dst, ptrdiff_t dststride,
1785 const AVFrame *ref0,
const Mv *mv0,
int x_off,
int y_off,
1786 int block_w,
int block_h,
const AVFrame *ref1,
1787 const Mv *mv1,
struct MvField *current_mv)
1790 ptrdiff_t src0stride = ref0->
linesize[0];
1791 ptrdiff_t src1stride = ref1->
linesize[0];
1792 int pic_width =
sps->width;
1793 int pic_height =
sps->height;
1794 int mx0 = mv0->
x & 3;
1795 int my0 = mv0->
y & 3;
1796 int mx1 = mv1->
x & 3;
1797 int my1 = mv1->
y & 3;
1798 int weight_flag = (
s->sh.slice_type ==
HEVC_SLICE_P &&
pps->weighted_pred_flag) ||
1800 int x_off0 = x_off + (mv0->
x >> 2);
1801 int y_off0 = y_off + (mv0->
y >> 2);
1802 int x_off1 = x_off + (mv1->
x >> 2);
1803 int y_off1 = y_off + (mv1->
y >> 2);
1806 const uint8_t *
src0 = ref0->
data[0] + y_off0 * src0stride + (int)((
unsigned)x_off0 <<
sps->pixel_shift);
1807 const uint8_t *
src1 = ref1->
data[0] + y_off1 * src1stride + (int)((
unsigned)x_off1 <<
sps->pixel_shift);
1817 edge_emu_stride, src0stride,
1821 pic_width, pic_height);
1823 src0stride = edge_emu_stride;
1834 edge_emu_stride, src1stride,
1838 pic_width, pic_height);
1840 src1stride = edge_emu_stride;
1843 s->hevcdsp.put_hevc_qpel[idx][!!my0][!!mx0](lc->
tmp,
src0, src0stride,
1844 block_h, mx0, my0, block_w);
1846 s->hevcdsp.put_hevc_qpel_bi[idx][!!my1][!!mx1](
dst, dststride,
src1, src1stride, lc->
tmp,
1847 block_h, mx1, my1, block_w);
1849 s->hevcdsp.put_hevc_qpel_bi_w[idx][!!my1][!!mx1](
dst, dststride,
src1, src1stride, lc->
tmp,
1850 block_h,
s->sh.luma_log2_weight_denom,
1851 s->sh.luma_weight_l0[current_mv->
ref_idx[0]],
1852 s->sh.luma_weight_l1[current_mv->
ref_idx[1]],
1853 s->sh.luma_offset_l0[current_mv->
ref_idx[0]],
1854 s->sh.luma_offset_l1[current_mv->
ref_idx[1]],
1879 ptrdiff_t dststride,
const uint8_t *
src0, ptrdiff_t
srcstride,
int reflist,
1880 int x_off,
int y_off,
int block_w,
int block_h,
1881 const struct MvField *current_mv,
int chroma_weight,
int chroma_offset)
1884 int pic_width =
sps->width >>
sps->hshift[1];
1885 int pic_height =
sps->height >>
sps->vshift[1];
1886 const Mv *
mv = ¤t_mv->
mv[reflist];
1887 int weight_flag = (
s->sh.slice_type ==
HEVC_SLICE_P &&
pps->weighted_pred_flag) ||
1890 int hshift =
sps->hshift[1];
1891 int vshift =
sps->vshift[1];
1894 intptr_t _mx =
mx << (1 - hshift);
1895 intptr_t _my =
my << (1 - vshift);
1896 int emu =
src0 ==
s->cur_frame->f->data[1] ||
src0 ==
s->cur_frame->f->data[2];
1898 x_off +=
mv->x >> (2 + hshift);
1899 y_off +=
mv->y >> (2 + vshift);
1909 (edge_emu_stride + (1 <<
sps->pixel_shift));
1915 pic_width, pic_height);
1922 block_h, _mx, _my, block_w);
1925 block_h,
s->sh.chroma_log2_weight_denom,
1926 chroma_weight, chroma_offset, _mx, _my, block_w);
1948 uint8_t *dst0, ptrdiff_t dststride,
1950 int x_off,
int y_off,
int block_w,
int block_h,
const MvField *current_mv,
int cidx)
1953 const uint8_t *
src1 = ref0->
data[cidx+1];
1954 const uint8_t *
src2 = ref1->
data[cidx+1];
1955 ptrdiff_t src1stride = ref0->
linesize[cidx+1];
1956 ptrdiff_t src2stride = ref1->
linesize[cidx+1];
1957 int weight_flag = (
s->sh.slice_type ==
HEVC_SLICE_P &&
pps->weighted_pred_flag) ||
1959 int pic_width =
sps->width >>
sps->hshift[1];
1960 int pic_height =
sps->height >>
sps->vshift[1];
1961 const Mv *
const mv0 = ¤t_mv->
mv[0];
1962 const Mv *
const mv1 = ¤t_mv->
mv[1];
1963 int hshift =
sps->hshift[1];
1964 int vshift =
sps->vshift[1];
1970 intptr_t _mx0 = mx0 << (1 - hshift);
1971 intptr_t _my0 = my0 << (1 - vshift);
1972 intptr_t _mx1 = mx1 << (1 - hshift);
1973 intptr_t _my1 = my1 << (1 - vshift);
1975 int x_off0 = x_off + (mv0->
x >> (2 + hshift));
1976 int y_off0 = y_off + (mv0->
y >> (2 + vshift));
1977 int x_off1 = x_off + (mv1->
x >> (2 + hshift));
1978 int y_off1 = y_off + (mv1->
y >> (2 + vshift));
1980 src1 += y_off0 * src1stride + (int)((
unsigned)x_off0 <<
sps->pixel_shift);
1981 src2 += y_off1 * src2stride + (int)((
unsigned)x_off1 <<
sps->pixel_shift);
1989 (edge_emu_stride + (1 <<
sps->pixel_shift));
1992 edge_emu_stride, src1stride,
1996 pic_width, pic_height);
1999 src1stride = edge_emu_stride;
2008 (edge_emu_stride + (1 <<
sps->pixel_shift));
2011 edge_emu_stride, src2stride,
2015 pic_width, pic_height);
2018 src2stride = edge_emu_stride;
2021 s->hevcdsp.put_hevc_epel[idx][!!my0][!!mx0](lc->
tmp,
src1, src1stride,
2022 block_h, _mx0, _my0, block_w);
2024 s->hevcdsp.put_hevc_epel_bi[idx][!!my1][!!mx1](dst0,
s->cur_frame->f->linesize[cidx+1],
2026 block_h, _mx1, _my1, block_w);
2028 s->hevcdsp.put_hevc_epel_bi_w[idx][!!my1][!!mx1](dst0,
s->cur_frame->f->linesize[cidx+1],
2031 s->sh.chroma_log2_weight_denom,
2032 s->sh.chroma_weight_l0[current_mv->
ref_idx[0]][cidx],
2033 s->sh.chroma_weight_l1[current_mv->
ref_idx[1]][cidx],
2034 s->sh.chroma_offset_l0[current_mv->
ref_idx[0]][cidx],
2035 s->sh.chroma_offset_l1[current_mv->
ref_idx[1]][cidx],
2036 _mx1, _my1, block_w);
2051 int x0,
int y0,
int nPbW,
2052 int nPbH,
int log2_cb_size,
int part_idx,
2064 if (inter_pred_idc !=
PRED_L1) {
2065 if (
s->sh.nb_refs[
L0])
2072 part_idx, merge_idx,
mv, mvp_flag, 0);
2077 if (inter_pred_idc !=
PRED_L0) {
2078 if (
s->sh.nb_refs[
L1])
2081 if (
s->sh.mvd_l1_zero_flag == 1 && inter_pred_idc ==
PRED_BI) {
2090 part_idx, merge_idx,
mv, mvp_flag, 1);
2099 int x0,
int y0,
int nPbW,
int nPbH,
2100 int log2_cb_size,
int partIdx,
int idx)
2102 #define POS(c_idx, x, y) \
2103 s->cur_frame->f->data[c_idx] ? \
2104 &s->cur_frame->f->data[c_idx][((y) >> sps->vshift[c_idx]) * linesize[c_idx] + \
2105 (((x) >> sps->hshift[c_idx]) << sps->pixel_shift)] : NULL
2108 struct MvField current_mv = {{{ 0 }}};
2110 int min_pu_width =
sps->min_pu_width;
2112 MvField *tab_mvf =
s->cur_frame->tab_mvf;
2113 const RefPicList *refPicList =
s->cur_frame->refPicList;
2115 const int *linesize =
s->cur_frame->f->linesize;
2116 uint8_t *dst0 =
s->cur_frame->f->data[0] + y0 * linesize[0] + (x0 <<
sps->pixel_shift);
2117 uint8_t *dst1 =
POS(1, x0, y0);
2118 uint8_t *dst2 =
POS(2, x0, y0);
2119 int log2_min_cb_size =
sps->log2_min_cb_size;
2120 int min_cb_width =
sps->min_cb_width;
2121 int x_cb = x0 >> log2_min_cb_size;
2122 int y_cb = y0 >> log2_min_cb_size;
2132 if (
s->sh.max_num_merge_cand > 1)
2138 partIdx, merge_idx, ¤t_mv);
2141 partIdx, merge_idx, ¤t_mv);
2144 x_pu = x0 >>
sps->log2_min_pu_size;
2145 y_pu = y0 >>
sps->log2_min_pu_size;
2147 for (j = 0; j < nPbH >>
sps->log2_min_pu_size; j++)
2148 for (
i = 0; i < nPbW >>
sps->log2_min_pu_size;
i++)
2149 tab_mvf[(y_pu + j) * min_pu_width + x_pu +
i] = current_mv;
2152 ref0 = refPicList[0].
ref[current_mv.
ref_idx[0]];
2153 if (!ref0 || !ref0->
f)
2158 ref1 = refPicList[1].
ref[current_mv.
ref_idx[1]];
2159 if (!ref1 || !ref1->f)
2165 int x0_c = x0 >>
sps->hshift[1];
2166 int y0_c = y0 >>
sps->vshift[1];
2167 int nPbW_c = nPbW >>
sps->hshift[1];
2168 int nPbH_c = nPbH >>
sps->vshift[1];
2171 ¤t_mv.
mv[0], x0, y0, nPbW, nPbH,
2172 s->sh.luma_weight_l0[current_mv.
ref_idx[0]],
2173 s->sh.luma_offset_l0[current_mv.
ref_idx[0]]);
2175 if (
sps->chroma_format_idc) {
2177 0, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
2178 s->sh.chroma_weight_l0[current_mv.
ref_idx[0]][0],
s->sh.chroma_offset_l0[current_mv.
ref_idx[0]][0]);
2180 0, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
2181 s->sh.chroma_weight_l0[current_mv.
ref_idx[0]][1],
s->sh.chroma_offset_l0[current_mv.
ref_idx[0]][1]);
2184 int x0_c = x0 >>
sps->hshift[1];
2185 int y0_c = y0 >>
sps->vshift[1];
2186 int nPbW_c = nPbW >>
sps->hshift[1];
2187 int nPbH_c = nPbH >>
sps->vshift[1];
2190 ¤t_mv.
mv[1], x0, y0, nPbW, nPbH,
2191 s->sh.luma_weight_l1[current_mv.
ref_idx[1]],
2192 s->sh.luma_offset_l1[current_mv.
ref_idx[1]]);
2194 if (
sps->chroma_format_idc) {
2196 1, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
2197 s->sh.chroma_weight_l1[current_mv.
ref_idx[1]][0],
s->sh.chroma_offset_l1[current_mv.
ref_idx[1]][0]);
2200 1, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
2201 s->sh.chroma_weight_l1[current_mv.
ref_idx[1]][1],
s->sh.chroma_offset_l1[current_mv.
ref_idx[1]][1]);
2204 int x0_c = x0 >>
sps->hshift[1];
2205 int y0_c = y0 >>
sps->vshift[1];
2206 int nPbW_c = nPbW >>
sps->hshift[1];
2207 int nPbH_c = nPbH >>
sps->vshift[1];
2210 ¤t_mv.
mv[0], x0, y0, nPbW, nPbH,
2211 ref1->f, ¤t_mv.
mv[1], ¤t_mv);
2213 if (
sps->chroma_format_idc) {
2215 x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv, 0);
2218 x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv, 1);
2228 int x0,
int y0,
int pu_size,
2229 int prev_intra_luma_pred_flag)
2232 int x_pu = x0 >>
sps->log2_min_pu_size;
2233 int y_pu = y0 >>
sps->log2_min_pu_size;
2234 int min_pu_width =
sps->min_pu_width;
2235 int size_in_pus = pu_size >>
sps->log2_min_pu_size;
2244 int y_ctb = (y0 >> (
sps->log2_ctb_size)) << (
sps->log2_ctb_size);
2246 MvField *tab_mvf =
s->cur_frame->tab_mvf;
2247 int intra_pred_mode;
2252 if ((y0 - 1) < y_ctb)
2255 if (cand_left == cand_up) {
2256 if (cand_left < 2) {
2261 candidate[0] = cand_left;
2262 candidate[1] = 2 + ((cand_left - 2 - 1 + 32) & 31);
2263 candidate[2] = 2 + ((cand_left - 2 + 1) & 31);
2266 candidate[0] = cand_left;
2267 candidate[1] = cand_up;
2277 if (prev_intra_luma_pred_flag) {
2278 intra_pred_mode = candidate[lc->
pu.
mpm_idx];
2280 if (candidate[0] > candidate[1])
2281 FFSWAP(uint8_t, candidate[0], candidate[1]);
2282 if (candidate[0] > candidate[2])
2283 FFSWAP(uint8_t, candidate[0], candidate[2]);
2284 if (candidate[1] > candidate[2])
2285 FFSWAP(uint8_t, candidate[1], candidate[2]);
2288 for (
i = 0;
i < 3;
i++)
2289 if (intra_pred_mode >= candidate[
i])
2296 for (
i = 0;
i < size_in_pus;
i++) {
2297 memset(&l->
tab_ipm[(y_pu +
i) * min_pu_width + x_pu],
2298 intra_pred_mode, size_in_pus);
2300 for (j = 0; j < size_in_pus; j++) {
2305 return intra_pred_mode;
2310 int log2_cb_size,
int ct_depth)
2312 int length = (1 << log2_cb_size) >>
sps->log2_min_cb_size;
2313 int x_cb = x0 >>
sps->log2_min_cb_size;
2314 int y_cb = y0 >>
sps->log2_min_cb_size;
2317 for (y = 0; y < length; y++)
2318 memset(&tab_ct_depth[(y_cb + y) *
sps->min_cb_width + x_cb],
2323 0, 1, 2, 2, 2, 2, 3, 5, 7, 8, 10, 12, 13, 15, 17, 18, 19, 20,
2324 21, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 29, 29, 30, 31};
2331 static const uint8_t intra_chroma_table[4] = { 0, 26, 10, 1 };
2332 uint8_t prev_intra_luma_pred_flag[4];
2334 int pb_size = (1 << log2_cb_size) >>
split;
2335 int side =
split + 1;
2339 for (
i = 0;
i < side;
i++)
2340 for (j = 0; j < side; j++)
2343 for (
i = 0;
i < side;
i++) {
2344 for (j = 0; j < side; j++) {
2345 if (prev_intra_luma_pred_flag[2 *
i + j])
2352 x0 + pb_size * j, y0 + pb_size *
i, pb_size,
2353 prev_intra_luma_pred_flag[2 *
i + j]);
2357 if (
sps->chroma_format_idc == 3) {
2358 for (
i = 0;
i < side;
i++) {
2359 for (j = 0; j < side; j++) {
2361 if (chroma_mode != 4) {
2371 }
else if (
sps->chroma_format_idc == 2) {
2374 if (chroma_mode != 4) {
2378 mode_idx = intra_chroma_table[chroma_mode];
2383 }
else if (
sps->chroma_format_idc != 0) {
2385 if (chroma_mode != 4) {
2403 int pb_size = 1 << log2_cb_size;
2404 int size_in_pus = pb_size >>
sps->log2_min_pu_size;
2405 int min_pu_width =
sps->min_pu_width;
2406 MvField *tab_mvf =
s->cur_frame->tab_mvf;
2407 int x_pu = x0 >>
sps->log2_min_pu_size;
2408 int y_pu = y0 >>
sps->log2_min_pu_size;
2411 if (size_in_pus == 0)
2413 for (j = 0; j < size_in_pus; j++)
2414 memset(&l->
tab_ipm[(y_pu + j) * min_pu_width + x_pu],
INTRA_DC, size_in_pus);
2416 for (j = 0; j < size_in_pus; j++)
2417 for (k = 0; k < size_in_pus; k++)
2424 int x0,
int y0,
int log2_cb_size)
2426 int cb_size = 1 << log2_cb_size;
2427 int log2_min_cb_size =
sps->log2_min_cb_size;
2428 int length = cb_size >> log2_min_cb_size;
2429 int min_cb_width =
sps->min_cb_width;
2430 int x_cb = x0 >> log2_min_cb_size;
2431 int y_cb = y0 >> log2_min_cb_size;
2432 int idx = log2_cb_size - 2;
2433 int qp_block_mask = (1 << (
sps->log2_ctb_size -
pps->diff_cu_qp_delta_depth)) - 1;
2443 for (x = 0; x < 4; x++)
2445 if (
pps->transquant_bypass_enable_flag) {
2456 x0b, y0b, x_cb, y_cb,
2459 x = y_cb * min_cb_width + x_cb;
2460 for (y = 0; y < length; y++) {
2461 memset(&l->
skip_flag[x], skip_flag, length);
2466 x = y_cb * min_cb_width + x_cb;
2467 for (y = 0; y < length; y++) {
2475 x0, y0, cb_size, cb_size, log2_cb_size, 0, idx);
2478 if (!
s->sh.disable_deblocking_filter_flag)
2486 log2_cb_size ==
sps->log2_min_cb_size) {
2494 log2_cb_size >=
sps->pcm.log2_min_pcm_cb_size &&
2495 log2_cb_size <= sps->pcm.log2_max_pcm_cb_size) {
2501 if (
sps->pcm_loop_filter_disabled)
2514 x0, y0, cb_size, cb_size, log2_cb_size, 0, idx);
2518 x0, y0, cb_size, cb_size / 2, log2_cb_size, 0, idx);
2520 x0, y0 + cb_size / 2, cb_size, cb_size / 2, log2_cb_size, 1, idx);
2524 x0, y0, cb_size / 2, cb_size, log2_cb_size, 0, idx - 1);
2526 x0 + cb_size / 2, y0, cb_size / 2, cb_size, log2_cb_size, 1, idx - 1);
2530 x0, y0, cb_size, cb_size / 4, log2_cb_size, 0, idx);
2532 x0, y0 + cb_size / 4, cb_size, cb_size * 3 / 4, log2_cb_size, 1, idx);
2536 x0, y0, cb_size, cb_size * 3 / 4, log2_cb_size, 0, idx);
2538 x0, y0 + cb_size * 3 / 4, cb_size, cb_size / 4, log2_cb_size, 1, idx);
2542 x0, y0, cb_size / 4, cb_size, log2_cb_size, 0, idx - 2);
2544 x0 + cb_size / 4, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 1, idx - 2);
2548 x0, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 0, idx - 2);
2550 x0 + cb_size * 3 / 4, y0, cb_size / 4, cb_size, log2_cb_size, 1, idx - 2);
2554 x0, y0, cb_size / 2, cb_size / 2, log2_cb_size, 0, idx - 1);
2556 x0 + cb_size / 2, y0, cb_size / 2, cb_size / 2, log2_cb_size, 1, idx - 1);
2558 x0, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 2, idx - 1);
2560 x0 + cb_size / 2, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 3, idx - 1);
2566 int rqt_root_cbf = 1;
2573 const static int cbf[2] = { 0 };
2576 sps->max_transform_hierarchy_depth_inter;
2577 ret =
hls_transform_tree(lc, l,
pps,
sps, x0, y0, x0, y0, x0, y0,
2579 log2_cb_size, 0, 0, cbf, cbf);
2583 if (!
s->sh.disable_deblocking_filter_flag)
2592 x = y_cb * min_cb_width + x_cb;
2593 for (y = 0; y < length; y++) {
2598 if(((x0 + (1<<log2_cb_size)) & qp_block_mask) == 0 &&
2599 ((y0 + (1<<log2_cb_size)) & qp_block_mask) == 0) {
2612 int log2_cb_size,
int cb_depth)
2615 const int cb_size = 1 << log2_cb_size;
2620 if (x0 + cb_size <= sps->
width &&
2621 y0 + cb_size <= sps->
height &&
2622 log2_cb_size >
sps->log2_min_cb_size) {
2624 sps, cb_depth, x0, y0);
2626 split_cu = (log2_cb_size >
sps->log2_min_cb_size);
2628 if (
pps->cu_qp_delta_enabled_flag &&
2629 log2_cb_size >=
sps->log2_ctb_size -
pps->diff_cu_qp_delta_depth) {
2634 if (
s->sh.cu_chroma_qp_offset_enabled_flag &&
2635 log2_cb_size >=
sps->log2_ctb_size -
pps->diff_cu_chroma_qp_offset_depth) {
2640 int qp_block_mask = (1 << (
sps->log2_ctb_size -
pps->diff_cu_qp_delta_depth)) - 1;
2641 const int cb_size_split = cb_size >> 1;
2642 const int x1 = x0 + cb_size_split;
2643 const int y1 = y0 + cb_size_split;
2648 x0, y0, log2_cb_size - 1, cb_depth + 1);
2652 if (more_data && x1 < sps->
width) {
2654 x1, y0, log2_cb_size - 1, cb_depth + 1);
2658 if (more_data && y1 < sps->
height) {
2660 x0, y1, log2_cb_size - 1, cb_depth + 1);
2664 if (more_data && x1 < sps->
width &&
2667 x1, y1, log2_cb_size - 1, cb_depth + 1);
2672 if(((x0 + (1<<log2_cb_size)) & qp_block_mask) == 0 &&
2673 ((y0 + (1<<log2_cb_size)) & qp_block_mask) == 0)
2677 return ((x1 + cb_size_split) <
sps->width ||
2678 (y1 + cb_size_split) <
sps->height);
2685 if ((!((x0 + cb_size) %
2686 (1 << (
sps->log2_ctb_size))) ||
2687 (x0 + cb_size >=
sps->width)) &&
2689 (1 << (
sps->log2_ctb_size))) ||
2690 (y0 + cb_size >=
sps->height))) {
2692 return !end_of_slice_flag;
2704 int x_ctb,
int y_ctb,
int ctb_addr_ts)
2707 int ctb_size = 1 <<
sps->log2_ctb_size;
2708 int ctb_addr_rs =
pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2709 int ctb_addr_in_slice = ctb_addr_rs -
s->sh.slice_addr;
2713 if (
pps->entropy_coding_sync_enabled_flag) {
2714 if (x_ctb == 0 && (y_ctb & (ctb_size - 1)) == 0)
2717 }
else if (
pps->tiles_enabled_flag) {
2718 if (ctb_addr_ts &&
pps->tile_id[ctb_addr_ts] !=
pps->tile_id[ctb_addr_ts - 1]) {
2719 int idxX =
pps->col_idxX[x_ctb >>
sps->log2_ctb_size];
2730 if (
pps->tiles_enabled_flag) {
2731 if (x_ctb > 0 &&
pps->tile_id[ctb_addr_ts] !=
pps->tile_id[
pps->ctb_addr_rs_to_ts[ctb_addr_rs - 1]])
2735 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]])
2740 if (ctb_addr_in_slice <= 0)
2742 if (ctb_addr_in_slice < sps->ctb_width)
2748 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]]));
2749 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]]));
2758 const uint8_t *slice_data = gb->
buffer +
s->sh.data_offset;
2760 int ctb_size = 1 <<
sps->log2_ctb_size;
2764 int ctb_addr_ts =
pps->ctb_addr_rs_to_ts[
s->sh.slice_ctb_addr_rs];
2767 while (more_data && ctb_addr_ts < sps->ctb_size) {
2768 int ctb_addr_rs =
pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2770 x_ctb = (ctb_addr_rs % ((
sps->width + ctb_size - 1) >>
sps->log2_ctb_size)) <<
sps->log2_ctb_size;
2771 y_ctb = (ctb_addr_rs / ((
sps->width + ctb_size - 1) >>
sps->log2_ctb_size)) <<
sps->log2_ctb_size;
2781 x_ctb >>
sps->log2_ctb_size, y_ctb >>
sps->log2_ctb_size);
2788 if (more_data < 0) {
2799 if (x_ctb + ctb_size >=
sps->width &&
2800 y_ctb + ctb_size >=
sps->height)
2807 int job,
int thread)
2814 int ctb_size = 1 <<
sps->log2_ctb_size;
2817 int ctb_addr_rs =
s->sh.slice_ctb_addr_rs + ctb_row * ((
sps->width + ctb_size - 1) >>
sps->log2_ctb_size);
2818 int ctb_addr_ts =
pps->ctb_addr_rs_to_ts[ctb_addr_rs];
2820 const uint8_t *
data =
s->data +
s->sh.offset[ctb_row];
2821 const size_t data_size =
s->sh.size[ctb_row];
2830 while(more_data && ctb_addr_ts < sps->ctb_size) {
2831 int x_ctb = (ctb_addr_rs %
sps->ctb_width) <<
sps->log2_ctb_size;
2832 int y_ctb = (ctb_addr_rs /
sps->ctb_width) <<
sps->log2_ctb_size;
2852 x_ctb >>
sps->log2_ctb_size, y_ctb >>
sps->log2_ctb_size);
2860 if (more_data < 0) {
2871 if (!more_data && (x_ctb+ctb_size) <
sps->width && ctb_row !=
s->sh.num_entry_point_offsets) {
2878 if ((x_ctb+ctb_size) >=
sps->width && (y_ctb+ctb_size) >=
sps->height ) {
2883 ctb_addr_rs =
pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2886 if(x_ctb >=
sps->width) {
2903 if (
s->nb_wpp_progress < count) {
2905 sizeof(*
s->wpp_progress));
2909 s->wpp_progress =
tmp;
2910 memset(
s->wpp_progress +
s->nb_wpp_progress, 0,
2911 (count -
s->nb_wpp_progress) *
sizeof(*
s->wpp_progress));
2913 for (
int i =
s->nb_wpp_progress;
i < count;
i++) {
2917 s->nb_wpp_progress =
i + 1;
2921 for (
int i = 0;
i < count;
i++)
2931 const uint8_t *
data =
nal->data;
2932 int length =
nal->size;
2935 int64_t startheader, cmpt = 0;
2938 if (
s->sh.slice_ctb_addr_rs +
s->sh.num_entry_point_offsets *
sps->ctb_width >=
sps->ctb_width *
sps->ctb_height) {
2940 s->sh.slice_ctb_addr_rs,
s->sh.num_entry_point_offsets,
2941 sps->ctb_width,
sps->ctb_height
2946 if (
s->avctx->thread_count >
s->nb_local_ctx) {
2952 memcpy(
tmp,
s->local_ctx,
sizeof(*
s->local_ctx) *
s->nb_local_ctx);
2956 for (
unsigned i =
s->nb_local_ctx; i < s->avctx->thread_count;
i++) {
2957 tmp = &
s->local_ctx[
i];
2959 memset(
tmp, 0,
sizeof(*
tmp));
2961 tmp->logctx =
s->avctx;
2963 tmp->common_cabac_state = &
s->cabac;
2966 s->nb_local_ctx =
s->avctx->thread_count;
2971 for (j = 0, cmpt = 0, startheader =
offset +
s->sh.entry_point_offset[0]; j < nal->skipped_bytes; j++) {
2972 if (
nal->skipped_bytes_pos[j] >=
offset &&
nal->skipped_bytes_pos[j] < startheader) {
2978 for (
int i = 1;
i <
s->sh.num_entry_point_offsets;
i++) {
2979 offset += (
s->sh.entry_point_offset[
i - 1] - cmpt);
2980 for (j = 0, cmpt = 0, startheader =
offset
2981 +
s->sh.entry_point_offset[
i]; j < nal->skipped_bytes; j++) {
2982 if (
nal->skipped_bytes_pos[j] >=
offset &&
nal->skipped_bytes_pos[j] < startheader) {
2987 s->sh.size[
i] =
s->sh.entry_point_offset[
i] - cmpt;
2992 offset +=
s->sh.entry_point_offset[
s->sh.num_entry_point_offsets - 1] - cmpt;
2997 s->sh.size [
s->sh.num_entry_point_offsets] = length -
offset;
2998 s->sh.offset[
s->sh.num_entry_point_offsets] =
offset;
3000 s->sh.offset[0] =
s->sh.data_offset;
3001 s->sh.size[0] =
s->sh.offset[1] -
s->sh.offset[0];
3005 for (
unsigned i = 1;
i <
s->nb_local_ctx;
i++) {
3006 s->local_ctx[
i].first_qp_group = 1;
3007 s->local_ctx[
i].qp_y =
s->local_ctx[0].qp_y;
3019 if (
pps->entropy_coding_sync_enabled_flag)
3022 for (
int i = 0;
i <=
s->sh.num_entry_point_offsets;
i++)
3035 if (!
s->sh.first_slice_in_pic_flag)
3036 s->slice_idx += !
s->sh.dependent_slice_segment_flag;
3038 if (!
s->sh.dependent_slice_segment_flag &&
s->sh.slice_type !=
HEVC_SLICE_I) {
3042 "Error constructing the reference lists for the current slice.\n");
3047 s->slice_initialized = 1;
3049 if (
s->avctx->hwaccel)
3054 "SCC profile is not yet implemented in hevc native decoder.\n");
3058 if (
s->sh.dependent_slice_segment_flag) {
3059 int ctb_addr_ts =
pps->ctb_addr_rs_to_ts[
s->sh.slice_ctb_addr_rs];
3060 int prev_rs =
pps->ctb_addr_ts_to_rs[ctb_addr_ts - 1];
3067 s->local_ctx[0].first_qp_group = !
s->sh.dependent_slice_segment_flag;
3069 if (!
pps->cu_qp_delta_enabled_flag)
3070 s->local_ctx[0].qp_y =
s->sh.slice_qp;
3072 s->local_ctx[0].tu.cu_qp_offset_cb = 0;
3073 s->local_ctx[0].tu.cu_qp_offset_cr = 0;
3076 s->sh.num_entry_point_offsets > 0 &&
3077 pps->num_tile_rows == 1 &&
pps->num_tile_columns == 1)
3092 if (
IS_IRAP(
s) &&
s->no_rasl_output_flag) {
3093 if (
s->sei.common.mastering_display.present > 0)
3094 s->sei.common.mastering_display.present--;
3096 if (
s->sei.common.content_light.present > 0)
3097 s->sei.common.content_light.present--;
3102 sps->bit_depth,
sps->bit_depth_chroma,
3103 s->cur_frame->poc );
3107 if (
s->sei.timecode.present) {
3112 sizeof(uint32_t) * 4, &tcside);
3117 tc_sd = (uint32_t*)tcside->
data;
3118 tc_sd[0] =
s->sei.timecode.num_clock_ts;
3120 for (
int i = 0;
i < tc_sd[0];
i++) {
3121 int drop =
s->sei.timecode.cnt_dropped_flag[
i];
3122 int hh =
s->sei.timecode.hours_value[
i];
3123 int mm =
s->sei.timecode.minutes_value[
i];
3124 int ss =
s->sei.timecode.seconds_value[
i];
3125 int ff =
s->sei.timecode.n_frames[
i];
3133 s->sei.timecode.num_clock_ts = 0;
3136 if (
s->sei.common.itut_t35.hdr_plus) {
3157 if (
s->sei.common.itut_t35.hdr_vivid) {
3160 &
s->sei.common.itut_t35.hdr_vivid,
3172 for (
int i = nal_idx;
i <
s->pkt.nb_nals;
i++) {
3174 const int layer_id =
nal->nuh_layer_id;
3178 !(
s->layers_active_decode & (1 <<
s->vps->layer_idx[layer_id])))
3181 switch (
nal->type) {
3215 const HEVCPPS *
const pps =
s->ps.pps_list[
s->sh.pps_id];
3217 int pic_size_in_ctb = ((
sps->width >>
sps->log2_min_cb_size) + 1) *
3218 ((
sps->height >>
sps->log2_min_cb_size) + 1);
3219 int new_sequence = (l == &
s->layers[0]) &&
3221 int prev_layers_active_decode =
s->layers_active_decode;
3222 int prev_layers_active_output =
s->layers_active_output;
3225 if (
sps->vps !=
s->vps && l != &
s->layers[0]) {
3233 const HEVCSPS *sps_base =
s->layers[0].sps;
3236 if (l != &
s->layers[0]) {
3239 "Access unit starts with a non-base layer frame\n");
3248 !
sps->vui.common.video_signal_type_present_flag)
3261 "Base/non-base layer SPS have unsupported parameter combination\n");
3272 if (l == &
s->layers[0]) {
3288 memset(l->
is_pcm, 0, (
sps->min_pu_width + 1) * (
sps->min_pu_height + 1));
3295 s->first_nal_type =
s->nal_unit_type;
3305 s->sei.recovery_point.has_recovery_poc) {
3307 s->recovery_poc =
s->poc +
s->sei.recovery_point.recovery_poc_cnt;
3308 else if (
s->poc >=
s->recovery_poc)
3313 if (
s->temporal_id == 0 &&
3321 s->poc_tid0 =
s->poc;
3323 if (
pps->tiles_enabled_flag)
3324 s->local_ctx[0].end_of_tiles_x =
pps->column_width[0] <<
sps->log2_ctb_size;
3328 0, 0,
s->sh.no_output_of_prior_pics_flag);
3352 s->cur_frame->needs_fg = ((
s->sei.common.film_grain_characteristics &&
3353 s->sei.common.film_grain_characteristics->present) ||
3354 s->sei.common.itut_t35.aom_film_grain.enable) &&
3362 if (
s->cur_frame->needs_fg &&
3363 (
s->sei.common.film_grain_characteristics &&
s->sei.common.film_grain_characteristics->present &&
3365 s->cur_frame->f->format) ||
3368 "Unsupported film grain parameters. Ignoring film grain.\n");
3369 s->cur_frame->needs_fg = 0;
3372 if (
s->cur_frame->needs_fg) {
3373 s->cur_frame->frame_grain->format =
s->cur_frame->f->format;
3374 s->cur_frame->frame_grain->width =
s->cur_frame->f->width;
3375 s->cur_frame->frame_grain->height =
s->cur_frame->f->height;
3384 s->cur_frame->f->pict_type = 3 -
s->sh.slice_type;
3387 sps->temporal_layer[
sps->max_sub_layers - 1].num_reorder_pics,
3388 sps->temporal_layer[
sps->max_sub_layers - 1].max_dec_pic_buffering, 0);
3392 if (
s->avctx->hwaccel) {
3404 if (l == &
s->layers[0])
3407 if (nal_idx >=
s->finish_setup_nal_idx)
3416 s->cur_frame =
s->collocated_ref =
NULL;
3423 char msg_buf[4 * (50 + 2 * 2 * 16 )];
3431 pixel_shift =
desc->comp[0].depth > 8;
3436 if (pixel_shift && !
s->checksum_buf) {
3439 frame->linesize[2]));
3440 if (!
s->checksum_buf)
3447 int width =
s->avctx->coded_width;
3448 int height =
s->avctx->coded_height;
3454 for (j = 0; j <
h; j++) {
3458 s->bdsp.bswap16_buf((uint16_t *)
s->checksum_buf,
3459 (
const uint16_t *)
src,
w);
3460 src =
s->checksum_buf;
3467 #define MD5_PRI "%016" PRIx64 "%016" PRIx64
3468 #define MD5_PRI_ARG(buf) AV_RB64(buf), AV_RB64((const uint8_t*)(buf) + 8)
3470 if (!memcmp(
md5,
s->sei.picture_hash.md5[
i], 16)) {
3472 "plane %d - correct " MD5_PRI "; ",
3476 "mismatching checksum of plane %d - " MD5_PRI " != " MD5_PRI "; ",
3483 "Verifying checksum for frame with POC %d: %s\n",
3495 if (
out->needs_fg) {
3498 switch (fgp->
type) {
3512 if (
s->avctx->hwaccel) {
3516 "hardware accelerator failed to decode picture\n");
3521 s->sei.picture_hash.is_md5) {
3527 s->sei.picture_hash.is_md5 = 0;
3530 l -
s->layers,
s->poc);
3537 const int layer_idx =
s->vps ?
s->vps->layer_idx[
s->nuh_layer_id] : 0;
3544 if (layer_idx < 0 ||
3545 (
s->nuh_layer_id > 0 && !(
s->layers_active_decode & (1 << layer_idx))))
3552 s->slice_initialized = 0;
3561 s->no_rasl_output_flag)) {
3566 if (
s->cur_layer != layer_idx &&
3567 s->layers[
s->cur_layer].cur_frame &&
3571 s->cur_layer = layer_idx;
3572 l = &
s->layers[
s->cur_layer];
3574 if (
s->sh.first_slice_in_pic_flag) {
3576 av_log(
s->avctx,
AV_LOG_ERROR,
"Two slices reporting being the first in the same frame.\n");
3588 if (
s->nal_unit_type !=
s->first_nal_type) {
3590 "Non-matching NAL types of the VCL NALUs: %d %d\n",
3591 s->first_nal_type,
s->nal_unit_type);
3608 s->nal_unit_type =
nal->type;
3609 s->nuh_layer_id =
nal->nuh_layer_id;
3610 s->temporal_id =
nal->temporal_id;
3619 nal->type,
nal->raw_data,
nal->raw_size);
3624 switch (
s->nal_unit_type) {
3632 nal->nuh_layer_id,
s->apply_defdispwin);
3676 "Skipping NAL unit %d\n",
s->nal_unit_type);
3684 "Skipping invalid undecodable NALU: %d\n",
s->nal_unit_type);
3693 s->sei.recovery_point.has_recovery_poc = 0;
3699 int eos_at_start = 1;
3702 s->cur_frame =
s->collocated_ref =
NULL;
3703 s->last_eos =
s->eos;
3705 s->slice_initialized = 0;
3717 s->nal_length_size,
s->avctx->codec_id,
flags);
3720 "Error splitting the input into NAL units.\n");
3724 for (
int i = 0;
i <
s->pkt.nb_nals;
i++) {
3747 for (
int i =
s->pkt.nb_nals - 1;
i > 0 ;
i--) {
3749 && !
s->pkt.nals[
i].nuh_layer_id && !
s->pkt.nals[
i].temporal_id) {
3750 rpu_nal = &
s->pkt.nals[
i];
3758 av_log(
s->avctx,
AV_LOG_WARNING,
"Multiple Dolby Vision RPUs found in one AU. Skipping previous.\n");
3769 s->avctx->err_recognition);
3778 for (
int i = 0;
i <
s->pkt.nb_nals;
i++) {
3788 "Error parsing NAL unit #%d.\n",
i);
3815 &
s->nal_length_size,
s->avctx->err_recognition,
3816 s->apply_defdispwin,
s->avctx);
3822 if (
first &&
s->ps.sps_list[
i]) {
3861 s->layers_active_output, 0, 0, 0);
3868 s->pkt_dts = avpkt->
dts;
3871 if (sd && sd_size > 0) {
3878 if (sd && sd_size >=
sizeof(
s->dovi_ctx.cfg)) {
3879 int old =
s->dovi_ctx.cfg.dv_profile;
3883 "New DOVI configuration record from input packet (profile %d -> %u).\n",
3884 old,
s->dovi_ctx.cfg.dv_profile);
3908 if (
src->needs_fg) {
3921 dst->nb_rpl_elems =
src->nb_rpl_elems;
3924 dst->ctb_count =
src->ctb_count;
3927 dst->base_layer_frame =
src->base_layer_frame;
3930 src->hwaccel_picture_private);
3964 for (
int i = 0;
i <
s->nb_wpp_progress;
i++)
3990 s->nb_local_ctx = 1;
3992 s->local_ctx[0].parent =
s;
3993 s->local_ctx[0].logctx = avctx;
3994 s->local_ctx[0].common_cabac_state = &
s->cabac;
3997 if (!
s->output_fifo)
4015 s->dovi_ctx.logctx = avctx;
4074 memcmp(
s->view_ids, s0->
view_ids,
sizeof(*
s->view_ids) *
s->nb_view_ids)) {
4121 if (
sei->tdrdi.present) {
4135 tdrdi->prec_ref_display_width =
sei->tdrdi.prec_ref_display_width;
4136 tdrdi->ref_viewing_distance_flag =
sei->tdrdi.ref_viewing_distance_flag;
4137 tdrdi->prec_ref_viewing_dist =
sei->tdrdi.prec_ref_viewing_dist;
4138 tdrdi->num_ref_displays =
sei->tdrdi.num_ref_displays;
4139 for (
int i = 0;
i <
sei->tdrdi.num_ref_displays;
i++) {
4175 s->sei.picture_timing.picture_struct = 0;
4195 if (sd && sd->
size >=
sizeof(
s->dovi_ctx.cfg))
4215 #define OFFSET(x) offsetof(HEVCContext, x)
4216 #define PAR (AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
4219 {
"apply_defdispwin",
"Apply default display window from VUI",
OFFSET(apply_defdispwin),
4221 {
"strict-displaywin",
"strictly apply default display window size",
OFFSET(apply_defdispwin),
4223 {
"view_ids",
"Array of view IDs that should be decoded and output; a single -1 to decode all views",
4225 .min = -1, .max = INT_MAX, .flags =
PAR },
4226 {
"view_ids_available",
"Array of available view IDs is exported here",
4229 {
"view_pos_available",
"Array of view positions for view_ids_available is exported here, as AVStereo3DView",
4265 #if CONFIG_HEVC_DXVA2_HWACCEL
4268 #if CONFIG_HEVC_D3D11VA_HWACCEL
4271 #if CONFIG_HEVC_D3D11VA2_HWACCEL
4274 #if CONFIG_HEVC_D3D12VA_HWACCEL
4277 #if CONFIG_HEVC_NVDEC_HWACCEL
4280 #if CONFIG_HEVC_VAAPI_HWACCEL
4283 #if CONFIG_HEVC_VDPAU_HWACCEL
4286 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
4289 #if CONFIG_HEVC_VULKAN_HWACCEL