Changing have_xid to have_video_out to match the new GstVideoSink parent object.

Original commit message from CVS:
Changing have_xid to have_video_out to match the new GstVideoSink parent object.
Adding have_vis_size.
Fixing gst_play_connect_visualisation
This commit is contained in:
Julien Moutte 2003-09-15 09:29:06 +00:00
parent 4535cf586b
commit e9c878d58d
3 changed files with 93 additions and 62 deletions

View file

@ -31,12 +31,13 @@ enum
STATE_CHANGE, STATE_CHANGE,
STREAM_LENGTH, STREAM_LENGTH,
TIME_TICK, TIME_TICK,
HAVE_XID, HAVE_VIDEO_OUT,
HAVE_VIS_XID, HAVE_VIS_VIDEO_OUT,
HAVE_VIDEO_SIZE, HAVE_VIDEO_SIZE,
HAVE_VIS_SIZE,
PIPELINE_ERROR, PIPELINE_ERROR,
/* put additional signals before this comment */ /* put additional signals before this comment */
LAST_SIGNAL, LAST_SIGNAL
}; };
/* this struct is used to decouple signals coming out of threaded pipelines */ /* this struct is used to decouple signals coming out of threaded pipelines */
@ -52,33 +53,27 @@ struct _GstPlaySignal
{ {
gint width; gint width;
gint height; gint height;
} } video_size;
video_size;
struct struct
{ {
gint xid; gpointer video_out;
} } video_out;
video_xid;
struct struct
{ {
GstElementState old_state; GstElementState old_state;
GstElementState new_state; GstElementState new_state;
} } state;
state;
struct struct
{ {
GstObject *object; GstObject *object;
GParamSpec *param; GParamSpec *param;
} } info;
info;
struct struct
{ {
GstElement *element; GstElement *element;
char *error; char *error;
} } error;
error; } signal_data;
}
signal_data;
}; };
enum enum
@ -345,19 +340,24 @@ gst_play_idle_signal (GstPlay * play)
switch (signal->signal_id) switch (signal->signal_id)
{ {
case HAVE_XID: case HAVE_VIDEO_OUT:
g_signal_emit (G_OBJECT (play), gst_play_signals[HAVE_XID], 0, g_signal_emit (G_OBJECT (play), gst_play_signals[HAVE_VIDEO_OUT], 0,
signal->signal_data.video_xid.xid); signal->signal_data.video_out.video_out);
break; break;
case HAVE_VIS_XID: case HAVE_VIS_VIDEO_OUT:
g_signal_emit (G_OBJECT (play), gst_play_signals[HAVE_VIS_XID], 0, g_signal_emit (G_OBJECT (play), gst_play_signals[HAVE_VIS_VIDEO_OUT], 0,
signal->signal_data.video_xid.xid); signal->signal_data.video_out.video_out);
break; break;
case HAVE_VIDEO_SIZE: case HAVE_VIDEO_SIZE:
g_signal_emit (G_OBJECT (play), gst_play_signals[HAVE_VIDEO_SIZE], 0, g_signal_emit (G_OBJECT (play), gst_play_signals[HAVE_VIDEO_SIZE], 0,
signal->signal_data.video_size.width, signal->signal_data.video_size.width,
signal->signal_data.video_size.height); signal->signal_data.video_size.height);
break; break;
case HAVE_VIS_SIZE:
g_signal_emit (G_OBJECT (play), gst_play_signals[HAVE_VIS_SIZE], 0,
signal->signal_data.video_size.width,
signal->signal_data.video_size.height);
break;
case STATE_CHANGE: case STATE_CHANGE:
g_signal_emit (G_OBJECT (play), gst_play_signals[STATE_CHANGE], 0, g_signal_emit (G_OBJECT (play), gst_play_signals[STATE_CHANGE], 0,
signal->signal_data.state.old_state, signal->signal_data.state.old_state,
@ -370,7 +370,6 @@ gst_play_idle_signal (GstPlay * play)
gst_object_unref (signal->signal_data.info.object); gst_object_unref (signal->signal_data.info.object);
break; break;
case PIPELINE_ERROR: case PIPELINE_ERROR:
if (gst_element_get_state (play->pipeline) == GST_STATE_PLAYING) if (gst_element_get_state (play->pipeline) == GST_STATE_PLAYING)
if (gst_element_set_state (play->pipeline, GST_STATE_READY) != if (gst_element_set_state (play->pipeline, GST_STATE_READY) !=
GST_STATE_SUCCESS) GST_STATE_SUCCESS)
@ -406,13 +405,14 @@ callback_audio_sink_eos (GstElement * element, GstPlay * play)
} }
static void static void
callback_video_have_xid (GstElement * element, gint xid, GstPlay * play) callback_video_have_video_out (GstElement * element,
gpointer video_out, GstPlay * play)
{ {
GstPlaySignal *signal; GstPlaySignal *signal;
signal = g_new0 (GstPlaySignal, 1); signal = g_new0 (GstPlaySignal, 1);
signal->signal_id = HAVE_XID; signal->signal_id = HAVE_VIDEO_OUT;
signal->signal_data.video_xid.xid = xid; signal->signal_data.video_out.video_out = video_out;
g_async_queue_push (play->signal_queue, signal); g_async_queue_push (play->signal_queue, signal);
@ -420,13 +420,14 @@ callback_video_have_xid (GstElement * element, gint xid, GstPlay * play)
} }
static void static void
callback_video_have_vis_xid (GstElement * element, gint xid, GstPlay * play) callback_video_have_vis_video_out (GstElement * element,
gpointer video_out, GstPlay * play)
{ {
GstPlaySignal *signal; GstPlaySignal *signal;
signal = g_new0 (GstPlaySignal, 1); signal = g_new0 (GstPlaySignal, 1);
signal->signal_id = HAVE_VIS_XID; signal->signal_id = HAVE_VIS_VIDEO_OUT;
signal->signal_data.video_xid.xid = xid; signal->signal_data.video_out.video_out = video_out;
g_async_queue_push (play->signal_queue, signal); g_async_queue_push (play->signal_queue, signal);
@ -449,6 +450,22 @@ callback_video_have_size (GstElement * element,
play->idle_add_func ((GSourceFunc) gst_play_idle_signal, play); play->idle_add_func ((GSourceFunc) gst_play_idle_signal, play);
} }
static void
callback_video_have_vis_size (GstElement * element,
gint width, gint height, GstPlay * play)
{
GstPlaySignal *signal;
signal = g_new0 (GstPlaySignal, 1);
signal->signal_id = HAVE_VIS_SIZE;
signal->signal_data.video_size.width = width;
signal->signal_data.video_size.height = height;
g_async_queue_push (play->signal_queue, signal);
play->idle_add_func ((GSourceFunc) gst_play_idle_signal, play);
}
static void static void
callback_pipeline_error (GstElement * object, callback_pipeline_error (GstElement * object,
GstElement * orig, char *error, GstPlay * play) GstElement * orig, char *error, GstPlay * play)
@ -646,21 +663,21 @@ gst_play_class_init (GstPlayClass * klass)
NULL, NULL, NULL, NULL,
gst_marshal_VOID__INT64, G_TYPE_NONE, 1, G_TYPE_INT64); gst_marshal_VOID__INT64, G_TYPE_NONE, 1, G_TYPE_INT64);
gst_play_signals[HAVE_XID] = gst_play_signals[HAVE_VIDEO_OUT] =
g_signal_new ("have_xid", g_signal_new ("have_video_out",
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST, G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (GstPlayClass, have_xid), G_STRUCT_OFFSET (GstPlayClass, have_video_out),
NULL, NULL, NULL, NULL,
gst_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT); gst_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_INT);
gst_play_signals[HAVE_VIS_XID] = gst_play_signals[HAVE_VIS_VIDEO_OUT] =
g_signal_new ("have_vis_xid", g_signal_new ("have_vis_video_out",
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST, G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (GstPlayClass, have_vis_xid), G_STRUCT_OFFSET (GstPlayClass, have_vis_video_out),
NULL, NULL, NULL, NULL,
gst_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT); gst_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_INT);
gst_play_signals[HAVE_VIDEO_SIZE] = gst_play_signals[HAVE_VIDEO_SIZE] =
g_signal_new ("have_video_size", g_signal_new ("have_video_size",
@ -670,6 +687,15 @@ gst_play_class_init (GstPlayClass * klass)
NULL, NULL, NULL, NULL,
gst_marshal_VOID__INT_INT, gst_marshal_VOID__INT_INT,
G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT); G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT);
gst_play_signals[HAVE_VIS_SIZE] =
g_signal_new ("have_vis_size",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (GstPlayClass, have_vis_size),
NULL, NULL,
gst_marshal_VOID__INT_INT,
G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT);
gst_control_init (NULL, NULL); gst_control_init (NULL, NULL);
} }

