853a56f8c59de13028d64349bafbaef1b5fe2100
[platform/upstream/gstreamer.git] / gst / law / alaw-encode.c
1 /* GStreamer
2  * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 02111-1307, USA.
18  */
19
20 #include <gst/gst.h>
21 #include "alaw-encode.h"
22 #include "mulaw-conversion.h"
23 #include "alaw-conversion.h"
24
25 extern GstPadTemplate *alawenc_src_template, *alawenc_sink_template;
26
27
28 /* Stereo signals and args */
29 enum {
30   /* FILL ME */
31   LAST_SIGNAL
32 };
33
34 enum {
35   ARG_0
36 };
37
38 static void             gst_alawenc_class_init          (GstALawEncClass *klass);
39 static void             gst_alawenc_init                        (GstALawEnc *alawenc);
40
41 static void             gst_alawenc_set_property                        (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
42 static void             gst_alawenc_get_property                        (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
43
44 static void             gst_alawenc_chain                       (GstPad *pad, GstBuffer *buf);
45
46
47 static GstElementClass *parent_class = NULL;
48 /*static guint gst_stereo_signals[LAST_SIGNAL] = { 0 }; */
49
50 /*
51 static GstPadNegotiateReturn
52 alawenc_negotiate_sink (GstPad *pad, GstCaps **caps, gint counter)
53 {
54   GstCaps* tempcaps;
55   
56   GstALawEnc* alawenc=GST_ALAWENC (GST_OBJECT_PARENT (pad));
57   
58   if (*caps==NULL) 
59     return GST_PAD_NEGOTIATE_FAIL;
60
61   tempcaps = gst_caps_copy(*caps);
62
63   gst_caps_set(tempcaps,"format",GST_PROPS_STRING("int"));
64   gst_caps_set(tempcaps,"law",GST_PROPS_INT(2));
65   gst_caps_set(tempcaps,"depth",GST_PROPS_INT(8));
66   gst_caps_set(tempcaps,"width",GST_PROPS_INT(8));
67   gst_caps_set(tempcaps,"signed",GST_PROPS_BOOLEAN(FALSE));
68
69   if (gst_pad_try_set_caps (alawenc->srcpad, tempcaps))
70   {
71     return GST_PAD_NEGOTIATE_AGREE;
72   }
73   else {
74     gst_caps_unref (tempcaps);
75     return GST_PAD_NEGOTIATE_FAIL;
76   }
77 }               
78 */
79
80 GType
81 gst_alawenc_get_type(void) {
82   static GType alawenc_type = 0;
83
84   if (!alawenc_type) {
85     static const GTypeInfo alawenc_info = {
86       sizeof(GstALawEncClass),      NULL,
87       NULL,
88       (GClassInitFunc)gst_alawenc_class_init,
89       NULL,
90       NULL,
91       sizeof(GstALawEnc),
92       0,
93       (GInstanceInitFunc)gst_alawenc_init,
94     };
95     alawenc_type = g_type_register_static(GST_TYPE_ELEMENT, "GstALawEnc", &alawenc_info, 0);
96   }
97   return alawenc_type;
98 }
99
100 static void
101 gst_alawenc_class_init (GstALawEncClass *klass)
102 {
103   GObjectClass *gobject_class;
104   GstElementClass *gstelement_class;
105
106   gobject_class = (GObjectClass*)klass;
107   gstelement_class = (GstElementClass*)klass;
108
109   parent_class = g_type_class_ref(GST_TYPE_ELEMENT);
110
111   gobject_class->set_property = gst_alawenc_set_property;
112   gobject_class->get_property = gst_alawenc_get_property;
113 }
114
115 static void
116 gst_alawenc_init (GstALawEnc *alawenc)
117 {
118   alawenc->sinkpad = gst_pad_new_from_template(alawenc_sink_template,"sink");
119   alawenc->srcpad = gst_pad_new_from_template(alawenc_src_template,"src");
120   /*gst_pad_set_negotiate_function(alawenc->sinkpad, alawenc_negotiate_sink);*/
121
122   gst_element_add_pad(GST_ELEMENT(alawenc),alawenc->sinkpad);
123   gst_pad_set_chain_function(alawenc->sinkpad,gst_alawenc_chain);
124   gst_element_add_pad(GST_ELEMENT(alawenc),alawenc->srcpad);
125 }
126
127 static void
128 gst_alawenc_chain (GstPad *pad,GstBuffer *buf)
129 {
130   GstALawEnc *alawenc;
131   gint16 *linear_data;
132   guint8 *alaw_data;
133   GstBuffer* outbuf;
134
135   g_return_if_fail(pad != NULL);
136   g_return_if_fail(GST_IS_PAD(pad));
137   g_return_if_fail(buf != NULL);
138
139   alawenc = GST_ALAWENC(GST_OBJECT_PARENT (pad));
140   g_return_if_fail(alawenc != NULL);
141   g_return_if_fail(GST_IS_ALAWENC(alawenc));
142
143   linear_data = (gint16 *)GST_BUFFER_DATA(buf);
144   outbuf=gst_buffer_new();
145   GST_BUFFER_DATA(outbuf) = (gchar*)g_new(gint16,GST_BUFFER_SIZE(buf)/4);
146   GST_BUFFER_SIZE(outbuf) = GST_BUFFER_SIZE(buf)/2;
147
148   alaw_data = (guint8*)GST_BUFFER_DATA(outbuf);
149   mulaw_encode(linear_data,alaw_data,GST_BUFFER_SIZE(outbuf));
150   isdn_audio_ulaw2alaw(alaw_data,GST_BUFFER_SIZE(outbuf));
151   gst_buffer_unref(buf);
152   gst_pad_push(alawenc->srcpad,outbuf);
153 }
154
155 static void
156 gst_alawenc_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
157 {
158   GstALawEnc *alawenc;
159
160   /* it's not null if we got it, but it might not be ours */
161   g_return_if_fail(GST_IS_ALAWENC(object));
162   alawenc = GST_ALAWENC(object);
163
164   switch (prop_id) {
165     default:
166       break;
167   }
168 }
169
170 static void
171 gst_alawenc_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
172 {
173   GstALawEnc *alawenc;
174
175   /* it's not null if we got it, but it might not be ours */
176   g_return_if_fail(GST_IS_ALAWENC(object));
177   alawenc = GST_ALAWENC(object);
178
179   switch (prop_id) {
180     default:
181       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
182       break;
183   }
184 }