diff options
author | Matthias Clasen <mclasen@redhat.com> | 2022-03-24 19:19:01 +0000 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2022-03-24 19:19:01 +0000 |
commit | 3f1021048f26aa177ac544405225c8cddd61a33c (patch) | |
tree | 22685fa6f429e80d4610d58970278942780c200c | |
parent | 1660a0eaf113d1836faa64984003a3dde612e65f (diff) | |
parent | ddba7f86018f4197037fdddaa812654b4bc41c5f (diff) | |
download | gtk+-3f1021048f26aa177ac544405225c8cddd61a33c.tar.gz |
Merge branch 'want_prepare_without_play_for_size' into 'main'
GtkMediaStream with gstreamer backend isn't 'prepared' until media is played
See merge request GNOME/gtk!4560
-rw-r--r-- | modules/media/gtkgstmediafile.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/modules/media/gtkgstmediafile.c b/modules/media/gtkgstmediafile.c index 0fead35bfa..0633214939 100644 --- a/modules/media/gtkgstmediafile.c +++ b/modules/media/gtkgstmediafile.c @@ -173,6 +173,23 @@ gtk_gst_media_file_position_updated_cb (GstPlayer *player, } static void +gtk_gst_media_file_media_info_updated_cb (GstPlayer *player, + GstPlayerMediaInfo *media_info, + GtkGstMediaFile *self) +{ + /* clock_time == 0: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/1588 + * GstPlayer's first media-info-updated comes with 0 duration + * + * clock_time == -1: Seen on loading an audio-only ogg + */ + GstClockTime clock_time = gst_player_media_info_get_duration (media_info); + if (clock_time == 0 || clock_time == -1) + return; + + gtk_gst_media_file_ensure_prepared (self); +} + +static void gtk_gst_media_file_seek_done_cb (GstPlayer *player, GstClockTime time, GtkGstMediaFile *self) @@ -219,6 +236,7 @@ gtk_gst_media_file_destroy_player (GtkGstMediaFile *self) if (self->player == NULL) return; + g_signal_handlers_disconnect_by_func (self->player, gtk_gst_media_file_media_info_updated_cb, self); g_signal_handlers_disconnect_by_func (self->player, gtk_gst_media_file_position_updated_cb, self); g_signal_handlers_disconnect_by_func (self->player, gtk_gst_media_file_end_of_stream_cb, self); g_signal_handlers_disconnect_by_func (self->player, gtk_gst_media_file_seek_done_cb, self); @@ -237,6 +255,7 @@ gtk_gst_media_file_create_player (GtkGstMediaFile *file) self->player = gst_player_new (GST_PLAYER_VIDEO_RENDERER (g_object_ref (self->paintable)), gst_player_g_main_context_signal_dispatcher_new (NULL)); + g_signal_connect (self->player, "media-info-updated", G_CALLBACK (gtk_gst_media_file_media_info_updated_cb), self); g_signal_connect (self->player, "position-updated", G_CALLBACK (gtk_gst_media_file_position_updated_cb), self); g_signal_connect (self->player, "end-of-stream", G_CALLBACK (gtk_gst_media_file_end_of_stream_cb), self); g_signal_connect (self->player, "seek-done", G_CALLBACK (gtk_gst_media_file_seek_done_cb), self); |