26 #include "config_components.h"
62 static const uint8_t
hevc_pel_weight[65] = { [2] = 0, [4] = 1, [6] = 2, [8] = 3, [12] = 4, [16] = 5, [24] = 6, [32] = 7, [48] = 8, [64] = 9 };
93 for (
int i = 0;
i < 3;
i++) {
105 int log2_min_cb_size =
sps->log2_min_cb_size;
108 int pic_size_in_ctb = ((
width >> log2_min_cb_size) + 1) *
109 ((
height >> log2_min_cb_size) + 1);
110 int ctb_count =
sps->ctb_width *
sps->ctb_height;
111 int min_pu_size =
sps->min_pu_width *
sps->min_pu_height;
150 if (
sps->sao_enabled) {
151 int c_count = (
sps->chroma_format_idc != 0) ? 3 : 1;
153 for (
int c_idx = 0; c_idx < c_count; c_idx++) {
154 int w =
sps->width >>
sps->hshift[c_idx];
155 int h =
sps->height >>
sps->vshift[c_idx];
180 int luma_log2_weight_denom;
181 unsigned luma_weight_flags, chroma_weight_flags;
184 if (luma_log2_weight_denom < 0 || luma_log2_weight_denom > 7) {
185 av_log(logctx,
AV_LOG_ERROR,
"luma_log2_weight_denom %d is invalid\n", luma_log2_weight_denom);
189 if (
sps->chroma_format_idc != 0) {
191 if (chroma_log2_weight_denom < 0 || chroma_log2_weight_denom > 7) {
192 av_log(logctx,
AV_LOG_ERROR,
"chroma_log2_weight_denom %"PRId64
" is invalid\n", chroma_log2_weight_denom);
201 unsigned flag_bit = 1 << (sh->
nb_refs[
L0] - 1 -
i);
203 if (luma_weight_flags & flag_bit) {
205 if ((int8_t)delta_luma_weight_l0 != delta_luma_weight_l0)
213 if (chroma_weight_flags & flag_bit) {
214 for (j = 0; j < 2; j++) {
218 if ( (int8_t)delta_chroma_weight_l0 != delta_chroma_weight_l0
219 || delta_chroma_offset_l0 < -(1<<17) || delta_chroma_offset_l0 > (1<<17)) {
238 unsigned flag_bit = 1 << (sh->
nb_refs[
L1] - 1 -
i);
240 if (luma_weight_flags & flag_bit) {
242 if ((int8_t)delta_luma_weight_l1 != delta_luma_weight_l1)
250 if (chroma_weight_flags & flag_bit) {
251 for (j = 0; j < 2; j++) {
255 if ( (int8_t)delta_chroma_weight_l1 != delta_chroma_weight_l1
256 || delta_chroma_offset_l1 < -(1<<17) || delta_chroma_offset_l1 > (1<<17)) {
278 int max_poc_lsb = 1 <<
sps->log2_max_poc_lsb;
279 int prev_delta_msb = 0;
280 unsigned int nb_sps = 0, nb_sh;
284 if (!
sps->long_term_ref_pics_present)
287 if (
sps->num_long_term_ref_pics_sps > 0)
291 if (nb_sps >
sps->num_long_term_ref_pics_sps)
301 uint8_t lt_idx_sps = 0;
303 if (
sps->num_long_term_ref_pics_sps > 1)
306 rps->
poc[
i] =
sps->lt_ref_pic_poc_lsb_sps[lt_idx_sps];
307 rps->
used[
i] = !!(
sps->used_by_curr_pic_lt & (1
U << lt_idx_sps));
318 if (
i &&
i != nb_sps)
319 delta += prev_delta_msb;
321 poc = rps->
poc[
i] + cur_poc -
delta * max_poc_lsb - poc_lsb;
325 prev_delta_msb =
delta;
337 unsigned int num = 0, den = 0;
345 avctx->
profile =
sps->ptl.general_ptl.profile_idc;
346 avctx->
level =
sps->ptl.general_ptl.level_idc;
350 if (
sps->vui.common.video_signal_type_present_flag)
356 if (
sps->vui.common.colour_description_present_flag) {
358 avctx->
color_trc =
sps->vui.common.transfer_characteristics;
367 if (
sps->chroma_format_idc == 1) {
368 if (
sps->vui.common.chroma_loc_info_present_flag) {
369 if (
sps->vui.common.chroma_sample_loc_type_top_field <= 5)
375 if (
vps->vps_timing_info_present_flag) {
376 num =
vps->vps_num_units_in_tick;
377 den =
vps->vps_time_scale;
378 }
else if (
sps->vui.vui_timing_info_present_flag) {
379 num =
sps->vui.vui_num_units_in_tick;
380 den =
sps->vui.vui_time_scale;
383 if (num > 0 && den > 0)
392 if (
s->sei.common.alternative_transfer.present &&
395 avctx->
color_trc =
s->sei.common.alternative_transfer.preferred_transfer_characteristics;
406 s->nb_view_ids_available = 0;
408 s->nb_view_pos_available = 0;
411 if (
vps->nb_layers < 2 && !
vps->view_id[0])
414 s->view_ids_available =
av_calloc(
vps->nb_layers,
sizeof(*
s->view_ids_available));
415 if (!
s->view_ids_available)
419 s->view_pos_available =
av_calloc(
vps->nb_layers,
sizeof(*
s->view_pos_available));
420 if (!
s->view_pos_available)
424 for (
int i = 0;
i <
vps->nb_layers;
i++) {
425 s->view_ids_available[
i] =
vps->view_id[
i];
427 if (
s->view_pos_available) {
434 s->nb_view_ids_available =
vps->nb_layers;
435 s->nb_view_pos_available =
s->view_pos_available ?
vps->nb_layers : 0;
445 if (
vps->nb_layers != 2 || !
vps->layer_id_in_nuh[1])
461 unsigned layers_active_output = 0, highest_layer;
463 s->layers_active_output = 1;
464 s->layers_active_decode = 1;
472 s->layers_active_decode = (1 <<
vps->nb_layers) - 1;
473 s->layers_active_output = 1;
482 if (
s->nb_view_ids == 1 &&
s->view_ids[0] == -1) {
483 layers_active_output = (1 <<
vps->nb_layers) - 1;
485 for (
int i = 0;
i <
s->nb_view_ids;
i++) {
486 int view_id =
s->view_ids[
i];
491 "Invalid view ID requested: %d\n", view_id);
495 for (
int j = 0; j <
vps->nb_layers; j++) {
496 if (
vps->view_id[j] == view_id) {
503 "View ID %d not present in VPS\n", view_id);
506 layers_active_output |= 1 << layer_idx;
510 if (!layers_active_output) {
515 highest_layer =
ff_log2(layers_active_output);
518 "Too many layers requested: %u\n", layers_active_output);
526 s->layers_active_decode = (1 << (highest_layer + 1)) - 1;
527 s->layers_active_output = layers_active_output;
530 s->layers_active_decode,
s->layers_active_output);
565 #define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \
566 CONFIG_HEVC_D3D11VA_HWACCEL * 2 + \
567 CONFIG_HEVC_D3D12VA_HWACCEL + \
568 CONFIG_HEVC_NVDEC_HWACCEL + \
569 CONFIG_HEVC_VAAPI_HWACCEL + \
570 CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \
571 CONFIG_HEVC_VDPAU_HWACCEL + \
572 CONFIG_HEVC_VULKAN_HWACCEL)
580 switch (
sps->pix_fmt) {
583 #if CONFIG_HEVC_DXVA2_HWACCEL
586 #if CONFIG_HEVC_D3D11VA_HWACCEL
590 #if CONFIG_HEVC_D3D12VA_HWACCEL
593 #if CONFIG_HEVC_VAAPI_HWACCEL
596 #if CONFIG_HEVC_VDPAU_HWACCEL
599 #if CONFIG_HEVC_NVDEC_HWACCEL
602 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
605 #if CONFIG_HEVC_VULKAN_HWACCEL
610 #if CONFIG_HEVC_DXVA2_HWACCEL
613 #if CONFIG_HEVC_D3D11VA_HWACCEL
617 #if CONFIG_HEVC_D3D12VA_HWACCEL
620 #if CONFIG_HEVC_VAAPI_HWACCEL
623 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
626 #if CONFIG_HEVC_VULKAN_HWACCEL
629 #if CONFIG_HEVC_VDPAU_HWACCEL
632 #if CONFIG_HEVC_NVDEC_HWACCEL
637 #if CONFIG_HEVC_VAAPI_HWACCEL
640 #if CONFIG_HEVC_VDPAU_HWACCEL
643 #if CONFIG_HEVC_NVDEC_HWACCEL
646 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
649 #if CONFIG_HEVC_VULKAN_HWACCEL
655 #if CONFIG_HEVC_VAAPI_HWACCEL
658 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
661 #if CONFIG_HEVC_VULKAN_HWACCEL
664 #if CONFIG_HEVC_NVDEC_HWACCEL
669 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
675 #if CONFIG_HEVC_VAAPI_HWACCEL
678 #if CONFIG_HEVC_VDPAU_HWACCEL
681 #if CONFIG_HEVC_VULKAN_HWACCEL
684 #if CONFIG_HEVC_NVDEC_HWACCEL
689 #if CONFIG_HEVC_VAAPI_HWACCEL
692 #if CONFIG_HEVC_VULKAN_HWACCEL
695 #if CONFIG_HEVC_NVDEC_HWACCEL
703 *fmt++ =
sps->pix_fmt;
715 s->avctx->pix_fmt =
ret;
760 unsigned pps_id, layer_idx;
781 pps =
s->ps.pps_list[pps_id];
784 layer_idx =
vps->layer_idx[
s->nuh_layer_id];
791 int slice_address_length;
793 if (
pps->dependent_slice_segments_enabled_flag)
805 "Invalid slice segment address: %u.\n",
818 for (
i = 0;
i <
pps->num_extra_slice_header_bits;
i++)
830 !
pps->pps_curr_pic_ref_enabled_flag &&
831 s->nuh_layer_id == 0) {
838 if (
pps->output_flag_present_flag)
841 if (
sps->separate_colour_plane)
845 (
s->nuh_layer_id > 0 &&
846 !(
vps->poc_lsb_not_present & (1 << layer_idx)))) {
853 "Ignoring POC change between slices: %d -> %d\n", poc, sh->
poc);
873 int numbits, rps_idx;
875 if (!
sps->nb_st_rps) {
881 rps_idx = numbits > 0 ?
get_bits(gb, numbits) : 0;
895 if (
sps->temporal_mvp_enabled)
911 if (
s->nuh_layer_id > 0) {
912 int num_direct_ref_layers =
vps->num_direct_ref_layers[layer_idx];
914 if (
vps->default_ref_layers_active)
916 else if (num_direct_ref_layers) {
921 "NumDirectRefLayers>1 not supported\n");
927 if (
sps->sao_enabled) {
929 if (
sps->chroma_format_idc) {
966 if (
pps->lists_modification_present_flag && nb_refs > 1) {
984 if (
pps->cabac_init_present_flag)
999 "Invalid collocated_ref_idx: %d.\n",
1016 "Invalid number of merging MVP candidates: %d.\n",
1022 if (
sps->motion_vector_resolution_control_idc == 2)
1032 if (
pps->pic_slice_level_chroma_qp_offsets_present_flag) {
1045 if (
pps->pps_slice_act_qp_offsets_present_flag) {
1051 if (
pps->chroma_qp_offset_list_enabled_flag)
1056 if (
pps->deblocking_filter_control_present_flag) {
1057 int deblocking_filter_override_flag = 0;
1059 if (
pps->deblocking_filter_override_enabled_flag)
1060 deblocking_filter_override_flag =
get_bits1(gb);
1062 if (deblocking_filter_override_flag) {
1067 if (beta_offset_div2 < -6 || beta_offset_div2 > 6 ||
1068 tc_offset_div2 < -6 || tc_offset_div2 > 6) {
1070 "Invalid deblock filter offsets: %d, %d\n",
1071 beta_offset_div2, tc_offset_div2);
1088 if (
pps->seq_loop_filter_across_slices_enabled_flag &&
1099 if (
pps->tiles_enabled_flag ||
pps->entropy_coding_sync_enabled_flag) {
1102 if (num_entry_point_offsets >
get_bits_left(gb) || num_entry_point_offsets > UINT16_MAX) {
1103 av_log(
s->avctx,
AV_LOG_ERROR,
"num_entry_point_offsets %d is invalid\n", num_entry_point_offsets);
1111 if (offset_len < 1 || offset_len > 32) {
1135 if (
pps->slice_header_extension_present_flag) {
1141 for (
i = 0;
i < length;
i++)
1163 "The slice_qp %d is outside the valid range "
1166 -
sps->qp_bd_offset);
1181 #define CTB(tab, x, y) ((tab)[(y) * sps->ctb_width + (x)])
1183 #define SET_SAO(elem, value) \
1185 if (!sao_merge_up_flag && !sao_merge_left_flag) \
1186 sao->elem = value; \
1187 else if (sao_merge_left_flag) \
1188 sao->elem = CTB(l->sao, rx-1, ry).elem; \
1189 else if (sao_merge_up_flag) \
1190 sao->elem = CTB(l->sao, rx, ry-1).elem; \
1200 int sao_merge_left_flag = 0;
1201 int sao_merge_up_flag = 0;
1205 if (
s->sh.slice_sample_adaptive_offset_flag[0] ||
1206 s->sh.slice_sample_adaptive_offset_flag[1]) {
1211 if (ry > 0 && !sao_merge_left_flag) {
1217 for (c_idx = 0; c_idx < (
sps->chroma_format_idc ? 3 : 1); c_idx++) {
1218 int log2_sao_offset_scale = c_idx == 0 ?
pps->log2_sao_offset_scale_luma :
1219 pps->log2_sao_offset_scale_chroma;
1221 if (!
s->sh.slice_sample_adaptive_offset_flag[c_idx]) {
1236 for (
i = 0;
i < 4;
i++)
1240 for (
i = 0;
i < 4;
i++) {
1249 }
else if (c_idx != 2) {
1255 for (
i = 0;
i < 4;
i++) {
1263 sao->
offset_val[c_idx][
i + 1] *= 1 << log2_sao_offset_scale;
1275 if (log2_res_scale_abs_plus1 != 0) {
1278 (1 - 2 * res_scale_sign_flag);
1291 int xBase,
int yBase,
int cb_xBase,
int cb_yBase,
1292 int log2_cb_size,
int log2_trafo_size,
1293 int blk_idx,
int cbf_luma,
int *cbf_cb,
int *cbf_cr)
1296 const int log2_trafo_size_c = log2_trafo_size -
sps->hshift[1];
1300 int trafo_size = 1 << log2_trafo_size;
1303 s->hpc.intra_pred[log2_trafo_size - 2](lc,
pps, x0, y0, 0);
1306 if (cbf_luma || cbf_cb[0] || cbf_cr[0] ||
1307 (
sps->chroma_format_idc == 2 && (cbf_cb[1] || cbf_cr[1]))) {
1310 int cbf_chroma = cbf_cb[0] || cbf_cr[0] ||
1311 (
sps->chroma_format_idc == 2 &&
1312 (cbf_cb[1] || cbf_cr[1]));
1324 "The cu_qp_delta %d is outside the valid range "
1327 -(26 +
sps->qp_bd_offset / 2),
1328 (25 +
sps->qp_bd_offset / 2));
1335 if (
s->sh.cu_chroma_qp_offset_enabled_flag && cbf_chroma &&
1338 if (cu_chroma_qp_offset_flag) {
1339 int cu_chroma_qp_offset_idx = 0;
1340 if (
pps->chroma_qp_offset_list_len_minus1 > 0) {
1343 "cu_chroma_qp_offset_idx not yet tested.\n");
1376 if (
sps->chroma_format_idc && (log2_trafo_size > 2 ||
sps->chroma_format_idc == 3)) {
1377 int trafo_size_h = 1 << (log2_trafo_size_c +
sps->hshift[1]);
1378 int trafo_size_v = 1 << (log2_trafo_size_c +
sps->vshift[1]);
1379 lc->
tu.
cross_pf = (
pps->cross_component_prediction_enabled_flag && cbf_luma &&
1386 for (
i = 0;
i < (
sps->chroma_format_idc == 2 ? 2 : 1);
i++) {
1389 trafo_size_h, trafo_size_v,
sps->log2_ctb_size);
1390 s->hpc.intra_pred[log2_trafo_size_c - 2](lc,
pps, x0, y0 + (
i << log2_trafo_size_c), 1);
1394 log2_trafo_size_c, scan_idx_c, 1);
1397 ptrdiff_t
stride =
s->cur_frame->f->linesize[1];
1398 int hshift =
sps->hshift[1];
1399 int vshift =
sps->vshift[1];
1402 int size = 1 << log2_trafo_size_c;
1404 uint8_t *
dst = &
s->cur_frame->f->data[1][(y0 >> vshift) *
stride +
1405 ((x0 >> hshift) <<
sps->pixel_shift)];
1409 s->hevcdsp.add_residual[log2_trafo_size_c-2](
dst, coeffs,
stride);
1416 for (
i = 0;
i < (
sps->chroma_format_idc == 2 ? 2 : 1);
i++) {
1419 trafo_size_h, trafo_size_v,
sps->log2_ctb_size);
1420 s->hpc.intra_pred[log2_trafo_size_c - 2](lc,
pps, x0, y0 + (
i << log2_trafo_size_c), 2);
1424 log2_trafo_size_c, scan_idx_c, 2);
1427 ptrdiff_t
stride =
s->cur_frame->f->linesize[2];
1428 int hshift =
sps->hshift[2];
1429 int vshift =
sps->vshift[2];
1432 int size = 1 << log2_trafo_size_c;
1434 uint8_t *
dst = &
s->cur_frame->f->data[2][(y0 >> vshift) *
stride +
1435 ((x0 >> hshift) <<
sps->pixel_shift)];
1439 s->hevcdsp.add_residual[log2_trafo_size_c-2](
dst, coeffs,
stride);
1442 }
else if (
sps->chroma_format_idc && blk_idx == 3) {
1443 int trafo_size_h = 1 << (log2_trafo_size + 1);
1444 int trafo_size_v = 1 << (log2_trafo_size +
sps->vshift[1]);
1445 for (
i = 0;
i < (
sps->chroma_format_idc == 2 ? 2 : 1);
i++) {
1448 trafo_size_h, trafo_size_v,
sps->log2_ctb_size);
1449 s->hpc.intra_pred[log2_trafo_size - 2](lc,
pps, xBase, yBase + (
i << log2_trafo_size), 1);
1453 log2_trafo_size, scan_idx_c, 1);
1455 for (
i = 0;
i < (
sps->chroma_format_idc == 2 ? 2 : 1);
i++) {
1458 trafo_size_h, trafo_size_v,
sps->log2_ctb_size);
1459 s->hpc.intra_pred[log2_trafo_size - 2](lc,
pps, xBase, yBase + (
i << log2_trafo_size), 2);
1463 log2_trafo_size, scan_idx_c, 2);
1467 if (log2_trafo_size > 2 ||
sps->chroma_format_idc == 3) {
1468 int trafo_size_h = 1 << (log2_trafo_size_c +
sps->hshift[1]);
1469 int trafo_size_v = 1 << (log2_trafo_size_c +
sps->vshift[1]);
1471 sps->log2_ctb_size);
1472 s->hpc.intra_pred[log2_trafo_size_c - 2](lc,
pps, x0, y0, 1);
1473 s->hpc.intra_pred[log2_trafo_size_c - 2](lc,
pps, x0, y0, 2);
1474 if (
sps->chroma_format_idc == 2) {
1476 trafo_size_h, trafo_size_v,
sps->log2_ctb_size);
1477 s->hpc.intra_pred[log2_trafo_size_c - 2](lc,
pps, x0, y0 + (1 << log2_trafo_size_c), 1);
1478 s->hpc.intra_pred[log2_trafo_size_c - 2](lc,
pps, x0, y0 + (1 << log2_trafo_size_c), 2);
1480 }
else if (blk_idx == 3) {
1481 int trafo_size_h = 1 << (log2_trafo_size + 1);
1482 int trafo_size_v = 1 << (log2_trafo_size +
sps->vshift[1]);
1484 trafo_size_h, trafo_size_v,
sps->log2_ctb_size);
1485 s->hpc.intra_pred[log2_trafo_size - 2](lc,
pps, xBase, yBase, 1);
1486 s->hpc.intra_pred[log2_trafo_size - 2](lc,
pps, xBase, yBase, 2);
1487 if (
sps->chroma_format_idc == 2) {
1489 trafo_size_h, trafo_size_v,
sps->log2_ctb_size);
1490 s->hpc.intra_pred[log2_trafo_size - 2](lc,
pps, xBase, yBase + (1 << log2_trafo_size), 1);
1491 s->hpc.intra_pred[log2_trafo_size - 2](lc,
pps, xBase, yBase + (1 << log2_trafo_size), 2);
1500 int x0,
int y0,
int log2_cb_size)
1502 int cb_size = 1 << log2_cb_size;
1503 int log2_min_pu_size =
sps->log2_min_pu_size;
1505 int min_pu_width =
sps->min_pu_width;
1506 int x_end =
FFMIN(x0 + cb_size,
sps->width);
1507 int y_end =
FFMIN(y0 + cb_size,
sps->height);
1510 for (j = (y0 >> log2_min_pu_size); j < (y_end >> log2_min_pu_size); j++)
1511 for (
i = (x0 >> log2_min_pu_size);
i < (x_end >> log2_min_pu_size);
i++)
1512 is_pcm[
i + j * min_pu_width] = 2;
1519 int xBase,
int yBase,
int cb_xBase,
int cb_yBase,
1520 int log2_cb_size,
int log2_trafo_size,
1521 int trafo_depth,
int blk_idx,
1522 const int *base_cbf_cb,
const int *base_cbf_cr)
1525 uint8_t split_transform_flag;
1530 cbf_cb[0] = base_cbf_cb[0];
1531 cbf_cb[1] = base_cbf_cb[1];
1532 cbf_cr[0] = base_cbf_cr[0];
1533 cbf_cr[1] = base_cbf_cr[1];
1536 if (trafo_depth == 1) {
1538 if (
sps->chroma_format_idc == 3) {
1552 if (log2_trafo_size <= sps->log2_max_trafo_size &&
1553 log2_trafo_size >
sps->log2_min_tb_size &&
1554 trafo_depth < lc->cu.max_trafo_depth &&
1558 int inter_split =
sps->max_transform_hierarchy_depth_inter == 0 &&
1563 split_transform_flag = log2_trafo_size >
sps->log2_max_trafo_size ||
1568 if (
sps->chroma_format_idc && (log2_trafo_size > 2 ||
sps->chroma_format_idc == 3)) {
1569 if (trafo_depth == 0 || cbf_cb[0]) {
1571 if (
sps->chroma_format_idc == 2 && (!split_transform_flag || log2_trafo_size == 3)) {
1576 if (trafo_depth == 0 || cbf_cr[0]) {
1578 if (
sps->chroma_format_idc == 2 && (!split_transform_flag || log2_trafo_size == 3)) {
1584 if (split_transform_flag) {
1585 const int trafo_size_split = 1 << (log2_trafo_size - 1);
1586 const int x1 = x0 + trafo_size_split;
1587 const int y1 = y0 + trafo_size_split;
1589 #define SUBDIVIDE(x, y, idx) \
1591 ret = hls_transform_tree(lc, l, pps, sps, \
1592 x, y, x0, y0, cb_xBase, cb_yBase, log2_cb_size, \
1593 log2_trafo_size - 1, trafo_depth + 1, idx, \
1606 int min_tu_size = 1 <<
sps->log2_min_tb_size;
1607 int log2_min_tu_size =
sps->log2_min_tb_size;
1608 int min_tu_width =
sps->min_tb_width;
1612 cbf_cb[0] || cbf_cr[0] ||
1613 (
sps->chroma_format_idc == 2 && (cbf_cb[1] || cbf_cr[1]))) {
1618 x0, y0, xBase, yBase, cb_xBase, cb_yBase,
1619 log2_cb_size, log2_trafo_size,
1620 blk_idx, cbf_luma, cbf_cb, cbf_cr);
1626 for (
i = 0;
i < (1 << log2_trafo_size);
i += min_tu_size)
1627 for (j = 0; j < (1 << log2_trafo_size); j += min_tu_size) {
1628 int x_tu = (x0 + j) >> log2_min_tu_size;
1629 int y_tu = (y0 +
i) >> log2_min_tu_size;
1630 l->
cbf_luma[y_tu * min_tu_width + x_tu] = 1;
1633 if (!
s->sh.disable_deblocking_filter_flag) {
1635 if (
pps->transquant_bypass_enable_flag &&
1644 const HEVCPPS *
pps,
int x0,
int y0,
int log2_cb_size)
1649 int cb_size = 1 << log2_cb_size;
1650 ptrdiff_t stride0 =
s->cur_frame->f->linesize[0];
1651 uint8_t *dst0 = &
s->cur_frame->f->data[0][y0 * stride0 + (x0 <<
sps->pixel_shift)];
1653 int length = cb_size * cb_size *
sps->pcm.bit_depth + (
sps->chroma_format_idc != 0 ?
1654 (((cb_size >>
sps->hshift[1]) * (cb_size >>
sps->vshift[1])) +
1655 ((cb_size >>
sps->hshift[2]) * (cb_size >>
sps->vshift[2]))) *
1656 sps->pcm.bit_depth_chroma : 0);
1657 const uint8_t *pcm =
skip_bytes(&lc->
cc, (length + 7) >> 3);
1660 if (!
s->sh.disable_deblocking_filter_flag)
1667 s->hevcdsp.put_pcm(dst0, stride0, cb_size, cb_size, &gb,
sps->pcm.bit_depth);
1668 if (
sps->chroma_format_idc) {
1669 ptrdiff_t stride1 =
s->cur_frame->f->linesize[1];
1670 ptrdiff_t stride2 =
s->cur_frame->f->linesize[2];
1671 uint8_t *dst1 = &
s->cur_frame->f->data[1][(y0 >>
sps->vshift[1]) * stride1 + ((x0 >>
sps->hshift[1]) <<
sps->pixel_shift)];
1672 uint8_t *dst2 = &
s->cur_frame->f->data[2][(y0 >>
sps->vshift[2]) * stride2 + ((x0 >>
sps->hshift[2]) <<
sps->pixel_shift)];
1674 s->hevcdsp.put_pcm(dst1, stride1,
1675 cb_size >>
sps->hshift[1],
1676 cb_size >>
sps->vshift[1],
1677 &gb,
sps->pcm.bit_depth_chroma);
1678 s->hevcdsp.put_pcm(dst2, stride2,
1679 cb_size >>
sps->hshift[2],
1680 cb_size >>
sps->vshift[2],
1681 &gb,
sps->pcm.bit_depth_chroma);
1705 uint8_t *
dst, ptrdiff_t dststride,
1707 int block_w,
int block_h,
int luma_weight,
int luma_offset)
1710 const uint8_t *
src =
ref->data[0];
1712 int pic_width =
sps->width;
1713 int pic_height =
sps->height;
1716 int weight_flag = (
s->sh.slice_type ==
HEVC_SLICE_P &&
pps->weighted_pred_flag) ||
1720 x_off +=
mv->x >> 2;
1721 y_off +=
mv->y >> 2;
1727 ref ==
s->cur_frame->f) {
1737 pic_width, pic_height);
1744 block_h,
mx,
my, block_w);
1747 block_h,
s->sh.luma_log2_weight_denom,
1748 luma_weight, luma_offset,
mx,
my, block_w);
1769 uint8_t *
dst, ptrdiff_t dststride,
1770 const AVFrame *ref0,
const Mv *mv0,
int x_off,
int y_off,
1771 int block_w,
int block_h,
const AVFrame *ref1,
1772 const Mv *mv1,
struct MvField *current_mv)
1775 ptrdiff_t src0stride = ref0->
linesize[0];
1776 ptrdiff_t src1stride = ref1->
linesize[0];
1777 int pic_width =
sps->width;
1778 int pic_height =
sps->height;
1779 int mx0 = mv0->
x & 3;
1780 int my0 = mv0->
y & 3;
1781 int mx1 = mv1->
x & 3;
1782 int my1 = mv1->
y & 3;
1783 int weight_flag = (
s->sh.slice_type ==
HEVC_SLICE_P &&
pps->weighted_pred_flag) ||
1785 int x_off0 = x_off + (mv0->
x >> 2);
1786 int y_off0 = y_off + (mv0->
y >> 2);
1787 int x_off1 = x_off + (mv1->
x >> 2);
1788 int y_off1 = y_off + (mv1->
y >> 2);
1791 const uint8_t *
src0 = ref0->
data[0] + y_off0 * src0stride + (int)((
unsigned)x_off0 <<
sps->pixel_shift);
1792 const uint8_t *
src1 = ref1->
data[0] + y_off1 * src1stride + (int)((
unsigned)x_off1 <<
sps->pixel_shift);
1802 edge_emu_stride, src0stride,
1806 pic_width, pic_height);
1808 src0stride = edge_emu_stride;
1819 edge_emu_stride, src1stride,
1823 pic_width, pic_height);
1825 src1stride = edge_emu_stride;
1828 s->hevcdsp.put_hevc_qpel[idx][!!my0][!!mx0](lc->
tmp,
src0, src0stride,
1829 block_h, mx0, my0, block_w);
1831 s->hevcdsp.put_hevc_qpel_bi[idx][!!my1][!!mx1](
dst, dststride,
src1, src1stride, lc->
tmp,
1832 block_h, mx1, my1, block_w);
1834 s->hevcdsp.put_hevc_qpel_bi_w[idx][!!my1][!!mx1](
dst, dststride,
src1, src1stride, lc->
tmp,
1835 block_h,
s->sh.luma_log2_weight_denom,
1836 s->sh.luma_weight_l0[current_mv->
ref_idx[0]],
1837 s->sh.luma_weight_l1[current_mv->
ref_idx[1]],
1838 s->sh.luma_offset_l0[current_mv->
ref_idx[0]],
1839 s->sh.luma_offset_l1[current_mv->
ref_idx[1]],
1864 ptrdiff_t dststride,
const uint8_t *
src0, ptrdiff_t
srcstride,
int reflist,
1865 int x_off,
int y_off,
int block_w,
int block_h,
1866 const struct MvField *current_mv,
int chroma_weight,
int chroma_offset)
1869 int pic_width =
sps->width >>
sps->hshift[1];
1870 int pic_height =
sps->height >>
sps->vshift[1];
1871 const Mv *
mv = ¤t_mv->
mv[reflist];
1872 int weight_flag = (
s->sh.slice_type ==
HEVC_SLICE_P &&
pps->weighted_pred_flag) ||
1875 int hshift =
sps->hshift[1];
1876 int vshift =
sps->vshift[1];
1879 intptr_t _mx =
mx << (1 - hshift);
1880 intptr_t _my =
my << (1 - vshift);
1881 int emu =
src0 ==
s->cur_frame->f->data[1] ||
src0 ==
s->cur_frame->f->data[2];
1883 x_off +=
mv->x >> (2 + hshift);
1884 y_off +=
mv->y >> (2 + vshift);
1894 (edge_emu_stride + (1 <<
sps->pixel_shift));
1900 pic_width, pic_height);
1907 block_h, _mx, _my, block_w);
1910 block_h,
s->sh.chroma_log2_weight_denom,
1911 chroma_weight, chroma_offset, _mx, _my, block_w);
1933 uint8_t *dst0, ptrdiff_t dststride,
1935 int x_off,
int y_off,
int block_w,
int block_h,
const MvField *current_mv,
int cidx)
1938 const uint8_t *
src1 = ref0->
data[cidx+1];
1939 const uint8_t *
src2 = ref1->
data[cidx+1];
1940 ptrdiff_t src1stride = ref0->
linesize[cidx+1];
1941 ptrdiff_t src2stride = ref1->
linesize[cidx+1];
1942 int weight_flag = (
s->sh.slice_type ==
HEVC_SLICE_P &&
pps->weighted_pred_flag) ||
1944 int pic_width =
sps->width >>
sps->hshift[1];
1945 int pic_height =
sps->height >>
sps->vshift[1];
1946 const Mv *
const mv0 = ¤t_mv->
mv[0];
1947 const Mv *
const mv1 = ¤t_mv->
mv[1];
1948 int hshift =
sps->hshift[1];
1949 int vshift =
sps->vshift[1];
1955 intptr_t _mx0 = mx0 << (1 - hshift);
1956 intptr_t _my0 = my0 << (1 - vshift);
1957 intptr_t _mx1 = mx1 << (1 - hshift);
1958 intptr_t _my1 = my1 << (1 - vshift);
1960 int x_off0 = x_off + (mv0->
x >> (2 + hshift));
1961 int y_off0 = y_off + (mv0->
y >> (2 + vshift));
1962 int x_off1 = x_off + (mv1->
x >> (2 + hshift));
1963 int y_off1 = y_off + (mv1->
y >> (2 + vshift));
1965 src1 += y_off0 * src1stride + (int)((
unsigned)x_off0 <<
sps->pixel_shift);
1966 src2 += y_off1 * src2stride + (int)((
unsigned)x_off1 <<
sps->pixel_shift);
1974 (edge_emu_stride + (1 <<
sps->pixel_shift));
1977 edge_emu_stride, src1stride,
1981 pic_width, pic_height);
1984 src1stride = edge_emu_stride;
1993 (edge_emu_stride + (1 <<
sps->pixel_shift));
1996 edge_emu_stride, src2stride,
2000 pic_width, pic_height);
2003 src2stride = edge_emu_stride;
2006 s->hevcdsp.put_hevc_epel[idx][!!my0][!!mx0](lc->
tmp,
src1, src1stride,
2007 block_h, _mx0, _my0, block_w);
2009 s->hevcdsp.put_hevc_epel_bi[idx][!!my1][!!mx1](dst0,
s->cur_frame->f->linesize[cidx+1],
2011 block_h, _mx1, _my1, block_w);
2013 s->hevcdsp.put_hevc_epel_bi_w[idx][!!my1][!!mx1](dst0,
s->cur_frame->f->linesize[cidx+1],
2016 s->sh.chroma_log2_weight_denom,
2017 s->sh.chroma_weight_l0[current_mv->
ref_idx[0]][cidx],
2018 s->sh.chroma_weight_l1[current_mv->
ref_idx[1]][cidx],
2019 s->sh.chroma_offset_l0[current_mv->
ref_idx[0]][cidx],
2020 s->sh.chroma_offset_l1[current_mv->
ref_idx[1]][cidx],
2021 _mx1, _my1, block_w);
2036 int x0,
int y0,
int nPbW,
2037 int nPbH,
int log2_cb_size,
int part_idx,
2049 if (inter_pred_idc !=
PRED_L1) {
2050 if (
s->sh.nb_refs[
L0])
2057 part_idx, merge_idx,
mv, mvp_flag, 0);
2062 if (inter_pred_idc !=
PRED_L0) {
2063 if (
s->sh.nb_refs[
L1])
2066 if (
s->sh.mvd_l1_zero_flag == 1 && inter_pred_idc ==
PRED_BI) {
2075 part_idx, merge_idx,
mv, mvp_flag, 1);
2084 int x0,
int y0,
int nPbW,
int nPbH,
2085 int log2_cb_size,
int partIdx,
int idx)
2087 #define POS(c_idx, x, y) \
2088 s->cur_frame->f->data[c_idx] ? \
2089 &s->cur_frame->f->data[c_idx][((y) >> sps->vshift[c_idx]) * linesize[c_idx] + \
2090 (((x) >> sps->hshift[c_idx]) << sps->pixel_shift)] : NULL
2093 struct MvField current_mv = {{{ 0 }}};
2095 int min_pu_width =
sps->min_pu_width;
2097 MvField *tab_mvf =
s->cur_frame->tab_mvf;
2098 const RefPicList *refPicList =
s->cur_frame->refPicList;
2100 const int *linesize =
s->cur_frame->f->linesize;
2101 uint8_t *dst0 =
s->cur_frame->f->data[0] + y0 * linesize[0] + (x0 <<
sps->pixel_shift);
2102 uint8_t *dst1 =
POS(1, x0, y0);
2103 uint8_t *dst2 =
POS(2, x0, y0);
2104 int log2_min_cb_size =
sps->log2_min_cb_size;
2105 int min_cb_width =
sps->min_cb_width;
2106 int x_cb = x0 >> log2_min_cb_size;
2107 int y_cb = y0 >> log2_min_cb_size;
2117 if (
s->sh.max_num_merge_cand > 1)
2123 partIdx, merge_idx, ¤t_mv);
2126 partIdx, merge_idx, ¤t_mv);
2129 x_pu = x0 >>
sps->log2_min_pu_size;
2130 y_pu = y0 >>
sps->log2_min_pu_size;
2132 for (j = 0; j < nPbH >>
sps->log2_min_pu_size; j++)
2133 for (
i = 0; i < nPbW >>
sps->log2_min_pu_size;
i++)
2134 tab_mvf[(y_pu + j) * min_pu_width + x_pu +
i] = current_mv;
2137 ref0 = refPicList[0].
ref[current_mv.
ref_idx[0]];
2138 if (!ref0 || !ref0->
f)
2143 ref1 = refPicList[1].
ref[current_mv.
ref_idx[1]];
2144 if (!ref1 || !ref1->f)
2150 int x0_c = x0 >>
sps->hshift[1];
2151 int y0_c = y0 >>
sps->vshift[1];
2152 int nPbW_c = nPbW >>
sps->hshift[1];
2153 int nPbH_c = nPbH >>
sps->vshift[1];
2156 ¤t_mv.
mv[0], x0, y0, nPbW, nPbH,
2157 s->sh.luma_weight_l0[current_mv.
ref_idx[0]],
2158 s->sh.luma_offset_l0[current_mv.
ref_idx[0]]);
2160 if (
sps->chroma_format_idc) {
2162 0, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
2163 s->sh.chroma_weight_l0[current_mv.
ref_idx[0]][0],
s->sh.chroma_offset_l0[current_mv.
ref_idx[0]][0]);
2165 0, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
2166 s->sh.chroma_weight_l0[current_mv.
ref_idx[0]][1],
s->sh.chroma_offset_l0[current_mv.
ref_idx[0]][1]);
2169 int x0_c = x0 >>
sps->hshift[1];
2170 int y0_c = y0 >>
sps->vshift[1];
2171 int nPbW_c = nPbW >>
sps->hshift[1];
2172 int nPbH_c = nPbH >>
sps->vshift[1];
2175 ¤t_mv.
mv[1], x0, y0, nPbW, nPbH,
2176 s->sh.luma_weight_l1[current_mv.
ref_idx[1]],
2177 s->sh.luma_offset_l1[current_mv.
ref_idx[1]]);
2179 if (
sps->chroma_format_idc) {
2181 1, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
2182 s->sh.chroma_weight_l1[current_mv.
ref_idx[1]][0],
s->sh.chroma_offset_l1[current_mv.
ref_idx[1]][0]);
2185 1, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
2186 s->sh.chroma_weight_l1[current_mv.
ref_idx[1]][1],
s->sh.chroma_offset_l1[current_mv.
ref_idx[1]][1]);
2189 int x0_c = x0 >>
sps->hshift[1];
2190 int y0_c = y0 >>
sps->vshift[1];
2191 int nPbW_c = nPbW >>
sps->hshift[1];
2192 int nPbH_c = nPbH >>
sps->vshift[1];
2195 ¤t_mv.
mv[0], x0, y0, nPbW, nPbH,
2196 ref1->f, ¤t_mv.
mv[1], ¤t_mv);
2198 if (
sps->chroma_format_idc) {
2200 x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv, 0);
2203 x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv, 1);
2213 int x0,
int y0,
int pu_size,
2214 int prev_intra_luma_pred_flag)
2217 int x_pu = x0 >>
sps->log2_min_pu_size;
2218 int y_pu = y0 >>
sps->log2_min_pu_size;
2219 int min_pu_width =
sps->min_pu_width;
2220 int size_in_pus = pu_size >>
sps->log2_min_pu_size;
2229 int y_ctb = (y0 >> (
sps->log2_ctb_size)) << (
sps->log2_ctb_size);
2231 MvField *tab_mvf =
s->cur_frame->tab_mvf;
2232 int intra_pred_mode;
2237 if ((y0 - 1) < y_ctb)
2240 if (cand_left == cand_up) {
2241 if (cand_left < 2) {
2246 candidate[0] = cand_left;
2247 candidate[1] = 2 + ((cand_left - 2 - 1 + 32) & 31);
2248 candidate[2] = 2 + ((cand_left - 2 + 1) & 31);
2251 candidate[0] = cand_left;
2252 candidate[1] = cand_up;
2262 if (prev_intra_luma_pred_flag) {
2263 intra_pred_mode = candidate[lc->
pu.
mpm_idx];
2265 if (candidate[0] > candidate[1])
2266 FFSWAP(uint8_t, candidate[0], candidate[1]);
2267 if (candidate[0] > candidate[2])
2268 FFSWAP(uint8_t, candidate[0], candidate[2]);
2269 if (candidate[1] > candidate[2])
2270 FFSWAP(uint8_t, candidate[1], candidate[2]);
2273 for (
i = 0;
i < 3;
i++)
2274 if (intra_pred_mode >= candidate[
i])
2281 for (
i = 0;
i < size_in_pus;
i++) {
2282 memset(&l->
tab_ipm[(y_pu +
i) * min_pu_width + x_pu],
2283 intra_pred_mode, size_in_pus);
2285 for (j = 0; j < size_in_pus; j++) {
2290 return intra_pred_mode;
2295 int log2_cb_size,
int ct_depth)
2297 int length = (1 << log2_cb_size) >>
sps->log2_min_cb_size;
2298 int x_cb = x0 >>
sps->log2_min_cb_size;
2299 int y_cb = y0 >>
sps->log2_min_cb_size;
2302 for (y = 0; y < length; y++)
2303 memset(&tab_ct_depth[(y_cb + y) *
sps->min_cb_width + x_cb],
2308 0, 1, 2, 2, 2, 2, 3, 5, 7, 8, 10, 12, 13, 15, 17, 18, 19, 20,
2309 21, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 29, 29, 30, 31};
2316 static const uint8_t intra_chroma_table[4] = { 0, 26, 10, 1 };
2317 uint8_t prev_intra_luma_pred_flag[4];
2319 int pb_size = (1 << log2_cb_size) >>
split;
2320 int side =
split + 1;
2324 for (
i = 0;
i < side;
i++)
2325 for (j = 0; j < side; j++)
2328 for (
i = 0;
i < side;
i++) {
2329 for (j = 0; j < side; j++) {
2330 if (prev_intra_luma_pred_flag[2 *
i + j])
2337 x0 + pb_size * j, y0 + pb_size *
i, pb_size,
2338 prev_intra_luma_pred_flag[2 *
i + j]);
2342 if (
sps->chroma_format_idc == 3) {
2343 for (
i = 0;
i < side;
i++) {
2344 for (j = 0; j < side; j++) {
2346 if (chroma_mode != 4) {
2356 }
else if (
sps->chroma_format_idc == 2) {
2359 if (chroma_mode != 4) {
2363 mode_idx = intra_chroma_table[chroma_mode];
2368 }
else if (
sps->chroma_format_idc != 0) {
2370 if (chroma_mode != 4) {
2388 int pb_size = 1 << log2_cb_size;
2389 int size_in_pus = pb_size >>
sps->log2_min_pu_size;
2390 int min_pu_width =
sps->min_pu_width;
2391 MvField *tab_mvf =
s->cur_frame->tab_mvf;
2392 int x_pu = x0 >>
sps->log2_min_pu_size;
2393 int y_pu = y0 >>
sps->log2_min_pu_size;
2396 if (size_in_pus == 0)
2398 for (j = 0; j < size_in_pus; j++)
2399 memset(&l->
tab_ipm[(y_pu + j) * min_pu_width + x_pu],
INTRA_DC, size_in_pus);
2401 for (j = 0; j < size_in_pus; j++)
2402 for (k = 0; k < size_in_pus; k++)
2409 int x0,
int y0,
int log2_cb_size)
2411 int cb_size = 1 << log2_cb_size;
2412 int log2_min_cb_size =
sps->log2_min_cb_size;
2413 int length = cb_size >> log2_min_cb_size;
2414 int min_cb_width =
sps->min_cb_width;
2415 int x_cb = x0 >> log2_min_cb_size;
2416 int y_cb = y0 >> log2_min_cb_size;
2417 int idx = log2_cb_size - 2;
2418 int qp_block_mask = (1 << (
sps->log2_ctb_size -
pps->diff_cu_qp_delta_depth)) - 1;
2428 for (x = 0; x < 4; x++)
2430 if (
pps->transquant_bypass_enable_flag) {
2441 x0b, y0b, x_cb, y_cb,
2444 x = y_cb * min_cb_width + x_cb;
2445 for (y = 0; y < length; y++) {
2446 memset(&l->
skip_flag[x], skip_flag, length);
2451 x = y_cb * min_cb_width + x_cb;
2452 for (y = 0; y < length; y++) {
2460 x0, y0, cb_size, cb_size, log2_cb_size, 0, idx);
2463 if (!
s->sh.disable_deblocking_filter_flag)
2471 log2_cb_size ==
sps->log2_min_cb_size) {
2479 log2_cb_size >=
sps->pcm.log2_min_pcm_cb_size &&
2480 log2_cb_size <= sps->pcm.log2_max_pcm_cb_size) {
2486 if (
sps->pcm_loop_filter_disabled)
2499 x0, y0, cb_size, cb_size, log2_cb_size, 0, idx);
2503 x0, y0, cb_size, cb_size / 2, log2_cb_size, 0, idx);
2505 x0, y0 + cb_size / 2, cb_size, cb_size / 2, log2_cb_size, 1, idx);
2509 x0, y0, cb_size / 2, cb_size, log2_cb_size, 0, idx - 1);
2511 x0 + cb_size / 2, y0, cb_size / 2, cb_size, log2_cb_size, 1, idx - 1);
2515 x0, y0, cb_size, cb_size / 4, log2_cb_size, 0, idx);
2517 x0, y0 + cb_size / 4, cb_size, cb_size * 3 / 4, log2_cb_size, 1, idx);
2521 x0, y0, cb_size, cb_size * 3 / 4, log2_cb_size, 0, idx);
2523 x0, y0 + cb_size * 3 / 4, cb_size, cb_size / 4, log2_cb_size, 1, idx);
2527 x0, y0, cb_size / 4, cb_size, log2_cb_size, 0, idx - 2);
2529 x0 + cb_size / 4, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 1, idx - 2);
2533 x0, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 0, idx - 2);
2535 x0 + cb_size * 3 / 4, y0, cb_size / 4, cb_size, log2_cb_size, 1, idx - 2);
2539 x0, y0, cb_size / 2, cb_size / 2, log2_cb_size, 0, idx - 1);
2541 x0 + cb_size / 2, y0, cb_size / 2, cb_size / 2, log2_cb_size, 1, idx - 1);
2543 x0, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 2, idx - 1);
2545 x0 + cb_size / 2, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 3, idx - 1);
2551 int rqt_root_cbf = 1;
2558 const static int cbf[2] = { 0 };
2561 sps->max_transform_hierarchy_depth_inter;
2562 ret =
hls_transform_tree(lc, l,
pps,
sps, x0, y0, x0, y0, x0, y0,
2564 log2_cb_size, 0, 0, cbf, cbf);
2568 if (!
s->sh.disable_deblocking_filter_flag)
2577 x = y_cb * min_cb_width + x_cb;
2578 for (y = 0; y < length; y++) {
2583 if(((x0 + (1<<log2_cb_size)) & qp_block_mask) == 0 &&
2584 ((y0 + (1<<log2_cb_size)) & qp_block_mask) == 0) {
2597 int log2_cb_size,
int cb_depth)
2600 const int cb_size = 1 << log2_cb_size;
2605 if (x0 + cb_size <= sps->
width &&
2606 y0 + cb_size <= sps->
height &&
2607 log2_cb_size >
sps->log2_min_cb_size) {
2609 sps, cb_depth, x0, y0);
2611 split_cu = (log2_cb_size >
sps->log2_min_cb_size);
2613 if (
pps->cu_qp_delta_enabled_flag &&
2614 log2_cb_size >=
sps->log2_ctb_size -
pps->diff_cu_qp_delta_depth) {
2619 if (
s->sh.cu_chroma_qp_offset_enabled_flag &&
2620 log2_cb_size >=
sps->log2_ctb_size -
pps->diff_cu_chroma_qp_offset_depth) {
2625 int qp_block_mask = (1 << (
sps->log2_ctb_size -
pps->diff_cu_qp_delta_depth)) - 1;
2626 const int cb_size_split = cb_size >> 1;
2627 const int x1 = x0 + cb_size_split;
2628 const int y1 = y0 + cb_size_split;
2633 x0, y0, log2_cb_size - 1, cb_depth + 1);
2637 if (more_data && x1 < sps->
width) {
2639 x1, y0, log2_cb_size - 1, cb_depth + 1);
2643 if (more_data && y1 < sps->
height) {
2645 x0, y1, log2_cb_size - 1, cb_depth + 1);
2649 if (more_data && x1 < sps->
width &&
2652 x1, y1, log2_cb_size - 1, cb_depth + 1);
2657 if(((x0 + (1<<log2_cb_size)) & qp_block_mask) == 0 &&
2658 ((y0 + (1<<log2_cb_size)) & qp_block_mask) == 0)
2662 return ((x1 + cb_size_split) <
sps->width ||
2663 (y1 + cb_size_split) <
sps->height);
2670 if ((!((x0 + cb_size) %
2671 (1 << (
sps->log2_ctb_size))) ||
2672 (x0 + cb_size >=
sps->width)) &&
2674 (1 << (
sps->log2_ctb_size))) ||
2675 (y0 + cb_size >=
sps->height))) {
2677 return !end_of_slice_flag;
2689 int x_ctb,
int y_ctb,
int ctb_addr_ts)
2692 int ctb_size = 1 <<
sps->log2_ctb_size;
2693 int ctb_addr_rs =
pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2694 int ctb_addr_in_slice = ctb_addr_rs -
s->sh.slice_addr;
2698 if (
pps->entropy_coding_sync_enabled_flag) {
2699 if (x_ctb == 0 && (y_ctb & (ctb_size - 1)) == 0)
2702 }
else if (
pps->tiles_enabled_flag) {
2703 if (ctb_addr_ts &&
pps->tile_id[ctb_addr_ts] !=
pps->tile_id[ctb_addr_ts - 1]) {
2704 int idxX =
pps->col_idxX[x_ctb >>
sps->log2_ctb_size];
2715 if (
pps->tiles_enabled_flag) {
2716 if (x_ctb > 0 &&
pps->tile_id[ctb_addr_ts] !=
pps->tile_id[
pps->ctb_addr_rs_to_ts[ctb_addr_rs - 1]])
2720 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]])
2725 if (ctb_addr_in_slice <= 0)
2727 if (ctb_addr_in_slice < sps->ctb_width)
2733 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]]));
2734 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]]));
2743 const uint8_t *slice_data = gb->
buffer +
s->sh.data_offset;
2745 int ctb_size = 1 <<
sps->log2_ctb_size;
2749 int ctb_addr_ts =
pps->ctb_addr_rs_to_ts[
s->sh.slice_ctb_addr_rs];
2752 while (more_data && ctb_addr_ts < sps->ctb_size) {
2753 int ctb_addr_rs =
pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2755 x_ctb = (ctb_addr_rs % ((
sps->width + ctb_size - 1) >>
sps->log2_ctb_size)) <<
sps->log2_ctb_size;
2756 y_ctb = (ctb_addr_rs / ((
sps->width + ctb_size - 1) >>
sps->log2_ctb_size)) <<
sps->log2_ctb_size;
2766 x_ctb >>
sps->log2_ctb_size, y_ctb >>
sps->log2_ctb_size);
2773 if (more_data < 0) {
2784 if (x_ctb + ctb_size >=
sps->width &&
2785 y_ctb + ctb_size >=
sps->height)
2792 int job,
int thread)
2799 int ctb_size = 1 <<
sps->log2_ctb_size;
2802 int ctb_addr_rs =
s->sh.slice_ctb_addr_rs + ctb_row * ((
sps->width + ctb_size - 1) >>
sps->log2_ctb_size);
2803 int ctb_addr_ts =
pps->ctb_addr_rs_to_ts[ctb_addr_rs];
2805 const uint8_t *
data =
s->data +
s->sh.offset[ctb_row];
2806 const size_t data_size =
s->sh.size[ctb_row];
2815 while(more_data && ctb_addr_ts < sps->ctb_size) {
2816 int x_ctb = (ctb_addr_rs %
sps->ctb_width) <<
sps->log2_ctb_size;
2817 int y_ctb = (ctb_addr_rs /
sps->ctb_width) <<
sps->log2_ctb_size;
2837 x_ctb >>
sps->log2_ctb_size, y_ctb >>
sps->log2_ctb_size);
2845 if (more_data < 0) {
2856 if (!more_data && (x_ctb+ctb_size) <
sps->width && ctb_row !=
s->sh.num_entry_point_offsets) {
2863 if ((x_ctb+ctb_size) >=
sps->width && (y_ctb+ctb_size) >=
sps->height ) {
2868 ctb_addr_rs =
pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2871 if(x_ctb >=
sps->width) {
2888 if (
s->nb_wpp_progress < count) {
2890 sizeof(*
s->wpp_progress));
2894 s->wpp_progress =
tmp;
2895 memset(
s->wpp_progress +
s->nb_wpp_progress, 0,
2896 (count -
s->nb_wpp_progress) *
sizeof(*
s->wpp_progress));
2898 for (
int i =
s->nb_wpp_progress;
i < count;
i++) {
2902 s->nb_wpp_progress =
i + 1;
2906 for (
int i = 0;
i < count;
i++)
2916 const uint8_t *
data =
nal->data;
2917 int length =
nal->size;
2920 int64_t startheader, cmpt = 0;
2923 if (
s->sh.slice_ctb_addr_rs +
s->sh.num_entry_point_offsets *
sps->ctb_width >=
sps->ctb_width *
sps->ctb_height) {
2925 s->sh.slice_ctb_addr_rs,
s->sh.num_entry_point_offsets,
2926 sps->ctb_width,
sps->ctb_height
2931 if (
s->avctx->thread_count >
s->nb_local_ctx) {
2937 memcpy(
tmp,
s->local_ctx,
sizeof(*
s->local_ctx) *
s->nb_local_ctx);
2941 for (
unsigned i =
s->nb_local_ctx; i < s->avctx->thread_count;
i++) {
2942 tmp = &
s->local_ctx[
i];
2944 memset(
tmp, 0,
sizeof(*
tmp));
2946 tmp->logctx =
s->avctx;
2948 tmp->common_cabac_state = &
s->cabac;
2951 s->nb_local_ctx =
s->avctx->thread_count;
2956 for (j = 0, cmpt = 0, startheader =
offset +
s->sh.entry_point_offset[0]; j < nal->skipped_bytes; j++) {
2957 if (
nal->skipped_bytes_pos[j] >=
offset &&
nal->skipped_bytes_pos[j] < startheader) {
2963 for (
int i = 1;
i <
s->sh.num_entry_point_offsets;
i++) {
2964 offset += (
s->sh.entry_point_offset[
i - 1] - cmpt);
2965 for (j = 0, cmpt = 0, startheader =
offset
2966 +
s->sh.entry_point_offset[
i]; j < nal->skipped_bytes; j++) {
2967 if (
nal->skipped_bytes_pos[j] >=
offset &&
nal->skipped_bytes_pos[j] < startheader) {
2972 s->sh.size[
i] =
s->sh.entry_point_offset[
i] - cmpt;
2977 offset +=
s->sh.entry_point_offset[
s->sh.num_entry_point_offsets - 1] - cmpt;
2982 s->sh.size [
s->sh.num_entry_point_offsets] = length -
offset;
2983 s->sh.offset[
s->sh.num_entry_point_offsets] =
offset;
2985 s->sh.offset[0] =
s->sh.data_offset;
2986 s->sh.size[0] =
s->sh.offset[1] -
s->sh.offset[0];
2990 for (
unsigned i = 1;
i <
s->nb_local_ctx;
i++) {
2991 s->local_ctx[
i].first_qp_group = 1;
2992 s->local_ctx[
i].qp_y =
s->local_ctx[0].qp_y;
3004 if (
pps->entropy_coding_sync_enabled_flag)
3007 for (
int i = 0;
i <=
s->sh.num_entry_point_offsets;
i++)
3020 if (!
s->sh.first_slice_in_pic_flag)
3021 s->slice_idx += !
s->sh.dependent_slice_segment_flag;
3023 if (!
s->sh.dependent_slice_segment_flag &&
s->sh.slice_type !=
HEVC_SLICE_I) {
3027 "Error constructing the reference lists for the current slice.\n");
3032 s->slice_initialized = 1;
3034 if (
s->avctx->hwaccel)
3039 "SCC profile is not yet implemented in hevc native decoder.\n");
3043 if (
s->sh.dependent_slice_segment_flag) {
3044 int ctb_addr_ts =
pps->ctb_addr_rs_to_ts[
s->sh.slice_ctb_addr_rs];
3045 int prev_rs =
pps->ctb_addr_ts_to_rs[ctb_addr_ts - 1];
3052 s->local_ctx[0].first_qp_group = !
s->sh.dependent_slice_segment_flag;
3054 if (!
pps->cu_qp_delta_enabled_flag)
3055 s->local_ctx[0].qp_y =
s->sh.slice_qp;
3057 s->local_ctx[0].tu.cu_qp_offset_cb = 0;
3058 s->local_ctx[0].tu.cu_qp_offset_cr = 0;
3061 s->sh.num_entry_point_offsets > 0 &&
3062 pps->num_tile_rows == 1 &&
pps->num_tile_columns == 1)
3077 if (
IS_IRAP(
s) &&
s->no_rasl_output_flag) {
3078 if (
s->sei.common.mastering_display.present > 0)
3079 s->sei.common.mastering_display.present--;
3081 if (
s->sei.common.content_light.present > 0)
3082 s->sei.common.content_light.present--;
3087 sps->bit_depth,
sps->bit_depth_chroma,
3088 s->cur_frame->poc );
3092 if (
s->sei.timecode.present) {
3097 sizeof(uint32_t) * 4, &tcside);
3102 tc_sd = (uint32_t*)tcside->
data;
3103 tc_sd[0] =
s->sei.timecode.num_clock_ts;
3105 for (
int i = 0;
i < tc_sd[0];
i++) {
3106 int drop =
s->sei.timecode.cnt_dropped_flag[
i];
3107 int hh =
s->sei.timecode.hours_value[
i];
3108 int mm =
s->sei.timecode.minutes_value[
i];
3109 int ss =
s->sei.timecode.seconds_value[
i];
3110 int ff =
s->sei.timecode.n_frames[
i];
3118 s->sei.timecode.num_clock_ts = 0;
3121 if (
s->sei.common.itut_t35.hdr_plus) {
3142 if (
s->sei.common.itut_t35.hdr_vivid) {
3145 &
s->sei.common.itut_t35.hdr_vivid,
3157 for (
int i = nal_idx;
i <
s->pkt.nb_nals;
i++) {
3159 const int layer_id =
nal->nuh_layer_id;
3163 !(
s->layers_active_decode & (1 <<
s->vps->layer_idx[layer_id])))
3166 switch (
nal->type) {
3200 const HEVCPPS *
const pps =
s->ps.pps_list[
s->sh.pps_id];
3202 int pic_size_in_ctb = ((
sps->width >>
sps->log2_min_cb_size) + 1) *
3203 ((
sps->height >>
sps->log2_min_cb_size) + 1);
3204 int new_sequence = (l == &
s->layers[0]) &&
3206 int prev_layers_active_decode =
s->layers_active_decode;
3207 int prev_layers_active_output =
s->layers_active_output;
3210 if (
sps->vps !=
s->vps && l != &
s->layers[0]) {
3218 const HEVCSPS *sps_base =
s->layers[0].sps;
3221 if (l != &
s->layers[0]) {
3224 "Access unit starts with a non-base layer frame\n");
3233 !
sps->vui.common.video_signal_type_present_flag)
3246 "Base/non-base layer SPS have unsupported parameter combination\n");
3257 if (l == &
s->layers[0]) {
3273 memset(l->
is_pcm, 0, (
sps->min_pu_width + 1) * (
sps->min_pu_height + 1));
3280 s->first_nal_type =
s->nal_unit_type;
3290 s->sei.recovery_point.has_recovery_poc) {
3292 s->recovery_poc =
s->poc +
s->sei.recovery_point.recovery_poc_cnt;
3293 else if (
s->poc >=
s->recovery_poc)
3298 if (
s->temporal_id == 0 &&
3306 s->poc_tid0 =
s->poc;
3308 if (
pps->tiles_enabled_flag)
3309 s->local_ctx[0].end_of_tiles_x =
pps->column_width[0] <<
sps->log2_ctb_size;
3313 0, 0,
s->sh.no_output_of_prior_pics_flag);
3337 s->cur_frame->needs_fg = ((
s->sei.common.film_grain_characteristics &&
3338 s->sei.common.film_grain_characteristics->present) ||
3339 s->sei.common.itut_t35.aom_film_grain.enable) &&
3347 if (
s->cur_frame->needs_fg &&
3348 (
s->sei.common.film_grain_characteristics &&
s->sei.common.film_grain_characteristics->present &&
3350 s->cur_frame->f->format) ||
3353 "Unsupported film grain parameters. Ignoring film grain.\n");
3354 s->cur_frame->needs_fg = 0;
3357 if (
s->cur_frame->needs_fg) {
3358 s->cur_frame->frame_grain->format =
s->cur_frame->f->format;
3359 s->cur_frame->frame_grain->width =
s->cur_frame->f->width;
3360 s->cur_frame->frame_grain->height =
s->cur_frame->f->height;
3369 s->cur_frame->f->pict_type = 3 -
s->sh.slice_type;
3372 sps->temporal_layer[
sps->max_sub_layers - 1].num_reorder_pics,
3373 sps->temporal_layer[
sps->max_sub_layers - 1].max_dec_pic_buffering, 0);
3377 if (
s->avctx->hwaccel) {
3389 if (l == &
s->layers[0])
3392 if (nal_idx >=
s->finish_setup_nal_idx)
3401 s->cur_frame =
s->collocated_ref =
NULL;
3408 char msg_buf[4 * (50 + 2 * 2 * 16 )];
3416 pixel_shift =
desc->comp[0].depth > 8;
3421 if (pixel_shift && !
s->checksum_buf) {
3424 frame->linesize[2]));
3425 if (!
s->checksum_buf)
3432 int width =
s->avctx->coded_width;
3433 int height =
s->avctx->coded_height;
3439 for (j = 0; j <
h; j++) {
3443 s->bdsp.bswap16_buf((uint16_t *)
s->checksum_buf,
3444 (
const uint16_t *)
src,
w);
3445 src =
s->checksum_buf;
3452 #define MD5_PRI "%016" PRIx64 "%016" PRIx64
3453 #define MD5_PRI_ARG(buf) AV_RB64(buf), AV_RB64((const uint8_t*)(buf) + 8)
3455 if (!memcmp(
md5,
s->sei.picture_hash.md5[
i], 16)) {
3457 "plane %d - correct " MD5_PRI "; ",
3461 "mismatching checksum of plane %d - " MD5_PRI " != " MD5_PRI "; ",
3468 "Verifying checksum for frame with POC %d: %s\n",
3480 if (
out->needs_fg) {
3483 switch (fgp->
type) {
3497 if (
s->avctx->hwaccel) {
3501 "hardware accelerator failed to decode picture\n");
3506 s->sei.picture_hash.is_md5) {
3512 s->sei.picture_hash.is_md5 = 0;
3515 l -
s->layers,
s->poc);
3522 const int layer_idx =
s->vps ?
s->vps->layer_idx[
s->nuh_layer_id] : 0;
3529 if (layer_idx < 0 ||
3530 (
s->nuh_layer_id > 0 && !(
s->layers_active_decode & (1 << layer_idx))))
3537 s->slice_initialized = 0;
3546 s->no_rasl_output_flag)) {
3551 if (
s->cur_layer != layer_idx &&
3552 s->layers[
s->cur_layer].cur_frame &&
3556 s->cur_layer = layer_idx;
3557 l = &
s->layers[
s->cur_layer];
3559 if (
s->sh.first_slice_in_pic_flag) {
3561 av_log(
s->avctx,
AV_LOG_ERROR,
"Two slices reporting being the first in the same frame.\n");
3573 if (
s->nal_unit_type !=
s->first_nal_type) {
3575 "Non-matching NAL types of the VCL NALUs: %d %d\n",
3576 s->first_nal_type,
s->nal_unit_type);
3593 s->nal_unit_type =
nal->type;
3594 s->nuh_layer_id =
nal->nuh_layer_id;
3595 s->temporal_id =
nal->temporal_id;
3604 nal->type,
nal->raw_data,
nal->raw_size);
3609 switch (
s->nal_unit_type) {
3617 nal->nuh_layer_id,
s->apply_defdispwin);
3661 "Skipping NAL unit %d\n",
s->nal_unit_type);
3669 "Skipping invalid undecodable NALU: %d\n",
s->nal_unit_type);
3678 s->sei.recovery_point.has_recovery_poc = 0;
3684 int eos_at_start = 1;
3687 s->cur_frame =
s->collocated_ref =
NULL;
3688 s->last_eos =
s->eos;
3690 s->slice_initialized = 0;
3702 s->nal_length_size,
s->avctx->codec_id,
flags);
3705 "Error splitting the input into NAL units.\n");
3709 for (
int i = 0;
i <
s->pkt.nb_nals;
i++) {
3732 for (
int i =
s->pkt.nb_nals - 1;
i > 0 ;
i--) {
3734 && !
s->pkt.nals[
i].nuh_layer_id && !
s->pkt.nals[
i].temporal_id) {
3735 rpu_nal = &
s->pkt.nals[
i];
3743 av_log(
s->avctx,
AV_LOG_WARNING,
"Multiple Dolby Vision RPUs found in one AU. Skipping previous.\n");
3754 s->avctx->err_recognition);
3763 for (
int i = 0;
i <
s->pkt.nb_nals;
i++) {
3773 "Error parsing NAL unit #%d.\n",
i);
3800 &
s->nal_length_size,
s->avctx->err_recognition,
3801 s->apply_defdispwin,
s->avctx);
3807 if (
first &&
s->ps.sps_list[
i]) {
3846 s->layers_active_output, 0, 0, 0);
3853 s->pkt_dts = avpkt->
dts;
3856 if (sd && sd_size > 0) {
3863 if (sd && sd_size >=
sizeof(
s->dovi_ctx.cfg)) {
3864 int old =
s->dovi_ctx.cfg.dv_profile;
3868 "New DOVI configuration record from input packet (profile %d -> %u).\n",
3869 old,
s->dovi_ctx.cfg.dv_profile);
3893 if (
src->needs_fg) {
3906 dst->nb_rpl_elems =
src->nb_rpl_elems;
3909 dst->ctb_count =
src->ctb_count;
3912 dst->base_layer_frame =
src->base_layer_frame;
3915 src->hwaccel_picture_private);
3949 for (
int i = 0;
i <
s->nb_wpp_progress;
i++)
3975 s->nb_local_ctx = 1;
3977 s->local_ctx[0].parent =
s;
3978 s->local_ctx[0].logctx = avctx;
3979 s->local_ctx[0].common_cabac_state = &
s->cabac;
3982 if (!
s->output_fifo)
4000 s->dovi_ctx.logctx = avctx;
4059 memcmp(
s->view_ids, s0->
view_ids,
sizeof(*
s->view_ids) *
s->nb_view_ids)) {
4106 if (
sei->tdrdi.present) {
4120 tdrdi->prec_ref_display_width =
sei->tdrdi.prec_ref_display_width;
4121 tdrdi->ref_viewing_distance_flag =
sei->tdrdi.ref_viewing_distance_flag;
4122 tdrdi->prec_ref_viewing_dist =
sei->tdrdi.prec_ref_viewing_dist;
4123 tdrdi->num_ref_displays =
sei->tdrdi.num_ref_displays;
4124 for (
int i = 0;
i <
sei->tdrdi.num_ref_displays;
i++) {
4160 s->sei.picture_timing.picture_struct = 0;
4180 if (sd && sd->
size >=
sizeof(
s->dovi_ctx.cfg))
4200 #define OFFSET(x) offsetof(HEVCContext, x)
4201 #define PAR (AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
4204 {
"apply_defdispwin",
"Apply default display window from VUI",
OFFSET(apply_defdispwin),
4206 {
"strict-displaywin",
"strictly apply default display window size",
OFFSET(apply_defdispwin),
4208 {
"view_ids",
"Array of view IDs that should be decoded and output; a single -1 to decode all views",
4210 .min = -1, .max = INT_MAX, .flags =
PAR },
4211 {
"view_ids_available",
"Array of available view IDs is exported here",
4214 {
"view_pos_available",
"Array of view positions for view_ids_available is exported here, as AVStereo3DView",
4250 #if CONFIG_HEVC_DXVA2_HWACCEL
4253 #if CONFIG_HEVC_D3D11VA_HWACCEL
4256 #if CONFIG_HEVC_D3D11VA2_HWACCEL
4259 #if CONFIG_HEVC_D3D12VA_HWACCEL
4262 #if CONFIG_HEVC_NVDEC_HWACCEL
4265 #if CONFIG_HEVC_VAAPI_HWACCEL
4268 #if CONFIG_HEVC_VDPAU_HWACCEL
4271 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
4274 #if CONFIG_HEVC_VULKAN_HWACCEL