gst/playback/: Move setup_output_pads into a virtual function, remove group-switch (no longer needed) and redirect (h...

Original commit message from CVS:
* gst/playback/gstdecodebin.c: (gst_decode_bin_class_init),
(try_to_link_1):
* gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init),
(group_commit), (probe_triggered), (setup_source),
(gst_play_base_bin_change_state):
* gst/playback/gstplaybasebin.h:
* gst/playback/gstplaybin.c: (gst_play_bin_class_init),
(gst_play_bin_init), (remove_sinks), (setup_sinks),
(gst_play_bin_change_state):
Move setup_output_pads into a virtual function, remove
group-switch (no longer needed) and redirect (handled by bus
now) signals.
This commit is contained in:
Ronald S. Bultje 2005-05-12 16:16:14 +00:00
parent 0209cb45e5
commit 09d04c380c
5 changed files with 33 additions and 99 deletions

View file

@ -1,3 +1,18 @@
2005-05-12 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
* gst/playback/gstdecodebin.c: (gst_decode_bin_class_init),
(try_to_link_1):
* gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init),
(group_commit), (probe_triggered), (setup_source),
(gst_play_base_bin_change_state):
* gst/playback/gstplaybasebin.h:
* gst/playback/gstplaybin.c: (gst_play_bin_class_init),
(gst_play_bin_init), (remove_sinks), (setup_sinks),
(gst_play_bin_change_state):
Move setup_output_pads into a virtual function, remove
group-switch (no longer needed) and redirect (handled by bus
now) signals.
2005-05-12 Ronald S. Bultje <rbultje@ronald.bitfreak.net> 2005-05-12 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
* gst/playback/gstplaybasebin.c: (gst_play_base_bin_get_type), * gst/playback/gstplaybasebin.c: (gst_play_base_bin_get_type),

View file

