v4l2src: add decimate property

This commit is contained in:
David Schleef 2009-06-29 11:43:07 -07:00
parent 75d0795e53
commit 178c57be4f
2 changed files with 26 additions and 1 deletions

View file

@ -63,6 +63,7 @@ GST_DEBUG_CATEGORY (v4l2src_debug);
#define PROP_DEF_QUEUE_SIZE 2 #define PROP_DEF_QUEUE_SIZE 2
#define PROP_DEF_ALWAYS_COPY TRUE #define PROP_DEF_ALWAYS_COPY TRUE
#define PROP_DEF_DECIMATE 1
#define DEFAULT_PROP_DEVICE "/dev/video0" #define DEFAULT_PROP_DEVICE "/dev/video0"
@ -71,7 +72,8 @@ enum
PROP_0, PROP_0,
V4L2_STD_OBJECT_PROPS, V4L2_STD_OBJECT_PROPS,
PROP_QUEUE_SIZE, PROP_QUEUE_SIZE,
PROP_ALWAYS_COPY PROP_ALWAYS_COPY,
PROP_DECIMATE
}; };
GST_IMPLEMENT_V4L2_PROBE_METHODS (GstV4l2SrcClass, gst_v4l2src); GST_IMPLEMENT_V4L2_PROBE_METHODS (GstV4l2SrcClass, gst_v4l2src);
@ -264,6 +266,10 @@ gst_v4l2src_class_init (GstV4l2SrcClass * klass)
g_param_spec_boolean ("always-copy", "Always Copy", g_param_spec_boolean ("always-copy", "Always Copy",
"If the buffer will or not be used directly from mmap", "If the buffer will or not be used directly from mmap",
PROP_DEF_ALWAYS_COPY, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); PROP_DEF_ALWAYS_COPY, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (gobject_class, PROP_DECIMATE,
g_param_spec_int ("decimate", "Decimate",
"Only use every nth frame", 1, G_MAXINT,
PROP_DEF_DECIMATE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
basesrc_class->get_caps = GST_DEBUG_FUNCPTR (gst_v4l2src_get_caps); basesrc_class->get_caps = GST_DEBUG_FUNCPTR (gst_v4l2src_get_caps);
basesrc_class->set_caps = GST_DEBUG_FUNCPTR (gst_v4l2src_set_caps); basesrc_class->set_caps = GST_DEBUG_FUNCPTR (gst_v4l2src_set_caps);
@ -290,6 +296,7 @@ gst_v4l2src_init (GstV4l2Src * v4l2src, GstV4l2SrcClass * klass)
v4l2src->num_buffers = PROP_DEF_QUEUE_SIZE; v4l2src->num_buffers = PROP_DEF_QUEUE_SIZE;
v4l2src->always_copy = PROP_DEF_ALWAYS_COPY; v4l2src->always_copy = PROP_DEF_ALWAYS_COPY;
v4l2src->decimate = PROP_DEF_DECIMATE;
v4l2src->is_capturing = FALSE; v4l2src->is_capturing = FALSE;
@ -338,6 +345,9 @@ gst_v4l2src_set_property (GObject * object,
case PROP_ALWAYS_COPY: case PROP_ALWAYS_COPY:
v4l2src->always_copy = g_value_get_boolean (value); v4l2src->always_copy = g_value_get_boolean (value);
break; break;
case PROP_DECIMATE:
v4l2src->decimate = g_value_get_int (value);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
@ -361,6 +371,9 @@ gst_v4l2src_get_property (GObject * object,
case PROP_ALWAYS_COPY: case PROP_ALWAYS_COPY:
g_value_set_boolean (value, v4l2src->always_copy); g_value_set_boolean (value, v4l2src->always_copy);
break; break;
case PROP_DECIMATE:
g_value_set_int (value, v4l2src->decimate);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
@ -910,9 +923,19 @@ static GstFlowReturn
gst_v4l2src_create (GstPushSrc * src, GstBuffer ** buf) gst_v4l2src_create (GstPushSrc * src, GstBuffer ** buf)
{ {
GstV4l2Src *v4l2src = GST_V4L2SRC (src); GstV4l2Src *v4l2src = GST_V4L2SRC (src);
int i;
GstFlowReturn ret; GstFlowReturn ret;
for (i = 0; i < v4l2src->decimate - 1; i++) {
ret = v4l2src->get_frame (v4l2src, buf);
if (ret != GST_FLOW_OK) {
return ret;
}
gst_buffer_unref (*buf);
}
ret = v4l2src->get_frame (v4l2src, buf); ret = v4l2src->get_frame (v4l2src, buf);
/* set buffer metadata */ /* set buffer metadata */
if (G_LIKELY (ret == GST_FLOW_OK && *buf)) { if (G_LIKELY (ret == GST_FLOW_OK && *buf)) {
GstClock *clock; GstClock *clock;

View file

@ -73,6 +73,8 @@ struct _GstV4l2Src
/* if the buffer will be or not used from directly mmap */ /* if the buffer will be or not used from directly mmap */
gboolean always_copy; gboolean always_copy;
int decimate;
/* True if we want to stop */ /* True if we want to stop */
gboolean quit; gboolean quit;
gboolean is_capturing; gboolean is_capturing;