mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 12:11:13 +00:00
vaapipostproc: enable HDR10 tone mapping
This commit is contained in:
parent
5f9e3ceef3
commit
4913d2b595
2 changed files with 134 additions and 7 deletions
|
@ -129,12 +129,37 @@ enum
|
|||
PROP_CROP_RIGHT,
|
||||
PROP_CROP_TOP,
|
||||
PROP_CROP_BOTTOM,
|
||||
PROP_HDR_TONE_MAP,
|
||||
#ifndef GST_REMOVE_DEPRECATED
|
||||
PROP_SKIN_TONE_ENHANCEMENT,
|
||||
#endif
|
||||
PROP_SKIN_TONE_ENHANCEMENT_LEVEL,
|
||||
};
|
||||
|
||||
#define GST_VAAPI_TYPE_HDR_TONE_MAP \
|
||||
gst_vaapi_hdr_tone_map_get_type()
|
||||
|
||||
static GType
|
||||
gst_vaapi_hdr_tone_map_get_type (void)
|
||||
{
|
||||
static gsize g_type = 0;
|
||||
|
||||
static const GEnumValue enum_values[] = {
|
||||
{GST_VAAPI_HDR_TONE_MAP_AUTO,
|
||||
"Auto detection", "auto"},
|
||||
{GST_VAAPI_HDR_TONE_MAP_DISABLED,
|
||||
"Disable HDR tone mapping", "disabled"},
|
||||
{0, NULL, NULL},
|
||||
};
|
||||
|
||||
if (g_once_init_enter (&g_type)) {
|
||||
const GType type =
|
||||
g_enum_register_static ("GstVaapiHDRToneMap", enum_values);
|
||||
g_once_init_leave (&g_type, type);
|
||||
}
|
||||
return g_type;
|
||||
}
|
||||
|
||||
#define GST_VAAPI_TYPE_DEINTERLACE_MODE \
|
||||
gst_vaapi_deinterlace_mode_get_type()
|
||||
|
||||
|
@ -515,6 +540,61 @@ set_best_deint_method (GstVaapiPostproc * postproc, guint flags,
|
|||
return success;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
should_hdr_tone_map (GstVaapiPostproc * const postproc, const GstCaps * caps)
|
||||
{
|
||||
switch (postproc->hdr_tone_map) {
|
||||
case GST_VAAPI_HDR_TONE_MAP_AUTO:
|
||||
{
|
||||
GstVideoMasteringDisplayInfo minfo;
|
||||
return gst_video_mastering_display_info_from_caps (&minfo, caps);
|
||||
}
|
||||
case GST_VAAPI_HDR_TONE_MAP_DISABLED:
|
||||
return FALSE;
|
||||
default:
|
||||
GST_ERROR_OBJECT (postproc, "unhandled \"hdr-tone-map\" option");
|
||||
break;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
configure_hdr_tone_map (GstVaapiPostproc * const postproc, const GstCaps * caps)
|
||||
{
|
||||
gboolean enable;
|
||||
|
||||
g_return_val_if_fail (postproc->has_vpp, FALSE);
|
||||
|
||||
enable = should_hdr_tone_map (postproc, caps);
|
||||
|
||||
if (!gst_vaapi_filter_set_hdr_tone_map (postproc->filter, enable))
|
||||
goto fail_configure_hdr_tone_map;
|
||||
|
||||
if (enable) {
|
||||
GstVideoMasteringDisplayInfo minfo;
|
||||
GstVideoContentLightLevel linfo;
|
||||
|
||||
gst_video_mastering_display_info_from_caps (&minfo, caps);
|
||||
gst_video_content_light_level_from_caps (&linfo, caps);
|
||||
|
||||
if (!gst_vaapi_filter_set_hdr_tone_map_meta (postproc->filter, &minfo,
|
||||
&linfo))
|
||||
goto fail_configure_hdr_tone_map;
|
||||
|
||||
postproc->flags |= GST_VAAPI_POSTPROC_FLAG_HDR_TONE_MAP;
|
||||
} else {
|
||||
postproc->flags &= ~(GST_VAAPI_POSTPROC_FLAG_HDR_TONE_MAP);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
||||
fail_configure_hdr_tone_map:
|
||||
{
|
||||
postproc->flags &= ~(GST_VAAPI_POSTPROC_FLAG_HDR_TONE_MAP);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
check_filter_update (GstVaapiPostproc * postproc)
|
||||
{
|
||||
|
@ -1650,6 +1730,21 @@ gst_vaapipostproc_set_caps (GstBaseTransform * trans, GstCaps * caps,
|
|||
goto done;
|
||||
}
|
||||
|
||||
if (postproc->has_vpp) {
|
||||
if (!gst_vaapi_filter_set_colorimetry (postproc->filter,
|
||||
&GST_VIDEO_INFO_COLORIMETRY (GST_VAAPI_PLUGIN_BASE_SINK_PAD_INFO
|
||||
(postproc)),
|
||||
&GST_VIDEO_INFO_COLORIMETRY (GST_VAAPI_PLUGIN_BASE_SRC_PAD_INFO
|
||||
(postproc))))
|
||||
goto done;
|
||||
|
||||
if (!configure_hdr_tone_map (postproc,
|
||||
GST_VAAPI_PLUGIN_BASE_SINK_PAD_CAPS (postproc)))
|
||||
GST_WARNING_OBJECT (postproc,
|
||||
"Failed to configure HDR tone mapping."
|
||||
" The driver may not support it.");
|
||||
}
|
||||
|
||||
if (!ensure_srcpad_buffer_pool (postproc, out_caps))
|
||||
goto done;
|
||||
|
||||
|
@ -1660,13 +1755,6 @@ gst_vaapipostproc_set_caps (GstBaseTransform * trans, GstCaps * caps,
|
|||
gst_vaapipostproc_set_passthrough (trans);
|
||||
}
|
||||
|
||||
if (postproc->has_vpp && !gst_vaapi_filter_set_colorimetry (postproc->filter,
|
||||
&GST_VIDEO_INFO_COLORIMETRY (GST_VAAPI_PLUGIN_BASE_SINK_PAD_INFO
|
||||
(postproc)),
|
||||
&GST_VIDEO_INFO_COLORIMETRY (GST_VAAPI_PLUGIN_BASE_SRC_PAD_INFO
|
||||
(postproc))))
|
||||
goto done;
|
||||
|
||||
ret = TRUE;
|
||||
|
||||
done:
|
||||
|
@ -2037,6 +2125,9 @@ gst_vaapipostproc_set_property (GObject * object,
|
|||
postproc->crop_bottom = g_value_get_uint (value);
|
||||
postproc->flags |= GST_VAAPI_POSTPROC_FLAG_CROP;
|
||||
break;
|
||||
case PROP_HDR_TONE_MAP:
|
||||
postproc->hdr_tone_map = g_value_get_enum (value);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
|
@ -2119,6 +2210,9 @@ gst_vaapipostproc_get_property (GObject * object,
|
|||
case PROP_CROP_BOTTOM:
|
||||
g_value_set_uint (value, postproc->crop_bottom);
|
||||
break;
|
||||
case PROP_HDR_TONE_MAP:
|
||||
g_value_set_enum (value, postproc->hdr_tone_map);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
|
@ -2173,6 +2267,22 @@ gst_vaapipostproc_class_init (GstVaapiPostprocClass * klass)
|
|||
gst_element_class_add_static_pad_template (element_class,
|
||||
&gst_vaapipostproc_src_factory);
|
||||
|
||||
/**
|
||||
* GstVaapiPostproc:hdr-tone-map:
|
||||
*
|
||||
* Selects whether HDR tone mapping should not be applied or if it
|
||||
* should be only applied on content that has the HDR meta on the caps.
|
||||
*/
|
||||
g_object_class_install_property
|
||||
(object_class,
|
||||
PROP_HDR_TONE_MAP,
|
||||
g_param_spec_enum ("hdr-tone-map",
|
||||
"HDR Tone Map",
|
||||
"Apply HDR tone mapping algorithm",
|
||||
GST_VAAPI_TYPE_HDR_TONE_MAP,
|
||||
GST_VAAPI_HDR_TONE_MAP_AUTO,
|
||||
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||
|
||||
/**
|
||||
* GstVaapiPostproc:deinterlace-mode:
|
||||
*
|
||||
|
@ -2487,6 +2597,7 @@ gst_vaapipostproc_init (GstVaapiPostproc * postproc)
|
|||
|
||||
g_mutex_init (&postproc->postproc_lock);
|
||||
postproc->format = DEFAULT_FORMAT;
|
||||
postproc->hdr_tone_map = GST_VAAPI_HDR_TONE_MAP_AUTO;
|
||||
postproc->deinterlace_mode = DEFAULT_DEINTERLACE_MODE;
|
||||
postproc->deinterlace_method = DEFAULT_DEINTERLACE_METHOD;
|
||||
postproc->field_duration = GST_CLOCK_TIME_NONE;
|
||||
|
|
|
@ -49,6 +49,17 @@ typedef struct _GstVaapiPostproc GstVaapiPostproc;
|
|||
typedef struct _GstVaapiPostprocClass GstVaapiPostprocClass;
|
||||
typedef struct _GstVaapiDeinterlaceState GstVaapiDeinterlaceState;
|
||||
|
||||
/**
|
||||
* GstVaapiHDRToneMap:
|
||||
* @GST_VAAPI_TYPE_HDR_TONE_MAP_AUTO: Auto detect need for hdr tone map.
|
||||
* @GST_VAAPI_TYPE_HDR_TONE_MAP_DISABLED: Never perform hdr tone map.
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
GST_VAAPI_HDR_TONE_MAP_AUTO = 0,
|
||||
GST_VAAPI_HDR_TONE_MAP_DISABLED,
|
||||
} GstVaapiHDRToneMap;
|
||||
|
||||
/**
|
||||
* GstVaapiDeinterlaceMode:
|
||||
* @GST_VAAPI_DEINTERLACE_MODE_AUTO: Auto detect needs for deinterlacing.
|
||||
|
@ -87,6 +98,7 @@ typedef enum
|
|||
* @GST_VAAPI_POSTPROC_FLAG_SIZE: Video scaling.
|
||||
* @GST_VAAPI_POSTPROC_FLAG_SCALE: Video scaling mode.
|
||||
* @GST_VAAPI_POSTPROC_FLAG_VIDEO_DIRECTION: Video rotation and flip/mirroring.
|
||||
* @GST_VAAPI_POSTPROC_FLAG_HDR_TONE_MAP: HDR tone mapping.
|
||||
* @GST_VAAPI_POSTPROC_FLAG_SKINTONE: Skin tone enhancement.
|
||||
* @GST_VAAPI_POSTPROC_FLAG_SKINTONE_LEVEL: Skin tone enhancement with value.
|
||||
*
|
||||
|
@ -106,6 +118,7 @@ typedef enum
|
|||
GST_VAAPI_POSTPROC_FLAG_VIDEO_DIRECTION =
|
||||
1 << GST_VAAPI_FILTER_OP_VIDEO_DIRECTION,
|
||||
GST_VAAPI_POSTPROC_FLAG_CROP = 1 << GST_VAAPI_FILTER_OP_CROP,
|
||||
GST_VAAPI_POSTPROC_FLAG_HDR_TONE_MAP = 1 << GST_VAAPI_FILTER_OP_HDR_TONE_MAP,
|
||||
#ifndef GST_REMOVE_DEPRECATED
|
||||
GST_VAAPI_POSTPROC_FLAG_SKINTONE = 1 << GST_VAAPI_FILTER_OP_SKINTONE,
|
||||
#endif
|
||||
|
@ -159,6 +172,9 @@ struct _GstVaapiPostproc
|
|||
GstCaps *allowed_srcpad_caps;
|
||||
GstVideoInfo srcpad_info;
|
||||
|
||||
/* HDR Tone Mapping */
|
||||
GstVaapiHDRToneMap hdr_tone_map;
|
||||
|
||||
/* Deinterlacing */
|
||||
GstVaapiDeinterlaceMode deinterlace_mode;
|
||||
GstVaapiDeinterlaceMethod deinterlace_method;
|
||||
|
|
Loading…
Reference in a new issue