summaryrefslogtreecommitdiffstats
path: root/gst/law/alaw-encode.c
diff options
context:
space:
mode:
Diffstat (limited to 'gst/law/alaw-encode.c')
-rw-r--r--gst/law/alaw-encode.c36
1 files changed, 23 insertions, 13 deletions
diff --git a/gst/law/alaw-encode.c b/gst/law/alaw-encode.c
index fbd7d669..991085da 100644
--- a/gst/law/alaw-encode.c
+++ b/gst/law/alaw-encode.c
@@ -269,40 +269,50 @@ gst_alawenc_chain (GstPad * pad, GstBuffer * buffer)
{
GstALawEnc *alawenc;
gint16 *linear_data;
+ guint linear_size;
guint8 *alaw_data;
+ guint alaw_size;
GstBuffer *outbuf;
- gint bufsize;
gint i;
+ GstFlowReturn ret;
- alawenc = GST_ALAWENC (GST_OBJECT_PARENT (pad));
+ alawenc = GST_ALAWENC (gst_pad_get_parent (pad));
if (!alawenc->rate || !alawenc->channels)
goto not_negotiated;
linear_data = (gint16 *) GST_BUFFER_DATA (buffer);
- bufsize = GST_BUFFER_SIZE (buffer) / 2;
- outbuf = gst_buffer_new_and_alloc (bufsize);
+ linear_size = GST_BUFFER_SIZE (buffer);
- GST_BUFFER_DURATION (outbuf) = GST_SECOND * (bufsize) /
- (alawenc->rate * alawenc->channels);
+ alaw_size = linear_size / 2;
+
+ outbuf = gst_buffer_new_and_alloc (alaw_size);
+ alaw_data = (guint8 *) GST_BUFFER_DATA (outbuf);
+
+ /* FIXME, just copy (and interpolate) timestamp */
+ GST_BUFFER_DURATION (outbuf) = gst_util_uint64_scale_int (alaw_size,
+ GST_SECOND, alawenc->rate * alawenc->channels);
GST_BUFFER_TIMESTAMP (outbuf) = alawenc->ts;
alawenc->ts += GST_BUFFER_DURATION (outbuf);
gst_buffer_set_caps (outbuf, GST_PAD_CAPS (alawenc->srcpad));
- alaw_data = (guint8 *) GST_BUFFER_DATA (outbuf);
- for (i = 0; i < GST_BUFFER_SIZE (outbuf); i++) {
- *alaw_data = s16_to_alaw (*linear_data);
- alaw_data++;
- linear_data++;
+ for (i = 0; i < alaw_size; i++) {
+ alaw_data[i] = s16_to_alaw (linear_data[i]);
}
gst_buffer_unref (buffer);
- return gst_pad_push (alawenc->srcpad, outbuf);
+ ret = gst_pad_push (alawenc->srcpad, outbuf);
+
+done:
+ gst_object_unref (alawenc);
+
+ return ret;
not_negotiated:
{
- return GST_FLOW_NOT_NEGOTIATED;
+ ret = GST_FLOW_NOT_NEGOTIATED;
+ goto done;
}
}