[v4l2videodecoder] Post message for number of buffers
[platform/upstream/gst-plugins-good.git] / gst / effectv / gstedge.c
index eddac91..07feb99 100644 (file)
@@ -20,8 +20,8 @@
  * 
  * You should have received a copy of the GNU Library General Public
  * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
  */
 
 /**
@@ -33,7 +33,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v videotestsrc ! edgetv ! videoconvert ! autovideosink
+ * gst-launch-1.0 -v videotestsrc ! edgetv ! videoconvert ! autovideosink
  * ]| This pipeline shows the effect of edgetv on a test stream.
  * </refsect2>
  */
@@ -70,21 +70,15 @@ GST_STATIC_PAD_TEMPLATE ("sink",
     );
 
 static gboolean
-gst_edgetv_set_caps (GstBaseTransform * btrans, GstCaps * incaps,
-    GstCaps * outcaps)
+gst_edgetv_set_info (GstVideoFilter * filter, GstCaps * incaps,
+    GstVideoInfo * in_info, GstCaps * outcaps, GstVideoInfo * out_info)
 {
-  GstEdgeTV *edgetv = GST_EDGETV (btrans);
-  GstVideoInfo info;
+  GstEdgeTV *edgetv = GST_EDGETV (filter);
   guint map_size;
   gint width, height;
 
-  if (!gst_video_info_from_caps (&info, incaps))
-    goto invalid_caps;
-
-  edgetv->info = info;
-
-  width = GST_VIDEO_INFO_WIDTH (&info);
-  height = GST_VIDEO_INFO_HEIGHT (&info);
+  width = GST_VIDEO_INFO_WIDTH (in_info);
+  height = GST_VIDEO_INFO_HEIGHT (in_info);
 
   edgetv->map_width = width / 4;
   edgetv->map_height = height / 4;
@@ -96,19 +90,13 @@ gst_edgetv_set_caps (GstBaseTransform * btrans, GstCaps * incaps,
   edgetv->map = (guint32 *) g_malloc0 (map_size);
 
   return TRUE;
-
-  /* ERRORS */
-invalid_caps:
-  {
-    GST_DEBUG_OBJECT (btrans, "could not parse caps");
-    return FALSE;
-  }
 }
 
 static GstFlowReturn
-gst_edgetv_transform (GstBaseTransform * trans, GstBuffer * in, GstBuffer * out)
+gst_edgetv_transform_frame (GstVideoFilter * vfilter, GstVideoFrame * in_frame,
+    GstVideoFrame * out_frame)
 {
-  GstEdgeTV *filter = GST_EDGETV (trans);
+  GstEdgeTV *filter = GST_EDGETV (vfilter);
   gint x, y, r, g, b;
   guint32 *src, *dest;
   guint32 p, q;
@@ -117,20 +105,16 @@ gst_edgetv_transform (GstBaseTransform * trans, GstBuffer * in, GstBuffer * out)
   gint video_width_margin;
   guint32 *map;
   GstFlowReturn ret = GST_FLOW_OK;
-  GstVideoFrame in_frame, out_frame;
 
   map = filter->map;
   map_height = filter->map_height;
   map_width = filter->map_width;
   video_width_margin = filter->video_width_margin;
 
-  gst_video_frame_map (&in_frame, &filter->info, in, GST_MAP_READ);
-  gst_video_frame_map (&out_frame, &filter->info, out, GST_MAP_WRITE);
-
-  src = GST_VIDEO_FRAME_PLANE_DATA (&in_frame, 0);
-  dest = GST_VIDEO_FRAME_PLANE_DATA (&out_frame, 0);
+  src = GST_VIDEO_FRAME_PLANE_DATA (in_frame, 0);
+  dest = GST_VIDEO_FRAME_PLANE_DATA (out_frame, 0);
 
-  width = GST_VIDEO_FRAME_WIDTH (&in_frame);
+  width = GST_VIDEO_FRAME_WIDTH (in_frame);
 
   src += width * 4 + 4;
   dest += width * 4 + 4;
@@ -140,7 +124,7 @@ gst_edgetv_transform (GstBaseTransform * trans, GstBuffer * in, GstBuffer * out)
       p = *src;
       q = *(src - 4);
 
-      /* difference between the current pixel and right neighbor. */
+      /* difference between the current pixel and left neighbor. */
       r = ((p & 0xff0000) - (q & 0xff0000)) >> 16;
       g = ((p & 0xff00) - (q & 0xff00)) >> 8;
       b = (p & 0xff) - (q & 0xff);
@@ -199,8 +183,12 @@ gst_edgetv_transform (GstBaseTransform * trans, GstBuffer * in, GstBuffer * out)
       dest[width + 3] = v3;
       dest[width * 2] = v2;
       dest[width * 2 + 1] = v2;
+      dest[width * 2 + 2] = 0;
+      dest[width * 2 + 3] = 0;
       dest[width * 3] = v2;
       dest[width * 3 + 1] = v2;
+      dest[width * 3 + 2] = 0;
+      dest[width * 3 + 3] = 0;
 
       src += 4;
       dest += 4;
@@ -240,21 +228,24 @@ gst_edgetv_class_init (GstEdgeTVClass * klass)
   GObjectClass *gobject_class = (GObjectClass *) klass;
   GstElementClass *gstelement_class = (GstElementClass *) klass;
   GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass;
+  GstVideoFilterClass *vfilter_class = (GstVideoFilterClass *) klass;
 
   gobject_class->finalize = gst_edgetv_finalize;
 
-  gst_element_class_set_details_simple (gstelement_class, "EdgeTV effect",
+  gst_element_class_set_static_metadata (gstelement_class, "EdgeTV effect",
       "Filter/Effect/Video",
       "Apply edge detect on video", "Wim Taymans <wim.taymans@chello.be>");
 
-  gst_element_class_add_pad_template (gstelement_class,
-      gst_static_pad_template_get (&gst_edgetv_sink_template));
-  gst_element_class_add_pad_template (gstelement_class,
-      gst_static_pad_template_get (&gst_edgetv_src_template));
+  gst_element_class_add_static_pad_template (gstelement_class,
+      &gst_edgetv_sink_template);
+  gst_element_class_add_static_pad_template (gstelement_class,
+      &gst_edgetv_src_template);
 
-  trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_edgetv_set_caps);
-  trans_class->transform = GST_DEBUG_FUNCPTR (gst_edgetv_transform);
   trans_class->start = GST_DEBUG_FUNCPTR (gst_edgetv_start);
+
+  vfilter_class->set_info = GST_DEBUG_FUNCPTR (gst_edgetv_set_info);
+  vfilter_class->transform_frame =
+      GST_DEBUG_FUNCPTR (gst_edgetv_transform_frame);
 }
 
 static void