@ -78,8 +78,6 @@ struct _GstDecodeBinClass
void (*removed_decoded_pad) (GstElement * element, GstPad * pad); void (*removed_decoded_pad) (GstElement * element, GstPad * pad);
/* signal fired when we found a pad that we cannot decode */ /* signal fired when we found a pad that we cannot decode */
void (*unknown_type) (GstElement * element, GstPad * pad, GstCaps * caps); void (*unknown_type) (GstElement * element, GstPad * pad, GstCaps * caps);
/* signal fired when we got a redirect attempt */
void (*got_redirect) (GstElement * element, const gchar * new_location);
}; };
#define DEFAULT_THREADED FALSE #define DEFAULT_THREADED FALSE
@ -209,11 +207,6 @@ gst_decode_bin_class_init (GstDecodeBinClass * klass)
G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstDecodeBinClass, unknown_type), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstDecodeBinClass, unknown_type),
NULL, NULL, gst_marshal_VOID__OBJECT_BOXED, G_TYPE_NONE, 2, NULL, NULL, gst_marshal_VOID__OBJECT_BOXED, G_TYPE_NONE, 2,
GST_TYPE_PAD, GST_TYPE_CAPS); GST_TYPE_PAD, GST_TYPE_CAPS);
gst_decode_bin_signals[SIGNAL_REDIRECT] =
g_signal_new ("got-redirect", G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstDecodeBinClass, got_redirect),
NULL, NULL, g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, 1,
G_TYPE_STRING);
gobject_klass->dispose = GST_DEBUG_FUNCPTR (gst_decode_bin_dispose); gobject_klass->dispose = GST_DEBUG_FUNCPTR (gst_decode_bin_dispose);
@ -549,17 +542,6 @@ many_types:
} }
} }
/*
* Called when we're redirected to a new URI.
*/
static void
got_redirect (GstElement * element,
const gchar * new_location, GstDecodeBin * decode_bin)
{
g_signal_emit (decode_bin, gst_decode_bin_signals[SIGNAL_REDIRECT], 0,
new_location);
}
/** /**
* given a list of element factories, try to link one of the factories * given a list of element factories, try to link one of the factories
* to the given pad. * to the given pad.
@ -624,11 +606,6 @@ try_to_link_1 (GstDecodeBin * decode_bin, GstPad * pad, GList * factories)
* because that would consume less memory. */ * because that would consume less memory. */
} }
} }
/* catch redirects */
if (g_signal_lookup ("got-redirect", G_OBJECT_TYPE (element))) {
g_signal_connect (element, "got-redirect",
G_CALLBACK (got_redirect), decode_bin);
}
/* make sure we catch unlink signals */ /* make sure we catch unlink signals */
sig = g_signal_connect (G_OBJECT (GST_PAD_REALIZE (pad)), "unlinked", sig = g_signal_connect (G_OBJECT (GST_PAD_REALIZE (pad)), "unlinked",

View file

@ -56,10 +56,7 @@ enum
/* signals */ /* signals */
enum enum
{ {
SIGNAL_SETUP_OUTPUT_PADS,
SIGNAL_BUFFERING, SIGNAL_BUFFERING,
SIGNAL_GROUP_SWITCH,
SIGNAL_REDIRECT,
LAST_SIGNAL LAST_SIGNAL
}; };
@ -175,27 +172,11 @@ gst_play_base_bin_class_init (GstPlayBaseBinClass * klass)
"playbasebin"); "playbasebin");
/* signals */ /* signals */
gst_play_base_bin_signals[SIGNAL_SETUP_OUTPUT_PADS] =
g_signal_new ("setup-output-pads", G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GstPlayBaseBinClass, setup_output_pads),
NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
gst_play_base_bin_signals[SIGNAL_BUFFERING] = gst_play_base_bin_signals[SIGNAL_BUFFERING] =
g_signal_new ("buffering", G_TYPE_FROM_CLASS (klass), g_signal_new ("buffering", G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GstPlayBaseBinClass, buffering), G_STRUCT_OFFSET (GstPlayBaseBinClass, buffering),
NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT); NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
gst_play_base_bin_signals[SIGNAL_GROUP_SWITCH] =
g_signal_new ("group-switch", G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GstPlayBaseBinClass, group_switch),
NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
gst_play_base_bin_signals[SIGNAL_REDIRECT] =
g_signal_new ("got-redirect", G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GstPlayBaseBinClass, got_redirect),
NULL, NULL, g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, 1,
G_TYPE_STRING);
gobject_klass->dispose = GST_DEBUG_FUNCPTR (gst_play_base_bin_dispose); gobject_klass->dispose = GST_DEBUG_FUNCPTR (gst_play_base_bin_dispose);
gobject_klass->finalize = GST_DEBUG_FUNCPTR (gst_play_base_bin_finalize); gobject_klass->finalize = GST_DEBUG_FUNCPTR (gst_play_base_bin_finalize);
@ -437,8 +418,8 @@ group_commit (GstPlayBaseBin * play_base_bin, gboolean fatal, gboolean subtitle)
setup_substreams (play_base_bin); setup_substreams (play_base_bin);
GST_DEBUG ("Emitting signal"); GST_DEBUG ("Emitting signal");
g_signal_emit (play_base_bin, GST_PLAY_BASE_BIN_GET_CLASS (play_base_bin)->
gst_play_base_bin_signals[SIGNAL_SETUP_OUTPUT_PADS], 0); setup_output_pads (play_base_bin, group);
GST_DEBUG ("done"); GST_DEBUG ("done");
GROUP_UNLOCK (play_base_bin); GROUP_UNLOCK (play_base_bin);
@ -846,13 +827,12 @@ probe_triggered (GstProbe * probe, GstData ** data, gpointer user_data)
GST_DEBUG ("switching to next group %p - emitting signal", GST_DEBUG ("switching to next group %p - emitting signal",
play_base_bin->queued_groups->data); play_base_bin->queued_groups->data);
/* and signal the new group */ /* and signal the new group */
g_signal_emit (play_base_bin, GST_PLAY_BASE_BIN_GET_CLASS (play_base_bin)->
gst_play_base_bin_signals[SIGNAL_SETUP_OUTPUT_PADS], 0); setup_output_pads (play_base_bin, group);
GROUP_UNLOCK (play_base_bin); GROUP_UNLOCK (play_base_bin);
g_signal_emit (play_base_bin, g_object_notify (G_OBJECT (play_base_bin), "streaminfo");
gst_play_base_bin_signals[SIGNAL_GROUP_SWITCH], 0);
/* get rid of the EOS event */ /* get rid of the EOS event */
return FALSE; return FALSE;
@ -1122,18 +1102,6 @@ setup_substreams (GstPlayBaseBin * play_base_bin)
} }
} }
/*
* Called when we're redirected to a new URI.
*/
static void
got_redirect (GstElement * element, const gchar * new_location, gpointer data)
{
gchar **location = data;
if (!*location)
*location = g_strdup (new_location);
}
/* construct and run the source and decoder elements until we found /* construct and run the source and decoder elements until we found
* all the streams or until a preroll queue has been filled. * all the streams or until a preroll queue has been filled.
*/ */
@ -1328,8 +1296,6 @@ setup_source (GstPlayBaseBin * play_base_bin,
/* set up callbacks to create the links between decoded data /* set up callbacks to create the links between decoded data
* and video/audio/subtitle rendering/output. */ * and video/audio/subtitle rendering/output. */
g_signal_connect (play_base_bin->decoder, "got_redirect",
G_CALLBACK (got_redirect), new_location);
g_signal_connect (G_OBJECT (play_base_bin->decoder), g_signal_connect (G_OBJECT (play_base_bin->decoder),
"new-decoded-pad", G_CALLBACK (new_decoded_pad), play_base_bin); "new-decoded-pad", G_CALLBACK (new_decoded_pad), play_base_bin);
g_signal_connect (G_OBJECT (play_base_bin->decoder), "no-more-pads", g_signal_connect (G_OBJECT (play_base_bin->decoder), "no-more-pads",
@ -1714,16 +1680,9 @@ gst_play_base_bin_change_state (GstElement * element)
switch (transition) { switch (transition) {
case GST_STATE_READY_TO_PAUSED: case GST_STATE_READY_TO_PAUSED:
if (new_location) { if (ret == GST_STATE_SUCCESS) {
g_signal_emit (play_base_bin,
gst_play_base_bin_signals[SIGNAL_REDIRECT], 0, new_location);
g_free (new_location);
ret = GST_STATE_FAILURE;
} else if (ret == GST_STATE_SUCCESS) {
finish_source (play_base_bin); finish_source (play_base_bin);
} } else {
if (ret != GST_STATE_SUCCESS) {
/* clean up leftover groups */ /* clean up leftover groups */
remove_groups (play_base_bin); remove_groups (play_base_bin);
play_base_bin->need_rebuild = TRUE; play_base_bin->need_rebuild = TRUE;

View file

@ -30,6 +30,9 @@ G_BEGIN_DECLS
#define GST_PLAY_BASE_BIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_PLAY_BASE_BIN,GstPlayBaseBinClass)) #define GST_PLAY_BASE_BIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_PLAY_BASE_BIN,GstPlayBaseBinClass))
#define GST_IS_PLAY_BASE_BIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PLAY_BASE_BIN)) #define GST_IS_PLAY_BASE_BIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PLAY_BASE_BIN))
#define GST_IS_PLAY_BASE_BIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PLAY_BASE_BIN)) #define GST_IS_PLAY_BASE_BIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PLAY_BASE_BIN))
#define GST_PLAY_BASE_BIN_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_PLAY_BASE_BIN, \
GstPlayBaseBinClass))
typedef struct _GstPlayBaseBin GstPlayBaseBin; typedef struct _GstPlayBaseBin GstPlayBaseBin;
typedef struct _GstPlayBaseBinClass GstPlayBaseBinClass; typedef struct _GstPlayBaseBinClass GstPlayBaseBinClass;
@ -88,20 +91,15 @@ struct _GstPlayBaseBin {
struct _GstPlayBaseBinClass { struct _GstPlayBaseBinClass {
GstPipelineClass parent_class; GstPipelineClass parent_class;
/* signals */ /* virtual fuctions */
void (*setup_output_pads) (GstPlayBaseBin *play_base_bin); void (*setup_output_pads) (GstPlayBaseBin *play_base_bin,
void (*removed_output_pad) (GstPlayBaseBin *play_base_bin, GstPlayBaseGroup *group);
GstStreamInfo *info);
/* signals */
/* 0: buf=empty (underrun) - will re-cache, /* 0: buf=empty (underrun) - will re-cache,
* 100: buf=full (overrun) - will flush head of cache (latency) */ * 100: buf=full (overrun) - will flush head of cache (latency) */
void (*buffering) (GstPlayBaseBin *play_base_bin, void (*buffering) (GstPlayBaseBin *play_base_bin,
gint percentage); gint percentage);
void (*group_switch) (GstPlayBaseBin *play_base_bin);
/* Called on redirect */
void (*got_redirect) (GstPlayBaseBin *play_base_bin,
const gchar *new_location);
}; };
GType gst_play_base_bin_get_type (void); GType gst_play_base_bin_get_type (void);

View file

@ -62,9 +62,6 @@ struct _GstPlayBin
/* our cache for the sinks */ /* our cache for the sinks */
GHashTable *cache; GHashTable *cache;
/* boolean to see if we're currently switching groups */
gboolean group_switch;
/* font description */ /* font description */
gchar *font_desc; gchar *font_desc;
}; };
@ -96,8 +93,8 @@ static void gst_play_bin_class_init (GstPlayBinClass * klass);
static void gst_play_bin_init (GstPlayBin * play_bin); static void gst_play_bin_init (GstPlayBin * play_bin);
static void gst_play_bin_dispose (GObject * object); static void gst_play_bin_dispose (GObject * object);
static void group_switch (GstPlayBaseBin * play_base_bin); static void setup_sinks (GstPlayBaseBin * play_base_bin,
static void setup_sinks (GstPlayBaseBin * play_base_bin); GstPlayBaseGroup * group);
static void remove_sinks (GstPlayBin * play_bin); static void remove_sinks (GstPlayBin * play_bin);
static void gst_play_bin_set_property (GObject * object, guint prop_id, static void gst_play_bin_set_property (GObject * object, guint prop_id,
@ -194,7 +191,6 @@ gst_play_bin_class_init (GstPlayBinClass * klass)
GST_DEBUG_FUNCPTR (gst_play_bin_change_state); GST_DEBUG_FUNCPTR (gst_play_bin_change_state);
playbasebin_klass->setup_output_pads = setup_sinks; playbasebin_klass->setup_output_pads = setup_sinks;
playbasebin_klass->group_switch = group_switch;
} }
static void static void
@ -211,7 +207,6 @@ gst_play_bin_init (GstPlayBin * play_bin)
play_bin->font_desc = NULL; play_bin->font_desc = NULL;
play_bin->cache = g_hash_table_new_full (g_str_hash, g_str_equal, play_bin->cache = g_hash_table_new_full (g_str_hash, g_str_equal,
NULL, (GDestroyNotify) gst_object_unref); NULL, (GDestroyNotify) gst_object_unref);
play_bin->group_switch = FALSE;
} }
static void static void
@ -624,13 +619,6 @@ gen_vis_element (GstPlayBin * play_bin)
return element; return element;
} }
/* set for group switch */
static void
group_switch (GstPlayBaseBin * play_base_bin)
{
GST_PLAY_BIN (play_base_bin)->group_switch = TRUE;
}
/* get rid of all installed sinks */ /* get rid of all installed sinks */
static void static void
remove_sinks (GstPlayBin * play_bin) remove_sinks (GstPlayBin * play_bin)
@ -640,7 +628,6 @@ remove_sinks (GstPlayBin * play_bin)
GstElement *element; GstElement *element;
GST_DEBUG ("removesinks"); GST_DEBUG ("removesinks");
play_bin->group_switch = FALSE;
element = g_hash_table_lookup (play_bin->cache, "abin"); element = g_hash_table_lookup (play_bin->cache, "abin");
if (element != NULL) { if (element != NULL) {
parent = gst_element_get_parent (element); parent = gst_element_get_parent (element);
@ -730,10 +717,9 @@ add_sink (GstPlayBin * play_bin, GstElement * sink, GstPad * srcpad)
} }
static void static void
setup_sinks (GstPlayBaseBin * play_base_bin) setup_sinks (GstPlayBaseBin * play_base_bin, GstPlayBaseGroup * group)
{ {
GstPlayBin *play_bin = GST_PLAY_BIN (play_base_bin); GstPlayBin *play_bin = GST_PLAY_BIN (play_base_bin);
GstPlayBaseGroup *group;
GList *streaminfo = NULL, *s; GList *streaminfo = NULL, *s;
gboolean need_vis = FALSE; gboolean need_vis = FALSE;
gboolean need_text = FALSE; gboolean need_text = FALSE;
@ -747,7 +733,6 @@ setup_sinks (GstPlayBaseBin * play_base_bin)
GST_DEBUG ("setupsinks"); GST_DEBUG ("setupsinks");
/* find out what to do */ /* find out what to do */
group = play_base_bin->queued_groups->data;
if (group->type[GST_STREAM_TYPE_VIDEO - 1].npads > 0 && if (group->type[GST_STREAM_TYPE_VIDEO - 1].npads > 0 &&
group->type[GST_STREAM_TYPE_TEXT - 1].npads > 0) { group->type[GST_STREAM_TYPE_TEXT - 1].npads > 0) {
need_text = TRUE; need_text = TRUE;
@ -838,7 +823,7 @@ gst_play_bin_change_state (GstElement * element)
case GST_STATE_PLAYING_TO_PAUSED: case GST_STATE_PLAYING_TO_PAUSED:
/* Set audio sink state to NULL to release the sound device, /* Set audio sink state to NULL to release the sound device,
* but only if we own it (else we might be in chain-transition). */ * but only if we own it (else we might be in chain-transition). */
//if (play_bin->audio_sink != NULL && !play_bin->group_switch && //if (play_bin->audio_sink != NULL &&
// GST_STATE (play_bin->audio_sink) == GST_STATE_PAUSED) { // GST_STATE (play_bin->audio_sink) == GST_STATE_PAUSED) {
// gst_element_set_state (play_bin->audio_sink, GST_STATE_NULL); // gst_element_set_state (play_bin->audio_sink, GST_STATE_NULL);
//} //}