mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-24 02:31:03 +00:00
libs: filter: check mirror and rotation caps only once
This patch locks the display before querying the pipeline caps and stores the mirror and rotation capabilities, thus they are not queried every time the video direction is set.
This commit is contained in:
parent
e4bb8f5895
commit
47ff72a6d4
1 changed files with 47 additions and 41 deletions
|
@ -69,6 +69,8 @@ struct _GstVaapiFilter
|
|||
GstVaapiRectangle target_rect;
|
||||
guint use_crop_rect:1;
|
||||
guint use_target_rect:1;
|
||||
guint32 mirror_flags;
|
||||
guint32 rotation_flags;
|
||||
};
|
||||
|
||||
typedef struct _GstVaapiFilterClass GstVaapiFilterClass;
|
||||
|
@ -283,6 +285,34 @@ vpp_get_filter_caps (GstVaapiFilter * filter, VAProcFilterType type,
|
|||
return caps;
|
||||
}
|
||||
|
||||
static void
|
||||
vpp_get_pipeline_caps_unlocked (GstVaapiFilter * filter)
|
||||
{
|
||||
#if VA_CHECK_VERSION(1,1,0)
|
||||
VAProcPipelineCaps pipeline_caps = { 0, };
|
||||
|
||||
VAStatus va_status = vaQueryVideoProcPipelineCaps (filter->va_display,
|
||||
filter->va_context, NULL, 0, &pipeline_caps);
|
||||
|
||||
if (vaapi_check_status (va_status, "vaQueryVideoProcPipelineCaps()")) {
|
||||
filter->mirror_flags = pipeline_caps.mirror_flags;
|
||||
filter->rotation_flags = pipeline_caps.rotation_flags;
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
filter->mirror_flags = 0;
|
||||
filter->rotation_flags = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
vpp_get_pipeline_caps (GstVaapiFilter * filter)
|
||||
{
|
||||
GST_VAAPI_DISPLAY_LOCK (filter->display);
|
||||
vpp_get_pipeline_caps_unlocked (filter);
|
||||
GST_VAAPI_DISPLAY_UNLOCK (filter->display);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
/* --- VPP Operations --- */
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
@ -715,6 +745,8 @@ get_operations_ordered (GstVaapiFilter * filter, GPtrArray * default_ops)
|
|||
filter_caps = NULL;
|
||||
}
|
||||
|
||||
vpp_get_pipeline_caps (filter);
|
||||
|
||||
if (filter->operations)
|
||||
g_ptr_array_unref (filter->operations);
|
||||
filter->operations = g_ptr_array_ref (ops);
|
||||
|
@ -1037,7 +1069,6 @@ op_set_skintone (GstVaapiFilter * filter, GstVaapiFilterOpData * op_data,
|
|||
return success;
|
||||
}
|
||||
|
||||
|
||||
static gboolean
|
||||
deint_refs_set (GArray * refs, GstVaapiSurface ** surfaces, guint num_surfaces)
|
||||
{
|
||||
|
@ -1958,39 +1989,21 @@ gst_vaapi_filter_set_video_direction (GstVaapiFilter * filter,
|
|||
{
|
||||
g_return_val_if_fail (filter != NULL, FALSE);
|
||||
|
||||
switch (method) {
|
||||
case GST_VIDEO_ORIENTATION_IDENTITY:
|
||||
break;
|
||||
case GST_VIDEO_ORIENTATION_HORIZ:
|
||||
case GST_VIDEO_ORIENTATION_VERT:
|
||||
case GST_VIDEO_ORIENTATION_90R:
|
||||
case GST_VIDEO_ORIENTATION_180:
|
||||
case GST_VIDEO_ORIENTATION_90L:
|
||||
case GST_VIDEO_ORIENTATION_UL_LR:
|
||||
case GST_VIDEO_ORIENTATION_UR_LL:
|
||||
{
|
||||
#if VA_CHECK_VERSION(1,1,0)
|
||||
VAProcPipelineCaps pipeline_caps;
|
||||
guint va_mirror = VA_MIRROR_NONE;
|
||||
guint va_rotation = VA_ROTATION_NONE;
|
||||
|
||||
VAStatus va_status = vaQueryVideoProcPipelineCaps (filter->va_display,
|
||||
filter->va_context, NULL, 0, &pipeline_caps);
|
||||
if (!vaapi_check_status (va_status, "vaQueryVideoProcPipelineCaps()"))
|
||||
return FALSE;
|
||||
{
|
||||
guint32 va_mirror = VA_MIRROR_NONE;
|
||||
guint32 va_rotation = VA_ROTATION_NONE;
|
||||
|
||||
from_GstVideoOrientationMethod (method, &va_mirror, &va_rotation);
|
||||
|
||||
if (va_mirror != VA_MIRROR_NONE) {
|
||||
if (!(pipeline_caps.mirror_flags & va_mirror)) {
|
||||
if (va_mirror != VA_MIRROR_NONE && !(filter->mirror_flags & va_mirror)) {
|
||||
GST_WARNING ("%s video-direction unsupported",
|
||||
gst_vaapi_get_video_direction_nick (method));
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if (va_rotation != VA_ROTATION_NONE) {
|
||||
if (!(pipeline_caps.rotation_flags & (1 << va_rotation))) {
|
||||
if (va_rotation != VA_ROTATION_NONE
|
||||
&& !(filter->rotation_flags & (1 << va_rotation))) {
|
||||
GST_WARNING ("%s video-direction unsupported",
|
||||
gst_vaapi_get_video_direction_nick (method));
|
||||
return TRUE;
|
||||
|
@ -2001,13 +2014,6 @@ gst_vaapi_filter_set_video_direction (GstVaapiFilter * filter,
|
|||
gst_vaapi_get_video_direction_nick (method));
|
||||
return TRUE;
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
default:
|
||||
GST_WARNING ("%s video-direction unsupported or unimplemented",
|
||||
gst_vaapi_get_video_direction_nick (method));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
filter->video_direction = method;
|
||||
return TRUE;
|
||||
|
|
Loading…
Reference in a new issue