playsink: Add FLUSHING pad type

Make it possible to request a flushing pad from the playsink. We can eventually
use these flushing pads to quickly terminate the dataflow when we are shutting
down.
This commit is contained in:
Wim Taymans 2009-02-25 12:42:20 +01:00
parent 4d59aa3bc5
commit 747841e97c
2 changed files with 25 additions and 1 deletions

View file

@ -134,6 +134,7 @@ struct _GstPlaySink
gboolean mute; gboolean mute;
gchar *font_desc; /* font description */ gchar *font_desc; /* font description */
guint connection_speed; /* connection speed in bits/sec (0 = unknown) */ guint connection_speed; /* connection speed in bits/sec (0 = unknown) */
gint count;
}; };
struct _GstPlaySinkClass struct _GstPlaySinkClass
@ -1603,6 +1604,7 @@ gst_play_sink_request_pad (GstPlaySink * playsink, GstPlaySinkType type)
GstPad *res = NULL; GstPad *res = NULL;
gboolean created = FALSE; gboolean created = FALSE;
gboolean raw = FALSE; gboolean raw = FALSE;
gboolean activate = TRUE;
GST_DEBUG_OBJECT (playsink, "request pad type %d", type); GST_DEBUG_OBJECT (playsink, "request pad type %d", type);
@ -1658,6 +1660,19 @@ gst_play_sink_request_pad (GstPlaySink * playsink, GstPlaySinkType type)
} }
res = playsink->text_pad; res = playsink->text_pad;
break; break;
case GST_PLAY_SINK_TYPE_FLUSHING:
{
gchar *padname;
/* we need a unique padname for the flushing pad. */
padname = g_strdup_printf ("flushing_%d", playsink->count);
res = gst_ghost_pad_new_no_target (padname, GST_PAD_SINK);
g_free (padname);
playsink->count++;
activate = FALSE;
created = TRUE;
break;
}
default: default:
res = NULL; res = NULL;
break; break;
@ -1665,8 +1680,12 @@ gst_play_sink_request_pad (GstPlaySink * playsink, GstPlaySinkType type)
GST_PLAY_SINK_UNLOCK (playsink); GST_PLAY_SINK_UNLOCK (playsink);
if (created && res) { if (created && res) {
/* we have to add the pad when it's active or we get an error when the
* element is 'running' */
gst_pad_set_active (res, TRUE); gst_pad_set_active (res, TRUE);
gst_element_add_pad (GST_ELEMENT_CAST (playsink), res); gst_element_add_pad (GST_ELEMENT_CAST (playsink), res);
if (!activate)
gst_pad_set_active (res, activate);
} }
return res; return res;
@ -1686,6 +1705,9 @@ gst_play_sink_release_pad (GstPlaySink * playsink, GstPad * pad)
res = &playsink->audio_pad; res = &playsink->audio_pad;
} else if (pad == playsink->text_pad) { } else if (pad == playsink->text_pad) {
res = &playsink->text_pad; res = &playsink->text_pad;
} else {
/* try to release the given pad anyway, these could be the FLUSHING pads. */
res = &pad;
} }
GST_PLAY_SINK_UNLOCK (playsink); GST_PLAY_SINK_UNLOCK (playsink);

View file

@ -45,6 +45,7 @@ G_BEGIN_DECLS
* @GST_PLAY_SINK_TYPE_VIDEO_RAW: a raw video pad * @GST_PLAY_SINK_TYPE_VIDEO_RAW: a raw video pad
* @GST_PLAY_SINK_TYPE_TEXT: a raw text pad * @GST_PLAY_SINK_TYPE_TEXT: a raw text pad
* @GST_PLAY_SINK_TYPE_LAST: the last type * @GST_PLAY_SINK_TYPE_LAST: the last type
* @GST_PLAY_SINK_TYPE_FLUSHING: a flushing pad, used when shutting down
* *
* Types of pads that can be requested from the sinks. * Types of pads that can be requested from the sinks.
*/ */
@ -54,7 +55,8 @@ typedef enum {
GST_PLAY_SINK_TYPE_VIDEO = 2, GST_PLAY_SINK_TYPE_VIDEO = 2,
GST_PLAY_SINK_TYPE_VIDEO_RAW = 3, GST_PLAY_SINK_TYPE_VIDEO_RAW = 3,
GST_PLAY_SINK_TYPE_TEXT = 4, GST_PLAY_SINK_TYPE_TEXT = 4,
GST_PLAY_SINK_TYPE_LAST = 5 GST_PLAY_SINK_TYPE_LAST = 5,
GST_PLAY_SINK_TYPE_FLUSHING = 6
} GstPlaySinkType; } GstPlaySinkType;
typedef struct _GstPlaySink GstPlaySink; typedef struct _GstPlaySink GstPlaySink;