mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-04 14:38:48 +00:00
libs: decoder: H265: Fill picture and slice SCC parameters.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/311>
This commit is contained in:
parent
1d9b2cab42
commit
c956d91807
1 changed files with 85 additions and 4 deletions
|
@ -537,11 +537,24 @@ is_range_extension_profile (GstVaapiProfile profile)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
is_scc_profile (GstVaapiProfile profile)
|
||||||
|
{
|
||||||
|
#if VA_CHECK_VERSION(1,2,0)
|
||||||
|
if (profile == GST_VAAPI_PROFILE_H265_SCREEN_EXTENDED_MAIN
|
||||||
|
|| profile == GST_VAAPI_PROFILE_H265_SCREEN_EXTENDED_MAIN_10
|
||||||
|
|| profile == GST_VAAPI_PROFILE_H265_SCREEN_EXTENDED_MAIN_444)
|
||||||
|
return TRUE;
|
||||||
|
#endif
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
static inline GstVaapiPictureH265 *
|
static inline GstVaapiPictureH265 *
|
||||||
gst_vaapi_picture_h265_new (GstVaapiDecoderH265 * decoder)
|
gst_vaapi_picture_h265_new (GstVaapiDecoderH265 * decoder)
|
||||||
{
|
{
|
||||||
GstVaapiDecoderH265Private *const priv = &decoder->priv;
|
GstVaapiDecoderH265Private *const priv = &decoder->priv;
|
||||||
if (is_range_extension_profile (priv->profile)) {
|
if (is_range_extension_profile (priv->profile)
|
||||||
|
|| is_scc_profile (priv->profile)) {
|
||||||
#if VA_CHECK_VERSION(1,2,0)
|
#if VA_CHECK_VERSION(1,2,0)
|
||||||
return (GstVaapiPictureH265 *)
|
return (GstVaapiPictureH265 *)
|
||||||
gst_vaapi_codec_object_new (&GstVaapiPictureH265Class,
|
gst_vaapi_codec_object_new (&GstVaapiPictureH265Class,
|
||||||
|
@ -1857,11 +1870,18 @@ fill_picture (GstVaapiDecoderH265 * decoder, GstVaapiPictureH265 * picture)
|
||||||
|
|
||||||
#if VA_CHECK_VERSION(1,2,0)
|
#if VA_CHECK_VERSION(1,2,0)
|
||||||
VAPictureParameterBufferHEVCRext *pic_rext_param = NULL;
|
VAPictureParameterBufferHEVCRext *pic_rext_param = NULL;
|
||||||
|
VAPictureParameterBufferHEVCScc *pic_scc_param = NULL;
|
||||||
if (is_range_extension_profile (priv->profile)) {
|
if (is_range_extension_profile (priv->profile)) {
|
||||||
VAPictureParameterBufferHEVCExtension *param = base_picture->param;
|
VAPictureParameterBufferHEVCExtension *param = base_picture->param;
|
||||||
pic_param = ¶m->base;
|
pic_param = ¶m->base;
|
||||||
pic_rext_param = ¶m->rext;
|
pic_rext_param = ¶m->rext;
|
||||||
}
|
}
|
||||||
|
if (is_scc_profile (priv->profile)) {
|
||||||
|
VAPictureParameterBufferHEVCExtension *param = base_picture->param;
|
||||||
|
pic_param = ¶m->base;
|
||||||
|
pic_rext_param = ¶m->rext;
|
||||||
|
pic_scc_param = ¶m->scc;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
pic_param->pic_fields.value = 0;
|
pic_param->pic_fields.value = 0;
|
||||||
|
@ -2024,6 +2044,56 @@ fill_picture (GstVaapiDecoderH265 * decoder, GstVaapiPictureH265 * picture)
|
||||||
pps->pps_extension_params.cr_qp_offset_list,
|
pps->pps_extension_params.cr_qp_offset_list,
|
||||||
sizeof (pic_rext_param->cr_qp_offset_list));
|
sizeof (pic_rext_param->cr_qp_offset_list));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pic_scc_param) {
|
||||||
|
#define COPY_SCC_FIELD(s, f) \
|
||||||
|
pic_scc_param->f = s->f
|
||||||
|
#define COPY_SCC_BFM(a, s, f) \
|
||||||
|
pic_scc_param->a.bits.f = s->f
|
||||||
|
|
||||||
|
const GstH265PPSSccExtensionParams *pps_scc =
|
||||||
|
&pps->pps_scc_extension_params;
|
||||||
|
const GstH265SPSSccExtensionParams *sps_scc =
|
||||||
|
&sps->sps_scc_extension_params;
|
||||||
|
guint32 num_comps;
|
||||||
|
|
||||||
|
pic_scc_param->screen_content_pic_fields.value = 0;
|
||||||
|
|
||||||
|
COPY_SCC_BFM (screen_content_pic_fields, pps_scc,
|
||||||
|
pps_curr_pic_ref_enabled_flag);
|
||||||
|
COPY_SCC_BFM (screen_content_pic_fields, sps_scc,
|
||||||
|
palette_mode_enabled_flag);
|
||||||
|
COPY_SCC_BFM (screen_content_pic_fields, sps_scc,
|
||||||
|
motion_vector_resolution_control_idc);
|
||||||
|
COPY_SCC_BFM (screen_content_pic_fields, sps_scc,
|
||||||
|
intra_boundary_filtering_disabled_flag);
|
||||||
|
COPY_SCC_BFM (screen_content_pic_fields, pps_scc,
|
||||||
|
residual_adaptive_colour_transform_enabled_flag);
|
||||||
|
COPY_SCC_BFM (screen_content_pic_fields, pps_scc,
|
||||||
|
pps_slice_act_qp_offsets_present_flag);
|
||||||
|
|
||||||
|
COPY_SCC_FIELD (sps_scc, palette_max_size);
|
||||||
|
COPY_SCC_FIELD (sps_scc, delta_palette_max_predictor_size);
|
||||||
|
COPY_SCC_FIELD (pps_scc, pps_act_y_qp_offset_plus5);
|
||||||
|
COPY_SCC_FIELD (pps_scc, pps_act_cb_qp_offset_plus5);
|
||||||
|
COPY_SCC_FIELD (pps_scc, pps_act_cr_qp_offset_plus3);
|
||||||
|
|
||||||
|
/* firstly use the pps, then sps */
|
||||||
|
num_comps = sps->chroma_format_idc ? 3 : 1;
|
||||||
|
|
||||||
|
if (pps_scc->pps_palette_predictor_initializers_present_flag) {
|
||||||
|
for (n = 0; n < num_comps; n++)
|
||||||
|
for (i = 0; i < pps_scc->pps_num_palette_predictor_initializer; i++)
|
||||||
|
pic_scc_param->predictor_palette_entries[n][i] =
|
||||||
|
(uint16_t) pps_scc->pps_palette_predictor_initializer[n][i];
|
||||||
|
} else if (sps_scc->sps_palette_predictor_initializers_present_flag) {
|
||||||
|
for (n = 0; n < num_comps; n++)
|
||||||
|
for (i = 0;
|
||||||
|
i < sps_scc->sps_num_palette_predictor_initializer_minus1 + 1; i++)
|
||||||
|
pic_scc_param->predictor_palette_entries[n][i] =
|
||||||
|
(uint16_t) sps_scc->sps_palette_predictor_initializer[n][i];
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -2600,7 +2670,8 @@ fill_slice (GstVaapiDecoderH265 * decoder,
|
||||||
#if VA_CHECK_VERSION(1,2,0)
|
#if VA_CHECK_VERSION(1,2,0)
|
||||||
GstVaapiDecoderH265Private *const priv = &decoder->priv;
|
GstVaapiDecoderH265Private *const priv = &decoder->priv;
|
||||||
VASliceParameterBufferHEVCRext *slice_rext_param = NULL;
|
VASliceParameterBufferHEVCRext *slice_rext_param = NULL;
|
||||||
if (is_range_extension_profile (priv->profile)) {
|
if (is_range_extension_profile (priv->profile)
|
||||||
|
|| is_scc_profile (priv->profile)) {
|
||||||
VASliceParameterBufferHEVCExtension *param = slice->param;
|
VASliceParameterBufferHEVCExtension *param = slice->param;
|
||||||
slice_param = ¶m->base;
|
slice_param = ¶m->base;
|
||||||
slice_rext_param = ¶m->rext;
|
slice_rext_param = ¶m->rext;
|
||||||
|
@ -2660,9 +2731,18 @@ fill_slice (GstVaapiDecoderH265 * decoder,
|
||||||
slice_hdr->five_minus_max_num_merge_cand;
|
slice_hdr->five_minus_max_num_merge_cand;
|
||||||
|
|
||||||
#if VA_CHECK_VERSION(1,2,0)
|
#if VA_CHECK_VERSION(1,2,0)
|
||||||
if (slice_rext_param)
|
if (slice_rext_param) {
|
||||||
slice_rext_param->slice_ext_flags.bits.cu_chroma_qp_offset_enabled_flag =
|
slice_rext_param->slice_ext_flags.bits.cu_chroma_qp_offset_enabled_flag =
|
||||||
slice_hdr->cu_chroma_qp_offset_enabled_flag;
|
slice_hdr->cu_chroma_qp_offset_enabled_flag;
|
||||||
|
slice_rext_param->slice_ext_flags.bits.use_integer_mv_flag =
|
||||||
|
slice_hdr->use_integer_mv_flag;
|
||||||
|
|
||||||
|
slice_rext_param->slice_act_y_qp_offset = slice_hdr->slice_act_y_qp_offset;
|
||||||
|
slice_rext_param->slice_act_cb_qp_offset =
|
||||||
|
slice_hdr->slice_act_cb_qp_offset;
|
||||||
|
slice_rext_param->slice_act_cr_qp_offset =
|
||||||
|
slice_hdr->slice_act_cr_qp_offset;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!fill_RefPicList (decoder, picture, slice, slice_hdr))
|
if (!fill_RefPicList (decoder, picture, slice, slice_hdr))
|
||||||
|
@ -2714,7 +2794,8 @@ decode_slice (GstVaapiDecoderH265 * decoder, GstVaapiDecoderUnit * unit)
|
||||||
if (pi->flags & GST_VAAPI_DECODER_UNIT_FLAG_AU_END)
|
if (pi->flags & GST_VAAPI_DECODER_UNIT_FLAG_AU_END)
|
||||||
GST_VAAPI_PICTURE_FLAG_SET (picture, GST_VAAPI_PICTURE_FLAG_AU_END);
|
GST_VAAPI_PICTURE_FLAG_SET (picture, GST_VAAPI_PICTURE_FLAG_AU_END);
|
||||||
|
|
||||||
if (is_range_extension_profile (priv->profile)) {
|
if (is_range_extension_profile (priv->profile)
|
||||||
|
|| is_scc_profile (priv->profile)) {
|
||||||
#if VA_CHECK_VERSION(1,2,0)
|
#if VA_CHECK_VERSION(1,2,0)
|
||||||
slice = GST_VAAPI_SLICE_NEW (HEVCExtension, decoder,
|
slice = GST_VAAPI_SLICE_NEW (HEVCExtension, decoder,
|
||||||
(map_info.data + unit->offset + pi->nalu.offset), pi->nalu.size);
|
(map_info.data + unit->offset + pi->nalu.offset), pi->nalu.size);
|
||||||
|
|
Loading…
Reference in a new issue