mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 12:11:13 +00:00
vaapipostproc: set early properties restrictions
When running transform_caps() vmethod, returning the srcpad caps, the caps are early restricted to the element properties set: width, height, format and force keep aspect. A new file was added gstvaapipostprocutil.{c,h} where the utilities functions are stored. https://bugzilla.gnome.org/show_bug.cgi?id=758548
This commit is contained in:
parent
54a2d9fb77
commit
606d166b56
4 changed files with 169 additions and 5 deletions
|
@ -46,6 +46,7 @@ libgstvaapi_source_c = \
|
||||||
gstvaapipluginbase.c \
|
gstvaapipluginbase.c \
|
||||||
gstvaapipluginutil.c \
|
gstvaapipluginutil.c \
|
||||||
gstvaapipostproc.c \
|
gstvaapipostproc.c \
|
||||||
|
gstvaapipostprocutil.c \
|
||||||
gstvaapisink.c \
|
gstvaapisink.c \
|
||||||
gstvaapivideobuffer.c \
|
gstvaapivideobuffer.c \
|
||||||
gstvaapivideocontext.c \
|
gstvaapivideocontext.c \
|
||||||
|
@ -62,6 +63,7 @@ libgstvaapi_source_h = \
|
||||||
gstvaapipluginbase.h \
|
gstvaapipluginbase.h \
|
||||||
gstvaapipluginutil.h \
|
gstvaapipluginutil.h \
|
||||||
gstvaapipostproc.h \
|
gstvaapipostproc.h \
|
||||||
|
gstvaapipostprocutil.h \
|
||||||
gstvaapisink.h \
|
gstvaapisink.h \
|
||||||
gstvaapivideobuffer.h \
|
gstvaapivideobuffer.h \
|
||||||
gstvaapivideocontext.h \
|
gstvaapivideocontext.h \
|
||||||
|
|
|
@ -39,6 +39,7 @@
|
||||||
#include <gst/video/video.h>
|
#include <gst/video/video.h>
|
||||||
|
|
||||||
#include "gstvaapipostproc.h"
|
#include "gstvaapipostproc.h"
|
||||||
|
#include "gstvaapipostprocutil.h"
|
||||||
#include "gstvaapipluginutil.h"
|
#include "gstvaapipluginutil.h"
|
||||||
#include "gstvaapivideobuffer.h"
|
#include "gstvaapivideobuffer.h"
|
||||||
#include "gstvaapivideobufferpool.h"
|
#include "gstvaapivideobufferpool.h"
|
||||||
|
@ -118,10 +119,6 @@ enum
|
||||||
PROP_SKIN_TONE_ENHANCEMENT,
|
PROP_SKIN_TONE_ENHANCEMENT,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define DEFAULT_FORMAT GST_VIDEO_FORMAT_ENCODED
|
|
||||||
#define DEFAULT_DEINTERLACE_MODE GST_VAAPI_DEINTERLACE_MODE_AUTO
|
|
||||||
#define DEFAULT_DEINTERLACE_METHOD GST_VAAPI_DEINTERLACE_METHOD_BOB
|
|
||||||
|
|
||||||
#define GST_VAAPI_TYPE_DEINTERLACE_MODE \
|
#define GST_VAAPI_TYPE_DEINTERLACE_MODE \
|
||||||
gst_vaapi_deinterlace_mode_get_type()
|
gst_vaapi_deinterlace_mode_get_type()
|
||||||
|
|
||||||
|
@ -1076,7 +1073,7 @@ gst_vaapipostproc_transform_caps_impl (GstBaseTransform * trans,
|
||||||
if (!gst_caps_is_fixed (caps)) {
|
if (!gst_caps_is_fixed (caps)) {
|
||||||
if (!ensure_allowed_srcpad_caps (postproc))
|
if (!ensure_allowed_srcpad_caps (postproc))
|
||||||
return NULL;
|
return NULL;
|
||||||
return gst_caps_ref (postproc->allowed_srcpad_caps);
|
return gst_vaapipostproc_transform_srccaps (postproc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Generate the expected src pad caps, from the current fixated
|
/* Generate the expected src pad caps, from the current fixated
|
||||||
|
|
126
gst/vaapi/gstvaapipostprocutil.c
Normal file
126
gst/vaapi/gstvaapipostprocutil.c
Normal file
|
@ -0,0 +1,126 @@
|
||||||
|
/*
|
||||||
|
* gstvaapipostprocutil.h - VA-API video post processing utilities
|
||||||
|
*
|
||||||
|
* Copyright (C) 2016 Intel Corporation
|
||||||
|
* Author: Gwenole Beauchesne <gwenole.beauchesne@intel.com>
|
||||||
|
* Author: Victor Jaquez <victorx.jaquez@intel.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2.1
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this program; if not, write to the Free
|
||||||
|
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "gstvaapipostprocutil.h"
|
||||||
|
#include "gstvaapipluginutil.h"
|
||||||
|
|
||||||
|
/* if format property is set */
|
||||||
|
static void
|
||||||
|
_transform_format (GstVaapiPostproc * postproc, GstCapsFeatures * features,
|
||||||
|
GstStructure * structure)
|
||||||
|
{
|
||||||
|
GValue value = G_VALUE_INIT;
|
||||||
|
|
||||||
|
if (postproc->format == DEFAULT_FORMAT)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!gst_caps_features_is_equal (features,
|
||||||
|
GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY)
|
||||||
|
&& !gst_caps_features_contains (features,
|
||||||
|
GST_CAPS_FEATURE_MEMORY_VAAPI_SURFACE))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!gst_vaapi_value_set_format (&value, postproc->format))
|
||||||
|
return;
|
||||||
|
|
||||||
|
gst_structure_set_value (structure, "format", &value);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_set_int (GValue * value, gint val)
|
||||||
|
{
|
||||||
|
g_value_init (value, G_TYPE_INT);
|
||||||
|
g_value_set_int (value, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_set_int_range (GValue * value)
|
||||||
|
{
|
||||||
|
g_value_init (value, GST_TYPE_INT_RANGE);
|
||||||
|
gst_value_set_int_range (value, 1, G_MAXINT);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_transform_frame_size (GstVaapiPostproc * postproc, GstStructure * structure)
|
||||||
|
{
|
||||||
|
GValue width = G_VALUE_INIT;
|
||||||
|
GValue height = G_VALUE_INIT;
|
||||||
|
|
||||||
|
if (postproc->width && postproc->height) {
|
||||||
|
_set_int (&width, postproc->width);
|
||||||
|
_set_int (&height, postproc->height);
|
||||||
|
} else if (postproc->width) {
|
||||||
|
_set_int (&width, postproc->width);
|
||||||
|
_set_int_range (&height);
|
||||||
|
} else if (postproc->height) {
|
||||||
|
_set_int_range (&width);
|
||||||
|
_set_int (&height, postproc->height);
|
||||||
|
} else {
|
||||||
|
_set_int_range (&width);
|
||||||
|
_set_int_range (&height);
|
||||||
|
}
|
||||||
|
|
||||||
|
gst_structure_set_value (structure, "width", &width);
|
||||||
|
gst_structure_set_value (structure, "height", &height);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_vaapipostproc_transform_srccaps:
|
||||||
|
* @postproc: a #GstVaapiPostproc instance
|
||||||
|
*
|
||||||
|
* Early apply transformation of the src pad caps according to the set
|
||||||
|
* properties.
|
||||||
|
*
|
||||||
|
* Returns: A new allocated #GstCaps
|
||||||
|
**/
|
||||||
|
GstCaps *
|
||||||
|
gst_vaapipostproc_transform_srccaps (GstVaapiPostproc * postproc)
|
||||||
|
{
|
||||||
|
GstCaps *out_caps;
|
||||||
|
GstStructure *structure;
|
||||||
|
GstCapsFeatures *features;
|
||||||
|
gint i, n;
|
||||||
|
|
||||||
|
out_caps = gst_caps_new_empty ();
|
||||||
|
n = gst_caps_get_size (postproc->allowed_srcpad_caps);
|
||||||
|
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
structure = gst_caps_get_structure (postproc->allowed_srcpad_caps, i);
|
||||||
|
features = gst_caps_get_features (postproc->allowed_srcpad_caps, i);
|
||||||
|
|
||||||
|
/* make copy */
|
||||||
|
structure = gst_structure_copy (structure);
|
||||||
|
|
||||||
|
if (postproc->keep_aspect)
|
||||||
|
gst_structure_set (structure, "pixel-aspect-ratio", GST_TYPE_FRACTION, 1,
|
||||||
|
1, NULL);
|
||||||
|
|
||||||
|
_transform_format (postproc, features, structure);
|
||||||
|
_transform_frame_size (postproc, structure);
|
||||||
|
|
||||||
|
gst_caps_append_structure_full (out_caps, structure,
|
||||||
|
gst_caps_features_copy (features));
|
||||||
|
}
|
||||||
|
|
||||||
|
return out_caps;
|
||||||
|
}
|
39
gst/vaapi/gstvaapipostprocutil.h
Normal file
39
gst/vaapi/gstvaapipostprocutil.h
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
/*
|
||||||
|
* gstvaapipostprocutil.h - VA-API video post processing utilities
|
||||||
|
*
|
||||||
|
* Copyright (C) 2016 Intel Corporation
|
||||||
|
* Author: Gwenole Beauchesne <gwenole.beauchesne@intel.com>
|
||||||
|
* Author: Victor Jaquez <victorx.jaquez@intel.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2.1
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this program; if not, write to the Free
|
||||||
|
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GST_VAAPIPOSTPROCUTIL_H
|
||||||
|
#define GST_VAAPIPOSTPROCUTIL_H
|
||||||
|
|
||||||
|
#include "gstvaapipostproc.h"
|
||||||
|
|
||||||
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
#define DEFAULT_FORMAT GST_VIDEO_FORMAT_ENCODED
|
||||||
|
#define DEFAULT_DEINTERLACE_MODE GST_VAAPI_DEINTERLACE_MODE_AUTO
|
||||||
|
#define DEFAULT_DEINTERLACE_METHOD GST_VAAPI_DEINTERLACE_METHOD_BOB
|
||||||
|
|
||||||
|
GstCaps *gst_vaapipostproc_transform_srccaps (GstVaapiPostproc * postproc);
|
||||||
|
|
||||||
|
G_END_DECLS
|
||||||
|
|
||||||
|
#endif /* GST_VAAPIPOSTPROCUTIL_H */
|
Loading…
Reference in a new issue