zbar: add frame sample to barcode message

New attach-frame property enables barcode frame
dumping when set to true.

https://bugzilla.gnome.org/show_bug.cgi?id=747557
This commit is contained in:
Reynaldo H. Verdejo Pinochet 2015-05-01 23:20:30 -03:00
parent 5b0c3ac153
commit 1246d93f3e
2 changed files with 49 additions and 2 deletions

View file

@ -22,6 +22,8 @@
* *
* Detect bar codes in the video streams and send them as element messages to * Detect bar codes in the video streams and send them as element messages to
* the #GstBus if .#GstZBar:message property is %TRUE. * the #GstBus if .#GstZBar:message property is %TRUE.
* If the .#GstZBar:attach-frame property is %TRUE, the posted barcode message
* includes a sample of the frame where the barcode was detected (Since 1.6).
* *
* The element generate messages named * The element generate messages named
* <classname>&quot;barcode&quot;</classname>. The structure containes these * <classname>&quot;barcode&quot;</classname>. The structure containes these
@ -56,6 +58,14 @@
* values. * values.
* </para> * </para>
* </listitem> * </listitem>
* <listitem>
* <para>
* GstSample
* <classname>&quot;frame&quot;</classname>:
* the frame in which the barcode message was detected, if
* the .#GstZBar:attach-frame property was set to %TRUE (Since 1.6)
* </para>
* </listitem>
* </itemizedlist> * </itemizedlist>
* *
* <refsect2> * <refsect2>
@ -95,11 +105,13 @@ enum
{ {
PROP_0, PROP_0,
PROP_MESSAGE, PROP_MESSAGE,
PROP_ATTACH_FRAME,
PROP_CACHE PROP_CACHE
}; };
#define DEFAULT_CACHE FALSE #define DEFAULT_CACHE FALSE
#define DEFAULT_MESSAGE TRUE #define DEFAULT_MESSAGE TRUE
#define DEFAULT_ATTACH_FRAME FALSE
#define ZBAR_YUV_CAPS \ #define ZBAR_YUV_CAPS \
"{ Y800, I420, YV12, NV12, NV21, Y41B, Y42B, YUV9, YVU9 }" "{ Y800, I420, YV12, NV12, NV21, Y41B, Y42B, YUV9, YVU9 }"
@ -155,6 +167,19 @@ gst_zbar_class_init (GstZBarClass * g_class)
"Post a barcode message for each detected code", "Post a barcode message for each detected code",
DEFAULT_MESSAGE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); DEFAULT_MESSAGE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
* GstZBar::attach-frame:
*
* Attach the frame in which the barcode was detected to the posted
* barcode message.
*
* Since: 1.6
*/
g_object_class_install_property (gobject_class, PROP_ATTACH_FRAME,
g_param_spec_boolean ("attach-frame", "Attach frame",
"Attach a frame dump to each barcode message",
DEFAULT_ATTACH_FRAME, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (gobject_class, PROP_CACHE, g_object_class_install_property (gobject_class, PROP_CACHE,
g_param_spec_boolean ("cache", "cache", g_param_spec_boolean ("cache", "cache",
"Enable or disable the inter-image result cache", "Enable or disable the inter-image result cache",
@ -185,6 +210,7 @@ gst_zbar_init (GstZBar * zbar)
{ {
zbar->cache = DEFAULT_CACHE; zbar->cache = DEFAULT_CACHE;
zbar->message = DEFAULT_MESSAGE; zbar->message = DEFAULT_MESSAGE;
zbar->attach_frame = DEFAULT_ATTACH_FRAME;
zbar->scanner = zbar_image_scanner_create (); zbar->scanner = zbar_image_scanner_create ();
} }
@ -215,6 +241,9 @@ gst_zbar_set_property (GObject * object, guint prop_id, const GValue * value,
case PROP_MESSAGE: case PROP_MESSAGE:
zbar->message = g_value_get_boolean (value); zbar->message = g_value_get_boolean (value);
break; break;
case PROP_ATTACH_FRAME:
zbar->attach_frame = g_value_get_boolean (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;
@ -237,6 +266,9 @@ gst_zbar_get_property (GObject * object, guint prop_id, GValue * value,
case PROP_MESSAGE: case PROP_MESSAGE:
g_value_set_boolean (value, zbar->message); g_value_set_boolean (value, zbar->message);
break; break;
case PROP_ATTACH_FRAME:
g_value_set_boolean (value, zbar->attach_frame);
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;
@ -286,15 +318,29 @@ gst_zbar_transform_frame_ip (GstVideoFilter * vfilter, GstVideoFrame * frame)
if (zbar->message) { if (zbar->message) {
GstMessage *m; GstMessage *m;
GstStructure *s; GstStructure *s;
GstSample *sample;
GstCaps *sample_caps;
/* post a message */
s = gst_structure_new ("barcode", s = gst_structure_new ("barcode",
"timestamp", G_TYPE_UINT64, GST_BUFFER_TIMESTAMP (frame->buffer), "timestamp", G_TYPE_UINT64, GST_BUFFER_TIMESTAMP (frame->buffer),
"type", G_TYPE_STRING, zbar_get_symbol_name (typ), "type", G_TYPE_STRING, zbar_get_symbol_name (typ),
"symbol", G_TYPE_STRING, data, "quality", G_TYPE_INT, quality, NULL); "symbol", G_TYPE_STRING, data, "quality", G_TYPE_INT, quality, NULL);
if (zbar->attach_frame) {
/* create a sample from image */
sample_caps = gst_video_info_to_caps (&frame->info);
sample = gst_sample_new (frame->buffer, sample_caps, NULL, NULL);
gst_caps_unref (sample_caps);
gst_structure_set (s, "frame", GST_TYPE_SAMPLE, sample, NULL);
gst_sample_unref (sample);
}
m = gst_message_new_element (GST_OBJECT (zbar), s); m = gst_message_new_element (GST_OBJECT (zbar), s);
gst_element_post_message (GST_ELEMENT (zbar), m); gst_element_post_message (GST_ELEMENT (zbar), m);
}
} else if (zbar->attach_frame)
GST_WARNING_OBJECT (zbar,
"attach-frame=true has no effect if message=false");
} }
out: out:

View file

@ -53,6 +53,7 @@ struct _GstZBar
/* properties */ /* properties */
gboolean message; gboolean message;
gboolean attach_frame;
gboolean cache; gboolean cache;
/* internals */ /* internals */