static gboolean gst_gsmenc_stop (GstAudioEncoder * enc) { GstGSMEnc *gsmenc = GST_GSMENC (enc); GST_DEBUG_OBJECT (enc, "stop"); gsm_destroy (gsmenc->state); return TRUE; }
static void gst_gsmenc_finalize (GObject * object) { GstGSMEnc *gsmenc; gsmenc = GST_GSMENC (object); g_object_unref (gsmenc->adapter); gsm_destroy (gsmenc->state); G_OBJECT_CLASS (parent_class)->finalize (object); }
static gboolean gst_gsmenc_start (GstAudioEncoder * enc) { GstGSMEnc *gsmenc = GST_GSMENC (enc); gint use_wav49; GST_DEBUG_OBJECT (enc, "start"); gsmenc->state = gsm_create (); /* turn off WAV49 handling */ use_wav49 = 0; gsm_option (gsmenc->state, GSM_OPT_WAV49, &use_wav49); return TRUE; }
static gboolean gst_gsmenc_setcaps (GstPad * pad, GstCaps * caps) { GstGSMEnc *gsmenc; GstCaps *srccaps; gsmenc = GST_GSMENC (gst_pad_get_parent (pad)); srccaps = gst_static_pad_template_get_caps (&gsmenc_src_template); gst_pad_set_caps (gsmenc->srcpad, srccaps); gst_object_unref (gsmenc); return TRUE; }
static GstFlowReturn gst_gsmenc_handle_frame (GstAudioEncoder * benc, GstBuffer * buffer) { GstGSMEnc *gsmenc; gsm_signal *data; GstFlowReturn ret = GST_FLOW_OK; GstBuffer *outbuf; GstMapInfo map, omap; gsmenc = GST_GSMENC (benc); /* we don't deal with squeezing remnants, so simply discard those */ if (G_UNLIKELY (buffer == NULL)) { GST_DEBUG_OBJECT (gsmenc, "no data"); goto done; } gst_buffer_map (buffer, &map, GST_MAP_READ); if (G_UNLIKELY (map.size < 320)) { GST_DEBUG_OBJECT (gsmenc, "discarding trailing data %d", (gint) map.size); gst_buffer_unmap (buffer, &map); ret = gst_audio_encoder_finish_frame (benc, NULL, -1); goto done; } outbuf = gst_buffer_new_and_alloc (33 * sizeof (gsm_byte)); gst_buffer_map (outbuf, &omap, GST_MAP_WRITE); /* encode 160 16-bit samples into 33 bytes */ data = (gsm_signal *) map.data; gsm_encode (gsmenc->state, data, (gsm_byte *) omap.data); GST_LOG_OBJECT (gsmenc, "encoded to %d bytes", (gint) omap.size); gst_buffer_unmap (buffer, &map); gst_buffer_unmap (buffer, &omap); ret = gst_audio_encoder_finish_frame (benc, outbuf, 160); done: return ret; }
static GstFlowReturn gst_gsmenc_chain (GstPad * pad, GstBuffer * buf) { GstGSMEnc *gsmenc; gsm_signal *data; GstFlowReturn ret = GST_FLOW_OK; gsmenc = GST_GSMENC (gst_pad_get_parent (pad)); if (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DISCONT)) { gst_adapter_clear (gsmenc->adapter); } gst_adapter_push (gsmenc->adapter, buf); while (gst_adapter_available (gsmenc->adapter) >= 320) { GstBuffer *outbuf; outbuf = gst_buffer_new_and_alloc (33 * sizeof (gsm_byte)); GST_BUFFER_TIMESTAMP (outbuf) = gsmenc->next_ts; GST_BUFFER_DURATION (outbuf) = 20 * GST_MSECOND; gsmenc->next_ts += 20 * GST_MSECOND; /* encode 160 16-bit samples into 33 bytes */ data = (gsm_signal *) gst_adapter_peek (gsmenc->adapter, 320); gsm_encode (gsmenc->state, data, (gsm_byte *) GST_BUFFER_DATA (outbuf)); gst_adapter_flush (gsmenc->adapter, 320); gst_buffer_set_caps (outbuf, GST_PAD_CAPS (gsmenc->srcpad)); GST_DEBUG_OBJECT (gsmenc, "Pushing buffer of size %d", GST_BUFFER_SIZE (outbuf)); ret = gst_pad_push (gsmenc->srcpad, outbuf); } gst_object_unref (gsmenc); return ret; }