static void gst_overlay_loop (GstElement * element) { GstOverlay *overlay; GstBuffer *out; GstBuffer *in1 = NULL, *in2 = NULL, *in3 = NULL; int size; overlay = GST_OVERLAY (element); in1 = GST_BUFFER (gst_pad_pull (overlay->sinkpad1)); if (GST_IS_EVENT (in1)) { gst_pad_push (overlay->srcpad, GST_DATA (in1)); /* FIXME */ return; } in2 = GST_BUFFER (gst_pad_pull (overlay->sinkpad2)); if (GST_IS_EVENT (in2)) { gst_pad_push (overlay->srcpad, GST_DATA (in2)); /* FIXME */ return; } in3 = GST_BUFFER (gst_pad_pull (overlay->sinkpad3)); if (GST_IS_EVENT (in3)) { gst_pad_push (overlay->srcpad, GST_DATA (in3)); /* FIXME */ return; } g_return_if_fail (in1 != NULL); g_return_if_fail (in2 != NULL); g_return_if_fail (in3 != NULL); size = (overlay->width * overlay->height * 3) / 2; g_return_if_fail (GST_BUFFER_SIZE (in1) != size); g_return_if_fail (GST_BUFFER_SIZE (in2) != size); g_return_if_fail (GST_BUFFER_SIZE (in3) != size); out = gst_buffer_new_and_alloc (size); gst_overlay_blend_i420 (GST_BUFFER_DATA (out), GST_BUFFER_DATA (in1), GST_BUFFER_DATA (in2), GST_BUFFER_DATA (in3), overlay->width, overlay->height); GST_BUFFER_TIMESTAMP (out) = GST_BUFFER_TIMESTAMP (in1); GST_BUFFER_DURATION (out) = GST_BUFFER_DURATION (in1); gst_buffer_unref (in1); gst_buffer_unref (in2); gst_buffer_unref (in3); gst_pad_push (overlay->srcpad, GST_DATA (out)); }
static void gst_mikmod_loop (GstElement * element) { GstMikMod *mikmod; GstBuffer *buffer_in; g_return_if_fail (element != NULL); g_return_if_fail (GST_IS_MIKMOD (element)); mikmod = GST_MIKMOD (element); srcpad = mikmod->srcpad; mikmod->Buffer = NULL; if (!mikmod->initialized) { while ((buffer_in = GST_BUFFER (gst_pad_pull (mikmod->sinkpad)))) { if (GST_IS_EVENT (buffer_in)) { GstEvent *event = GST_EVENT (buffer_in); if (GST_EVENT_TYPE (event) == GST_EVENT_EOS) break; } else { if (mikmod->Buffer) { mikmod->Buffer = gst_buffer_append (mikmod->Buffer, buffer_in); } else { mikmod->Buffer = buffer_in; } } } if (!GST_PAD_CAPS (mikmod->srcpad)) { if (GST_PAD_LINK_SUCCESSFUL (gst_pad_renegotiate (mikmod->srcpad))) { GST_ELEMENT_ERROR (mikmod, CORE, NEGOTIATION, (NULL), (NULL)); return; } } MikMod_RegisterDriver (&drv_gst); MikMod_RegisterAllLoaders (); MikMod_Init (""); reader = GST_READER_new (mikmod); module = Player_LoadGeneric (reader, 64, 0); gst_buffer_unref (mikmod->Buffer); if (!Player_Active ()) Player_Start (module); mikmod->initialized = TRUE; } if (Player_Active ()) { timestamp = (module->sngtime / 1024.0) * GST_SECOND; drv_gst.Update (); } else { gst_element_set_eos (GST_ELEMENT (mikmod)); gst_pad_push (mikmod->srcpad, GST_DATA (gst_event_new (GST_EVENT_EOS))); } }