gst-libs/gst/video/video.h: Fix caps template names to be understandable.
[platform/upstream/gst-plugins-good.git] / gst / law / mulaw-decode.c
index d93c690..d04a6ed 100644 (file)
@@ -1,4 +1,4 @@
-/* Gnome-Streamer
+/* GStreamer
  * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
  *
  * This library is free software; you can redistribute it and/or
  * Boston, MA 02111-1307, USA.
  */
 
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
 #include <gst/gst.h>
 #include "mulaw-decode.h"
 #include "mulaw-conversion.h"
 
 extern GstPadTemplate *mulawdec_src_template, *mulawdec_sink_template;
 
+/* elementfactory information */
+static GstElementDetails mulawdec_details = {
+  "Mu Law to PCM conversion",
+  "Codec/Decoder/Audio",
+  "Convert 8bit mu law to 16bit PCM",
+  "Zaheer Merali <zaheer@bellworldwide.net>"
+};
 
 /* Stereo signals and args */
 enum {
@@ -35,44 +45,45 @@ enum {
 };
 
 static void            gst_mulawdec_class_init         (GstMuLawDecClass *klass);
+static void            gst_mulawdec_base_init          (GstMuLawDecClass *klass);
 static void            gst_mulawdec_init                       (GstMuLawDec *mulawdec);
 
 static void            gst_mulawdec_set_property                       (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
 static void            gst_mulawdec_get_property                       (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
 
-static void            gst_mulawdec_chain                      (GstPad *pad, GstBuffer *buf);
+static void            gst_mulawdec_chain                      (GstPad *pad, GstData *_data);
 
 
 static GstElementClass *parent_class = NULL;
-//static guint gst_stereo_signals[LAST_SIGNAL] = { 0 };
+/*static guint gst_stereo_signals[LAST_SIGNAL] = { 0 };*/
+
 
-static GstPadNegotiateReturn
-mulawdec_negotiate_sink (GstPad *pad, GstCaps **caps, gint counter)
+static GstPadLinkReturn
+mulawdec_link (GstPad *pad, const GstCaps *caps)
 {
   GstCaps* tempcaps;
+  gint rate, channels;
+  GstStructure *structure;
+  gboolean ret;
   
-  GstMuLawDec* mulawdec=GST_MULAWDEC (GST_OBJECT_PARENT (pad));
+  GstMuLawDec* mulawdec = GST_MULAWDEC (GST_OBJECT_PARENT (pad));
   
-  if (*caps==NULL) 
-    return GST_PAD_NEGOTIATE_FAIL;
-
-  tempcaps = gst_caps_copy(*caps);
-
-  gst_caps_set(tempcaps,"format",GST_PROPS_STRING("int"));
-  gst_caps_set(tempcaps,"law",GST_PROPS_INT(0));
-  gst_caps_set(tempcaps,"depth",GST_PROPS_INT(16));
-  gst_caps_set(tempcaps,"width",GST_PROPS_INT(16));
-  gst_caps_set(tempcaps,"signed",GST_PROPS_BOOLEAN(TRUE));
-
-  if (gst_pad_set_caps (mulawdec->srcpad, tempcaps))
-  {
-    return GST_PAD_NEGOTIATE_AGREE;
-  }
-  else {
-    gst_caps_unref (tempcaps);
-    return GST_PAD_NEGOTIATE_FAIL;
-  }
-}              
+  structure = gst_caps_get_structure (caps, 0);
+  ret = gst_structure_get_int (structure, "rate", &rate);
+  ret = gst_structure_get_int (structure, "channels", &channels);
+  if (!ret) return GST_PAD_LINK_REFUSED;
+
+  tempcaps = gst_caps_new_simple ("audio/x-mulaw",
+      "depth",    G_TYPE_INT, 16,
+      "width",    G_TYPE_INT, 16,
+      "signed",   G_TYPE_BOOLEAN, TRUE,
+      "endianness",    G_TYPE_INT, G_BYTE_ORDER,
+      "rate",     G_TYPE_INT, rate,
+      "channels", G_TYPE_INT, channels,
+      NULL);
+
+  return gst_pad_try_set_caps (mulawdec->srcpad, tempcaps);
+}
 
 GType
 gst_mulawdec_get_type(void) {
@@ -80,7 +91,8 @@ gst_mulawdec_get_type(void) {
 
   if (!mulawdec_type) {
     static const GTypeInfo mulawdec_info = {
-      sizeof(GstMuLawDecClass),      NULL,
+      sizeof(GstMuLawDecClass),
+      (GBaseInitFunc)gst_mulawdec_base_init,
       NULL,
       (GClassInitFunc)gst_mulawdec_class_init,
       NULL,
@@ -95,6 +107,16 @@ gst_mulawdec_get_type(void) {
 }
 
 static void
+gst_mulawdec_base_init (GstMuLawDecClass *klass)
+{
+  GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+
+  gst_element_class_add_pad_template (element_class, mulawdec_src_template);
+  gst_element_class_add_pad_template (element_class, mulawdec_sink_template);
+  gst_element_class_set_details (element_class, &mulawdec_details);
+}
+
+static void
 gst_mulawdec_class_init (GstMuLawDecClass *klass)
 {
   GObjectClass *gobject_class;
@@ -114,7 +136,7 @@ gst_mulawdec_init (GstMuLawDec *mulawdec)
 {
   mulawdec->sinkpad = gst_pad_new_from_template(mulawdec_sink_template,"sink");
   mulawdec->srcpad = gst_pad_new_from_template(mulawdec_src_template,"src");
-  gst_pad_set_negotiate_function(mulawdec->sinkpad, mulawdec_negotiate_sink);
+  gst_pad_set_link_function(mulawdec->sinkpad, mulawdec_link);
 
   gst_element_add_pad(GST_ELEMENT(mulawdec),mulawdec->sinkpad);
   gst_pad_set_chain_function(mulawdec->sinkpad,gst_mulawdec_chain);
@@ -122,8 +144,9 @@ gst_mulawdec_init (GstMuLawDec *mulawdec)
 }
 
 static void
-gst_mulawdec_chain (GstPad *pad,GstBuffer *buf)
+gst_mulawdec_chain (GstPad *pad,GstData *_data)
 {
+  GstBuffer *buf = GST_BUFFER (_data);
   GstMuLawDec *mulawdec;
   gint16 *linear_data;
   guint8 *mulaw_data;
@@ -146,7 +169,7 @@ gst_mulawdec_chain (GstPad *pad,GstBuffer *buf)
   mulaw_decode(mulaw_data,linear_data,GST_BUFFER_SIZE(buf));
 
   gst_buffer_unref(buf);
-  gst_pad_push(mulawdec->srcpad,outbuf);
+  gst_pad_push(mulawdec->srcpad,GST_DATA (outbuf));
 }
 
 static void