View file

@ -46,8 +46,7 @@ typedef enum
GST_PLAY_UNKNOWN_MEDIA, GST_PLAY_UNKNOWN_MEDIA,
GST_PLAY_CANNOT_PLAY, GST_PLAY_CANNOT_PLAY,
GST_PLAY_ERROR, GST_PLAY_ERROR,
} } GstPlayReturn;
GstPlayReturn;
typedef enum typedef enum
{ {
@ -56,8 +55,7 @@ typedef enum
GST_PLAY_PIPE_AUDIO_HYPER_THREADED, GST_PLAY_PIPE_AUDIO_HYPER_THREADED,
GST_PLAY_PIPE_VIDEO, GST_PLAY_PIPE_VIDEO,
GST_PLAY_PIPE_VIDEO_VISUALISATION, GST_PLAY_PIPE_VIDEO_VISUALISATION,
} } GstPlayPipeType;
GstPlayPipeType;
typedef enum typedef enum
{ {
@ -68,16 +66,14 @@ typedef enum
GST_PLAY_ERROR_VOLUME, GST_PLAY_ERROR_VOLUME,
GST_PLAY_ERROR_COLORSPACE, GST_PLAY_ERROR_COLORSPACE,
GST_PLAY_ERROR_LAST, GST_PLAY_ERROR_LAST,
} } GstPlayError;
GstPlayError;
typedef enum typedef enum
{ {
GST_PLAY_SINK_TYPE_AUDIO, GST_PLAY_SINK_TYPE_AUDIO,
GST_PLAY_SINK_TYPE_VIDEO, GST_PLAY_SINK_TYPE_VIDEO,
GST_PLAY_SINK_TYPE_ANY, GST_PLAY_SINK_TYPE_ANY,
} } GstPlaySinkType;
GstPlaySinkType;
#define GST_PLAY_ERROR gst_play_error_quark () #define GST_PLAY_ERROR gst_play_error_quark ()
@ -152,9 +148,10 @@ struct _GstPlayClass
void (*stream_end) (GstPlay * play); void (*stream_end) (GstPlay * play);
void (*time_tick) (GstPlay * play, gint64 time_nanos); void (*time_tick) (GstPlay * play, gint64 time_nanos);
void (*stream_length) (GstPlay * play, gint64 length_nanos); void (*stream_length) (GstPlay * play, gint64 length_nanos);
void (*have_xid) (GstPlay * play, gint xid); void (*have_video_out) (GstPlay * play, gpointer video_out);
void (*have_vis_xid) (GstPlay * play, gint xid); void (*have_vis_video_out) (GstPlay * play, gpointer video_out);
void (*have_video_size) (GstPlay * play, gint width, gint height); void (*have_video_size) (GstPlay * play, gint width, gint height);
void (*have_vis_size) (GstPlay * play, gint width, gint height);
}; };
struct _GstPlayIdleData struct _GstPlayIdleData

