static void gst_amrnbdec_finalize (GObject * object);
-#define _do_init(bla) \
- GST_DEBUG_CATEGORY_INIT (gst_amrnbdec_debug, "amrnbdec", 0, "AMR-NB audio decoder");
-
-GST_BOILERPLATE_FULL (GstAmrnbDec, gst_amrnbdec, GstElement, GST_TYPE_ELEMENT,
- _do_init);
-
-static void
-gst_amrnbdec_base_init (gpointer klass)
-{
- GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
-
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_template));
-
- gst_element_class_set_details_simple (element_class, "AMR-NB audio decoder",
- "Codec/Decoder/Audio",
- "Adaptive Multi-Rate Narrow-Band audio decoder",
- "GStreamer maintainers <gstreamer-devel@lists.sourceforge.net>");
-}
+#define gst_amrnbdec_parent_class parent_class
+G_DEFINE_TYPE (GstAmrnbDec, gst_amrnbdec, GST_TYPE_ELEMENT);
static void
gst_amrnbdec_class_init (GstAmrnbDecClass * klass)
G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS));
element_class->change_state = GST_DEBUG_FUNCPTR (gst_amrnbdec_state_change);
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&sink_template));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&src_template));
+
+ gst_element_class_set_details_simple (element_class, "AMR-NB audio decoder",
+ "Codec/Decoder/Audio",
+ "Adaptive Multi-Rate Narrow-Band audio decoder",
+ "GStreamer maintainers <gstreamer-devel@lists.sourceforge.net>");
+
+ GST_DEBUG_CATEGORY_INIT (gst_amrnbdec_debug, "amrnbdec", 0,
+ "AMR-NB audio decoder");
}
static void
-gst_amrnbdec_init (GstAmrnbDec * amrnbdec, GstAmrnbDecClass * klass)
+gst_amrnbdec_init (GstAmrnbDec * amrnbdec)
{
/* create the sink pad */
amrnbdec->sinkpad = gst_pad_new_from_static_template (&sink_template, "sink");
- gst_pad_set_setcaps_function (amrnbdec->sinkpad, gst_amrnbdec_setcaps);
gst_pad_set_event_function (amrnbdec->sinkpad, gst_amrnbdec_event);
gst_pad_set_chain_function (amrnbdec->sinkpad, gst_amrnbdec_chain);
gst_element_add_pad (GST_ELEMENT (amrnbdec), amrnbdec->sinkpad);
amrnbdec = GST_AMRNBDEC (gst_pad_get_parent (pad));
switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_CAPS:
+ {
+ GstCaps *caps;
+
+ gst_event_parse_caps (event, &caps);
+ ret = gst_amrnbdec_setcaps (pad, caps);
+ gst_event_unref (event);
+ break;
+ }
case GST_EVENT_FLUSH_START:
ret = gst_pad_push_event (amrnbdec->srcpad, event);
break;
gst_adapter_clear (amrnbdec->adapter);
ret = gst_pad_push_event (amrnbdec->srcpad, event);
break;
- case GST_EVENT_NEWSEGMENT:
+ case GST_EVENT_SEGMENT:
{
- GstFormat format;
- gdouble rate, arate;
- gint64 start, stop, time;
- gboolean update;
+ GstSegment seg;
- gst_event_parse_new_segment_full (event, &update, &rate, &arate, &format,
- &start, &stop, &time);
+ gst_event_copy_segment (event, &seg);
/* we need time for now */
- if (format != GST_FORMAT_TIME)
+ if (seg.format != GST_FORMAT_TIME)
goto newseg_wrong_format;
- GST_DEBUG_OBJECT (amrnbdec,
- "newsegment: update %d, rate %g, arate %g, start %" GST_TIME_FORMAT
- ", stop %" GST_TIME_FORMAT ", time %" GST_TIME_FORMAT,
- update, rate, arate, GST_TIME_ARGS (start), GST_TIME_ARGS (stop),
- GST_TIME_ARGS (time));
+ GST_DEBUG_OBJECT (amrnbdec, "segment: %" GST_SEGMENT_FORMAT, &seg);
/* now configure the values */
- gst_segment_set_newsegment_full (&amrnbdec->segment, update,
- rate, arate, format, start, stop, time);
+ amrnbdec->segment = seg;
+
ret = gst_pad_push_event (amrnbdec->srcpad, event);
- }
break;
+ }
default:
ret = gst_pad_push_event (amrnbdec->srcpad, event);
break;
while (TRUE) {
GstBuffer *out;
+ guint8 head[1];
guint8 *data;
+ short *out_data;
gint block, mode;
/* need to peek data to get the size */
if (gst_adapter_available (amrnbdec->adapter) < 1)
break;
- data = (guint8 *) gst_adapter_peek (amrnbdec->adapter, 1);
+ gst_adapter_copy (amrnbdec->adapter, head, 0, 1);
/* get size */
switch (amrnbdec->variant) {
case GST_AMRNB_VARIANT_IF1:
- mode = (data[0] >> 3) & 0x0F;
+ mode = (head[0] >> 3) & 0x0F;
block = block_size_if1[mode] + 1;
break;
case GST_AMRNB_VARIANT_IF2:
- mode = data[0] & 0x0F;
+ mode = head[0] & 0x0F;
block = block_size_if2[mode] + 1;
break;
default:
amrnbdec->discont = FALSE;
}
- gst_buffer_set_caps (out, GST_PAD_CAPS (amrnbdec->srcpad));
-
/* decode */
- Decoder_Interface_Decode (amrnbdec->handle, data,
- (short *) GST_BUFFER_DATA (out), 0);
+ out_data = gst_buffer_map (out, NULL, NULL, GST_MAP_WRITE);
+ Decoder_Interface_Decode (amrnbdec->handle, data, out_data, 0);
+ gst_buffer_unmap (out, out_data, -1);
g_free (data);
/* send out */
static GstFlowReturn gst_amrnbenc_handle_frame (GstAudioEncoder * enc,
GstBuffer * in_buf);
-GST_BOILERPLATE (GstAmrnbEnc, gst_amrnbenc, GstAudioEncoder,
- GST_TYPE_AUDIO_ENCODER);
+#define gst_amrnbenc_parent_class parent_class
+G_DEFINE_TYPE (GstAmrnbEnc, gst_amrnbenc, GST_TYPE_AUDIO_ENCODER);
static void
gst_amrnbenc_set_property (GObject * object, guint prop_id,
}
static void
-gst_amrnbenc_base_init (gpointer klass)
-{
- GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
-
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_template));
-
- gst_element_class_set_details_simple (element_class, "AMR-NB audio encoder",
- "Codec/Encoder/Audio",
- "Adaptive Multi-Rate Narrow-Band audio encoder",
- "Wim Taymans <wim.taymans@gmail.com>");
-}
-
-static void
gst_amrnbenc_class_init (GstAmrnbEncClass * klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
GstAudioEncoderClass *base_class = GST_AUDIO_ENCODER_CLASS (klass);
object_class->set_property = gst_amrnbenc_set_property;
BANDMODE_DEFAULT,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&sink_template));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&src_template));
+
+ gst_element_class_set_details_simple (element_class, "AMR-NB audio encoder",
+ "Codec/Encoder/Audio",
+ "Adaptive Multi-Rate Narrow-Band audio encoder",
+ "Wim Taymans <wim.taymans@gmail.com>");
+
GST_DEBUG_CATEGORY_INIT (gst_amrnbenc_debug, "amrnbenc", 0,
"AMR-NB audio encoder");
}
static void
-gst_amrnbenc_init (GstAmrnbEnc * amrnbenc, GstAmrnbEncClass * klass)
+gst_amrnbenc_init (GstAmrnbEnc * amrnbenc)
{
}
GstAmrnbEnc *amrnbenc;
GstFlowReturn ret;
GstBuffer *out;
- guint8 *data;
- gint outsize;
+ short *in_data;
+ guint8 *out_data;
+ gsize in_size, out_size;
amrnbenc = GST_AMRNBENC (enc);
return GST_FLOW_OK;
}
- if (G_UNLIKELY (GST_BUFFER_SIZE (buffer) < 320)) {
- GST_DEBUG_OBJECT (amrnbenc, "discarding trailing data %d",
- buffer ? GST_BUFFER_SIZE (buffer) : 0);
+ in_data = gst_buffer_map (buffer, &in_size, NULL, GST_MAP_READ);
+
+ if (G_UNLIKELY (in_size < 320)) {
+ gst_buffer_unmap (buffer, in_data, in_size);
+ GST_DEBUG_OBJECT (amrnbenc, "discarding trailing data %d", in_size);
return gst_audio_encoder_finish_frame (enc, NULL, -1);
}
out = gst_buffer_new_and_alloc (32);
/* AMR encoder actually writes into the source data buffers it gets */
/* should be able to handle that with what we are given */
- data = GST_BUFFER_DATA (buffer);
+ out_data = gst_buffer_map (buffer, NULL, NULL, GST_MAP_WRITE);
/* encode */
- outsize =
+ out_size =
Encoder_Interface_Encode (amrnbenc->handle, amrnbenc->bandmode,
- (short *) data, (guint8 *) GST_BUFFER_DATA (out), 0);
+ in_data, out_data, 0);
+ gst_buffer_unmap (out, out_data, out_size);
- GST_LOG_OBJECT (amrnbenc, "output data size %d", outsize);
+ GST_LOG_OBJECT (amrnbenc, "output data size %d", out_size);
- if (outsize) {
- GST_BUFFER_SIZE (out) = outsize;
+ if (out_size) {
ret = gst_audio_encoder_finish_frame (enc, out, 160);
} else {
/* should not happen (without dtx or so at least) */