GstAudioInfo * info);
static GstFlowReturn gst_vorbis_enc_handle_frame (GstAudioEncoder * enc,
GstBuffer * in_buf);
-static GstCaps *gst_vorbis_enc_getcaps (GstAudioEncoder * enc);
+static GstCaps *gst_vorbis_enc_getcaps (GstAudioEncoder * enc,
+ GstCaps * filter);
static gboolean gst_vorbis_enc_sink_event (GstAudioEncoder * enc,
GstEvent * event);
+ static GstFlowReturn gst_vorbis_enc_pre_push (GstAudioEncoder * enc,
+ GstBuffer ** buffer);
static gboolean gst_vorbis_enc_setup (GstVorbisEnc * vorbisenc);
g_param_spec_string ("last-message", "last-message",
"The last status message", NULL,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&vorbis_enc_src_factory));
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&vorbis_enc_sink_factory));
+
+ gst_element_class_set_details_simple (gstelement_class,
+ "Vorbis audio encoder", "Codec/Encoder/Audio",
+ "Encodes audio in Vorbis format",
+ "Monty <monty@xiph.org>, " "Wim Taymans <wim@fluendo.com>");
+
+ base_class->start = GST_DEBUG_FUNCPTR (gst_vorbis_enc_start);
+ base_class->stop = GST_DEBUG_FUNCPTR (gst_vorbis_enc_stop);
+ base_class->set_format = GST_DEBUG_FUNCPTR (gst_vorbis_enc_set_format);
+ base_class->handle_frame = GST_DEBUG_FUNCPTR (gst_vorbis_enc_handle_frame);
+ base_class->getcaps = GST_DEBUG_FUNCPTR (gst_vorbis_enc_getcaps);
+ base_class->event = GST_DEBUG_FUNCPTR (gst_vorbis_enc_sink_event);
++ base_class->pre_push = GST_DEBUG_FUNCPTR (gst_vorbis_enc_pre_push);
}
static void
/* negotiate with these caps */
GST_DEBUG_OBJECT (vorbisenc, "here are the caps: %" GST_PTR_FORMAT, caps);
-
- gst_buffer_set_caps (buf1, caps);
- gst_buffer_set_caps (buf2, caps);
- gst_buffer_set_caps (buf3, caps);
gst_pad_set_caps (GST_AUDIO_ENCODER_SRC_PAD (vorbisenc), caps);
+ gst_caps_unref (caps);
- /* push out buffers */
- /* push_buffer takes the reference even for failure */
- if ((ret = gst_vorbis_enc_push_header (vorbisenc, buf1)) != GST_FLOW_OK)
- goto failed_header_push;
- if ((ret = gst_vorbis_enc_push_header (vorbisenc, buf2)) != GST_FLOW_OK) {
- buf2 = NULL;
- goto failed_header_push;
- }
- if ((ret = gst_vorbis_enc_push_header (vorbisenc, buf3)) != GST_FLOW_OK) {
- buf3 = NULL;
- goto failed_header_push;
- }
+ /* store buffers for later pre_push sending */
+ g_slist_foreach (vorbisenc->headers, (GFunc) gst_buffer_unref, NULL);
+ vorbisenc->headers = NULL;
+ GST_DEBUG_OBJECT (vorbisenc, "storing header buffers");
+ vorbisenc->headers = g_slist_prepend (vorbisenc->headers, buf3);
+ vorbisenc->headers = g_slist_prepend (vorbisenc->headers, buf2);
+ vorbisenc->headers = g_slist_prepend (vorbisenc->headers, buf1);
vorbisenc->header_sent = TRUE;
}