/* chain function * this function does the actual processing */ static GstFlowReturn gst_opencv_text_overlay_chain (GstPad * pad, GstObject * parent, GstBuffer * buf) { GstOpencvTextOverlay *filter; GstMapInfo map_info; guint8 *data; filter = GST_OPENCV_TEXT_OVERLAY (parent); gst_buffer_map (buf, &map_info, GST_MAP_READ); data = map_info.data; filter->cvImage->imageData = (char *) data; cvInitFont (&(filter->font), CV_FONT_VECTOR0, filter->width, filter->height, 0, filter->thickness, 0); buf = gst_buffer_make_writable (buf); cvPutText (filter->cvImage, filter->textbuf, cvPoint (filter->xpos, filter->ypos), &(filter->font), cvScalar (filter->colorR, filter->colorG, filter->colorB, 0)); gst_buffer_unmap (buf, &map_info); return gst_pad_push (filter->srcpad, buf); }
static gboolean gst_opencv_text_overlay_handle_sink_event (GstPad * pad, GstObject * parent, GstEvent * event) { GstOpencvTextOverlay *filter; gint width, height; GstStructure *structure; gboolean res = TRUE; filter = GST_OPENCV_TEXT_OVERLAY (parent); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_CAPS: { GstCaps *caps; gst_event_parse_caps (event, &caps); structure = gst_caps_get_structure (caps, 0); gst_structure_get_int (structure, "width", &width); gst_structure_get_int (structure, "height", &height); if (filter->cvImage) { cvReleaseImage (&filter->cvImage); } filter->cvImage = cvCreateImage (cvSize (width, height), IPL_DEPTH_8U, 3); break; } default: break; } res = gst_pad_event_default (pad, parent, event); return res; }
/* Clean up */ static void gst_opencv_text_overlay_finalize (GObject * obj) { GstOpencvTextOverlay *filter = GST_OPENCV_TEXT_OVERLAY (obj); g_free (filter->textbuf); G_OBJECT_CLASS (gst_opencv_text_overlay_parent_class)->finalize (obj); }
/* Clean up */ static void gst_opencv_text_overlay_finalize (GObject * obj) { GstOpencvTextOverlay *filter = GST_OPENCV_TEXT_OVERLAY (obj); if (filter->cvImage) { cvReleaseImage (&filter->cvImage); } G_OBJECT_CLASS (parent_class)->finalize (obj); }
/* chain function * this function does the actual processing */ static GstFlowReturn gst_opencv_text_overlay_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf, IplImage * img) { GstOpencvTextOverlay *filter = GST_OPENCV_TEXT_OVERLAY (base); cvInitFont (&(filter->font), CV_FONT_VECTOR0, filter->width, filter->height, 0, filter->thickness, 0); cvPutText (img, filter->textbuf, cvPoint (filter->xpos, filter->ypos), &(filter->font), cvScalar (filter->colorR, filter->colorG, filter->colorB, 0)); return GST_FLOW_OK; }
/* chain function * this function does the actual processing */ static GstFlowReturn gst_opencv_text_overlay_chain (GstPad * pad, GstBuffer * buf) { GstOpencvTextOverlay *filter; filter = GST_OPENCV_TEXT_OVERLAY (GST_OBJECT_PARENT (pad)); filter->cvImage->imageData = (char *) GST_BUFFER_DATA (buf); cvInitFont (&(filter->font), CV_FONT_VECTOR0, filter->width, filter->height, 0, filter->thickness, 0); buf = gst_buffer_make_writable (buf); cvPutText (filter->cvImage, filter->textbuf, cvPoint (filter->xpos, filter->ypos), &(filter->font), cvScalar (filter->colorR, filter->colorG, filter->colorB, 0)); return gst_pad_push (filter->srcpad, buf); }
static void gst_opencv_text_overlay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstOpencvTextOverlay *filter = GST_OPENCV_TEXT_OVERLAY (object); switch (prop_id) { case PROP_TEXT: g_free (filter->textbuf); filter->textbuf = g_value_dup_string (value); break; case PROP_XPOS: filter->xpos = g_value_get_int (value); break; case PROP_YPOS: filter->ypos = g_value_get_int (value); break; case PROP_THICKNESS: filter->thickness = g_value_get_int (value); break; case PROP_COLOR_R: filter->colorR = g_value_get_int (value); break; case PROP_COLOR_G: filter->colorG = g_value_get_int (value); break; case PROP_COLOR_B: filter->colorB = g_value_get_int (value); break; case PROP_HEIGHT: filter->height = g_value_get_double (value); break; case PROP_WIDTH: filter->width = g_value_get_double (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
/* this function handles the link with other elements */ static gboolean gst_opencv_text_overlay_set_caps (GstPad * pad, GstCaps * caps) { GstOpencvTextOverlay *filter; GstPad *otherpad; gint width, height; GstStructure *structure; filter = GST_OPENCV_TEXT_OVERLAY (gst_pad_get_parent (pad)); structure = gst_caps_get_structure (caps, 0); gst_structure_get_int (structure, "width", &width); gst_structure_get_int (structure, "height", &height); filter->cvImage = cvCreateImage (cvSize (width, height), IPL_DEPTH_8U, 3); filter->cvStorage = cvCreateMemStorage (0); otherpad = (pad == filter->srcpad) ? filter->sinkpad : filter->srcpad; gst_object_unref (filter); return gst_pad_set_caps (otherpad, caps); }