From e37bb460bd751fac9e4f43caed27e76b96baf946 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebastian=20Dr=C3=B6ge?= Date: Thu, 9 Aug 2012 14:39:18 +0200 Subject: [PATCH] videoencoder: Add negotiate vfunc that is used to negotiate with downstream The default implementation negotiates a buffer pool and allocator with downstream. --- gst-libs/gst/video/gstvideoencoder.c | 40 +++++++++++++++++++++++++++--------- gst-libs/gst/video/gstvideoencoder.h | 4 ++++ 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/gst-libs/gst/video/gstvideoencoder.c b/gst-libs/gst/video/gstvideoencoder.c index 5b96569..85a8a8d 100644 --- a/gst-libs/gst/video/gstvideoencoder.c +++ b/gst-libs/gst/video/gstvideoencoder.c @@ -231,6 +231,7 @@ static gboolean gst_video_encoder_decide_allocation_default (GstVideoEncoder * encoder, GstQuery * query); static gboolean gst_video_encoder_propose_allocation_default (GstVideoEncoder * encoder, GstQuery * query); +static gboolean gst_video_encoder_negotiate_default (GstVideoEncoder * encoder); /* we can't use G_DEFINE_ABSTRACT_TYPE because we need the klass in the _init * method to get to the padtemplates */ @@ -292,6 +293,7 @@ gst_video_encoder_class_init (GstVideoEncoderClass * klass) klass->src_event = gst_video_encoder_src_event_default; klass->propose_allocation = gst_video_encoder_propose_allocation_default; klass->decide_allocation = gst_video_encoder_decide_allocation_default; + klass->negotiate = gst_video_encoder_negotiate_default; } static void @@ -1391,16 +1393,8 @@ close_failed: } } -/** - * gst_video_encoder_negotiate: - * @encoder: a #GstVideoEncoder - * - * Negotiate with downstream elements to currently configured #GstVideoCodecState. - * - * Returns: #TRUE if the negotiation succeeded, else #FALSE. - */ -gboolean -gst_video_encoder_negotiate (GstVideoEncoder * encoder) +static gboolean +gst_video_encoder_negotiate_default (GstVideoEncoder * encoder) { GstVideoEncoderClass *klass = GST_VIDEO_ENCODER_GET_CLASS (encoder); GstAllocator *allocator; @@ -1482,6 +1476,32 @@ no_decide_allocation: } /** + * gst_video_encoder_negotiate: + * @encoder: a #GstVideoEncoder + * + * Negotiate with downstream elements to currently configured #GstVideoCodecState. + * + * Returns: #TRUE if the negotiation succeeded, else #FALSE. + */ +gboolean +gst_video_encoder_negotiate (GstVideoEncoder * encoder) +{ + GstVideoEncoderClass *klass; + gboolean ret = TRUE; + + g_return_val_if_fail (GST_IS_VIDEO_ENCODER (encoder), FALSE); + + klass = GST_VIDEO_ENCODER_GET_CLASS (encoder); + + GST_VIDEO_ENCODER_STREAM_LOCK (encoder); + if (klass->negotiate) + ret = klass->negotiate (encoder); + GST_VIDEO_ENCODER_STREAM_UNLOCK (encoder); + + return ret; +} + +/** * gst_video_encoder_allocate_output_buffer: * @encoder: a #GstVideoEncoder * @size: size of the buffer diff --git a/gst-libs/gst/video/gstvideoencoder.h b/gst-libs/gst/video/gstvideoencoder.h index 0f5dd7f..1f71507 100644 --- a/gst-libs/gst/video/gstvideoencoder.h +++ b/gst-libs/gst/video/gstvideoencoder.h @@ -191,6 +191,8 @@ struct _GstVideoEncoder * Event handler on the source pad. This function should return * TRUE if the event was handled and should be discarded * (i.e. not unref'ed). + * @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 @@ -240,6 +242,8 @@ struct _GstVideoEncoderClass gboolean (*src_event) (GstVideoEncoder *encoder, GstEvent *event); + gboolean (*negotiate) (GstVideoEncoder *encoder); + gboolean (*decide_allocation) (GstVideoEncoder *encoder, GstQuery *query); gboolean (*propose_allocation) (GstVideoEncoder * encoder, -- 2.7.4