static gboolean gst_ass_render_event_text (GstPad * pad, GstEvent * event);
static gboolean gst_ass_render_event_src (GstPad * pad, GstEvent * event);
+static GstFlowReturn gst_ass_render_bufferalloc_video (GstPad * pad,
+ guint64 offset, guint size, GstCaps * caps, GstBuffer ** buffer);
+
static void
gst_ass_render_base_init (gpointer gclass)
{
gst_pad_set_getcaps_function (render->srcpad,
GST_DEBUG_FUNCPTR (gst_ass_render_getcaps));
+ gst_pad_set_getcaps_function (render->video_sinkpad,
+ GST_DEBUG_FUNCPTR (gst_ass_render_getcaps));
gst_pad_set_chain_function (render->video_sinkpad,
GST_DEBUG_FUNCPTR (gst_ass_render_chain_video));
gst_pad_set_event_function (render->srcpad,
GST_DEBUG_FUNCPTR (gst_ass_render_event_src));
+ gst_pad_set_bufferalloc_function (render->video_sinkpad,
+ GST_DEBUG_FUNCPTR (gst_ass_render_bufferalloc_video));
+
gst_element_add_pad (GST_ELEMENT (render), render->srcpad);
gst_element_add_pad (GST_ELEMENT (render), render->video_sinkpad);
gst_element_add_pad (GST_ELEMENT (render), render->text_sinkpad);
}
static GstFlowReturn
+gst_ass_render_bufferalloc_video (GstPad * pad, guint64 offset, guint size,
+ GstCaps * caps, GstBuffer ** buffer)
+{
+ GstAssRender *render = GST_ASS_RENDER (gst_pad_get_parent (pad));
+ GstFlowReturn ret = GST_FLOW_WRONG_STATE;
+ GstPad *allocpad;
+
+ GST_OBJECT_LOCK (render);
+ allocpad = render->srcpad ? gst_object_ref (render->srcpad) : NULL;
+ GST_OBJECT_UNLOCK (render);
+
+ if (allocpad) {
+ ret = gst_pad_alloc_buffer (allocpad, offset, size, caps, buffer);
+ gst_object_unref (allocpad);
+ }
+
+ gst_object_unref (render);
+
+ return ret;
+}
+
+static GstFlowReturn
gst_ass_render_chain_video (GstPad * pad, GstBuffer * buffer)
{
GstAssRender *render = GST_ASS_RENDER (GST_PAD_PARENT (pad));