mirror of
https://github.com/brl/mutter.git
synced 2024-12-22 11:02:05 +00:00
gl crash fixes
This commit is contained in:
parent
f085407d41
commit
24cefa8d2a
10
ChangeLog
10
ChangeLog
@ -1,3 +1,13 @@
|
||||
2005-05-11 mallum,,, <mallum@openedhand.com>
|
||||
|
||||
* clutter/cltr-video.c: (got_buffering), (cltr_video_new),
|
||||
(cltr_video_play), (cltr_video_idler):
|
||||
* examples/photos.c: (main):
|
||||
* examples/player.c: (handle_xevent), (main):
|
||||
* gst/cltrimagesink.c: (gst_cltrimagesink_chain):
|
||||
Fix Gl thread related crash on video playback
|
||||
Make examples less bound to my laptop ;)
|
||||
|
||||
2005-05-06 mallum,,, <mallum@openedhand.com>
|
||||
|
||||
* clutter/cltr-button.c: (cltr_button_new_with_label):
|
||||
|
@ -23,7 +23,8 @@ struct CltrVideo
|
||||
float current_position;
|
||||
|
||||
guint update_id;
|
||||
char *last_error_message;
|
||||
gchar *last_error_message;
|
||||
gchar *mrl;
|
||||
};
|
||||
|
||||
|
||||
@ -42,6 +43,9 @@ parse_stream_info (CltrVideo *video);
|
||||
static gboolean
|
||||
cb_iterate (CltrVideo *video);
|
||||
|
||||
static void
|
||||
reset_error_msg (CltrVideo *video);
|
||||
|
||||
static gboolean
|
||||
cltr_video_idler (CltrVideo *video);
|
||||
|
||||
@ -292,6 +296,16 @@ got_buffering (GstElement *play,
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
reset_error_msg (CltrVideo *video)
|
||||
{
|
||||
if (video->last_error_message)
|
||||
{
|
||||
g_free (video->last_error_message);
|
||||
video->last_error_message = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
got_error (GstElement *play,
|
||||
@ -579,11 +593,7 @@ cltr_video_play ( CltrVideo *video, GError ** error)
|
||||
{
|
||||
gboolean ret;
|
||||
|
||||
if (video->last_error_message)
|
||||
{
|
||||
g_free (video->last_error_message);
|
||||
video->last_error_message = NULL;
|
||||
}
|
||||
reset_error_msg (video);
|
||||
|
||||
ret = (gst_element_set_state (GST_ELEMENT (video->play),
|
||||
GST_STATE_PLAYING) == GST_STATE_SUCCESS);
|
||||
@ -697,14 +707,25 @@ cltr_video_idler (CltrVideo *video)
|
||||
switch (signal->signal_id)
|
||||
{
|
||||
case CLTR_VIDEO_ASYNC_TEXTURE:
|
||||
video->frame_texture = signal->signal_data.texture.ref;
|
||||
{
|
||||
Pixbuf *pixb = NULL;
|
||||
|
||||
/*
|
||||
* we can actually grab the width and height from
|
||||
* the textures pixbuf.
|
||||
*/
|
||||
video->frame_texture = signal->signal_data.texture.ref;
|
||||
|
||||
cltr_widget_queue_paint(CLTR_WIDGET(video));
|
||||
cltr_texture_lock(video->frame_texture);
|
||||
|
||||
pixb = cltr_texture_get_pixbuf(video->frame_texture);
|
||||
|
||||
if (pixb)
|
||||
cltr_texture_force_rgb_data(video->frame_texture,
|
||||
pixb->width,
|
||||
pixb->height,
|
||||
pixb->data);
|
||||
|
||||
cltr_texture_unlock(video->frame_texture);
|
||||
|
||||
cltr_widget_queue_paint(CLTR_WIDGET(video));
|
||||
}
|
||||
break;
|
||||
case CLTR_VIDEO_ASYNC_VIDEO_SIZE:
|
||||
video->video_width = signal->signal_data.video_size.width;
|
||||
@ -730,13 +751,72 @@ cltr_video_idler (CltrVideo *video)
|
||||
}
|
||||
|
||||
gboolean
|
||||
cltr_video_set_source(CltrVideo *video, char *location)
|
||||
cltr_video_set_source(CltrVideo *video, char *mrl)
|
||||
{
|
||||
/* if (!gst_play_set_location (video->play, location)) */
|
||||
gboolean ret;
|
||||
|
||||
g_object_set (G_OBJECT (video->play), "uri", location, NULL);
|
||||
if (video->mrl && !strcmp (video->mrl, mrl))
|
||||
return TRUE;
|
||||
|
||||
if (video->mrl)
|
||||
g_free (video->mrl);
|
||||
|
||||
video->mrl = g_strdup (mrl);
|
||||
|
||||
gst_element_set_state (GST_ELEMENT (video->play), GST_STATE_READY);
|
||||
|
||||
reset_error_msg (video);
|
||||
|
||||
/* video->got_redirect = FALSE; */
|
||||
video->has_video = FALSE;
|
||||
video->stream_length = 0;
|
||||
|
||||
/* Dont handle subtitles as yet
|
||||
if (g_strrstr (video->mrl, "#subtitle:"))
|
||||
{
|
||||
gchar **uris;
|
||||
|
||||
uris = g_strsplit (video->mrl, "#subtitle:", 2);
|
||||
g_object_set (G_OBJECT (video->play), "uri",
|
||||
uris[0], "suburi", uris[1], NULL);
|
||||
g_strfreev (uris);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_object_set (G_OBJECT (video->play), "uri",
|
||||
video->mrl, "suburi", subtitle_uri, NULL);
|
||||
}
|
||||
*/
|
||||
|
||||
g_object_set (G_OBJECT (video->play), "uri",
|
||||
video->mrl, "suburi", NULL, NULL);
|
||||
|
||||
|
||||
ret = (gst_element_set_state (video->play,
|
||||
GST_STATE_PAUSED) == GST_STATE_SUCCESS);
|
||||
|
||||
|
||||
if (!ret /* && !video->got_redirect */)
|
||||
{
|
||||
|
||||
/*
|
||||
g_set_error (error, 0, 0, "%s", video->last_error_message ?
|
||||
video->last_error_message : "Failed to open; reason unknown");
|
||||
*/
|
||||
|
||||
g_free (video->mrl);
|
||||
video->mrl = NULL;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
if (ret)
|
||||
g_signal_emit (bvw, bvw_table_signals[SIGNAL_CHANNELS_CHANGE], 0);
|
||||
*/
|
||||
|
||||
return ret;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
@ -131,12 +131,12 @@ main(int argc, char **argv)
|
||||
usage(argv[0]);
|
||||
}
|
||||
|
||||
win = cltr_window_new(640, 480);
|
||||
win = cltr_window_new(800, 600);
|
||||
|
||||
if (want_fullscreen)
|
||||
cltr_window_set_fullscreen(CLTR_WINDOW(win));
|
||||
|
||||
grid = cltr_photo_grid_new(640, 480, cols, cols, ImgPath);
|
||||
grid = cltr_photo_grid_new(800, 600, cols, cols, ImgPath);
|
||||
|
||||
cltr_window_focus_widget(CLTR_WINDOW(win), grid);
|
||||
|
||||
|
@ -41,6 +41,7 @@ handle_xevent(CltrWidget *win, XEvent *xev, void *cookie)
|
||||
else
|
||||
cltr_video_pause (video);
|
||||
Paused ^= 1;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -65,17 +66,17 @@ main (int argc, char *argv[])
|
||||
|
||||
font = font_new("Sans bold 96");
|
||||
|
||||
win = cltr_window_new(1400, 1050);
|
||||
win = cltr_window_new(800, 600);
|
||||
|
||||
video = cltr_video_new(1400, 1050);
|
||||
video = cltr_video_new(800, 600);
|
||||
|
||||
cltr_video_set_source(CLTR_VIDEO(video), argv[1]);
|
||||
|
||||
cltr_widget_add_child(win, video, 0, 0);
|
||||
|
||||
// label = cltr_label_new("hello world", font, &col);
|
||||
label = cltr_label_new("hello world", font, &col);
|
||||
|
||||
// cltr_widget_add_child(win, label, 100, 300);
|
||||
cltr_widget_add_child(win, label, 100, 300);
|
||||
|
||||
cltr_window_on_xevent(CLTR_WINDOW(win), handle_xevent, video);
|
||||
|
||||
|
@ -331,21 +331,20 @@ gst_cltrimagesink_chain (GstPad * pad, GstData * data)
|
||||
|
||||
if (pixb)
|
||||
{
|
||||
/*
|
||||
memcpy (pixb->data,
|
||||
GST_BUFFER_DATA (buf),
|
||||
MIN (GST_BUFFER_SIZE (buf),
|
||||
pixb->bytes_per_line * pixb->width));
|
||||
*/
|
||||
|
||||
/* EVIL */
|
||||
/* Below faster but threading issues causing DRI to bomb out */
|
||||
|
||||
/*
|
||||
if (GST_BUFFER_SIZE (buf) >= pixb->width * pixb->height * 3)
|
||||
cltr_texture_force_rgb_data(cltrimagesink->texture,
|
||||
pixb->width,
|
||||
pixb->height,
|
||||
GST_BUFFER_DATA (buf));
|
||||
|
||||
*/
|
||||
}
|
||||
|
||||
cltr_texture_unlock(cltrimagesink->texture);
|
||||
|
Loading…
Reference in New Issue
Block a user