View file

@ -580,8 +580,8 @@ gst_play_video_set_video (GstPlay * play, GstElement * video_sink)
if (play->video_sink_element != NULL) if (play->video_sink_element != NULL)
{ {
g_signal_connect (G_OBJECT (play->video_sink_element), g_signal_connect (G_OBJECT (play->video_sink_element),
"have_xid", "have_video_out",
G_CALLBACK (callback_video_have_xid), play); G_CALLBACK (callback_video_have_video_out), play);
g_signal_connect (G_OBJECT (play->video_sink_element), g_signal_connect (G_OBJECT (play->video_sink_element),
"have_size", "have_size",
G_CALLBACK (callback_video_have_size), play); G_CALLBACK (callback_video_have_size), play);
@ -917,8 +917,8 @@ gst_play_video_vis_set_video (GstPlay * play, GstElement * video_sink)
if (play->video_sink_element != NULL) if (play->video_sink_element != NULL)
{ {
g_signal_connect (G_OBJECT (play->video_sink_element), g_signal_connect (G_OBJECT (play->video_sink_element),
"have_xid", "have_video_out",
G_CALLBACK (callback_video_have_xid), play); G_CALLBACK (callback_video_have_video_out), play);
g_signal_connect (G_OBJECT (play->video_sink_element), g_signal_connect (G_OBJECT (play->video_sink_element),
"have_size", "have_size",
G_CALLBACK (callback_video_have_size), play); G_CALLBACK (callback_video_have_size), play);
@ -971,12 +971,11 @@ gst_play_set_visualisation_video_sink (GstPlay * play,
if (play->visualisation_sink_element != NULL) if (play->visualisation_sink_element != NULL)
{ {
g_signal_connect (G_OBJECT (play->visualisation_sink_element), g_signal_connect (G_OBJECT (play->visualisation_sink_element),
"have_xid", "have_video_out",
G_CALLBACK (callback_video_have_vis_xid), play); G_CALLBACK (callback_video_have_vis_video_out), play);
/*g_signal_connect ( G_OBJECT (play->visualisation_sink_element), g_signal_connect (G_OBJECT (play->visualisation_sink_element),
"have_size", "have_size",
G_CALLBACK (callback_video_have_vis_size), G_CALLBACK (callback_video_have_vis_size), play);
play); */
g_object_set (G_OBJECT (play->visualisation_sink_element), g_object_set (G_OBJECT (play->visualisation_sink_element),
"need_new_window", TRUE, "toplevel", FALSE, NULL); "need_new_window", TRUE, "toplevel", FALSE, NULL);
} }
@ -1039,7 +1038,7 @@ gst_play_connect_visualisation (GstPlay * play, gboolean connect)
{ {
GstPad *tee_vis_pad, *vis_video_thread_pad; GstPad *tee_vis_pad, *vis_video_thread_pad;
GstElement *vis_video_thread; GstElement *vis_video_thread;
gboolean connected = FALSE; gboolean connected = FALSE, was_playing = FALSE;
g_return_val_if_fail (play != NULL, FALSE); g_return_val_if_fail (play != NULL, FALSE);
g_return_val_if_fail (GST_IS_PLAY (play), FALSE); g_return_val_if_fail (GST_IS_PLAY (play), FALSE);
@ -1049,6 +1048,13 @@ gst_play_connect_visualisation (GstPlay * play, gboolean connect)
"vis_video_thread_pad"); "vis_video_thread_pad");
vis_video_thread = g_hash_table_lookup (play->other_elements, vis_video_thread = g_hash_table_lookup (play->other_elements,
"vis_video_thread"); "vis_video_thread");
/* If pipeline was playing we pause it and note that */
if (gst_element_get_state (play->pipeline) == GST_STATE_PLAYING)
{
gst_element_set_state (play->pipeline, GST_STATE_PAUSED);
was_playing = TRUE;
}
if (gst_pad_get_peer (vis_video_thread_pad) != NULL) if (gst_pad_get_peer (vis_video_thread_pad) != NULL)
connected = TRUE; connected = TRUE;
@ -1063,11 +1069,13 @@ gst_play_connect_visualisation (GstPlay * play, gboolean connect)
{ {
gst_pad_unlink (tee_vis_pad, vis_video_thread_pad); gst_pad_unlink (tee_vis_pad, vis_video_thread_pad);
} }
if (GST_IS_ELEMENT (vis_video_thread) && GST_IS_ELEMENT (play->pipeline)) /* Restore playing state if needed */
if (GST_IS_ELEMENT (vis_video_thread) &&
GST_IS_ELEMENT (play->pipeline) &&
was_playing)
{ {
gst_element_set_state (vis_video_thread, gst_element_set_state (play->pipeline, GST_STATE_PLAYING);
gst_element_get_state (play->pipeline));
} }
return TRUE; return TRUE;