summaryrefslogtreecommitdiffstats
path: root/ext/snapshot
diff options
context:
space:
mode:
Diffstat (limited to 'ext/snapshot')
-rw-r--r--ext/snapshot/gstsnapshot.c275
-rw-r--r--ext/snapshot/gstsnapshot.h51
2 files changed, 169 insertions, 157 deletions
diff --git a/ext/snapshot/gstsnapshot.c b/ext/snapshot/gstsnapshot.c
index 7362d56c..66c505bc 100644
--- a/ext/snapshot/gstsnapshot.c
+++ b/ext/snapshot/gstsnapshot.c
@@ -37,58 +37,62 @@ static GstElementDetails snapshot_details = {
};
static GstStaticPadTemplate snapshot_src_factory =
-GST_STATIC_PAD_TEMPLATE (
- "src",
- GST_PAD_SRC,
- GST_PAD_ALWAYS,
- GST_STATIC_CAPS (GST_VIDEO_CAPS_BGR)
-);
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (GST_VIDEO_CAPS_BGR)
+ );
static GstStaticPadTemplate snapshot_sink_factory =
-GST_STATIC_PAD_TEMPLATE (
- "sink",
- GST_PAD_SINK,
- GST_PAD_ALWAYS,
- GST_STATIC_CAPS (GST_VIDEO_CAPS_BGR)
-);
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (GST_VIDEO_CAPS_BGR)
+ );
/* Snapshot signals and args */
-enum {
+enum
+{
/* FILL ME */
SNAPSHOT_SIGNAL,
LAST_SIGNAL
};
-enum {
+enum
+{
ARG_0,
ARG_FRAME,
ARG_LOCATION
};
-static GType gst_snapshot_get_type (void);
-static void gst_snapshot_base_init (gpointer g_class);
-static void gst_snapshot_class_init (GstSnapshotClass *klass);
-static void gst_snapshot_init (GstSnapshot *snapshot);
+static GType gst_snapshot_get_type (void);
+static void gst_snapshot_base_init (gpointer g_class);
+static void gst_snapshot_class_init (GstSnapshotClass * klass);
+static void gst_snapshot_init (GstSnapshot * snapshot);
-static void gst_snapshot_chain (GstPad *pad, GstData *_data);
+static void gst_snapshot_chain (GstPad * pad, GstData * _data);
-static void gst_snapshot_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
-static void gst_snapshot_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
-static void snapshot_handler(GstElement *element);
+static void gst_snapshot_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_snapshot_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+static void snapshot_handler (GstElement * element);
static GstElementClass *parent_class = NULL;
-static guint gst_snapshot_signals[LAST_SIGNAL] = { 0 };
+static guint gst_snapshot_signals[LAST_SIGNAL] = { 0 };
-static void user_error_fn(png_structp png_ptr, png_const_charp error_msg)
+static void
+user_error_fn (png_structp png_ptr, png_const_charp error_msg)
{
- g_warning("%s", error_msg);
+ g_warning ("%s", error_msg);
}
-static void user_warning_fn(png_structp png_ptr, png_const_charp warning_msg)
+static void
+user_warning_fn (png_structp png_ptr, png_const_charp warning_msg)
{
- g_warning("%s", warning_msg);
+ g_warning ("%s", warning_msg);
}
GType
@@ -98,17 +102,19 @@ gst_snapshot_get_type (void)
if (!snapshot_type) {
static const GTypeInfo snapshot_info = {
- sizeof(GstSnapshotClass),
+ sizeof (GstSnapshotClass),
gst_snapshot_base_init,
NULL,
- (GClassInitFunc)gst_snapshot_class_init,
+ (GClassInitFunc) gst_snapshot_class_init,
NULL,
NULL,
- sizeof(GstSnapshot),
+ sizeof (GstSnapshot),
0,
- (GInstanceInitFunc)gst_snapshot_init,
+ (GInstanceInitFunc) gst_snapshot_init,
};
- snapshot_type = g_type_register_static(GST_TYPE_ELEMENT, "GstSnapshot", &snapshot_info, 0);
+ snapshot_type =
+ g_type_register_static (GST_TYPE_ELEMENT, "GstSnapshot", &snapshot_info,
+ 0);
}
return snapshot_type;
}
@@ -118,34 +124,36 @@ gst_snapshot_base_init (gpointer g_class)
{
GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
- gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&snapshot_sink_factory));
- gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&snapshot_src_factory));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&snapshot_sink_factory));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&snapshot_src_factory));
gst_element_class_set_details (element_class, &snapshot_details);
}
static void
-gst_snapshot_class_init (GstSnapshotClass *klass)
+gst_snapshot_class_init (GstSnapshotClass * klass)
{
GObjectClass *gobject_class;
GstElementClass *gstelement_class;
- gobject_class = (GObjectClass*)klass;
- gstelement_class = (GstElementClass*)klass;
+ gobject_class = (GObjectClass *) klass;
+ gstelement_class = (GstElementClass *) klass;
- parent_class = g_type_class_ref(GST_TYPE_ELEMENT);
+ parent_class = g_type_class_ref (GST_TYPE_ELEMENT);
+
+ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FRAME,
+ g_param_spec_long ("frame", "frame", "frame",
+ 0, G_MAXLONG, 0, G_PARAM_READWRITE));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_LOCATION,
+ g_param_spec_string ("location", "location", "location",
+ 0, G_PARAM_READWRITE));
- g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_FRAME,
- g_param_spec_long("frame","frame","frame",
- 0, G_MAXLONG, 0, G_PARAM_READWRITE));
- g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_LOCATION,
- g_param_spec_string("location","location","location",
- 0,G_PARAM_READWRITE));
-
gst_snapshot_signals[SNAPSHOT_SIGNAL] =
- g_signal_new("snapshot", G_TYPE_FROM_CLASS(klass),
- G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(GstSnapshotClass, snapshot),
- NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
+ g_signal_new ("snapshot", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstSnapshotClass, snapshot),
+ NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
klass->snapshot = snapshot_handler;
@@ -154,17 +162,17 @@ gst_snapshot_class_init (GstSnapshotClass *klass)
}
static void
-snapshot_handler(GstElement *element)
+snapshot_handler (GstElement * element)
{
GstSnapshot *snapshot;
- snapshot = GST_SNAPSHOT( element );
- snapshot->snapshot_asked=TRUE;
+ snapshot = GST_SNAPSHOT (element);
+ snapshot->snapshot_asked = TRUE;
}
static gboolean
-gst_snapshot_sinkconnect (GstPad *pad, const GstCaps *caps)
+gst_snapshot_sinkconnect (GstPad * pad, const GstCaps * caps)
{
GstSnapshot *filter;
gdouble fps;
@@ -173,125 +181,129 @@ gst_snapshot_sinkconnect (GstPad *pad, const GstCaps *caps)
filter = GST_SNAPSHOT (gst_pad_get_parent (pad));
structure = gst_caps_get_structure (caps, 0);
- gst_structure_get_int (structure, "width", &filter->width);
- gst_structure_get_int (structure, "height", &filter->height);
- gst_structure_get_double (structure, "framerate", &fps);
- gst_structure_get_fourcc (structure, "format", &filter->format);
+ gst_structure_get_int (structure, "width", &filter->width);
+ gst_structure_get_int (structure, "height", &filter->height);
+ gst_structure_get_double (structure, "framerate", &fps);
+ gst_structure_get_fourcc (structure, "format", &filter->format);
filter->to_bpp = 24;
- filter->png_struct_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, (png_voidp)NULL, user_error_fn, user_warning_fn);
- if ( filter->png_struct_ptr == NULL )
- g_warning( "Failed to initialize png structure");
+ filter->png_struct_ptr =
+ png_create_write_struct (PNG_LIBPNG_VER_STRING, (png_voidp) NULL,
+ user_error_fn, user_warning_fn);
+ if (filter->png_struct_ptr == NULL)
+ g_warning ("Failed to initialize png structure");
+
+ filter->png_info_ptr = png_create_info_struct (filter->png_struct_ptr);
- filter->png_info_ptr = png_create_info_struct( filter->png_struct_ptr );
+ if (setjmp (filter->png_struct_ptr->jmpbuf))
+ png_destroy_write_struct (&filter->png_struct_ptr, &filter->png_info_ptr);
- if (setjmp( filter->png_struct_ptr->jmpbuf))
- png_destroy_write_struct(&filter->png_struct_ptr, &filter->png_info_ptr);
-
gst_pad_try_set_caps (filter->srcpad, caps);
return GST_PAD_LINK_OK;
}
static void
-gst_snapshot_init (GstSnapshot *snapshot)
+gst_snapshot_init (GstSnapshot * snapshot)
{
- snapshot->sinkpad = gst_pad_new_from_template (gst_static_pad_template_get (&snapshot_sink_factory), "sink");
+ snapshot->sinkpad =
+ gst_pad_new_from_template (gst_static_pad_template_get
+ (&snapshot_sink_factory), "sink");
gst_pad_set_link_function (snapshot->sinkpad, gst_snapshot_sinkconnect);
gst_pad_set_chain_function (snapshot->sinkpad, gst_snapshot_chain);
gst_element_add_pad (GST_ELEMENT (snapshot), snapshot->sinkpad);
- snapshot->srcpad = gst_pad_new_from_template (gst_static_pad_template_get (&snapshot_src_factory), "src");
+ snapshot->srcpad =
+ gst_pad_new_from_template (gst_static_pad_template_get
+ (&snapshot_src_factory), "src");
gst_element_add_pad (GST_ELEMENT (snapshot), snapshot->srcpad);
snapshot->cur_frame = 0;
- snapshot->frame=-1;
- snapshot->snapshot_asked=FALSE;
+ snapshot->frame = -1;
+ snapshot->snapshot_asked = FALSE;
}
static void
-gst_snapshot_chain (GstPad *pad, GstData *_data)
+gst_snapshot_chain (GstPad * pad, GstData * _data)
{
GstBuffer *buf = GST_BUFFER (_data);
GstSnapshot *snapshot;
guchar *data;
gulong size;
gint i;
- png_byte *row_pointers[ MAX_HEIGHT ];
+ png_byte *row_pointers[MAX_HEIGHT];
FILE *fp;
- g_return_if_fail(pad != NULL);
- g_return_if_fail(GST_IS_PAD(pad));
- g_return_if_fail(buf != NULL);
+ g_return_if_fail (pad != NULL);
+ g_return_if_fail (GST_IS_PAD (pad));
+ g_return_if_fail (buf != NULL);
snapshot = GST_SNAPSHOT (GST_OBJECT_PARENT (pad));
- data = GST_BUFFER_DATA(buf);
- size = GST_BUFFER_SIZE(buf);
+ data = GST_BUFFER_DATA (buf);
+ size = GST_BUFFER_SIZE (buf);
- GST_DEBUG ("snapshot: have buffer of %d\n", GST_BUFFER_SIZE(buf));
+ GST_DEBUG ("snapshot: have buffer of %d\n", GST_BUFFER_SIZE (buf));
snapshot->cur_frame++;
if (snapshot->cur_frame == snapshot->frame ||
- snapshot->snapshot_asked == TRUE )
- {
+ snapshot->snapshot_asked == TRUE) {
snapshot->snapshot_asked = FALSE;
- GST_INFO ("dumpfile : %s\n", snapshot->location );
- fp = fopen( snapshot->location, "wb" );
- if ( fp == NULL )
- g_warning(" Can not open %s\n", snapshot->location );
- else
- {
- png_set_filter( snapshot->png_struct_ptr, 0, PNG_FILTER_NONE | PNG_FILTER_VALUE_NONE );
- png_init_io(snapshot->png_struct_ptr, fp);
- png_set_compression_level( snapshot->png_struct_ptr, 9);
- png_set_IHDR(
- snapshot->png_struct_ptr,
- snapshot->png_info_ptr,
- snapshot->width,
- snapshot->height,
- snapshot->to_bpp/3,
- PNG_COLOR_TYPE_RGB,
- PNG_INTERLACE_NONE,
- PNG_COMPRESSION_TYPE_DEFAULT,
- PNG_FILTER_TYPE_DEFAULT
- );
-
- for ( i = 0; i < snapshot->height; i++ )
- row_pointers[i] = data + (snapshot->width * i * snapshot->to_bpp/8 );
-
- png_write_info( snapshot->png_struct_ptr, snapshot->png_info_ptr );
- png_write_image( snapshot->png_struct_ptr, row_pointers );
- png_write_end( snapshot->png_struct_ptr, NULL );
- png_destroy_info_struct ( snapshot->png_struct_ptr, &snapshot->png_info_ptr );
- png_destroy_write_struct( &snapshot->png_struct_ptr, (png_infopp)NULL );
- fclose( fp );
- g_signal_emit (G_OBJECT (snapshot),
- gst_snapshot_signals[SNAPSHOT_SIGNAL], 0);
+ GST_INFO ("dumpfile : %s\n", snapshot->location);
+ fp = fopen (snapshot->location, "wb");
+ if (fp == NULL)
+ g_warning (" Can not open %s\n", snapshot->location);
+ else {
+ png_set_filter (snapshot->png_struct_ptr, 0,
+ PNG_FILTER_NONE | PNG_FILTER_VALUE_NONE);
+ png_init_io (snapshot->png_struct_ptr, fp);
+ png_set_compression_level (snapshot->png_struct_ptr, 9);
+ png_set_IHDR (snapshot->png_struct_ptr,
+ snapshot->png_info_ptr,
+ snapshot->width,
+ snapshot->height,
+ snapshot->to_bpp / 3,
+ PNG_COLOR_TYPE_RGB,
+ PNG_INTERLACE_NONE,
+ PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
+
+ for (i = 0; i < snapshot->height; i++)
+ row_pointers[i] = data + (snapshot->width * i * snapshot->to_bpp / 8);
+
+ png_write_info (snapshot->png_struct_ptr, snapshot->png_info_ptr);
+ png_write_image (snapshot->png_struct_ptr, row_pointers);
+ png_write_end (snapshot->png_struct_ptr, NULL);
+ png_destroy_info_struct (snapshot->png_struct_ptr,
+ &snapshot->png_info_ptr);
+ png_destroy_write_struct (&snapshot->png_struct_ptr, (png_infopp) NULL);
+ fclose (fp);
+ g_signal_emit (G_OBJECT (snapshot),
+ gst_snapshot_signals[SNAPSHOT_SIGNAL], 0);
}
}
- gst_pad_push(snapshot->srcpad,GST_DATA (buf ));
+ gst_pad_push (snapshot->srcpad, GST_DATA (buf));
}
static void
-gst_snapshot_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
+gst_snapshot_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
{
GstSnapshot *snapshot;
- g_return_if_fail(GST_IS_SNAPSHOT(object));
- snapshot = GST_SNAPSHOT(object);
+ g_return_if_fail (GST_IS_SNAPSHOT (object));
+ snapshot = GST_SNAPSHOT (object);
switch (prop_id) {
case ARG_LOCATION:
- snapshot->location = g_strdup(g_value_get_string (value));
+ snapshot->location = g_strdup (g_value_get_string (value));
break;
case ARG_FRAME:
- snapshot->frame = g_value_get_long(value);
+ snapshot->frame = g_value_get_long (value);
break;
default:
break;
@@ -299,19 +311,20 @@ gst_snapshot_set_property (GObject *object, guint prop_id, const GValue *value,
}
static void
-gst_snapshot_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
+gst_snapshot_get_property (GObject * object, guint prop_id, GValue * value,
+ GParamSpec * pspec)
{
GstSnapshot *snapshot;
- g_return_if_fail(GST_IS_SNAPSHOT(object));
- snapshot = GST_SNAPSHOT(object);
+ g_return_if_fail (GST_IS_SNAPSHOT (object));
+ snapshot = GST_SNAPSHOT (object);
switch (prop_id) {
case ARG_LOCATION:
- g_value_set_string(value, snapshot->location);
+ g_value_set_string (value, snapshot->location);
break;
case ARG_FRAME:
- g_value_set_long(value, snapshot->frame);
+ g_value_set_long (value, snapshot->frame);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -321,21 +334,17 @@ gst_snapshot_get_property (GObject *object, guint prop_id, GValue *value, GParam
static gboolean
-plugin_init (GstPlugin *plugin)
+plugin_init (GstPlugin * plugin)
{
- if (!gst_element_register (plugin, "snapshot", GST_RANK_NONE, GST_TYPE_SNAPSHOT))
+ if (!gst_element_register (plugin, "snapshot", GST_RANK_NONE,
+ GST_TYPE_SNAPSHOT))
return FALSE;
return TRUE;
}
-GST_PLUGIN_DEFINE (
- GST_VERSION_MAJOR,
- GST_VERSION_MINOR,
- "snapshot",
- "Dump a frame to a png file",
- plugin_init,
- VERSION,
- "LGPL",
- GST_PACKAGE,
- GST_ORIGIN)
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "snapshot",
+ "Dump a frame to a png file",
+ plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN)
diff --git a/ext/snapshot/gstsnapshot.h b/ext/snapshot/gstsnapshot.h
index 0ca1fb93..23cca911 100644
--- a/ext/snapshot/gstsnapshot.h
+++ b/ext/snapshot/gstsnapshot.h
@@ -26,8 +26,9 @@
#include <png.h>
#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
+extern "C"
+{
+#endif /* __cplusplus */
#define GST_TYPE_SNAPSHOT \
@@ -41,36 +42,38 @@ extern "C" {
#define GST_IS_SNAPSHOT_CLASS(obj) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SNAPSHOT))
-typedef struct _GstSnapshot GstSnapshot;
-typedef struct _GstSnapshotClass GstSnapshotClass;
+ typedef struct _GstSnapshot GstSnapshot;
+ typedef struct _GstSnapshotClass GstSnapshotClass;
-struct _GstSnapshot {
- GstElement element;
+ struct _GstSnapshot
+ {
+ GstElement element;
- guint32 format;
- gint width;
- gint height;
- gint to_bpp;
- glong frame;
- glong cur_frame;
- const gchar *location;
- gboolean snapshot_asked;
+ guint32 format;
+ gint width;
+ gint height;
+ gint to_bpp;
+ glong frame;
+ glong cur_frame;
+ const gchar *location;
+ gboolean snapshot_asked;
- png_structp png_struct_ptr;
- png_infop png_info_ptr;
+ png_structp png_struct_ptr;
+ png_infop png_info_ptr;
- GstPad *sinkpad,*srcpad;
-};
+ GstPad *sinkpad, *srcpad;
+ };
-struct _GstSnapshotClass {
- GstElementClass parent_class;
+ struct _GstSnapshotClass
+ {
+ GstElementClass parent_class;
- void (*snapshot) (GstElement *elem);
-};
+ void (*snapshot) (GstElement * elem);
+ };
#ifdef __cplusplus
}
-#endif /* __cplusplus */
+#endif /* __cplusplus */
-#endif /* __GST_SNAPSHOT_H__ */
+#endif /* __GST_SNAPSHOT_H__ */