static GstFlowReturn gst_mulawenc_handle_frame (GstAudioEncoder * audioenc, GstBuffer * buffer) { GstMuLawEnc *mulawenc; GstMapInfo inmap, outmap; gint16 *linear_data; gsize linear_size; guint8 *mulaw_data; guint mulaw_size; GstBuffer *outbuf; GstFlowReturn ret; if (!buffer) { ret = GST_FLOW_OK; goto done; } mulawenc = GST_MULAWENC (audioenc); if (!mulawenc->rate || !mulawenc->channels) goto not_negotiated; gst_buffer_map (buffer, &inmap, GST_MAP_READ); linear_data = (gint16 *) inmap.data; linear_size = inmap.size; mulaw_size = linear_size / 2; outbuf = gst_audio_encoder_allocate_output_buffer (audioenc, mulaw_size); g_assert (outbuf); gst_buffer_map (outbuf, &outmap, GST_MAP_WRITE); mulaw_data = outmap.data; mulaw_encode (linear_data, mulaw_data, mulaw_size); gst_buffer_unmap (outbuf, &outmap); gst_buffer_unmap (buffer, &inmap); ret = gst_audio_encoder_finish_frame (audioenc, outbuf, -1); done: return ret; not_negotiated: { GST_DEBUG_OBJECT (mulawenc, "no format negotiated"); ret = GST_FLOW_NOT_NEGOTIATED; goto done; } }
static GstFlowReturn gst_mulawenc_chain (GstPad * pad, GstBuffer * buffer) { GstMuLawEnc *mulawenc; gint16 *linear_data; guint linear_size; guint8 *mulaw_data; guint mulaw_size; GstBuffer *outbuf; GstFlowReturn ret; GstClockTime timestamp, duration; mulawenc = GST_MULAWENC (gst_pad_get_parent (pad)); if (!mulawenc->rate || !mulawenc->channels) goto not_negotiated; linear_data = (gint16 *) GST_BUFFER_DATA (buffer); linear_size = GST_BUFFER_SIZE (buffer); mulaw_size = linear_size / 2; timestamp = GST_BUFFER_TIMESTAMP (buffer); duration = GST_BUFFER_DURATION (buffer); ret = gst_pad_alloc_buffer_and_set_caps (mulawenc->srcpad, GST_BUFFER_OFFSET_NONE, mulaw_size, GST_PAD_CAPS (mulawenc->srcpad), &outbuf); if (ret != GST_FLOW_OK) goto alloc_failed; if (duration == -1) { duration = gst_util_uint64_scale_int (mulaw_size, GST_SECOND, mulawenc->rate * mulawenc->channels); } if (GST_BUFFER_SIZE (outbuf) < mulaw_size) { /* pad-alloc can suggest a smaller size */ gst_buffer_unref (outbuf); outbuf = gst_buffer_new_and_alloc (mulaw_size); } mulaw_data = (guint8 *) GST_BUFFER_DATA (outbuf); /* copy discont flag */ if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT)) GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); GST_BUFFER_TIMESTAMP (outbuf) = timestamp; GST_BUFFER_DURATION (outbuf) = duration; gst_buffer_set_caps (outbuf, GST_PAD_CAPS (mulawenc->srcpad)); mulaw_encode (linear_data, mulaw_data, mulaw_size); gst_buffer_unref (buffer); ret = gst_pad_push (mulawenc->srcpad, outbuf); done: gst_object_unref (mulawenc); return ret; not_negotiated: { GST_DEBUG_OBJECT (mulawenc, "no format negotiated"); ret = GST_FLOW_NOT_NEGOTIATED; gst_buffer_unref (buffer); goto done; } alloc_failed: { GST_DEBUG_OBJECT (mulawenc, "pad alloc failed"); gst_buffer_unref (buffer); goto done; } }