26 #include "config_components.h"
54 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 };
96 int log2_min_cb_size =
sps->log2_min_cb_size;
99 int pic_size_in_ctb = ((
width >> log2_min_cb_size) + 1) *
100 ((
height >> log2_min_cb_size) + 1);
101 int ctb_count =
sps->ctb_width *
sps->ctb_height;
102 int min_pu_size =
sps->min_pu_width *
sps->min_pu_height;
104 s->bs_width = (
width >> 2) + 1;
105 s->bs_height = (
height >> 2) + 1;
108 s->deblock =
av_calloc(ctb_count,
sizeof(*
s->deblock));
109 if (!
s->sao || !
s->deblock)
114 if (!
s->skip_flag || !
s->tab_ct_depth)
120 if (!
s->tab_ipm || !
s->cbf_luma || !
s->is_pcm)
125 sizeof(*
s->tab_slice_address));
127 sizeof(*
s->qp_y_tab));
128 if (!
s->qp_y_tab || !
s->filter_slice_edges || !
s->tab_slice_address)
131 s->horizontal_bs =
av_calloc(
s->bs_width,
s->bs_height);
133 if (!
s->horizontal_bs || !
s->vertical_bs)
138 if (!
s->tab_mvf_pool || !
s->rpl_tab_pool)
152 uint8_t luma_weight_l0_flag[16];
153 uint8_t chroma_weight_l0_flag[16];
154 uint8_t luma_weight_l1_flag[16];
155 uint8_t chroma_weight_l1_flag[16];
156 int luma_log2_weight_denom;
159 if (luma_log2_weight_denom < 0 || luma_log2_weight_denom > 7) {
160 av_log(
s->avctx,
AV_LOG_ERROR,
"luma_log2_weight_denom %d is invalid\n", luma_log2_weight_denom);
163 s->sh.luma_log2_weight_denom =
av_clip_uintp2(luma_log2_weight_denom, 3);
164 if (
s->ps.sps->chroma_format_idc != 0) {
165 int64_t chroma_log2_weight_denom = luma_log2_weight_denom + (int64_t)
get_se_golomb(gb);
166 if (chroma_log2_weight_denom < 0 || chroma_log2_weight_denom > 7) {
167 av_log(
s->avctx,
AV_LOG_ERROR,
"chroma_log2_weight_denom %"PRId64
" is invalid\n", chroma_log2_weight_denom);
170 s->sh.chroma_log2_weight_denom = chroma_log2_weight_denom;
173 for (
i = 0;
i <
s->sh.nb_refs[
L0];
i++) {
175 if (!luma_weight_l0_flag[
i]) {
176 s->sh.luma_weight_l0[
i] = 1 <<
s->sh.luma_log2_weight_denom;
177 s->sh.luma_offset_l0[
i] = 0;
180 if (
s->ps.sps->chroma_format_idc != 0) {
181 for (
i = 0;
i <
s->sh.nb_refs[
L0];
i++)
184 for (
i = 0;
i <
s->sh.nb_refs[
L0];
i++)
185 chroma_weight_l0_flag[
i] = 0;
187 for (
i = 0;
i <
s->sh.nb_refs[
L0];
i++) {
188 if (luma_weight_l0_flag[
i]) {
190 if ((int8_t)delta_luma_weight_l0 != delta_luma_weight_l0)
192 s->sh.luma_weight_l0[
i] = (1 <<
s->sh.luma_log2_weight_denom) + delta_luma_weight_l0;
195 if (chroma_weight_l0_flag[
i]) {
196 for (j = 0; j < 2; j++) {
200 if ( (int8_t)delta_chroma_weight_l0 != delta_chroma_weight_l0
201 || delta_chroma_offset_l0 < -(1<<17) || delta_chroma_offset_l0 > (1<<17)) {
205 s->sh.chroma_weight_l0[
i][j] = (1 <<
s->sh.chroma_log2_weight_denom) + delta_chroma_weight_l0;
206 s->sh.chroma_offset_l0[
i][j] =
av_clip((delta_chroma_offset_l0 - ((128 *
s->sh.chroma_weight_l0[
i][j])
207 >>
s->sh.chroma_log2_weight_denom) + 128), -128, 127);
210 s->sh.chroma_weight_l0[
i][0] = 1 <<
s->sh.chroma_log2_weight_denom;
211 s->sh.chroma_offset_l0[
i][0] = 0;
212 s->sh.chroma_weight_l0[
i][1] = 1 <<
s->sh.chroma_log2_weight_denom;
213 s->sh.chroma_offset_l0[
i][1] = 0;
217 for (
i = 0;
i <
s->sh.nb_refs[
L1];
i++) {
219 if (!luma_weight_l1_flag[
i]) {
220 s->sh.luma_weight_l1[
i] = 1 <<
s->sh.luma_log2_weight_denom;
221 s->sh.luma_offset_l1[
i] = 0;
224 if (
s->ps.sps->chroma_format_idc != 0) {
225 for (
i = 0;
i <
s->sh.nb_refs[
L1];
i++)
228 for (
i = 0;
i <
s->sh.nb_refs[
L1];
i++)
229 chroma_weight_l1_flag[
i] = 0;
231 for (
i = 0;
i <
s->sh.nb_refs[
L1];
i++) {
232 if (luma_weight_l1_flag[
i]) {
234 if ((int8_t)delta_luma_weight_l1 != delta_luma_weight_l1)
236 s->sh.luma_weight_l1[
i] = (1 <<
s->sh.luma_log2_weight_denom) + delta_luma_weight_l1;
239 if (chroma_weight_l1_flag[
i]) {
240 for (j = 0; j < 2; j++) {
244 if ( (int8_t)delta_chroma_weight_l1 != delta_chroma_weight_l1
245 || delta_chroma_offset_l1 < -(1<<17) || delta_chroma_offset_l1 > (1<<17)) {
249 s->sh.chroma_weight_l1[
i][j] = (1 <<
s->sh.chroma_log2_weight_denom) + delta_chroma_weight_l1;
250 s->sh.chroma_offset_l1[
i][j] =
av_clip((delta_chroma_offset_l1 - ((128 *
s->sh.chroma_weight_l1[
i][j])
251 >>
s->sh.chroma_log2_weight_denom) + 128), -128, 127);
254 s->sh.chroma_weight_l1[
i][0] = 1 <<
s->sh.chroma_log2_weight_denom;
255 s->sh.chroma_offset_l1[
i][0] = 0;
256 s->sh.chroma_weight_l1[
i][1] = 1 <<
s->sh.chroma_log2_weight_denom;
257 s->sh.chroma_offset_l1[
i][1] = 0;
267 int max_poc_lsb = 1 <<
sps->log2_max_poc_lsb;
268 int prev_delta_msb = 0;
269 unsigned int nb_sps = 0, nb_sh;
273 if (!
sps->long_term_ref_pics_present_flag)
276 if (
sps->num_long_term_ref_pics_sps > 0)
280 if (nb_sps >
sps->num_long_term_ref_pics_sps)
290 uint8_t lt_idx_sps = 0;
292 if (
sps->num_long_term_ref_pics_sps > 1)
295 rps->
poc[
i] =
sps->lt_ref_pic_poc_lsb_sps[lt_idx_sps];
296 rps->
used[
i] =
sps->used_by_curr_pic_lt_sps_flag[lt_idx_sps];
307 if (
i &&
i != nb_sps)
308 delta += prev_delta_msb;
310 poc = rps->
poc[
i] +
s->poc -
delta * max_poc_lsb -
s->sh.pic_order_cnt_lsb;
314 prev_delta_msb =
delta;
327 unsigned int num = 0, den = 0;
335 avctx->
profile =
sps->ptl.general_ptl.profile_idc;
336 avctx->
level =
sps->ptl.general_ptl.level_idc;
340 if (
sps->vui.common.video_signal_type_present_flag)
346 if (
sps->vui.common.colour_description_present_flag) {
348 avctx->
color_trc =
sps->vui.common.transfer_characteristics;
357 if (
sps->chroma_format_idc == 1) {
358 if (
sps->vui.common.chroma_loc_info_present_flag) {
359 if (
sps->vui.common.chroma_sample_loc_type_top_field <= 5)
365 if (
vps->vps_timing_info_present_flag) {
366 num =
vps->vps_num_units_in_tick;
367 den =
vps->vps_time_scale;
368 }
else if (
sps->vui.vui_timing_info_present_flag) {
369 num =
sps->vui.vui_num_units_in_tick;
370 den =
sps->vui.vui_time_scale;
373 if (num != 0 && den != 0)
382 if (
s->sei.common.a53_caption.buf_ref)
385 if (
s->sei.common.alternative_transfer.present &&
388 avctx->
color_trc =
s->sei.common.alternative_transfer.preferred_transfer_characteristics;
391 if (
s->sei.common.film_grain_characteristics.present)
399 #define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \
400 CONFIG_HEVC_D3D11VA_HWACCEL * 2 + \
401 CONFIG_HEVC_NVDEC_HWACCEL + \
402 CONFIG_HEVC_VAAPI_HWACCEL + \
403 CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \
404 CONFIG_HEVC_VDPAU_HWACCEL + \
405 CONFIG_HEVC_VULKAN_HWACCEL)
408 switch (
sps->pix_fmt) {
411 #if CONFIG_HEVC_DXVA2_HWACCEL
414 #if CONFIG_HEVC_D3D11VA_HWACCEL
418 #if CONFIG_HEVC_VAAPI_HWACCEL
421 #if CONFIG_HEVC_VDPAU_HWACCEL
424 #if CONFIG_HEVC_NVDEC_HWACCEL
427 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
430 #if CONFIG_HEVC_VULKAN_HWACCEL
435 #if CONFIG_HEVC_DXVA2_HWACCEL
438 #if CONFIG_HEVC_D3D11VA_HWACCEL
442 #if CONFIG_HEVC_VAAPI_HWACCEL
445 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
448 #if CONFIG_HEVC_VULKAN_HWACCEL
451 #if CONFIG_HEVC_VDPAU_HWACCEL
454 #if CONFIG_HEVC_NVDEC_HWACCEL
459 #if CONFIG_HEVC_VAAPI_HWACCEL
462 #if CONFIG_HEVC_VDPAU_HWACCEL
465 #if CONFIG_HEVC_NVDEC_HWACCEL
468 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
471 #if CONFIG_HEVC_VULKAN_HWACCEL
477 #if CONFIG_HEVC_VAAPI_HWACCEL
480 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
483 #if CONFIG_HEVC_VULKAN_HWACCEL
488 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
494 #if CONFIG_HEVC_VAAPI_HWACCEL
497 #if CONFIG_HEVC_VDPAU_HWACCEL
500 #if CONFIG_HEVC_VULKAN_HWACCEL
503 #if CONFIG_HEVC_NVDEC_HWACCEL
508 #if CONFIG_HEVC_VAAPI_HWACCEL
511 #if CONFIG_HEVC_VULKAN_HWACCEL
517 *fmt++ =
sps->pix_fmt;
547 for (
i = 0;
i < 3;
i++) {
552 if (
sps->sao_enabled && !
s->avctx->hwaccel) {
553 int c_count = (
sps->chroma_format_idc != 0) ? 3 : 1;
556 for(c_idx = 0; c_idx < c_count; c_idx++) {
557 int w =
sps->width >>
sps->hshift[c_idx];
558 int h =
sps->height >>
sps->vshift[c_idx];
559 s->sao_pixel_buffer_h[c_idx] =
562 s->sao_pixel_buffer_v[c_idx] =
565 if (!
s->sao_pixel_buffer_h[c_idx] ||
566 !
s->sao_pixel_buffer_v[c_idx])
572 s->ps.vps =
s->ps.vps_list[
s->ps.sps->vps_id];
578 for (
i = 0;
i < 3;
i++) {
595 av_log(
s->avctx,
AV_LOG_ERROR,
"Two slices reporting being the first in the same frame.\n");
615 s->ps.pps !=
s->ps.pps_list[sh->
pps_id]) {
619 s->ps.pps =
s->ps.pps_list[sh->
pps_id];
623 if (
s->ps.sps !=
s->ps.sps_list[
s->ps.pps->sps_id]) {
648 int slice_address_length;
650 if (
s->ps.pps->dependent_slice_segments_enabled_flag)
654 s->ps.sps->ctb_height);
658 "Invalid slice segment address: %u.\n",
670 s->slice_initialized = 0;
674 s->slice_initialized = 0;
676 for (
i = 0;
i <
s->ps.pps->num_extra_slice_header_bits;
i++)
688 !
s->ps.pps->pps_curr_pic_ref_enabled_flag) {
695 if (
s->ps.pps->output_flag_present_flag)
698 if (
s->ps.sps->separate_colour_plane_flag)
708 "Ignoring POC change between slices: %d -> %d\n",
s->poc, poc);
724 int numbits, rps_idx;
726 if (!
s->ps.sps->nb_st_rps) {
732 rps_idx = numbits > 0 ?
get_bits(gb, numbits) : 0;
746 if (
s->ps.sps->sps_temporal_mvp_enabled_flag)
771 if (
s->ps.sps->sao_enabled) {
773 if (
s->ps.sps->chroma_format_idc) {
787 sh->
nb_refs[
L0] =
s->ps.pps->num_ref_idx_l0_default_active;
789 sh->
nb_refs[
L1] =
s->ps.pps->num_ref_idx_l1_default_active;
810 if (
s->ps.pps->lists_modification_present_flag && nb_refs > 1) {
828 if (
s->ps.pps->cabac_init_present_flag)
843 "Invalid collocated_ref_idx: %d.\n",
860 "Invalid number of merging MVP candidates: %d.\n",
866 if (
s->ps.sps->motion_vector_resolution_control_idc == 2)
876 if (
s->ps.pps->pic_slice_level_chroma_qp_offsets_present_flag) {
889 if (
s->ps.pps->pps_slice_act_qp_offsets_present_flag) {
895 if (
s->ps.pps->chroma_qp_offset_list_enabled_flag)
900 if (
s->ps.pps->deblocking_filter_control_present_flag) {
901 int deblocking_filter_override_flag = 0;
903 if (
s->ps.pps->deblocking_filter_override_enabled_flag)
904 deblocking_filter_override_flag =
get_bits1(gb);
906 if (deblocking_filter_override_flag) {
911 if (beta_offset_div2 < -6 || beta_offset_div2 > 6 ||
912 tc_offset_div2 < -6 || tc_offset_div2 > 6) {
914 "Invalid deblock filter offsets: %d, %d\n",
915 beta_offset_div2, tc_offset_div2);
932 if (
s->ps.pps->seq_loop_filter_across_slices_enabled_flag &&
940 }
else if (!
s->slice_initialized) {
946 if (
s->ps.pps->tiles_enabled_flag ||
s->ps.pps->entropy_coding_sync_enabled_flag) {
950 av_log(
s->avctx,
AV_LOG_ERROR,
"num_entry_point_offsets %d is invalid\n", num_entry_point_offsets);
958 if (offset_len < 1 || offset_len > 32) {
979 if (
s->threads_number > 1 && (
s->ps.pps->num_tile_rows > 1 ||
s->ps.pps->num_tile_columns > 1)) {
980 s->enable_parallel_tiles = 0;
981 s->threads_number = 1;
983 s->enable_parallel_tiles = 0;
985 s->enable_parallel_tiles = 0;
988 if (
s->ps.pps->slice_header_extension_present_flag) {
994 for (
i = 0;
i < length;
i++)
1001 sh->
slice_qp < -
s->ps.sps->qp_bd_offset) {
1003 "The slice_qp %d is outside the valid range "
1006 -
s->ps.sps->qp_bd_offset);
1012 if (!
s->sh.slice_ctb_addr_rs &&
s->sh.dependent_slice_segment_flag) {
1023 s->HEVClc->first_qp_group = !
s->sh.dependent_slice_segment_flag;
1025 if (!
s->ps.pps->cu_qp_delta_enabled_flag)
1026 s->HEVClc->qp_y =
s->sh.slice_qp;
1028 s->slice_initialized = 1;
1029 s->HEVClc->tu.cu_qp_offset_cb = 0;
1030 s->HEVClc->tu.cu_qp_offset_cr = 0;
1035 #define CTB(tab, x, y) ((tab)[(y) * s->ps.sps->ctb_width + (x)])
1037 #define SET_SAO(elem, value) \
1039 if (!sao_merge_up_flag && !sao_merge_left_flag) \
1040 sao->elem = value; \
1041 else if (sao_merge_left_flag) \
1042 sao->elem = CTB(s->sao, rx-1, ry).elem; \
1043 else if (sao_merge_up_flag) \
1044 sao->elem = CTB(s->sao, rx, ry-1).elem; \
1052 int sao_merge_left_flag = 0;
1053 int sao_merge_up_flag = 0;
1057 if (
s->sh.slice_sample_adaptive_offset_flag[0] ||
1058 s->sh.slice_sample_adaptive_offset_flag[1]) {
1063 if (ry > 0 && !sao_merge_left_flag) {
1069 for (c_idx = 0; c_idx < (
s->ps.sps->chroma_format_idc ? 3 : 1); c_idx++) {
1070 int log2_sao_offset_scale = c_idx == 0 ?
s->ps.pps->log2_sao_offset_scale_luma :
1071 s->ps.pps->log2_sao_offset_scale_chroma;
1073 if (!
s->sh.slice_sample_adaptive_offset_flag[c_idx]) {
1088 for (
i = 0;
i < 4;
i++)
1092 for (
i = 0;
i < 4;
i++) {
1101 }
else if (c_idx != 2) {
1107 for (
i = 0;
i < 4;
i++) {
1115 sao->
offset_val[c_idx][
i + 1] *= 1 << log2_sao_offset_scale;
1127 if (log2_res_scale_abs_plus1 != 0) {
1130 (1 - 2 * res_scale_sign_flag);
1140 int xBase,
int yBase,
int cb_xBase,
int cb_yBase,
1141 int log2_cb_size,
int log2_trafo_size,
1142 int blk_idx,
int cbf_luma,
int *cbf_cb,
int *cbf_cr)
1145 const int log2_trafo_size_c = log2_trafo_size -
s->ps.sps->hshift[1];
1149 int trafo_size = 1 << log2_trafo_size;
1152 s->hpc.intra_pred[log2_trafo_size - 2](lc, x0, y0, 0);
1155 if (cbf_luma || cbf_cb[0] || cbf_cr[0] ||
1156 (
s->ps.sps->chroma_format_idc == 2 && (cbf_cb[1] || cbf_cr[1]))) {
1159 int cbf_chroma = cbf_cb[0] || cbf_cr[0] ||
1160 (
s->ps.sps->chroma_format_idc == 2 &&
1161 (cbf_cb[1] || cbf_cr[1]));
1173 "The cu_qp_delta %d is outside the valid range "
1176 -(26 +
s->ps.sps->qp_bd_offset / 2),
1177 (25 +
s->ps.sps->qp_bd_offset / 2));
1184 if (
s->sh.cu_chroma_qp_offset_enabled_flag && cbf_chroma &&
1187 if (cu_chroma_qp_offset_flag) {
1188 int cu_chroma_qp_offset_idx = 0;
1189 if (
s->ps.pps->chroma_qp_offset_list_len_minus1 > 0) {
1192 "cu_chroma_qp_offset_idx not yet tested.\n");
1225 if (
s->ps.sps->chroma_format_idc && (log2_trafo_size > 2 ||
s->ps.sps->chroma_format_idc == 3)) {
1226 int trafo_size_h = 1 << (log2_trafo_size_c +
s->ps.sps->hshift[1]);
1227 int trafo_size_v = 1 << (log2_trafo_size_c +
s->ps.sps->vshift[1]);
1228 lc->
tu.
cross_pf = (
s->ps.pps->cross_component_prediction_enabled_flag && cbf_luma &&
1235 for (
i = 0;
i < (
s->ps.sps->chroma_format_idc == 2 ? 2 : 1);
i++) {
1238 s->hpc.intra_pred[log2_trafo_size_c - 2](lc, x0, y0 + (
i << log2_trafo_size_c), 1);
1242 log2_trafo_size_c, scan_idx_c, 1);
1245 ptrdiff_t
stride =
s->frame->linesize[1];
1246 int hshift =
s->ps.sps->hshift[1];
1247 int vshift =
s->ps.sps->vshift[1];
1250 int size = 1 << log2_trafo_size_c;
1252 uint8_t *dst = &
s->frame->data[1][(y0 >> vshift) *
stride +
1253 ((x0 >> hshift) <<
s->ps.sps->pixel_shift)];
1257 s->hevcdsp.add_residual[log2_trafo_size_c-2](dst, coeffs,
stride);
1264 for (
i = 0;
i < (
s->ps.sps->chroma_format_idc == 2 ? 2 : 1);
i++) {
1267 trafo_size_h, trafo_size_v);
1268 s->hpc.intra_pred[log2_trafo_size_c - 2](lc, x0, y0 + (
i << log2_trafo_size_c), 2);
1272 log2_trafo_size_c, scan_idx_c, 2);
1275 ptrdiff_t
stride =
s->frame->linesize[2];
1276 int hshift =
s->ps.sps->hshift[2];
1277 int vshift =
s->ps.sps->vshift[2];
1280 int size = 1 << log2_trafo_size_c;
1282 uint8_t *dst = &
s->frame->data[2][(y0 >> vshift) *
stride +
1283 ((x0 >> hshift) <<
s->ps.sps->pixel_shift)];
1287 s->hevcdsp.add_residual[log2_trafo_size_c-2](dst, coeffs,
stride);
1290 }
else if (
s->ps.sps->chroma_format_idc && blk_idx == 3) {
1291 int trafo_size_h = 1 << (log2_trafo_size + 1);
1292 int trafo_size_v = 1 << (log2_trafo_size +
s->ps.sps->vshift[1]);
1293 for (
i = 0;
i < (
s->ps.sps->chroma_format_idc == 2 ? 2 : 1);
i++) {
1296 trafo_size_h, trafo_size_v);
1297 s->hpc.intra_pred[log2_trafo_size - 2](lc, xBase, yBase + (
i << log2_trafo_size), 1);
1301 log2_trafo_size, scan_idx_c, 1);
1303 for (
i = 0;
i < (
s->ps.sps->chroma_format_idc == 2 ? 2 : 1);
i++) {
1306 trafo_size_h, trafo_size_v);
1307 s->hpc.intra_pred[log2_trafo_size - 2](lc, xBase, yBase + (
i << log2_trafo_size), 2);
1311 log2_trafo_size, scan_idx_c, 2);
1315 if (log2_trafo_size > 2 ||
s->ps.sps->chroma_format_idc == 3) {
1316 int trafo_size_h = 1 << (log2_trafo_size_c +
s->ps.sps->hshift[1]);
1317 int trafo_size_v = 1 << (log2_trafo_size_c +
s->ps.sps->vshift[1]);
1319 s->hpc.intra_pred[log2_trafo_size_c - 2](lc, x0, y0, 1);
1320 s->hpc.intra_pred[log2_trafo_size_c - 2](lc, x0, y0, 2);
1321 if (
s->ps.sps->chroma_format_idc == 2) {
1323 trafo_size_h, trafo_size_v);
1324 s->hpc.intra_pred[log2_trafo_size_c - 2](lc, x0, y0 + (1 << log2_trafo_size_c), 1);
1325 s->hpc.intra_pred[log2_trafo_size_c - 2](lc, x0, y0 + (1 << log2_trafo_size_c), 2);
1327 }
else if (blk_idx == 3) {
1328 int trafo_size_h = 1 << (log2_trafo_size + 1);
1329 int trafo_size_v = 1 << (log2_trafo_size +
s->ps.sps->vshift[1]);
1331 trafo_size_h, trafo_size_v);
1332 s->hpc.intra_pred[log2_trafo_size - 2](lc, xBase, yBase, 1);
1333 s->hpc.intra_pred[log2_trafo_size - 2](lc, xBase, yBase, 2);
1334 if (
s->ps.sps->chroma_format_idc == 2) {
1336 trafo_size_h, trafo_size_v);
1337 s->hpc.intra_pred[log2_trafo_size - 2](lc, xBase, yBase + (1 << log2_trafo_size), 1);
1338 s->hpc.intra_pred[log2_trafo_size - 2](lc, xBase, yBase + (1 << log2_trafo_size), 2);
1348 int cb_size = 1 << log2_cb_size;
1349 int log2_min_pu_size =
s->ps.sps->log2_min_pu_size;
1351 int min_pu_width =
s->ps.sps->min_pu_width;
1352 int x_end =
FFMIN(x0 + cb_size,
s->ps.sps->width);
1353 int y_end =
FFMIN(y0 + cb_size,
s->ps.sps->height);
1356 for (j = (y0 >> log2_min_pu_size); j < (y_end >> log2_min_pu_size); j++)
1357 for (
i = (x0 >> log2_min_pu_size);
i < (x_end >> log2_min_pu_size);
i++)
1358 s->is_pcm[
i + j * min_pu_width] = 2;
1362 int xBase,
int yBase,
int cb_xBase,
int cb_yBase,
1363 int log2_cb_size,
int log2_trafo_size,
1364 int trafo_depth,
int blk_idx,
1365 const int *base_cbf_cb,
const int *base_cbf_cr)
1368 uint8_t split_transform_flag;
1373 cbf_cb[0] = base_cbf_cb[0];
1374 cbf_cb[1] = base_cbf_cb[1];
1375 cbf_cr[0] = base_cbf_cr[0];
1376 cbf_cr[1] = base_cbf_cr[1];
1379 if (trafo_depth == 1) {
1381 if (
s->ps.sps->chroma_format_idc == 3) {
1395 if (log2_trafo_size <= s->ps.sps->log2_max_trafo_size &&
1396 log2_trafo_size >
s->ps.sps->log2_min_tb_size &&
1397 trafo_depth < lc->cu.max_trafo_depth &&
1401 int inter_split =
s->ps.sps->max_transform_hierarchy_depth_inter == 0 &&
1406 split_transform_flag = log2_trafo_size >
s->ps.sps->log2_max_trafo_size ||
1411 if (
s->ps.sps->chroma_format_idc && (log2_trafo_size > 2 ||
s->ps.sps->chroma_format_idc == 3)) {
1412 if (trafo_depth == 0 || cbf_cb[0]) {
1414 if (
s->ps.sps->chroma_format_idc == 2 && (!split_transform_flag || log2_trafo_size == 3)) {
1419 if (trafo_depth == 0 || cbf_cr[0]) {
1421 if (
s->ps.sps->chroma_format_idc == 2 && (!split_transform_flag || log2_trafo_size == 3)) {
1427 if (split_transform_flag) {
1428 const int trafo_size_split = 1 << (log2_trafo_size - 1);
1429 const int x1 = x0 + trafo_size_split;
1430 const int y1 = y0 + trafo_size_split;
1432 #define SUBDIVIDE(x, y, idx) \
1434 ret = hls_transform_tree(lc, x, y, x0, y0, cb_xBase, cb_yBase, log2_cb_size,\
1435 log2_trafo_size - 1, trafo_depth + 1, idx, \
1448 int min_tu_size = 1 <<
s->ps.sps->log2_min_tb_size;
1449 int log2_min_tu_size =
s->ps.sps->log2_min_tb_size;
1450 int min_tu_width =
s->ps.sps->min_tb_width;
1454 cbf_cb[0] || cbf_cr[0] ||
1455 (
s->ps.sps->chroma_format_idc == 2 && (cbf_cb[1] || cbf_cr[1]))) {
1460 log2_cb_size, log2_trafo_size,
1461 blk_idx, cbf_luma, cbf_cb, cbf_cr);
1467 for (
i = 0;
i < (1 << log2_trafo_size);
i += min_tu_size)
1468 for (j = 0; j < (1 << log2_trafo_size); j += min_tu_size) {
1469 int x_tu = (x0 + j) >> log2_min_tu_size;
1470 int y_tu = (y0 +
i) >> log2_min_tu_size;
1471 s->cbf_luma[y_tu * min_tu_width + x_tu] = 1;
1474 if (!
s->sh.disable_deblocking_filter_flag) {
1476 if (
s->ps.pps->transquant_bypass_enable_flag &&
1488 int cb_size = 1 << log2_cb_size;
1489 ptrdiff_t stride0 =
s->frame->linesize[0];
1490 ptrdiff_t stride1 =
s->frame->linesize[1];
1491 ptrdiff_t stride2 =
s->frame->linesize[2];
1492 uint8_t *dst0 = &
s->frame->data[0][y0 * stride0 + (x0 <<
s->ps.sps->pixel_shift)];
1493 uint8_t *dst1 = &
s->frame->data[1][(y0 >>
s->ps.sps->vshift[1]) * stride1 + ((x0 >>
s->ps.sps->hshift[1]) <<
s->ps.sps->pixel_shift)];
1494 uint8_t *dst2 = &
s->frame->data[2][(y0 >>
s->ps.sps->vshift[2]) * stride2 + ((x0 >>
s->ps.sps->hshift[2]) <<
s->ps.sps->pixel_shift)];
1496 int length = cb_size * cb_size *
s->ps.sps->pcm.bit_depth +
1497 (((cb_size >>
s->ps.sps->hshift[1]) * (cb_size >>
s->ps.sps->vshift[1])) +
1498 ((cb_size >>
s->ps.sps->hshift[2]) * (cb_size >>
s->ps.sps->vshift[2]))) *
1499 s->ps.sps->pcm.bit_depth_chroma;
1500 const uint8_t *pcm =
skip_bytes(&lc->
cc, (length + 7) >> 3);
1503 if (!
s->sh.disable_deblocking_filter_flag)
1510 s->hevcdsp.put_pcm(dst0, stride0, cb_size, cb_size, &gb,
s->ps.sps->pcm.bit_depth);
1511 if (
s->ps.sps->chroma_format_idc) {
1512 s->hevcdsp.put_pcm(dst1, stride1,
1513 cb_size >>
s->ps.sps->hshift[1],
1514 cb_size >>
s->ps.sps->vshift[1],
1515 &gb,
s->ps.sps->pcm.bit_depth_chroma);
1516 s->hevcdsp.put_pcm(dst2, stride2,
1517 cb_size >>
s->ps.sps->hshift[2],
1518 cb_size >>
s->ps.sps->vshift[2],
1519 &gb,
s->ps.sps->pcm.bit_depth_chroma);
1543 int block_w,
int block_h,
int luma_weight,
int luma_offset)
1546 const uint8_t *
src =
ref->data[0];
1547 ptrdiff_t srcstride =
ref->linesize[0];
1548 int pic_width =
s->ps.sps->width;
1549 int pic_height =
s->ps.sps->height;
1552 int weight_flag = (
s->sh.slice_type ==
HEVC_SLICE_P &&
s->ps.pps->weighted_pred_flag) ||
1553 (
s->sh.slice_type ==
HEVC_SLICE_B &&
s->ps.pps->weighted_bipred_flag);
1556 x_off +=
mv->x >> 2;
1557 y_off +=
mv->y >> 2;
1558 src += y_off * srcstride + (x_off * (1 <<
s->ps.sps->pixel_shift));
1569 edge_emu_stride, srcstride,
1573 pic_width, pic_height);
1575 srcstride = edge_emu_stride;
1579 s->hevcdsp.put_hevc_qpel_uni[idx][!!my][!!mx](dst, dststride,
src, srcstride,
1580 block_h, mx, my, block_w);
1582 s->hevcdsp.put_hevc_qpel_uni_w[idx][!!my][!!mx](dst, dststride,
src, srcstride,
1583 block_h,
s->sh.luma_log2_weight_denom,
1584 luma_weight, luma_offset, mx, my, block_w);
1604 const AVFrame *ref0,
const Mv *mv0,
int x_off,
int y_off,
1605 int block_w,
int block_h,
const AVFrame *ref1,
1606 const Mv *mv1,
struct MvField *current_mv)
1609 ptrdiff_t src0stride = ref0->
linesize[0];
1610 ptrdiff_t src1stride = ref1->
linesize[0];
1611 int pic_width =
s->ps.sps->width;
1612 int pic_height =
s->ps.sps->height;
1613 int mx0 = mv0->
x & 3;
1614 int my0 = mv0->
y & 3;
1615 int mx1 = mv1->
x & 3;
1616 int my1 = mv1->
y & 3;
1617 int weight_flag = (
s->sh.slice_type ==
HEVC_SLICE_P &&
s->ps.pps->weighted_pred_flag) ||
1618 (
s->sh.slice_type ==
HEVC_SLICE_B &&
s->ps.pps->weighted_bipred_flag);
1619 int x_off0 = x_off + (mv0->
x >> 2);
1620 int y_off0 = y_off + (mv0->
y >> 2);
1621 int x_off1 = x_off + (mv1->
x >> 2);
1622 int y_off1 = y_off + (mv1->
y >> 2);
1625 const uint8_t *
src0 = ref0->
data[0] + y_off0 * src0stride + (
int)((
unsigned)x_off0 <<
s->ps.sps->pixel_shift);
1626 const uint8_t *
src1 = ref1->
data[0] + y_off1 * src1stride + (
int)((
unsigned)x_off1 <<
s->ps.sps->pixel_shift);
1636 edge_emu_stride, src0stride,
1640 pic_width, pic_height);
1642 src0stride = edge_emu_stride;
1653 edge_emu_stride, src1stride,
1657 pic_width, pic_height);
1659 src1stride = edge_emu_stride;
1662 s->hevcdsp.put_hevc_qpel[idx][!!my0][!!mx0](lc->
tmp,
src0, src0stride,
1663 block_h, mx0, my0, block_w);
1665 s->hevcdsp.put_hevc_qpel_bi[idx][!!my1][!!mx1](dst, dststride,
src1, src1stride, lc->
tmp,
1666 block_h, mx1, my1, block_w);
1668 s->hevcdsp.put_hevc_qpel_bi_w[idx][!!my1][!!mx1](dst, dststride,
src1, src1stride, lc->
tmp,
1669 block_h,
s->sh.luma_log2_weight_denom,
1670 s->sh.luma_weight_l0[current_mv->
ref_idx[0]],
1671 s->sh.luma_weight_l1[current_mv->
ref_idx[1]],
1672 s->sh.luma_offset_l0[current_mv->
ref_idx[0]],
1673 s->sh.luma_offset_l1[current_mv->
ref_idx[1]],
1696 ptrdiff_t dststride,
const uint8_t *
src0, ptrdiff_t srcstride,
int reflist,
1697 int x_off,
int y_off,
int block_w,
int block_h,
1698 const struct MvField *current_mv,
int chroma_weight,
int chroma_offset)
1701 int pic_width =
s->ps.sps->width >>
s->ps.sps->hshift[1];
1702 int pic_height =
s->ps.sps->height >>
s->ps.sps->vshift[1];
1703 const Mv *
mv = ¤t_mv->
mv[reflist];
1704 int weight_flag = (
s->sh.slice_type ==
HEVC_SLICE_P &&
s->ps.pps->weighted_pred_flag) ||
1705 (
s->sh.slice_type ==
HEVC_SLICE_B &&
s->ps.pps->weighted_bipred_flag);
1707 int hshift =
s->ps.sps->hshift[1];
1708 int vshift =
s->ps.sps->vshift[1];
1711 intptr_t _mx = mx << (1 - hshift);
1712 intptr_t _my = my << (1 - vshift);
1713 int emu =
src0 ==
s->frame->data[1] ||
src0 ==
s->frame->data[2];
1715 x_off +=
mv->x >> (2 + hshift);
1716 y_off +=
mv->y >> (2 + vshift);
1717 src0 += y_off * srcstride + (x_off * (1 <<
s->ps.sps->pixel_shift));
1726 (edge_emu_stride + (1 <<
s->ps.sps->pixel_shift));
1728 edge_emu_stride, srcstride,
1732 pic_width, pic_height);
1735 srcstride = edge_emu_stride;
1738 s->hevcdsp.put_hevc_epel_uni[idx][!!my][!!mx](dst0, dststride,
src0, srcstride,
1739 block_h, _mx, _my, block_w);
1741 s->hevcdsp.put_hevc_epel_uni_w[idx][!!my][!!mx](dst0, dststride,
src0, srcstride,
1742 block_h,
s->sh.chroma_log2_weight_denom,
1743 chroma_weight, chroma_offset, _mx, _my, block_w);
1765 int x_off,
int y_off,
int block_w,
int block_h,
const MvField *current_mv,
int cidx)
1768 const uint8_t *
src1 = ref0->
data[cidx+1];
1769 const uint8_t *
src2 = ref1->
data[cidx+1];
1770 ptrdiff_t src1stride = ref0->
linesize[cidx+1];
1771 ptrdiff_t src2stride = ref1->
linesize[cidx+1];
1772 int weight_flag = (
s->sh.slice_type ==
HEVC_SLICE_P &&
s->ps.pps->weighted_pred_flag) ||
1773 (
s->sh.slice_type ==
HEVC_SLICE_B &&
s->ps.pps->weighted_bipred_flag);
1774 int pic_width =
s->ps.sps->width >>
s->ps.sps->hshift[1];
1775 int pic_height =
s->ps.sps->height >>
s->ps.sps->vshift[1];
1776 const Mv *
const mv0 = ¤t_mv->
mv[0];
1777 const Mv *
const mv1 = ¤t_mv->
mv[1];
1778 int hshift =
s->ps.sps->hshift[1];
1779 int vshift =
s->ps.sps->vshift[1];
1785 intptr_t _mx0 = mx0 << (1 - hshift);
1786 intptr_t _my0 = my0 << (1 - vshift);
1787 intptr_t _mx1 = mx1 << (1 - hshift);
1788 intptr_t _my1 = my1 << (1 - vshift);
1790 int x_off0 = x_off + (mv0->
x >> (2 + hshift));
1791 int y_off0 = y_off + (mv0->
y >> (2 + vshift));
1792 int x_off1 = x_off + (mv1->
x >> (2 + hshift));
1793 int y_off1 = y_off + (mv1->
y >> (2 + vshift));
1795 src1 += y_off0 * src1stride + (
int)((
unsigned)x_off0 <<
s->ps.sps->pixel_shift);
1796 src2 += y_off1 * src2stride + (
int)((
unsigned)x_off1 <<
s->ps.sps->pixel_shift);
1804 (edge_emu_stride + (1 <<
s->ps.sps->pixel_shift));
1807 edge_emu_stride, src1stride,
1811 pic_width, pic_height);
1814 src1stride = edge_emu_stride;
1823 (edge_emu_stride + (1 <<
s->ps.sps->pixel_shift));
1826 edge_emu_stride, src2stride,
1830 pic_width, pic_height);
1833 src2stride = edge_emu_stride;
1836 s->hevcdsp.put_hevc_epel[idx][!!my0][!!mx0](lc->
tmp,
src1, src1stride,
1837 block_h, _mx0, _my0, block_w);
1839 s->hevcdsp.put_hevc_epel_bi[idx][!!my1][!!mx1](dst0,
s->frame->linesize[cidx+1],
1841 block_h, _mx1, _my1, block_w);
1843 s->hevcdsp.put_hevc_epel_bi_w[idx][!!my1][!!mx1](dst0,
s->frame->linesize[cidx+1],
1846 s->sh.chroma_log2_weight_denom,
1847 s->sh.chroma_weight_l0[current_mv->
ref_idx[0]][cidx],
1848 s->sh.chroma_weight_l1[current_mv->
ref_idx[1]][cidx],
1849 s->sh.chroma_offset_l0[current_mv->
ref_idx[0]][cidx],
1850 s->sh.chroma_offset_l1[current_mv->
ref_idx[1]][cidx],
1851 _mx1, _my1, block_w);
1865 int nPbH,
int log2_cb_size,
int part_idx,
1877 if (inter_pred_idc !=
PRED_L1) {
1878 if (
s->sh.nb_refs[
L0])
1885 part_idx, merge_idx,
mv, mvp_flag, 0);
1890 if (inter_pred_idc !=
PRED_L0) {
1891 if (
s->sh.nb_refs[
L1])
1894 if (
s->sh.mvd_l1_zero_flag == 1 && inter_pred_idc ==
PRED_BI) {
1903 part_idx, merge_idx,
mv, mvp_flag, 1);
1911 int log2_cb_size,
int partIdx,
int idx)
1913 #define POS(c_idx, x, y) \
1914 &s->frame->data[c_idx][((y) >> s->ps.sps->vshift[c_idx]) * s->frame->linesize[c_idx] + \
1915 (((x) >> s->ps.sps->hshift[c_idx]) << s->ps.sps->pixel_shift)]
1918 struct MvField current_mv = {{{ 0 }}};
1920 int min_pu_width =
s->ps.sps->min_pu_width;
1922 MvField *tab_mvf =
s->ref->tab_mvf;
1923 const RefPicList *refPicList =
s->ref->refPicList;
1925 uint8_t *dst0 =
POS(0, x0, y0);
1926 uint8_t *dst1 =
POS(1, x0, y0);
1927 uint8_t *dst2 =
POS(2, x0, y0);
1928 int log2_min_cb_size =
s->ps.sps->log2_min_cb_size;
1929 int min_cb_width =
s->ps.sps->min_cb_width;
1930 int x_cb = x0 >> log2_min_cb_size;
1931 int y_cb = y0 >> log2_min_cb_size;
1935 int skip_flag =
SAMPLE_CTB(
s->skip_flag, x_cb, y_cb);
1941 if (
s->sh.max_num_merge_cand > 1)
1947 partIdx, merge_idx, ¤t_mv);
1950 partIdx, merge_idx, ¤t_mv);
1953 x_pu = x0 >>
s->ps.sps->log2_min_pu_size;
1954 y_pu = y0 >>
s->ps.sps->log2_min_pu_size;
1956 for (j = 0; j < nPbH >>
s->ps.sps->log2_min_pu_size; j++)
1957 for (
i = 0; i < nPbW >>
s->ps.sps->log2_min_pu_size;
i++)
1958 tab_mvf[(y_pu + j) * min_pu_width + x_pu +
i] = current_mv;
1961 ref0 = refPicList[0].
ref[current_mv.
ref_idx[0]];
1967 ref1 = refPicList[1].
ref[current_mv.
ref_idx[1]];
1968 if (!ref1 || !ref1->frame->data[0])
1974 int x0_c = x0 >>
s->ps.sps->hshift[1];
1975 int y0_c = y0 >>
s->ps.sps->vshift[1];
1976 int nPbW_c = nPbW >>
s->ps.sps->hshift[1];
1977 int nPbH_c = nPbH >>
s->ps.sps->vshift[1];
1980 ¤t_mv.
mv[0], x0, y0, nPbW, nPbH,
1981 s->sh.luma_weight_l0[current_mv.
ref_idx[0]],
1982 s->sh.luma_offset_l0[current_mv.
ref_idx[0]]);
1984 if (
s->ps.sps->chroma_format_idc) {
1986 0, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
1987 s->sh.chroma_weight_l0[current_mv.
ref_idx[0]][0],
s->sh.chroma_offset_l0[current_mv.
ref_idx[0]][0]);
1989 0, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
1990 s->sh.chroma_weight_l0[current_mv.
ref_idx[0]][1],
s->sh.chroma_offset_l0[current_mv.
ref_idx[0]][1]);
1993 int x0_c = x0 >>
s->ps.sps->hshift[1];
1994 int y0_c = y0 >>
s->ps.sps->vshift[1];
1995 int nPbW_c = nPbW >>
s->ps.sps->hshift[1];
1996 int nPbH_c = nPbH >>
s->ps.sps->vshift[1];
1998 luma_mc_uni(lc, dst0,
s->frame->linesize[0], ref1->frame,
1999 ¤t_mv.
mv[1], x0, y0, nPbW, nPbH,
2000 s->sh.luma_weight_l1[current_mv.
ref_idx[1]],
2001 s->sh.luma_offset_l1[current_mv.
ref_idx[1]]);
2003 if (
s->ps.sps->chroma_format_idc) {
2004 chroma_mc_uni(lc, dst1,
s->frame->linesize[1], ref1->frame->data[1], ref1->frame->linesize[1],
2005 1, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
2006 s->sh.chroma_weight_l1[current_mv.
ref_idx[1]][0],
s->sh.chroma_offset_l1[current_mv.
ref_idx[1]][0]);
2008 chroma_mc_uni(lc, dst2,
s->frame->linesize[2], ref1->frame->data[2], ref1->frame->linesize[2],
2009 1, x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv,
2010 s->sh.chroma_weight_l1[current_mv.
ref_idx[1]][1],
s->sh.chroma_offset_l1[current_mv.
ref_idx[1]][1]);
2013 int x0_c = x0 >>
s->ps.sps->hshift[1];
2014 int y0_c = y0 >>
s->ps.sps->vshift[1];
2015 int nPbW_c = nPbW >>
s->ps.sps->hshift[1];
2016 int nPbH_c = nPbH >>
s->ps.sps->vshift[1];
2019 ¤t_mv.
mv[0], x0, y0, nPbW, nPbH,
2020 ref1->frame, ¤t_mv.
mv[1], ¤t_mv);
2022 if (
s->ps.sps->chroma_format_idc) {
2024 x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv, 0);
2027 x0_c, y0_c, nPbW_c, nPbH_c, ¤t_mv, 1);
2036 int prev_intra_luma_pred_flag)
2039 int x_pu = x0 >>
s->ps.sps->log2_min_pu_size;
2040 int y_pu = y0 >>
s->ps.sps->log2_min_pu_size;
2041 int min_pu_width =
s->ps.sps->min_pu_width;
2042 int size_in_pus = pu_size >>
s->ps.sps->log2_min_pu_size;
2047 s->tab_ipm[(y_pu - 1) * min_pu_width + x_pu] :
INTRA_DC;
2049 s->tab_ipm[y_pu * min_pu_width + x_pu - 1] :
INTRA_DC;
2051 int y_ctb = (y0 >> (
s->ps.sps->log2_ctb_size)) << (
s->ps.sps->log2_ctb_size);
2053 MvField *tab_mvf =
s->ref->tab_mvf;
2054 int intra_pred_mode;
2059 if ((y0 - 1) < y_ctb)
2062 if (cand_left == cand_up) {
2063 if (cand_left < 2) {
2068 candidate[0] = cand_left;
2069 candidate[1] = 2 + ((cand_left - 2 - 1 + 32) & 31);
2070 candidate[2] = 2 + ((cand_left - 2 + 1) & 31);
2073 candidate[0] = cand_left;
2074 candidate[1] = cand_up;
2084 if (prev_intra_luma_pred_flag) {
2085 intra_pred_mode = candidate[lc->
pu.
mpm_idx];
2087 if (candidate[0] > candidate[1])
2088 FFSWAP(uint8_t, candidate[0], candidate[1]);
2089 if (candidate[0] > candidate[2])
2090 FFSWAP(uint8_t, candidate[0], candidate[2]);
2091 if (candidate[1] > candidate[2])
2092 FFSWAP(uint8_t, candidate[1], candidate[2]);
2095 for (
i = 0;
i < 3;
i++)
2096 if (intra_pred_mode >= candidate[
i])
2103 for (
i = 0;
i < size_in_pus;
i++) {
2104 memset(&
s->tab_ipm[(y_pu +
i) * min_pu_width + x_pu],
2105 intra_pred_mode, size_in_pus);
2107 for (j = 0; j < size_in_pus; j++) {
2112 return intra_pred_mode;
2116 int log2_cb_size,
int ct_depth)
2118 int length = (1 << log2_cb_size) >>
s->ps.sps->log2_min_cb_size;
2119 int x_cb = x0 >>
s->ps.sps->log2_min_cb_size;
2120 int y_cb = y0 >>
s->ps.sps->log2_min_cb_size;
2123 for (y = 0; y < length; y++)
2124 memset(&
s->tab_ct_depth[(y_cb + y) *
s->ps.sps->min_cb_width + x_cb],
2129 0, 1, 2, 2, 2, 2, 3, 5, 7, 8, 10, 12, 13, 15, 17, 18, 19, 20,
2130 21, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 29, 29, 30, 31};
2136 static const uint8_t intra_chroma_table[4] = { 0, 26, 10, 1 };
2137 uint8_t prev_intra_luma_pred_flag[4];
2139 int pb_size = (1 << log2_cb_size) >>
split;
2140 int side =
split + 1;
2144 for (
i = 0;
i < side;
i++)
2145 for (j = 0; j < side; j++)
2148 for (
i = 0;
i < side;
i++) {
2149 for (j = 0; j < side; j++) {
2150 if (prev_intra_luma_pred_flag[2 *
i + j])
2157 prev_intra_luma_pred_flag[2 *
i + j]);
2161 if (
s->ps.sps->chroma_format_idc == 3) {
2162 for (
i = 0;
i < side;
i++) {
2163 for (j = 0; j < side; j++) {
2165 if (chroma_mode != 4) {
2175 }
else if (
s->ps.sps->chroma_format_idc == 2) {
2178 if (chroma_mode != 4) {
2182 mode_idx = intra_chroma_table[chroma_mode];
2187 }
else if (
s->ps.sps->chroma_format_idc != 0) {
2189 if (chroma_mode != 4) {
2205 int pb_size = 1 << log2_cb_size;
2206 int size_in_pus = pb_size >>
s->ps.sps->log2_min_pu_size;
2207 int min_pu_width =
s->ps.sps->min_pu_width;
2208 MvField *tab_mvf =
s->ref->tab_mvf;
2209 int x_pu = x0 >>
s->ps.sps->log2_min_pu_size;
2210 int y_pu = y0 >>
s->ps.sps->log2_min_pu_size;
2213 if (size_in_pus == 0)
2215 for (j = 0; j < size_in_pus; j++)
2216 memset(&
s->tab_ipm[(y_pu + j) * min_pu_width + x_pu],
INTRA_DC, size_in_pus);
2218 for (j = 0; j < size_in_pus; j++)
2219 for (k = 0; k < size_in_pus; k++)
2225 int cb_size = 1 << log2_cb_size;
2226 int log2_min_cb_size =
s->ps.sps->log2_min_cb_size;
2227 int length = cb_size >> log2_min_cb_size;
2228 int min_cb_width =
s->ps.sps->min_cb_width;
2229 int x_cb = x0 >> log2_min_cb_size;
2230 int y_cb = y0 >> log2_min_cb_size;
2231 int idx = log2_cb_size - 2;
2232 int qp_block_mask = (1<<(
s->ps.sps->log2_ctb_size -
s->ps.pps->diff_cu_qp_delta_depth)) - 1;
2242 for (x = 0; x < 4; x++)
2244 if (
s->ps.pps->transquant_bypass_enable_flag) {
2254 x = y_cb * min_cb_width + x_cb;
2255 for (y = 0; y < length; y++) {
2256 memset(&
s->skip_flag[x], skip_flag, length);
2261 x = y_cb * min_cb_width + x_cb;
2262 for (y = 0; y < length; y++) {
2263 memset(&
s->skip_flag[x], 0, length);
2272 if (!
s->sh.disable_deblocking_filter_flag)
2280 log2_cb_size ==
s->ps.sps->log2_min_cb_size) {
2288 log2_cb_size >=
s->ps.sps->pcm.log2_min_pcm_cb_size &&
2289 log2_cb_size <= s->ps.sps->pcm.log2_max_pcm_cb_size) {
2295 if (
s->ps.sps->pcm.loop_filter_disable_flag)
2311 hls_prediction_unit(lc, x0, y0 + cb_size / 2, cb_size, cb_size / 2, log2_cb_size, 1, idx);
2315 hls_prediction_unit(lc, x0 + cb_size / 2, y0, cb_size / 2, cb_size, log2_cb_size, 1, idx - 1);
2319 hls_prediction_unit(lc, x0, y0 + cb_size / 4, cb_size, cb_size * 3 / 4, log2_cb_size, 1, idx);
2323 hls_prediction_unit(lc, x0, y0 + cb_size * 3 / 4, cb_size, cb_size / 4, log2_cb_size, 1, idx);
2327 hls_prediction_unit(lc, x0 + cb_size / 4, y0, cb_size * 3 / 4, cb_size, log2_cb_size, 1, idx - 2);
2331 hls_prediction_unit(lc, x0 + cb_size * 3 / 4, y0, cb_size / 4, cb_size, log2_cb_size, 1, idx - 2);
2335 hls_prediction_unit(lc, x0 + cb_size / 2, y0, cb_size / 2, cb_size / 2, log2_cb_size, 1, idx - 1);
2336 hls_prediction_unit(lc, x0, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 2, idx - 1);
2337 hls_prediction_unit(lc, x0 + cb_size / 2, y0 + cb_size / 2, cb_size / 2, cb_size / 2, log2_cb_size, 3, idx - 1);
2343 int rqt_root_cbf = 1;
2350 const static int cbf[2] = { 0 };
2353 s->ps.sps->max_transform_hierarchy_depth_inter;
2356 log2_cb_size, 0, 0, cbf, cbf);
2360 if (!
s->sh.disable_deblocking_filter_flag)
2369 x = y_cb * min_cb_width + x_cb;
2370 for (y = 0; y < length; y++) {
2371 memset(&
s->qp_y_tab[x], lc->
qp_y, length);
2375 if(((x0 + (1<<log2_cb_size)) & qp_block_mask) == 0 &&
2376 ((y0 + (1<<log2_cb_size)) & qp_block_mask) == 0) {
2386 int log2_cb_size,
int cb_depth)
2389 const int cb_size = 1 << log2_cb_size;
2394 if (x0 + cb_size <= s->ps.sps->width &&
2395 y0 + cb_size <= s->ps.sps->height &&
2396 log2_cb_size >
s->ps.sps->log2_min_cb_size) {
2399 split_cu = (log2_cb_size >
s->ps.sps->log2_min_cb_size);
2401 if (
s->ps.pps->cu_qp_delta_enabled_flag &&
2402 log2_cb_size >=
s->ps.sps->log2_ctb_size -
s->ps.pps->diff_cu_qp_delta_depth) {
2407 if (
s->sh.cu_chroma_qp_offset_enabled_flag &&
2408 log2_cb_size >=
s->ps.sps->log2_ctb_size -
s->ps.pps->diff_cu_chroma_qp_offset_depth) {
2413 int qp_block_mask = (1<<(
s->ps.sps->log2_ctb_size -
s->ps.pps->diff_cu_qp_delta_depth)) - 1;
2414 const int cb_size_split = cb_size >> 1;
2415 const int x1 = x0 + cb_size_split;
2416 const int y1 = y0 + cb_size_split;
2424 if (more_data && x1 < s->ps.sps->width) {
2429 if (more_data && y1 < s->ps.sps->height) {
2434 if (more_data && x1 < s->ps.sps->width &&
2435 y1 < s->ps.sps->height) {
2441 if(((x0 + (1<<log2_cb_size)) & qp_block_mask) == 0 &&
2442 ((y0 + (1<<log2_cb_size)) & qp_block_mask) == 0)
2446 return ((x1 + cb_size_split) <
s->ps.sps->width ||
2447 (y1 + cb_size_split) <
s->ps.sps->height);
2454 if ((!((x0 + cb_size) %
2455 (1 << (
s->ps.sps->log2_ctb_size))) ||
2456 (x0 + cb_size >=
s->ps.sps->width)) &&
2458 (1 << (
s->ps.sps->log2_ctb_size))) ||
2459 (y0 + cb_size >=
s->ps.sps->height))) {
2461 return !end_of_slice_flag;
2474 int ctb_size = 1 <<
s->ps.sps->log2_ctb_size;
2475 int ctb_addr_rs =
s->ps.pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2476 int ctb_addr_in_slice = ctb_addr_rs -
s->sh.slice_addr;
2478 s->tab_slice_address[ctb_addr_rs] =
s->sh.slice_addr;
2480 if (
s->ps.pps->entropy_coding_sync_enabled_flag) {
2481 if (x_ctb == 0 && (y_ctb & (ctb_size - 1)) == 0)
2484 }
else if (
s->ps.pps->tiles_enabled_flag) {
2485 if (ctb_addr_ts &&
s->ps.pps->tile_id[ctb_addr_ts] !=
s->ps.pps->tile_id[ctb_addr_ts - 1]) {
2486 int idxX =
s->ps.pps->col_idxX[x_ctb >>
s->ps.sps->log2_ctb_size];
2487 lc->
end_of_tiles_x = x_ctb + (
s->ps.pps->column_width[idxX] <<
s->ps.sps->log2_ctb_size);
2497 if (
s->ps.pps->tiles_enabled_flag) {
2498 if (x_ctb > 0 &&
s->ps.pps->tile_id[ctb_addr_ts] !=
s->ps.pps->tile_id[
s->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs - 1]])
2500 if (x_ctb > 0 &&
s->tab_slice_address[ctb_addr_rs] !=
s->tab_slice_address[ctb_addr_rs - 1])
2502 if (y_ctb > 0 &&
s->ps.pps->tile_id[ctb_addr_ts] !=
s->ps.pps->tile_id[
s->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs -
s->ps.sps->ctb_width]])
2504 if (y_ctb > 0 &&
s->tab_slice_address[ctb_addr_rs] !=
s->tab_slice_address[ctb_addr_rs -
s->ps.sps->ctb_width])
2507 if (ctb_addr_in_slice <= 0)
2509 if (ctb_addr_in_slice < s->ps.sps->ctb_width)
2515 lc->
ctb_up_right_flag = ((y_ctb > 0) && (ctb_addr_in_slice+1 >=
s->ps.sps->ctb_width) && (
s->ps.pps->tile_id[ctb_addr_ts] ==
s->ps.pps->tile_id[
s->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs+1 -
s->ps.sps->ctb_width]]));
2516 lc->
ctb_up_left_flag = ((x_ctb > 0) && (y_ctb > 0) && (ctb_addr_in_slice-1 >=
s->ps.sps->ctb_width) && (
s->ps.pps->tile_id[ctb_addr_ts] ==
s->ps.pps->tile_id[
s->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs-1 -
s->ps.sps->ctb_width]]));
2523 int ctb_size = 1 <<
s->ps.sps->log2_ctb_size;
2527 int ctb_addr_ts =
s->ps.pps->ctb_addr_rs_to_ts[
s->sh.slice_ctb_addr_rs];
2530 if (!ctb_addr_ts &&
s->sh.dependent_slice_segment_flag) {
2535 if (
s->sh.dependent_slice_segment_flag) {
2536 int prev_rs =
s->ps.pps->ctb_addr_ts_to_rs[ctb_addr_ts - 1];
2537 if (
s->tab_slice_address[prev_rs] !=
s->sh.slice_addr) {
2543 while (more_data && ctb_addr_ts < s->ps.sps->ctb_size) {
2544 int ctb_addr_rs =
s->ps.pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2546 x_ctb = (ctb_addr_rs % ((
s->ps.sps->width + ctb_size - 1) >>
s->ps.sps->log2_ctb_size)) <<
s->ps.sps->log2_ctb_size;
2547 y_ctb = (ctb_addr_rs / ((
s->ps.sps->width + ctb_size - 1) >>
s->ps.sps->log2_ctb_size)) <<
s->ps.sps->log2_ctb_size;
2552 s->tab_slice_address[ctb_addr_rs] = -1;
2556 hls_sao_param(lc, x_ctb >>
s->ps.sps->log2_ctb_size, y_ctb >>
s->ps.sps->log2_ctb_size);
2558 s->deblock[ctb_addr_rs].beta_offset =
s->sh.beta_offset;
2559 s->deblock[ctb_addr_rs].tc_offset =
s->sh.tc_offset;
2560 s->filter_slice_edges[ctb_addr_rs] =
s->sh.slice_loop_filter_across_slices_enabled_flag;
2563 if (more_data < 0) {
2564 s->tab_slice_address[ctb_addr_rs] = -1;
2574 if (x_ctb + ctb_size >=
s->ps.sps->width &&
2575 y_ctb + ctb_size >=
s->ps.sps->height)
2589 int job,
int self_id)
2593 int ctb_size = 1 <<
s->ps.sps->log2_ctb_size;
2596 int ctb_addr_rs =
s->sh.slice_ctb_addr_rs + ctb_row * ((
s->ps.sps->width + ctb_size - 1) >>
s->ps.sps->log2_ctb_size);
2597 int ctb_addr_ts =
s->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs];
2598 int thread = ctb_row %
s->threads_number;
2608 while(more_data && ctb_addr_ts < s->ps.sps->ctb_size) {
2609 int x_ctb = (ctb_addr_rs %
s->ps.sps->ctb_width) <<
s->ps.sps->log2_ctb_size;
2610 int y_ctb = (ctb_addr_rs /
s->ps.sps->ctb_width) <<
s->ps.sps->log2_ctb_size;
2627 hls_sao_param(lc, x_ctb >>
s->ps.sps->log2_ctb_size, y_ctb >>
s->ps.sps->log2_ctb_size);
2630 if (more_data < 0) {
2641 if (!more_data && (x_ctb+ctb_size) <
s->ps.sps->width && ctb_row !=
s->sh.num_entry_point_offsets) {
2648 if ((x_ctb+ctb_size) >=
s->ps.sps->width && (y_ctb+ctb_size) >=
s->ps.sps->height ) {
2653 ctb_addr_rs =
s->ps.pps->ctb_addr_ts_to_rs[ctb_addr_ts];
2656 if(x_ctb >=
s->ps.sps->width) {
2664 s->tab_slice_address[ctb_addr_rs] = -1;
2674 int length = nal->
size;
2678 int64_t startheader, cmpt = 0;
2681 if (
s->sh.slice_ctb_addr_rs +
s->sh.num_entry_point_offsets *
s->ps.sps->ctb_width >=
s->ps.sps->ctb_width *
s->ps.sps->ctb_height) {
2683 s->sh.slice_ctb_addr_rs,
s->sh.num_entry_point_offsets,
2684 s->ps.sps->ctb_width,
s->ps.sps->ctb_height
2689 for (
i = 1;
i <
s->threads_number;
i++) {
2690 if (
s->HEVClcList[
i])
2693 if (!
s->HEVClcList[
i])
2695 s->HEVClcList[
i]->logctx =
s->avctx;
2696 s->HEVClcList[
i]->parent =
s;
2697 s->HEVClcList[
i]->common_cabac_state = &
s->cabac;
2702 for (j = 0, cmpt = 0, startheader =
offset +
s->sh.entry_point_offset[0]; j < nal->skipped_bytes; j++) {
2709 for (
i = 1;
i <
s->sh.num_entry_point_offsets;
i++) {
2710 offset += (
s->sh.entry_point_offset[
i - 1] - cmpt);
2711 for (j = 0, cmpt = 0, startheader =
offset
2712 +
s->sh.entry_point_offset[
i]; j < nal->skipped_bytes; j++) {
2718 s->sh.size[
i - 1] =
s->sh.entry_point_offset[
i] - cmpt;
2722 if (
s->sh.num_entry_point_offsets != 0) {
2723 offset +=
s->sh.entry_point_offset[
s->sh.num_entry_point_offsets - 1] - cmpt;
2728 s->sh.size[
s->sh.num_entry_point_offsets - 1] = length -
offset;
2729 s->sh.offset[
s->sh.num_entry_point_offsets - 1] =
offset;
2734 for (
i = 1;
i <
s->threads_number;
i++) {
2735 s->HEVClcList[
i]->first_qp_group = 1;
2736 s->HEVClcList[
i]->qp_y =
s->HEVClc->qp_y;
2748 if (
s->ps.pps->entropy_coding_sync_enabled_flag)
2751 for (
i = 0;
i <=
s->sh.num_entry_point_offsets;
i++)
2766 if (
IS_IRAP(
s) &&
s->no_rasl_output_flag) {
2767 if (
s->sei.common.mastering_display.present > 0)
2768 s->sei.common.mastering_display.present--;
2770 if (
s->sei.common.content_light.present > 0)
2771 s->sei.common.content_light.present--;
2775 &
s->ps.sps->vui.common,
2776 s->ps.sps->bit_depth,
s->ps.sps->bit_depth_chroma,
2781 if (
s->sei.timecode.present) {
2785 sizeof(uint32_t) * 4);
2789 tc_sd = (uint32_t*)tcside->
data;
2790 tc_sd[0] =
s->sei.timecode.num_clock_ts;
2792 for (
int i = 0;
i < tc_sd[0];
i++) {
2793 int drop =
s->sei.timecode.cnt_dropped_flag[
i];
2794 int hh =
s->sei.timecode.hours_value[
i];
2795 int mm =
s->sei.timecode.minutes_value[
i];
2796 int ss =
s->sei.timecode.seconds_value[
i];
2797 int ff =
s->sei.timecode.n_frames[
i];
2804 s->sei.timecode.num_clock_ts = 0;
2807 if (
s->sei.common.dynamic_hdr_plus.info) {
2829 if (
s->sei.common.dynamic_hdr_vivid.info) {
2846 int pic_size_in_ctb = ((
s->ps.sps->width >>
s->ps.sps->log2_min_cb_size) + 1) *
2847 ((
s->ps.sps->height >>
s->ps.sps->log2_min_cb_size) + 1);
2850 memset(
s->horizontal_bs, 0,
s->bs_width *
s->bs_height);
2851 memset(
s->vertical_bs, 0,
s->bs_width *
s->bs_height);
2852 memset(
s->cbf_luma, 0,
s->ps.sps->min_tb_width *
s->ps.sps->min_tb_height);
2853 memset(
s->is_pcm, 0, (
s->ps.sps->min_pu_width + 1) * (
s->ps.sps->min_pu_height + 1));
2854 memset(
s->tab_slice_address, -1, pic_size_in_ctb *
sizeof(*
s->tab_slice_address));
2857 s->first_nal_type =
s->nal_unit_type;
2861 if (
s->ps.pps->tiles_enabled_flag)
2862 lc->
end_of_tiles_x =
s->ps.pps->column_width[0] <<
s->ps.sps->log2_ctb_size;
2879 s->ref->needs_fg =
s->sei.common.film_grain_characteristics.present &&
2883 if (
s->ref->needs_fg &&
2885 s->ref->frame->format)) {
2887 "Unsupported film grain parameters. Ignoring film grain.\n");
2888 s->ref->needs_fg = 0;
2891 if (
s->ref->needs_fg) {
2892 s->ref->frame_grain->format =
s->ref->frame->format;
2893 s->ref->frame_grain->width =
s->ref->frame->width;
2894 s->ref->frame_grain->height =
s->ref->frame->height;
2903 s->frame->pict_type = 3 -
s->sh.slice_type;
2913 if (!
s->avctx->hwaccel)
2921 s->ref =
s->collocated_ref =
NULL;
2931 if (
out->needs_fg) {
2946 int ctb_addr_ts,
ret;
2949 s->nal_unit_type = nal->
type;
2952 switch (
s->nal_unit_type) {
2972 s->apply_defdispwin);
3031 if (
s->sh.first_slice_in_pic_flag) {
3032 if (
s->max_ra == INT_MAX) {
3037 s->max_ra = INT_MIN;
3042 s->poc <=
s->max_ra) {
3047 s->max_ra = INT_MIN;
3054 }
else if (!
s->ref) {
3059 if (
s->nal_unit_type !=
s->first_nal_type) {
3061 "Non-matching NAL types of the VCL NALUs: %d %d\n",
3062 s->first_nal_type,
s->nal_unit_type);
3066 if (!
s->sh.dependent_slice_segment_flag &&
3071 "Error constructing the reference lists for the current slice.\n");
3076 if (
s->sh.first_slice_in_pic_flag &&
s->avctx->hwaccel) {
3082 if (
s->avctx->hwaccel) {
3089 "SCC profile is not yet implemented in hevc native decoder.\n");
3094 if (
s->threads_number > 1 &&
s->sh.num_entry_point_offsets > 0)
3098 if (ctb_addr_ts >= (
s->ps.sps->ctb_width *
s->ps.sps->ctb_height)) {
3105 if (ctb_addr_ts < 0) {
3114 s->max_ra = INT_MAX;
3122 "Skipping NAL unit %d\n",
s->nal_unit_type);
3135 int eos_at_start = 1;
3137 s->ref =
s->collocated_ref =
NULL;
3138 s->last_eos =
s->eos;
3145 s->nal_length_size,
s->avctx->codec_id, 1, 0);
3148 "Error splitting the input into NAL units.\n");
3152 for (
i = 0;
i <
s->pkt.nb_nals;
i++) {
3174 s->pkt.nals[
s->pkt.nb_nals - 1].size > 2 && !
s->pkt.nals[
s->pkt.nb_nals - 1].nuh_layer_id
3175 && !
s->pkt.nals[
s->pkt.nb_nals - 1].temporal_id) {
3176 H2645NAL *nal = &
s->pkt.nals[
s->pkt.nb_nals - 1];
3179 av_log(
s->avctx,
AV_LOG_WARNING,
"Multiple Dolby Vision RPUs found in one AU. Skipping previous.\n");
3196 for (
i = 0;
i <
s->pkt.nb_nals;
i++) {
3205 if (
ret >= 0 &&
s->overlap > 2)
3209 "Error parsing NAL unit #%d.\n",
i);
3224 char msg_buf[4 * (50 + 2 * 2 * 16 )];
3232 pixel_shift =
desc->comp[0].depth > 8;
3237 if (pixel_shift && !
s->checksum_buf) {
3241 if (!
s->checksum_buf)
3248 int width =
s->avctx->coded_width;
3249 int height =
s->avctx->coded_height;
3255 for (j = 0; j <
h; j++) {
3259 s->bdsp.bswap16_buf((uint16_t *)
s->checksum_buf,
3260 (
const uint16_t *)
src,
w);
3261 src =
s->checksum_buf;
3268 #define MD5_PRI "%016" PRIx64 "%016" PRIx64
3269 #define MD5_PRI_ARG(buf) AV_RB64(buf), AV_RB64((const uint8_t*)(buf) + 8)
3271 if (!memcmp(
md5,
s->sei.picture_hash.md5[
i], 16)) {
3273 "plane %d - correct " MD5_PRI "; ",
3277 "mismatching checksum of plane %d - " MD5_PRI " != " MD5_PRI "; ",
3284 "Verifying checksum for frame with POC %d: %s\n",
3295 &
s->nal_length_size,
s->avctx->err_recognition,
3296 s->apply_defdispwin,
s->avctx);
3302 if (
first &&
s->ps.sps_list[
i]) {
3335 if (sd && sd_size > 0) {
3342 if (sd && sd_size > 0) {
3343 int old =
s->dovi_ctx.dv_profile;
3348 "New DOVI configuration record from input packet (profile %d -> %u).\n",
3349 old,
s->dovi_ctx.dv_profile);
3352 s->ref =
s->collocated_ref =
NULL;
3360 "hardware accelerator failed to decode picture\n");
3367 s->sei.picture_hash.is_md5) {
3375 s->sei.picture_hash.is_md5 = 0;
3377 if (
s->is_decoded) {
3382 if (
s->output_frame->buf[0]) {
3398 if (
src->needs_fg) {
3416 src->hwaccel_picture_private);
3433 for (
i = 0;
i < 3;
i++) {
3451 if (
s->HEVClcList) {
3452 for (
i = 1;
i <
s->threads_number;
i++) {
3475 if (!
s->HEVClc || !
s->HEVClcList)
3477 s->HEVClc->parent =
s;
3478 s->HEVClc->logctx = avctx;
3479 s->HEVClc->common_cabac_state = &
s->cabac;
3480 s->HEVClcList[0] =
s->HEVClc;
3483 if (!
s->output_frame)
3488 if (!
s->DPB[
i].frame)
3490 s->DPB[
i].tf.f =
s->DPB[
i].frame;
3493 if (!
s->DPB[
i].frame_grain)
3497 s->max_ra = INT_MAX;
3505 s->dovi_ctx.logctx = avctx;
3523 if (
s0->DPB[
i].frame->buf[0]) {
3530 if (
s->ps.sps !=
s0->ps.sps)
3541 if (
s->ps.sps !=
s0->ps.sps)
3545 s->seq_decode =
s0->seq_decode;
3546 s->seq_output =
s0->seq_output;
3547 s->pocTid0 =
s0->pocTid0;
3548 s->max_ra =
s0->max_ra;
3550 s->no_rasl_output_flag =
s0->no_rasl_output_flag;
3552 s->is_nalff =
s0->is_nalff;
3553 s->nal_length_size =
s0->nal_length_size;
3555 s->threads_number =
s0->threads_number;
3556 s->threads_type =
s0->threads_type;
3558 s->film_grain_warning_shown =
s0->film_grain_warning_shown;
3562 s->max_ra = INT_MAX;
3570 s0->sei.common.dynamic_hdr_plus.info);
3581 s0->sei.common.dynamic_hdr_vivid.info);
3585 s->sei.common.frame_packing =
s0->sei.common.frame_packing;
3586 s->sei.common.display_orientation =
s0->sei.common.display_orientation;
3587 s->sei.common.alternative_transfer =
s0->sei.common.alternative_transfer;
3588 s->sei.common.mastering_display =
s0->sei.common.mastering_display;
3589 s->sei.common.content_light =
s0->sei.common.content_light;
3610 s->threads_number = 1;
3621 s->enable_parallel_tiles = 0;
3622 s->sei.picture_timing.picture_struct = 0;
3638 if (sd && sd->
size > 0)
3652 s->max_ra = INT_MAX;
3659 #define OFFSET(x) offsetof(HEVCContext, x)
3660 #define PAR (AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
3663 {
"apply_defdispwin",
"Apply default display window from VUI",
OFFSET(apply_defdispwin),
3665 {
"strict-displaywin",
"stricly apply default display window size",
OFFSET(apply_defdispwin),
3695 #if CONFIG_HEVC_DXVA2_HWACCEL
3698 #if CONFIG_HEVC_D3D11VA_HWACCEL
3701 #if CONFIG_HEVC_D3D11VA2_HWACCEL
3704 #if CONFIG_HEVC_NVDEC_HWACCEL
3707 #if CONFIG_HEVC_VAAPI_HWACCEL
3710 #if CONFIG_HEVC_VDPAU_HWACCEL
3713 #if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
3716 #if CONFIG_HEVC_VULKAN_HWACCEL