Merge branch 'master' into 0.11
authorWim Taymans <wim.taymans@collabora.co.uk>
Mon, 10 Oct 2011 09:45:49 +0000 (11:45 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Mon, 10 Oct 2011 09:45:49 +0000 (11:45 +0200)
Conflicts:
ext/vorbis/gstvorbisenc.c

1  2 
ext/vorbis/gstvorbisenc.c

@@@ -102,10 -103,11 +102,12 @@@ static gboolean gst_vorbis_enc_set_form
      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);
  
@@@ -164,23 -197,6 +166,24 @@@ gst_vorbis_enc_class_init (GstVorbisEnc
        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
@@@ -720,20 -743,20 +725,16 @@@ gst_vorbis_enc_handle_frame (GstAudioEn
  
      /* 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;
    }