summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@gmail.com>2004-06-16 15:07:58 +0000
committerWim Taymans <wim.taymans@gmail.com>2004-06-16 15:07:58 +0000
commitae8739f7616813571c4b4ca334eb2486d9fb7dcc (patch)
treeff4ca6de4e115012cc740710f4585ab2aa30c270
parentac4b3f471800a8a5f9eea86cc083bc5d51cfbf19 (diff)
sys/v4l/: Added a copy mode to v4lsrc where it will output a copied version of its internal hardware buffer.
Original commit message from CVS: * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_get): * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_sync_mode_get_type), (gst_v4lsrc_class_init), (gst_v4lsrc_init), (gst_v4lsrc_get_fps), (gst_v4lsrc_get), (gst_v4lsrc_set_property), (gst_v4lsrc_get_property): * sys/v4l/gstv4lsrc.h: Added a copy mode to v4lsrc where it will output a copied version of its internal hardware buffer. Fix the wrong FLAG_SET usage. The flags are integers, not bits, you can't | them.
-rw-r--r--ChangeLog13
-rw-r--r--sys/v4l/gstv4lmjpegsrc.c3
-rw-r--r--sys/v4l/gstv4lsrc.c31
-rw-r--r--sys/v4l/gstv4lsrc.h2
4 files changed, 43 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index c2cd1964b..a6f87b194 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,18 @@
2004-06-16 Wim Taymans <wim@fluendo.com>
+ * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_get):
+ * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_sync_mode_get_type),
+ (gst_v4lsrc_class_init), (gst_v4lsrc_init), (gst_v4lsrc_get_fps),
+ (gst_v4lsrc_get), (gst_v4lsrc_set_property),
+ (gst_v4lsrc_get_property):
+ * sys/v4l/gstv4lsrc.h:
+ Added a copy mode to v4lsrc where it will output a copied version
+ of its internal hardware buffer.
+ Fix the wrong FLAG_SET usage. The flags are integers, not bits, you
+ can't | them.
+
+2004-06-16 Wim Taymans <wim@fluendo.com>
+
* sys/oss/gstosssrc.c: (gst_osssrc_get):
Timestamp fixes.
diff --git a/sys/v4l/gstv4lmjpegsrc.c b/sys/v4l/gstv4lmjpegsrc.c
index 8377c7b75..83942f1ee 100644
--- a/sys/v4l/gstv4lmjpegsrc.c
+++ b/sys/v4l/gstv4lmjpegsrc.c
@@ -574,7 +574,8 @@ gst_v4lmjpegsrc_get (GstPad * pad)
GST_BUFFER_DATA (buf) = gst_v4lmjpegsrc_get_buffer (v4lmjpegsrc, num);
GST_BUFFER_SIZE (buf) = v4lmjpegsrc->last_size;
GST_BUFFER_MAXSIZE (buf) = v4lmjpegsrc->breq.size;
- GST_BUFFER_FLAG_SET (buf, GST_BUFFER_READONLY | GST_BUFFER_DONTFREE);
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_READONLY);
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_DONTFREE);
if (v4lmjpegsrc->use_fixed_fps)
GST_BUFFER_TIMESTAMP (buf) = v4lmjpegsrc->handled * GST_SECOND / fps;
else /* calculate time based on our own clock */
diff --git a/sys/v4l/gstv4lsrc.c b/sys/v4l/gstv4lsrc.c
index 3c3b45c8b..6057e86c9 100644
--- a/sys/v4l/gstv4lsrc.c
+++ b/sys/v4l/gstv4lsrc.c
@@ -52,13 +52,16 @@ enum
LAST_SIGNAL
};
+#define DEFAULT_SYNC_MODE GST_V4LSRC_SYNC_MODE_CLOCK
+#define DEFAULT_COPY_MODE FALSE
/* arguments */
enum
{
ARG_0,
ARG_NUMBUFS,
ARG_BUFSIZE,
- ARG_SYNC_MODE
+ ARG_SYNC_MODE,
+ ARG_COPY_MODE
};
GST_FORMATS_FUNCTION (GstPad *, gst_v4lsrc_get_formats,
@@ -66,8 +69,6 @@ GST_FORMATS_FUNCTION (GstPad *, gst_v4lsrc_get_formats,
GST_QUERY_TYPE_FUNCTION (GstPad *, gst_v4lsrc_get_query_types,
GST_QUERY_POSITION);
-#define DEFAULT_SYNC_MODE GST_V4LSRC_SYNC_MODE_CLOCK
-
#define GST_TYPE_V4LSRC_SYNC_MODE (gst_v4lsrc_sync_mode_get_type())
static GType
gst_v4lsrc_sync_mode_get_type (void)
@@ -201,6 +202,10 @@ gst_v4lsrc_class_init (GstV4lSrcClass * klass)
g_param_spec_enum ("sync_mode", "Sync mode",
"Method to use for timestamping captured frames",
GST_TYPE_V4LSRC_SYNC_MODE, DEFAULT_SYNC_MODE, G_PARAM_READWRITE));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_COPY_MODE,
+ g_param_spec_boolean ("copy_mode", "Copy mode",
+ "Don't send out HW buffers, send copy instead", DEFAULT_COPY_MODE,
+ G_PARAM_READWRITE));
/* signals */
gst_v4lsrc_signals[SIGNAL_FRAME_CAPTURE] =
@@ -258,8 +263,8 @@ gst_v4lsrc_init (GstV4lSrc * v4lsrc)
/* no colourspaces */
v4lsrc->colourspaces = NULL;
- /* fps */
v4lsrc->syncmode = DEFAULT_SYNC_MODE;
+ v4lsrc->copy_mode = DEFAULT_COPY_MODE;
v4lsrc->is_capturing = FALSE;
}
@@ -875,11 +880,19 @@ gst_v4lsrc_get (GstPad * pad)
v4lsrc_private->num = num;
GST_BUFFER_PRIVATE (buf) = v4lsrc_private;
- GST_BUFFER_FLAG_SET (buf, GST_BUFFER_READONLY | GST_BUFFER_DONTFREE);
+ /* don't | the flags, they are integers, not bits!! */
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_READONLY);
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_DONTFREE);
GST_BUFFER_DATA (buf) = gst_v4lsrc_get_buffer (v4lsrc, num);
GST_BUFFER_MAXSIZE (buf) = v4lsrc->mbuf.size / v4lsrc->mbuf.frames;
GST_BUFFER_SIZE (buf) = v4lsrc->buffer_size;
+ if (v4lsrc->copy_mode) {
+ GstBuffer *copy = gst_buffer_copy (buf);
+
+ gst_buffer_unref (buf);
+ buf = copy;
+ }
switch (v4lsrc->syncmode) {
case GST_V4LSRC_SYNC_MODE_FIXED_FPS:
@@ -973,6 +986,10 @@ gst_v4lsrc_set_property (GObject * object,
}
break;
+ case ARG_COPY_MODE:
+ v4lsrc->copy_mode = g_value_get_boolean (value);
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -1006,6 +1023,10 @@ gst_v4lsrc_get_property (GObject * object,
g_value_set_enum (value, v4lsrc->syncmode);
break;
+ case ARG_COPY_MODE:
+ g_value_set_boolean (value, v4lsrc->copy_mode);
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
diff --git a/sys/v4l/gstv4lsrc.h b/sys/v4l/gstv4lsrc.h
index 6f8cd4220..0a6b4d882 100644
--- a/sys/v4l/gstv4lsrc.h
+++ b/sys/v4l/gstv4lsrc.h
@@ -101,6 +101,8 @@ struct _GstV4lSrc
/* how are we going to timestamp buffers? */
GstV4lSrcSyncMode syncmode;
+
+ gboolean copy_mode;
};
struct _GstV4lSrcClass