summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorVíctor Manuel Jáquez Leal <vjaquez@igalia.com>2021-08-23 15:24:55 +0200
committerVíctor Manuel Jáquez Leal <vjaquez@igalia.com>2021-09-10 14:45:00 +0200
commitcc91fd0956401dc9450a0dc129341526e3aa83c7 (patch)
treefcc2526eff598a8d738bee3947d148c64b6d8850 /sys
parent7f2e1e2eb36160d6eb29d4cb30353a3a39a0d7dc (diff)
downloadgstreamer-plugins-bad-cc91fd0956401dc9450a0dc129341526e3aa83c7.tar.gz
va: filter: Add helper function to query pipeline caps.
This function is going to be shared for future deinterlace filter processing. Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2495>
Diffstat (limited to 'sys')
-rw-r--r--sys/va/gstvafilter.c65
1 files changed, 41 insertions, 24 deletions
diff --git a/sys/va/gstvafilter.c b/sys/va/gstvafilter.c
index e4caa3945..27cd920d9 100644
--- a/sys/va/gstvafilter.c
+++ b/sys/va/gstvafilter.c
@@ -1219,6 +1219,43 @@ gst_va_filter_set_video_info (GstVaFilter * self, GstVideoInfo * in_info,
return TRUE;
}
+static gboolean
+_query_pipeline_caps (GstVaFilter * self, VAProcPipelineCaps * caps)
+{
+ VABufferID *filters = NULL;
+ VADisplay dpy;
+ VAStatus status;
+ guint32 num_filters = 0;
+
+ GST_OBJECT_LOCK (self);
+ if (self->filters) {
+ g_array_ref (self->filters);
+ num_filters = self->filters->len;
+ filters = (num_filters > 0) ? (VABufferID *) self->filters->data : NULL;
+ }
+ GST_OBJECT_UNLOCK (self);
+
+ dpy = gst_va_display_get_va_dpy (self->display);
+
+ gst_va_display_lock (self->display);
+ status = vaQueryVideoProcPipelineCaps (dpy, self->context, filters,
+ num_filters, caps);
+ gst_va_display_unlock (self->display);
+
+ GST_OBJECT_LOCK (self);
+ if (self->filters)
+ g_array_unref (self->filters);
+ GST_OBJECT_UNLOCK (self);
+
+ if (status != VA_STATUS_SUCCESS) {
+ GST_ERROR_OBJECT (self, "vaQueryVideoProcPipelineCaps: %s",
+ vaErrorStr (status));
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
gboolean
gst_va_filter_add_filter_buffer (GstVaFilter * self, gpointer data, gsize size,
guint num)
@@ -1395,12 +1432,11 @@ _create_pipeline_buffer (GstVaFilter * self, GstVaSample * src,
gboolean
gst_va_filter_process (GstVaFilter * self, GstVaSample * src, GstVaSample * dst)
{
- VABufferID buffer, *filters = NULL;
+ VABufferID buffer;
VADisplay dpy;
VAProcPipelineCaps pipeline_caps = { 0, };
VAStatus status;
gboolean ret = FALSE;
- guint32 num_filters = 0;
g_return_val_if_fail (GST_IS_VA_FILTER (self), FALSE);
g_return_val_if_fail (src && GST_IS_BUFFER (src->buffer), FALSE);
@@ -1413,30 +1449,14 @@ gst_va_filter_process (GstVaFilter * self, GstVaSample * src, GstVaSample * dst)
&& _fill_va_sample (self, dst, GST_PAD_SRC)))
return FALSE;
- GST_OBJECT_LOCK (self);
-
- if (self->filters) {
- g_array_ref (self->filters);
- num_filters = self->filters->len;
- filters = (num_filters > 0) ? (VABufferID *) self->filters->data : NULL;
- }
- GST_OBJECT_UNLOCK (self);
-
- dpy = gst_va_display_get_va_dpy (self->display);
-
- gst_va_display_lock (self->display);
- status = vaQueryVideoProcPipelineCaps (dpy, self->context, filters,
- num_filters, &pipeline_caps);
- gst_va_display_unlock (self->display);
- if (status != VA_STATUS_SUCCESS) {
- GST_ERROR_OBJECT (self, "vaQueryVideoProcPipelineCaps: %s",
- vaErrorStr (status));
+ if (!_query_pipeline_caps (self, &pipeline_caps))
return FALSE;
- }
if (!_create_pipeline_buffer (self, src, dst, &buffer))
return FALSE;
+ dpy = gst_va_display_get_va_dpy (self->display);
+
gst_va_display_lock (self->display);
status = vaBeginPicture (dpy, self->context, dst->surface);
gst_va_display_unlock (self->display);
@@ -1465,9 +1485,6 @@ gst_va_filter_process (GstVaFilter * self, GstVaSample * src, GstVaSample * dst)
bail:
GST_OBJECT_LOCK (self);
- if (self->filters)
- g_array_unref (self->filters);
-
gst_va_display_lock (self->display);
status = vaDestroyBuffer (dpy, buffer);
gst_va_display_unlock (self->display);