audioencoder: Add negotiate vfunc that is used to negotiate with downstream
authorSebastian Dröge <sebastian.droege@collabora.co.uk>
Thu, 9 Aug 2012 13:27:33 +0000 (15:27 +0200)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Thu, 9 Aug 2012 13:27:33 +0000 (15:27 +0200)
The default implementation negotiates a buffer pool and allocator
with downstream.

gst-libs/gst/audio/gstaudioencoder.c
gst-libs/gst/audio/gstaudioencoder.h

index c2718b1..303ef94 100644 (file)
@@ -335,6 +335,7 @@ static gboolean gst_audio_encoder_decide_allocation_default (GstAudioEncoder *
     enc, GstQuery * query);
 static gboolean gst_audio_encoder_propose_allocation_default (GstAudioEncoder *
     enc, GstQuery * query);
+static gboolean gst_audio_encoder_negotiate_default (GstAudioEncoder * enc);
 
 static void
 gst_audio_encoder_class_init (GstAudioEncoderClass * klass)
@@ -383,6 +384,7 @@ gst_audio_encoder_class_init (GstAudioEncoderClass * klass)
   klass->src_event = gst_audio_encoder_src_event_default;
   klass->propose_allocation = gst_audio_encoder_propose_allocation_default;
   klass->decide_allocation = gst_audio_encoder_decide_allocation_default;
+  klass->negotiate = gst_audio_encoder_negotiate_default;
 }
 
 static void
@@ -2510,16 +2512,8 @@ gst_audio_encoder_merge_tags (GstAudioEncoder * enc,
   GST_OBJECT_UNLOCK (enc);
 }
 
-/**
- * gst_audio_encoder_negotiate:
- * @dec: a #GstAudioEncoder
- *
- * Negotiate with downstreame elements to currently configured #GstCaps.
- *
- * Returns: #TRUE if the negotiation succeeded, else #FALSE.
- */
-gboolean
-gst_audio_encoder_negotiate (GstAudioEncoder * enc)
+static gboolean
+gst_audio_encoder_negotiate_default (GstAudioEncoder * enc)
 {
   GstAudioEncoderClass *klass;
   gboolean res = FALSE;
@@ -2533,8 +2527,6 @@ gst_audio_encoder_negotiate (GstAudioEncoder * enc)
 
   klass = GST_AUDIO_ENCODER_GET_CLASS (enc);
 
-  GST_AUDIO_ENCODER_STREAM_LOCK (enc);
-
   caps = enc->priv->ctx.caps;
 
   GST_DEBUG_OBJECT (enc, "Setting srcpad caps %" GST_PTR_FORMAT, caps);
@@ -2576,8 +2568,6 @@ done:
   if (query)
     gst_query_unref (query);
 
-  GST_AUDIO_ENCODER_STREAM_UNLOCK (enc);
-
   return res;
 
   /* ERRORS */
@@ -2588,6 +2578,32 @@ no_decide_allocation:
   }
 }
 
+/**
+ * gst_audio_encoder_negotiate:
+ * @dec: a #GstAudioEncoder
+ *
+ * Negotiate with downstreame elements to currently configured #GstCaps.
+ *
+ * Returns: #TRUE if the negotiation succeeded, else #FALSE.
+ */
+gboolean
+gst_audio_encoder_negotiate (GstAudioEncoder * enc)
+{
+  GstAudioEncoderClass *klass;
+  gboolean ret = TRUE;
+
+  g_return_val_if_fail (GST_IS_AUDIO_ENCODER (enc), FALSE);
+
+  klass = GST_AUDIO_ENCODER_GET_CLASS (enc);
+
+  GST_AUDIO_ENCODER_STREAM_LOCK (enc);
+  if (klass->negotiate)
+    ret = klass->negotiate (enc);
+  GST_AUDIO_ENCODER_STREAM_UNLOCK (enc);
+
+  return ret;
+}
+
 /*
  * gst_audio_encoder_set_output_format:
  * @enc: a #GstAudioEncoder
index 1f9bf2f..840f02e 100644 (file)
@@ -157,6 +157,8 @@ struct _GstAudioEncoder {
  * @close:          Optional.
  *                  Called when the element changes to GST_STATE_NULL.
  *                  Allows closing external resources.
+ * @negotiate:      Optional.
+ *                  Negotiate with downstream and configure buffer pools, etc.
  * @decide_allocation: Optional.
  *                     Setup the allocation parameters for allocating output
  *                     buffers. The passed in query contains the result of the
@@ -200,6 +202,8 @@ struct _GstAudioEncoderClass {
 
   gboolean      (*close)              (GstAudioEncoder *enc);
 
+  gboolean      (*negotiate)          (GstAudioEncoder *enc);
+
   gboolean      (*decide_allocation)  (GstAudioEncoder *enc, GstQuery *query);
 
   gboolean      (*propose_allocation) (GstAudioEncoder * enc,