diff --git a/ChangeLog b/ChangeLog index d9d2174936..dc5c0c857f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,54 @@ +2005-05-09 Wim Taymans + + * examples/seeking/seek.c: (make_theora_pipeline), + (make_vorbis_theora_pipeline), (make_avi_msmpeg4v3_mp3_pipeline), + (query_rates), (query_positions_elems), (query_positions_pads), + (update_scale), (play_cb), (pause_cb), (stop_cb), (main): + * ext/ogg/gstoggdemux.c: (gst_ogg_pad_init), + (gst_ogg_pad_query_types), (gst_ogg_pad_src_query), + (gst_ogg_pad_typefind), (gst_ogg_demux_init), + (gst_ogg_demux_perform_seek), (gst_ogg_demux_read_chain), + (gst_ogg_demux_read_end_chain), (gst_ogg_demux_sink_activate): + * ext/ogg/gstoggmux.c: (gst_ogg_mux_init), + (gst_ogg_mux_request_new_pad), (gst_ogg_mux_next_buffer), + (gst_ogg_mux_push_page), (gst_ogg_mux_queue_pads), + (gst_ogg_mux_get_headers), (gst_ogg_mux_send_headers), + (gst_ogg_mux_collected), (gst_ogg_mux_change_state): + * ext/ogg/gstogmparse.c: (gst_ogm_audio_parse_init), + (gst_ogm_video_parse_init), (gst_ogm_text_parse_init), + (gst_ogm_parse_sink_query), (gst_ogm_parse_chain): + * ext/theora/theoradec.c: (gst_theora_dec_init), (_inc_granulepos), + (theora_dec_src_convert), (theora_dec_sink_convert), + (theora_dec_src_query), (theora_dec_sink_query), + (theora_dec_src_event), (theora_dec_sink_event), + (theora_handle_comment_packet), (theora_handle_type_packet), + (theora_handle_header_packet), (theora_handle_data_packet), + (theora_dec_chain): + * ext/vorbis/vorbisdec.c: (gst_vorbis_dec_init), + (vorbis_dec_convert), (vorbis_dec_src_query), + (vorbis_dec_sink_query), (vorbis_dec_src_event), + (vorbis_dec_sink_event), (vorbis_handle_comment_packet), + (vorbis_handle_type_packet), (vorbis_handle_header_packet), + (copy_samples), (vorbis_handle_data_packet), (vorbis_dec_chain): + * ext/vorbis/vorbisenc.c: (gst_vorbisenc_src_query), + (gst_vorbisenc_sink_query), (gst_vorbisenc_init), + (gst_vorbisenc_sink_event), (gst_vorbisenc_chain): + * gst/playback/gstplaybin.c: (gst_play_bin_class_init), + (gst_play_bin_query): + * gst/playback/test3.c: (update_scale): + * gst/sine/gstsinesrc.c: (gst_sinesrc_setcaps), + (gst_sinesrc_src_query), (gst_sinesrc_create), (gst_sinesrc_start): + * gst/subparse/gstsubparse.c: (gst_subparse_init): + * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_init), + (gst_videotestsrc_src_query): + * gst/videotestsrc/videotestsrc.c: (paint_hline_I420), + (paint_hline_Y41B), (paint_hline_Y42B), (paint_hline_Y800), + (paint_hline_YUV9): + * sys/ximage/ximagesink.c: (gst_ximagesink_show_frame): + Port to new query API. + Updated seek. + Cleanups in x[v]imagesink + 2005-05-09 Andy Wingo * ext/alsa/gstalsasink.h: diff --git a/examples/seeking/seek.c b/examples/seeking/seek.c index f89a7069af..2b7c763c48 100644 --- a/examples/seeking/seek.c +++ b/examples/seeking/seek.c @@ -9,7 +9,8 @@ static GList *rate_pads = NULL; static GList *seekable_elements = NULL; static GstElement *pipeline; -static guint64 duration; +static gint64 position; +static gint64 duration; static GtkAdjustment *adjustment; static GtkWidget *hscale; static gboolean stats = FALSE; @@ -24,6 +25,9 @@ static gulong changed_id; #define SOURCE "gnomevfssrc" #define ASINK "alsasink" //#define ASINK "osssink" +#define VSINK "xvimagesink" +//#define VSINK "ximagesink" +//#define VSINK "aasink" #define UPDATE_INTERVAL 500 @@ -334,7 +338,7 @@ make_theora_pipeline (const gchar * location) queue = gst_element_factory_make_or_warn ("queue", "queue"); decoder = gst_element_factory_make_or_warn ("theoradec", "decoder"); convert = gst_element_factory_make_or_warn ("ffmpegcolorspace", "convert"); - videosink = gst_element_factory_make_or_warn ("xvimagesink", "sink"); + videosink = gst_element_factory_make_or_warn (VSINK, "sink"); g_object_set (G_OBJECT (src), "location", location, NULL); @@ -407,7 +411,7 @@ make_vorbis_theora_pipeline (const gchar * location) v_decoder = gst_element_factory_make_or_warn ("theoradec", "v_dec"); v_convert = gst_element_factory_make_or_warn ("ffmpegcolorspace", "v_convert"); - videosink = gst_element_factory_make_or_warn ("xvimagesink", "v_sink"); + videosink = gst_element_factory_make_or_warn (VSINK, "v_sink"); gst_element_link_many (v_queue, v_decoder, v_convert, videosink, NULL); gst_bin_add (GST_BIN (video_bin), v_queue); @@ -472,7 +476,7 @@ make_avi_msmpeg4v3_mp3_pipeline (const gchar * location) v_decoder = gst_element_factory_make_or_warn ("ffdec_msmpeg4", "v_dec"); v_convert = gst_element_factory_make_or_warn ("ffmpegcolorspace", "v_convert"); - videosink = gst_element_factory_make_or_warn ("xvimagesink", "v_sink"); + videosink = gst_element_factory_make_or_warn (VSINK, "v_sink"); gst_element_link_many (v_queue, v_decoder, v_convert, videosink, NULL); gst_bin_add (GST_BIN (video_bin), v_queue); @@ -794,7 +798,8 @@ query_rates (void) format = seek_formats[i].format; - if (gst_pad_convert (pad, GST_FORMAT_TIME, GST_SECOND, &format, &value)) { + if (gst_pad_query_convert (pad, GST_FORMAT_TIME, GST_SECOND, &format, + &value)) { g_print ("%s %13" G_GINT64_FORMAT " | ", seek_formats[i].name, value); } else { g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*"); @@ -808,66 +813,6 @@ query_rates (void) } } -G_GNUC_UNUSED static void -query_durations_elems () -{ - GList *walk = seekable_elements; - - while (walk) { - GstElement *element = GST_ELEMENT (walk->data); - gint i = 0; - - g_print ("durations %8.8s: ", GST_ELEMENT_NAME (element)); - while (seek_formats[i].name) { - gboolean res; - gint64 value; - GstFormat format; - - format = seek_formats[i].format; - res = gst_element_query (element, GST_QUERY_TOTAL, &format, &value); - if (res) { - g_print ("%s %13" G_GINT64_FORMAT " | ", seek_formats[i].name, value); - } else { - g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*"); - } - i++; - } - g_print (" %s\n", GST_ELEMENT_NAME (element)); - - walk = g_list_next (walk); - } -} - -G_GNUC_UNUSED static void -query_durations_pads () -{ - GList *walk = seekable_pads; - - while (walk) { - GstPad *pad = GST_PAD (walk->data); - gint i = 0; - - g_print ("durations %8.8s: ", GST_PAD_NAME (pad)); - while (seek_formats[i].name) { - gboolean res; - gint64 value; - GstFormat format; - - format = seek_formats[i].format; - res = gst_pad_query (pad, GST_QUERY_TOTAL, &format, &value); - if (res) { - g_print ("%s %13" G_GINT64_FORMAT " | ", seek_formats[i].name, value); - } else { - g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*"); - } - i++; - } - g_print (" %s:%s\n", GST_DEBUG_PAD_NAME (pad)); - - walk = g_list_next (walk); - } -} - G_GNUC_UNUSED static void query_positions_elems () { @@ -879,16 +824,17 @@ query_positions_elems () g_print ("positions %8.8s: ", GST_ELEMENT_NAME (element)); while (seek_formats[i].name) { - gboolean res; - gint64 value; + gint64 position, total; GstFormat format; format = seek_formats[i].format; - res = gst_element_query (element, GST_QUERY_POSITION, &format, &value); - if (res) { - g_print ("%s %13" G_GINT64_FORMAT " | ", seek_formats[i].name, value); + + if (gst_element_query_position (element, &format, &position, &total)) { + g_print ("%s %13" G_GINT64_FORMAT " / %13" G_GINT64_FORMAT " | ", + seek_formats[i].name, position, total); } else { - g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*"); + g_print ("%s %13.13s / %13.13s | ", seek_formats[i].name, "*NA*", + "*NA*"); } i++; } @@ -909,17 +855,19 @@ query_positions_pads () g_print ("positions %8.8s: ", GST_PAD_NAME (pad)); while (seek_formats[i].name) { - gboolean res; - gint64 value; GstFormat format; + gint64 position, total; format = seek_formats[i].format; - res = gst_pad_query (pad, GST_QUERY_POSITION, &format, &value); - if (res) { - g_print ("%s %13" G_GINT64_FORMAT " | ", seek_formats[i].name, value); + + if (gst_pad_query_position (pad, &format, &position, &total)) { + g_print ("%s %13" G_GINT64_FORMAT " / %13" G_GINT64_FORMAT " | ", + seek_formats[i].name, position, total); } else { - g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*"); + g_print ("%s %13.13s / %13.13s | ", seek_formats[i].name, "*NA*", + "*NA*"); } + i++; } g_print (" %s:%s\n", GST_DEBUG_PAD_NAME (pad)); @@ -932,34 +880,25 @@ static gboolean update_scale (gpointer data) { GstClock *clock; - guint64 position; - GstFormat format = GST_FORMAT_TIME; - gboolean res; + GstFormat format; + position = 0; duration = 0; clock = gst_pipeline_get_clock (GST_PIPELINE (pipeline)); + format = GST_FORMAT_TIME; + if (elem_seek) { if (seekable_elements) { GstElement *element = GST_ELEMENT (seekable_elements->data); - res = gst_element_query (element, GST_QUERY_TOTAL, &format, &duration); - if (!res) - duration = 0; - res = gst_element_query (element, GST_QUERY_POSITION, &format, &position); - if (!res) - position = 0; + gst_element_query_position (element, &format, &position, &duration); } } else { if (seekable_pads) { GstPad *pad = GST_PAD (seekable_pads->data); - res = gst_pad_query (pad, GST_QUERY_TOTAL, &format, &duration); - if (!res) - duration = 0; - res = gst_pad_query (pad, GST_QUERY_POSITION, &format, &position); - if (!res) - position = 0; + gst_pad_query_position (pad, &format, &position, &duration); } } @@ -970,10 +909,8 @@ update_scale (gpointer data) } if (elem_seek) { - query_durations_elems (); query_positions_elems (); } else { - query_durations_pads (); query_positions_pads (); } query_rates (); @@ -1107,6 +1044,7 @@ play_cb (GtkButton * button, gpointer data) gst_element_get_state (pipeline, &state, NULL, NULL); if (state != GST_STATE_PLAYING) { + g_print ("PLAY pipeline\n"); gst_element_set_state (pipeline, GST_STATE_PLAYING); update_id = gtk_timeout_add (UPDATE_INTERVAL, (GtkFunction) update_scale, pipeline); @@ -1120,6 +1058,7 @@ pause_cb (GtkButton * button, gpointer data) gst_element_get_state (pipeline, &state, NULL, NULL); if (state != GST_STATE_PAUSED) { + g_print ("PAUSE pipeline\n"); gst_element_set_state (pipeline, GST_STATE_PAUSED); gtk_timeout_remove (update_id); } @@ -1132,6 +1071,7 @@ stop_cb (GtkButton * button, gpointer data) gst_element_get_state (pipeline, &state, NULL, NULL); if (state != GST_STATE_READY) { + g_print ("READY pipeline\n"); gst_element_set_state (pipeline, GST_STATE_READY); gtk_adjustment_set_value (adjustment, 0.0); gtk_timeout_remove (update_id); @@ -1260,8 +1200,10 @@ main (int argc, char **argv) } gtk_main (); + g_print ("NULL pipeline\n"); gst_element_set_state (pipeline, GST_STATE_NULL); + g_print ("free pipeline\n"); gst_object_unref (GST_OBJECT (pipeline)); return 0; diff --git a/ext/ogg/gstoggdemux.c b/ext/ogg/gstoggdemux.c index 8bb1096742..dc1691f7f5 100644 --- a/ext/ogg/gstoggdemux.c +++ b/ext/ogg/gstoggdemux.c @@ -186,14 +186,13 @@ static void gst_ogg_pad_class_init (GstOggPadClass * klass); static void gst_ogg_pad_init (GstOggPad * pad); static void gst_ogg_pad_dispose (GObject * object); static void gst_ogg_pad_finalize (GObject * object); + +#if 0 static const GstFormat *gst_ogg_pad_formats (GstPad * pad); static const GstEventMask *gst_ogg_pad_event_masks (GstPad * pad); +#endif static const GstQueryType *gst_ogg_pad_query_types (GstPad * pad); -static gboolean gst_ogg_pad_src_convert (GstPad * pad, - GstFormat src_format, gint64 src_value, - GstFormat * dest_format, gint64 * dest_value); -static gboolean gst_ogg_pad_src_query (GstPad * pad, GstQueryType type, - GstFormat * format, gint64 * value); +static gboolean gst_ogg_pad_src_query (GstPad * pad, GstQuery * query); static gboolean gst_ogg_pad_event (GstPad * pad, GstEvent * event); static GstCaps *gst_ogg_pad_getcaps (GstPad * pad); static GstCaps *gst_ogg_type_find (ogg_packet * packet); @@ -243,16 +242,10 @@ gst_ogg_pad_init (GstOggPad * pad) { gst_pad_set_event_function (GST_PAD (pad), GST_DEBUG_FUNCPTR (gst_ogg_pad_event)); - gst_pad_set_event_mask_function (GST_PAD (pad), - GST_DEBUG_FUNCPTR (gst_ogg_pad_event_masks)); gst_pad_set_getcaps_function (GST_PAD (pad), GST_DEBUG_FUNCPTR (gst_ogg_pad_getcaps)); gst_pad_set_query_type_function (GST_PAD (pad), GST_DEBUG_FUNCPTR (gst_ogg_pad_query_types)); - gst_pad_set_formats_function (GST_PAD (pad), - GST_DEBUG_FUNCPTR (gst_ogg_pad_formats)); - gst_pad_set_convert_function (GST_PAD (pad), - GST_DEBUG_FUNCPTR (gst_ogg_pad_src_convert)); gst_pad_set_query_function (GST_PAD (pad), GST_DEBUG_FUNCPTR (gst_ogg_pad_src_query)); @@ -304,6 +297,7 @@ gst_ogg_pad_finalize (GObject * object) G_OBJECT_CLASS (ogg_pad_parent_class)->finalize (object); } +#if 0 static const GstFormat * gst_ogg_pad_formats (GstPad * pad) { @@ -320,7 +314,9 @@ gst_ogg_pad_formats (GstPad * pad) return (GST_PAD_IS_SRC (pad) ? src_formats : sink_formats); } +#endif +#if 0 static const GstEventMask * gst_ogg_pad_event_masks (GstPad * pad) { @@ -331,13 +327,13 @@ gst_ogg_pad_event_masks (GstPad * pad) return src_event_masks; } +#endif static const GstQueryType * gst_ogg_pad_query_types (GstPad * pad) { static const GstQueryType query_types[] = { GST_QUERY_POSITION, - GST_QUERY_TOTAL, 0 }; @@ -351,23 +347,7 @@ gst_ogg_pad_getcaps (GstPad * pad) } static gboolean -gst_ogg_pad_src_convert (GstPad * pad, - GstFormat src_format, gint64 src_value, - GstFormat * dest_format, gint64 * dest_value) -{ - gboolean res = FALSE; - GstOggDemux *ogg; - - ogg = GST_OGG_DEMUX (GST_PAD_PARENT (pad)); - - /* fill me, not sure with what... */ - - return res; -} - -static gboolean -gst_ogg_pad_src_query (GstPad * pad, GstQueryType type, - GstFormat * format, gint64 * value) +gst_ogg_pad_src_query (GstPad * pad, GstQuery * query) { gboolean res = TRUE; GstOggDemux *ogg; @@ -376,12 +356,13 @@ gst_ogg_pad_src_query (GstPad * pad, GstQueryType type, ogg = GST_OGG_DEMUX (GST_PAD_PARENT (pad)); cur = GST_OGG_PAD (pad); - switch (type) { + switch (GST_QUERY_TYPE (query)) { case GST_QUERY_POSITION: - *value = cur->current_granule; + gst_query_set_position (query, GST_FORMAT_TIME, -1, ogg->total_time); break; - case GST_QUERY_TOTAL: - *value = ogg->total_time; + case GST_QUERY_CONVERT: + /* hmm .. */ + res = FALSE; break; default: res = FALSE; @@ -940,7 +921,6 @@ gst_ogg_demux_init (GstOggDemux * ogg) ogg->sinkpad = gst_pad_new_from_template (gst_static_pad_template_get (&ogg_demux_sink_template_factory), "sink"); - gst_pad_set_formats_function (ogg->sinkpad, gst_ogg_pad_formats); gst_pad_set_loop_function (ogg->sinkpad, (GstPadLoopFunction) gst_ogg_demux_loop); gst_pad_set_event_function (ogg->sinkpad, gst_ogg_demux_handle_event); @@ -1327,7 +1307,7 @@ gst_ogg_demux_perform_seek (GstOggDemux * ogg, gint64 pos) } else { gint64 granulepos; GstClockTime granuletime; - GstFormat format = GST_FORMAT_TIME; + GstFormat format; GstOggPad *pad; granulepos = ogg_page_granulepos (&og); @@ -1338,8 +1318,13 @@ gst_ogg_demux_perform_seek (GstOggDemux * ogg, gint64 pos) if (pad == NULL) continue; - gst_pad_convert (pad->elem_pad, - GST_FORMAT_DEFAULT, granulepos, &format, (gint64 *) & granuletime); + format = GST_FORMAT_TIME; + if (!gst_pad_query_convert (pad->elem_pad, + GST_FORMAT_DEFAULT, granulepos, &format, + (gint64 *) & granuletime)) { + g_warning ("could not convert granulepos to time"); + granuletime = target; + } GST_DEBUG_OBJECT (ogg, "found page with granule %" G_GINT64_FORMAT " and time %" @@ -1575,11 +1560,14 @@ gst_ogg_demux_read_chain (GstOggDemux * ogg) /* now we can fill in the missing info using queries */ for (i = 0; i < chain->streams->len; i++) { GstOggPad *pad = g_array_index (chain->streams, GstOggPad *, i); - GstFormat target = GST_FORMAT_TIME; + GstFormat target; - gst_pad_convert (pad->elem_pad, - GST_FORMAT_DEFAULT, pad->first_granule, &target, - (gint64 *) & pad->first_time); + target = GST_FORMAT_TIME; + if (!gst_pad_query_convert (pad->elem_pad, + GST_FORMAT_DEFAULT, pad->first_granule, &target, + (gint64 *) & pad->first_time)) { + g_warning ("could not convert granule to time"); + } pad->mode = GST_OGG_PAD_MODE_STREAMING; pad->packetno = 0; @@ -1637,11 +1625,14 @@ gst_ogg_demux_read_end_chain (GstOggDemux * ogg, GstOggChain * chain) /* now we can fill in the missing info using queries */ for (i = 0; i < chain->streams->len; i++) { GstOggPad *pad = g_array_index (chain->streams, GstOggPad *, i); - GstFormat target = GST_FORMAT_TIME; + GstFormat target; - gst_pad_convert (pad->elem_pad, - GST_FORMAT_DEFAULT, pad->last_granule, &target, - (gint64 *) & pad->last_time); + target = GST_FORMAT_TIME; + if (!gst_pad_query_convert (pad->elem_pad, + GST_FORMAT_DEFAULT, pad->last_granule, &target, + (gint64 *) & pad->last_time)) { + g_warning ("could not convert granule to time"); + } } return 0; } diff --git a/ext/ogg/gstoggmux.c b/ext/ogg/gstoggmux.c index 1596b80750..a9499c7ba1 100644 --- a/ext/ogg/gstoggmux.c +++ b/ext/ogg/gstoggmux.c @@ -240,6 +240,7 @@ gst_ogg_mux_class_init (GstOggMuxClass * klass) } +#if 0 static const GstEventMask * gst_ogg_mux_get_sink_event_masks (GstPad * pad) { @@ -251,6 +252,7 @@ gst_ogg_mux_get_sink_event_masks (GstPad * pad) return gst_ogg_mux_sink_event_masks; } +#endif static void gst_ogg_mux_init (GstOggMux * ogg_mux) @@ -353,7 +355,6 @@ gst_ogg_mux_request_new_pad (GstElement * element, /* setup some pad functions */ gst_pad_set_link_function (newpad, gst_ogg_mux_sinkconnect); - gst_pad_set_event_mask_function (newpad, gst_ogg_mux_get_sink_event_masks); /* dd the pad to the element */ gst_element_add_pad (element, newpad); diff --git a/ext/ogg/gstogmparse.c b/ext/ogg/gstogmparse.c index 49e6c5a3ea..847fce2fe5 100644 --- a/ext/ogg/gstogmparse.c +++ b/ext/ogg/gstogmparse.c @@ -140,12 +140,14 @@ static void gst_ogm_video_parse_init (GstOgmParse * ogm); static void gst_ogm_audio_parse_init (GstOgmParse * ogm); static void gst_ogm_text_parse_init (GstOgmParse * ogm); +#if 0 static const GstFormat *gst_ogm_parse_get_sink_formats (GstPad * pad); +#endif + static const GstQueryType *gst_ogm_parse_get_sink_querytypes (GstPad * pad); +static gboolean gst_ogm_parse_sink_query (GstPad * pad, GstQuery * query); static gboolean gst_ogm_parse_sink_convert (GstPad * pad, GstFormat src_format, gint64 src_value, GstFormat * dest_format, gint64 * dest_value); -static gboolean gst_ogm_parse_sink_query (GstPad * pad, GstQueryType type, - GstFormat * fmt, gint64 * val); static GstFlowReturn gst_ogm_parse_chain (GstPad * pad, GstBuffer * buffer); @@ -343,8 +345,7 @@ gst_ogm_audio_parse_init (GstOgmParse * ogm) /* create the pads */ templ = gst_static_pad_template_get (&ogm_audio_parse_sink_template_factory); ogm->sinkpad = gst_pad_new_from_template (templ, "sink"); - gst_pad_set_convert_function (ogm->sinkpad, gst_ogm_parse_sink_convert); - gst_pad_set_formats_function (ogm->sinkpad, gst_ogm_parse_get_sink_formats); + gst_pad_set_query_function (ogm->sinkpad, gst_ogm_parse_sink_query); gst_pad_set_chain_function (ogm->sinkpad, gst_ogm_parse_chain); gst_element_add_pad (GST_ELEMENT (ogm), ogm->sinkpad); @@ -364,8 +365,7 @@ gst_ogm_video_parse_init (GstOgmParse * ogm) /* create the pads */ templ = gst_static_pad_template_get (&ogm_video_parse_sink_template_factory); ogm->sinkpad = gst_pad_new_from_template (templ, "sink"); - gst_pad_set_convert_function (ogm->sinkpad, gst_ogm_parse_sink_convert); - gst_pad_set_formats_function (ogm->sinkpad, gst_ogm_parse_get_sink_formats); + gst_pad_set_query_function (ogm->sinkpad, gst_ogm_parse_sink_query); gst_pad_set_chain_function (ogm->sinkpad, gst_ogm_parse_chain); gst_element_add_pad (GST_ELEMENT (ogm), ogm->sinkpad); @@ -385,8 +385,6 @@ gst_ogm_text_parse_init (GstOgmParse * ogm) /* create the pads */ templ = gst_static_pad_template_get (&ogm_text_parse_sink_template_factory); ogm->sinkpad = gst_pad_new_from_template (templ, "sink"); - gst_pad_set_convert_function (ogm->sinkpad, gst_ogm_parse_sink_convert); - gst_pad_set_formats_function (ogm->sinkpad, gst_ogm_parse_get_sink_formats); gst_pad_set_query_type_function (ogm->sinkpad, gst_ogm_parse_get_sink_querytypes); gst_pad_set_query_function (ogm->sinkpad, gst_ogm_parse_sink_query); @@ -401,6 +399,7 @@ gst_ogm_text_parse_init (GstOgmParse * ogm) ogm->srcpadtempl = text_src_templ; } +#if 0 static const GstFormat * gst_ogm_parse_get_sink_formats (GstPad * pad) { @@ -412,6 +411,7 @@ gst_ogm_parse_get_sink_formats (GstPad * pad) return formats; } +#endif static const GstQueryType * gst_ogm_parse_get_sink_querytypes (GstPad * pad) @@ -485,18 +485,47 @@ gst_ogm_parse_sink_convert (GstPad * pad, } static gboolean -gst_ogm_parse_sink_query (GstPad * pad, - GstQueryType type, GstFormat * fmt, gint64 * val) +gst_ogm_parse_sink_query (GstPad * pad, GstQuery * query) { - GstOgmParse *ogm = GST_OGM_PARSE (gst_pad_get_parent (pad)); + GstOgmParse *ogm = GST_OGM_PARSE (GST_PAD_PARENT (pad)); + GstFormat format; + gboolean res; - if (type != GST_QUERY_POSITION) - return FALSE; - if (*fmt != GST_FORMAT_DEFAULT && *fmt != GST_FORMAT_TIME) - return FALSE; + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_POSITION: + { + gint64 val; - return gst_pad_convert (pad, - GST_FORMAT_DEFAULT, ogm->next_granulepos, fmt, val); + gst_query_parse_position (query, &format, NULL, NULL); + + if (format != GST_FORMAT_DEFAULT && format != GST_FORMAT_TIME) + return FALSE; + + if ((res = gst_ogm_parse_sink_convert (pad, + GST_FORMAT_DEFAULT, ogm->next_granulepos, &format, &val))) { + /* don't know the total length here.. */ + gst_query_set_position (query, format, val, -1); + } + break; + } + case GST_QUERY_CONVERT: + { + GstFormat src_fmt, dest_fmt; + gint64 src_val, dest_val; + + /* peel off input */ + gst_query_parse_convert (query, &src_fmt, &src_val, NULL, NULL); + if ((res = gst_ogm_parse_sink_convert (pad, src_fmt, src_val, + &dest_fmt, &dest_val))) { + gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val); + } + break; + } + default: + res = FALSE; + break; + } + return res; } static GstFlowReturn diff --git a/ext/theora/theoradec.c b/ext/theora/theoradec.c index e2d8b2663b..9ccbfdf285 100644 --- a/ext/theora/theoradec.c +++ b/ext/theora/theoradec.c @@ -115,16 +115,21 @@ static gboolean theora_dec_sink_event (GstPad * pad, GstEvent * event); static GstFlowReturn theora_dec_chain (GstPad * pad, GstBuffer * buffer); static GstElementStateReturn theora_dec_change_state (GstElement * element); static gboolean theora_dec_src_event (GstPad * pad, GstEvent * event); -static gboolean theora_dec_src_query (GstPad * pad, - GstQueryType query, GstFormat * format, gint64 * value); +static gboolean theora_dec_src_query (GstPad * pad, GstQuery * query); static gboolean theora_dec_src_convert (GstPad * pad, GstFormat src_format, gint64 src_value, GstFormat * dest_format, gint64 * dest_value); static gboolean theora_dec_sink_convert (GstPad * pad, GstFormat src_format, gint64 src_value, GstFormat * dest_format, gint64 * dest_value); +static gboolean theora_dec_sink_query (GstPad * pad, GstQuery * query); + +#if 0 static const GstFormat *theora_get_formats (GstPad * pad); +#endif +#if 0 static const GstEventMask *theora_get_event_masks (GstPad * pad); +#endif static const GstQueryType *theora_get_query_types (GstPad * pad); @@ -165,8 +170,7 @@ gst_theora_dec_init (GstTheoraDec * dec) dec->sinkpad = gst_pad_new_from_template (gst_static_pad_template_get (&theora_dec_sink_factory), "sink"); - gst_pad_set_formats_function (dec->sinkpad, theora_get_formats); - gst_pad_set_convert_function (dec->sinkpad, theora_dec_sink_convert); + gst_pad_set_query_function (dec->sinkpad, theora_dec_sink_query); gst_pad_set_event_function (dec->sinkpad, theora_dec_sink_event); gst_pad_set_chain_function (dec->sinkpad, theora_dec_chain); gst_element_add_pad (GST_ELEMENT (dec), dec->sinkpad); @@ -174,12 +178,9 @@ gst_theora_dec_init (GstTheoraDec * dec) dec->srcpad = gst_pad_new_from_template (gst_static_pad_template_get (&theora_dec_src_factory), "src"); - gst_pad_set_event_mask_function (dec->srcpad, theora_get_event_masks); gst_pad_set_event_function (dec->srcpad, theora_dec_src_event); gst_pad_set_query_type_function (dec->srcpad, theora_get_query_types); gst_pad_set_query_function (dec->srcpad, theora_dec_src_query); - gst_pad_set_formats_function (dec->srcpad, theora_get_formats); - gst_pad_set_convert_function (dec->srcpad, theora_dec_src_convert); gst_element_add_pad (GST_ELEMENT (dec), dec->srcpad); @@ -221,6 +222,7 @@ _inc_granulepos (GstTheoraDec * dec) dec->granulepos = (framecount << ilog); } +#if 0 static const GstFormat * theora_get_formats (GstPad * pad) { @@ -238,7 +240,9 @@ theora_get_formats (GstPad * pad) return (GST_PAD_IS_SRC (pad) ? src_formats : sink_formats); } +#endif +#if 0 static const GstEventMask * theora_get_event_masks (GstPad * pad) { @@ -249,6 +253,7 @@ theora_get_event_masks (GstPad * pad) return theora_src_event_masks; } +#endif static const GstQueryType * theora_get_query_types (GstPad * pad) @@ -278,6 +283,11 @@ theora_dec_src_convert (GstPad * pad, if (dec->packetno < 1) return FALSE; + if (src_format == *dest_format) { + *dest_value = src_value; + return TRUE; + } + switch (src_format) { case GST_FORMAT_BYTES: switch (*dest_format) { @@ -339,6 +349,11 @@ theora_dec_sink_convert (GstPad * pad, if (dec->packetno < 1) return FALSE; + if (src_format == *dest_format) { + *dest_value = src_value; + return TRUE; + } + switch (src_format) { case GST_FORMAT_DEFAULT: { @@ -395,36 +410,98 @@ theora_dec_sink_convert (GstPad * pad, } static gboolean -theora_dec_src_query (GstPad * pad, GstQueryType query, GstFormat * format, - gint64 * value) +theora_dec_src_query (GstPad * pad, GstQuery * query) { - gint64 granulepos; GstTheoraDec *dec = GST_THEORA_DEC (GST_PAD_PARENT (pad)); - GstFormat my_format = GST_FORMAT_DEFAULT; - guint64 time; + gboolean res = FALSE; - if (query == GST_QUERY_POSITION) { - /* this is easy, we can convert a granule position to everything */ - granulepos = dec->granulepos; - } else { - /* for the total, we just forward the query to the peer */ - return gst_pad_query (GST_PAD_PEER (dec->sinkpad), query, format, value); + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_POSITION: + { + gboolean res; + gint64 granulepos, total, value; + GstFormat my_format, format; + gint64 time; + + /* forward to peer for total */ + if (!(res = gst_pad_query (GST_PAD_PEER (dec->sinkpad), query))) + goto error; + + /* we can convert a granule position to everything */ + granulepos = dec->granulepos; + + /* parse total time from peer and format */ + gst_query_parse_position (query, &format, NULL, &total); + + /* and convert to the final format in two steps with time as the + * intermediate step */ + my_format = GST_FORMAT_TIME; + if (!(res = + theora_dec_sink_convert (dec->sinkpad, GST_FORMAT_DEFAULT, + granulepos, &my_format, &time))) + goto error; + + if (!(res = + theora_dec_src_convert (pad, my_format, time, &format, &value))) + goto error; + + gst_query_set_position (query, format, value, total); + + GST_LOG_OBJECT (dec, + "query %u: peer returned granulepos: %llu - we return %llu (format %u)", + query, granulepos, value, format); + + res = TRUE; + break; + } + case GST_QUERY_CONVERT: + { + GstFormat src_fmt, dest_fmt; + gint64 src_val, dest_val; + + gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, &dest_val); + if ((res = + theora_dec_src_convert (pad, src_fmt, src_val, &dest_fmt, + &dest_val))) + gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val); + break; + } + default: + res = FALSE; + break; } - /* and convert to the final format in two steps with time as the - * intermediate step */ - my_format = GST_FORMAT_TIME; - if (!theora_dec_sink_convert (dec->sinkpad, GST_FORMAT_DEFAULT, granulepos, - &my_format, (gint64 *) & time)) - return FALSE; - if (!gst_pad_convert (pad, my_format, time, format, value)) - return FALSE; +error: + return res; +} - GST_LOG_OBJECT (dec, - "query %u: peer returned granulepos: %llu - we return %llu (format %u)", - query, granulepos, *value, *format); +static gboolean +theora_dec_sink_query (GstPad * pad, GstQuery * query) +{ + gboolean res = FALSE; - return TRUE; + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_CONVERT: + { + GstFormat src_fmt, dest_fmt; + gint64 src_val, dest_val; + + gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, &dest_val); + if (!(res = + theora_dec_sink_convert (pad, src_fmt, src_val, &dest_fmt, + &dest_val))) + goto error; + + gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val); + break; + } + default: + res = FALSE; + break; + } + +error: + return res; } static gboolean @@ -448,9 +525,8 @@ theora_dec_src_event (GstPad * pad, GstEvent * event) * First bring the requested format to time */ format = GST_FORMAT_TIME; - res = gst_pad_convert (pad, GST_EVENT_SEEK_FORMAT (event), - GST_EVENT_SEEK_OFFSET (event), &format, &value); - if (!res) + if (!(res = theora_dec_src_convert (pad, GST_EVENT_SEEK_FORMAT (event), + GST_EVENT_SEEK_OFFSET (event), &format, &value))) goto error; /* then seek with time on the peer */ diff --git a/ext/vorbis/vorbisdec.c b/ext/vorbis/vorbisdec.c index 4e1dc8182d..f1e667fcaa 100644 --- a/ext/vorbis/vorbisdec.c +++ b/ext/vorbis/vorbisdec.c @@ -75,15 +75,18 @@ GST_BOILERPLATE (GstVorbisDec, gst_vorbis_dec, GstElement, GST_TYPE_ELEMENT); static gboolean vorbis_dec_sink_event (GstPad * pad, GstEvent * event); static GstFlowReturn vorbis_dec_chain (GstPad * pad, GstBuffer * buffer); static GstElementStateReturn vorbis_dec_change_state (GstElement * element); + +#if 0 static const GstFormat *vorbis_dec_get_formats (GstPad * pad); +#endif static gboolean vorbis_dec_src_event (GstPad * pad, GstEvent * event); -static gboolean vorbis_dec_src_query (GstPad * pad, - GstQueryType query, GstFormat * format, gint64 * value); +static gboolean vorbis_dec_src_query (GstPad * pad, GstQuery * query); static gboolean vorbis_dec_convert (GstPad * pad, GstFormat src_format, gint64 src_value, GstFormat * dest_format, gint64 * dest_value); +static gboolean vorbis_dec_sink_query (GstPad * pad, GstQuery * query); static void gst_vorbis_dec_base_init (gpointer g_class) @@ -105,6 +108,7 @@ gst_vorbis_dec_class_init (GstVorbisDecClass * klass) gstelement_class->change_state = vorbis_dec_change_state; } +#if 0 static const GstFormat * vorbis_dec_get_formats (GstPad * pad) { @@ -123,7 +127,9 @@ vorbis_dec_get_formats (GstPad * pad) return (GST_PAD_IS_SRC (pad) ? src_formats : sink_formats); } +#endif +#if 0 static const GstEventMask * vorbis_get_event_masks (GstPad * pad) { @@ -134,6 +140,7 @@ vorbis_get_event_masks (GstPad * pad) return vorbis_dec_src_event_masks; } +#endif static const GstQueryType * vorbis_get_query_types (GstPad * pad) @@ -155,19 +162,15 @@ gst_vorbis_dec_init (GstVorbisDec * dec) (&vorbis_dec_sink_factory), "sink"); gst_pad_set_event_function (dec->sinkpad, vorbis_dec_sink_event); gst_pad_set_chain_function (dec->sinkpad, vorbis_dec_chain); - gst_pad_set_formats_function (dec->sinkpad, vorbis_dec_get_formats); - gst_pad_set_convert_function (dec->sinkpad, vorbis_dec_convert); + gst_pad_set_query_function (dec->sinkpad, vorbis_dec_sink_query); gst_element_add_pad (GST_ELEMENT (dec), dec->sinkpad); dec->srcpad = gst_pad_new_from_template (gst_static_pad_template_get (&vorbis_dec_src_factory), "src"); - gst_pad_set_event_mask_function (dec->srcpad, vorbis_get_event_masks); gst_pad_set_event_function (dec->srcpad, vorbis_dec_src_event); gst_pad_set_query_type_function (dec->srcpad, vorbis_get_query_types); gst_pad_set_query_function (dec->srcpad, vorbis_dec_src_query); - gst_pad_set_formats_function (dec->srcpad, vorbis_dec_get_formats); - gst_pad_set_convert_function (dec->srcpad, vorbis_dec_convert); gst_element_add_pad (GST_ELEMENT (dec), dec->srcpad); } @@ -185,6 +188,11 @@ vorbis_dec_convert (GstPad * pad, if (dec->packetno < 1) return FALSE; + if (src_format == *dest_format) { + *dest_value = src_value; + return TRUE; + } + if (dec->sinkpad == pad && (src_format == GST_FORMAT_BYTES || *dest_format == GST_FORMAT_BYTES)) return FALSE; @@ -234,27 +242,94 @@ vorbis_dec_convert (GstPad * pad, } static gboolean -vorbis_dec_src_query (GstPad * pad, GstQueryType query, GstFormat * format, - gint64 * value) +vorbis_dec_src_query (GstPad * pad, GstQuery * query) { - gint64 granulepos = 0; - GstVorbisDec *dec = GST_VORBIS_DEC (GST_PAD_PARENT (pad)); + gint64 granulepos; + GstVorbisDec *dec; + gboolean res; - if (query == GST_QUERY_POSITION) { - granulepos = dec->granulepos; - } else { - /* query peer in default format */ - return gst_pad_query (GST_PAD_PEER (dec->sinkpad), query, format, value); + dec = GST_VORBIS_DEC (GST_PAD_PARENT (pad)); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_POSITION: + { + GstFormat format; + gint64 value, total; + + /* query peer for total length */ + if (!(res = gst_pad_query (GST_PAD_PEER (dec->sinkpad), query))) + goto error; + + granulepos = dec->granulepos; + + gst_query_parse_position (query, &format, NULL, &total); + + /* and convert to the final format */ + if (!(res = + vorbis_dec_convert (pad, GST_FORMAT_DEFAULT, granulepos, &format, + &value))) + goto error; + + gst_query_set_position (query, format, value, total); + + GST_LOG_OBJECT (dec, + "query %u: peer returned granulepos: %llu - we return %llu (format %u)", + query, granulepos, value, format); + + break; + } + case GST_QUERY_CONVERT: + { + GstFormat src_fmt, dest_fmt; + gint64 src_val, dest_val; + + gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, &dest_val); + if (!(res = + vorbis_dec_convert (pad, src_fmt, src_val, &dest_fmt, &dest_val))) + goto error; + gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val); + break; + } + default: + res = FALSE; + break; } + return res; - /* and convert to the final format */ - if (!gst_pad_convert (pad, GST_FORMAT_DEFAULT, granulepos, format, value)) - return FALSE; +error: + { + GST_DEBUG ("error handling event"); + return res; + } +} - GST_LOG_OBJECT (dec, - "query %u: peer returned granulepos: %llu - we return %llu (format %u)", - query, granulepos, *value, *format); - return TRUE; +static gboolean +vorbis_dec_sink_query (GstPad * pad, GstQuery * query) +{ + GstVorbisDec *dec; + gboolean res; + + dec = GST_VORBIS_DEC (GST_PAD_PARENT (pad)); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_CONVERT: + { + GstFormat src_fmt, dest_fmt; + gint64 src_val, dest_val; + + gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, &dest_val); + if (!(res = + vorbis_dec_convert (pad, src_fmt, src_val, &dest_fmt, &dest_val))) + goto error; + gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val); + break; + } + default: + res = FALSE; + break; + } +error: + return res; } static gboolean @@ -269,7 +344,7 @@ vorbis_dec_src_event (GstPad * pad, GstEvent * event) GstFormat my_format = GST_FORMAT_TIME; /* convert to time */ - res = gst_pad_convert (pad, GST_EVENT_SEEK_FORMAT (event), + res = vorbis_dec_convert (pad, GST_EVENT_SEEK_FORMAT (event), GST_EVENT_SEEK_OFFSET (event), &my_format, &value); if (res) { GstEvent *real_seek = gst_event_new_seek ( diff --git a/ext/vorbis/vorbisenc.c b/ext/vorbis/vorbisenc.c index c0286e5bcc..980cf11ccc 100644 --- a/ext/vorbis/vorbisenc.c +++ b/ext/vorbis/vorbisenc.c @@ -74,6 +74,7 @@ vorbis_granule_time_copy (vorbis_dsp_state * v, ogg_int64_t granulepos) return (-1); } +#if 0 static const GstFormat * gst_vorbisenc_get_formats (GstPad * pad) { @@ -91,6 +92,7 @@ gst_vorbisenc_get_formats (GstPad * pad) return (GST_PAD_IS_SRC (pad) ? src_formats : sink_formats); } +#endif #define MAX_BITRATE_DEFAULT -1 #define BITRATE_DEFAULT -1 @@ -374,17 +376,17 @@ gst_vorbisenc_get_query_types (GstPad * pad) } static gboolean -gst_vorbisenc_src_query (GstPad * pad, GstQueryType type, - GstFormat * format, gint64 * value) +gst_vorbisenc_src_query (GstPad * pad, GstQuery * query) { gboolean res = TRUE; VorbisEnc *vorbisenc; - vorbisenc = GST_VORBISENC (gst_pad_get_parent (pad)); + vorbisenc = GST_VORBISENC (GST_PAD_PARENT (pad)); - switch (type) { - case GST_QUERY_TOTAL: + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_POSITION: { +#if 0 switch (*format) { case GST_FORMAT_BYTES: case GST_FORMAT_TIME: @@ -408,10 +410,10 @@ gst_vorbisenc_src_query (GstPad * pad, GstQueryType type, /* convert to TIME */ conv_format = GST_FORMAT_TIME; - res = gst_pad_convert (vorbisenc->sinkpad, + res = gst_vorbisenc_convert_sink (vorbisenc->sinkpad, peer_format, peer_value, &conv_format, value); /* and to final format */ - res &= gst_pad_convert (pad, + res &= gst_vorbisenc_convert_src (pad, GST_FORMAT_TIME, *value, format, value); } peer_formats++; @@ -422,23 +424,60 @@ gst_vorbisenc_src_query (GstPad * pad, GstQueryType type, res = FALSE; break; } +#endif + res = FALSE; break; } - case GST_QUERY_POSITION: - switch (*format) { - default: - { - /* we only know about our samples, convert to requested format */ - res = gst_pad_convert (pad, - GST_FORMAT_BYTES, vorbisenc->bytes_out, format, value); - break; - } - } + case GST_QUERY_CONVERT: + { + GstFormat src_fmt, dest_fmt; + gint64 src_val, dest_val; + + gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, &dest_val); + if (!(res = + gst_vorbisenc_convert_src (pad, src_fmt, src_val, &dest_fmt, + &dest_val))) + goto error; + gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val); break; + } default: res = FALSE; break; } + +error: + return res; +} + +static gboolean +gst_vorbisenc_sink_query (GstPad * pad, GstQuery * query) +{ + gboolean res = TRUE; + VorbisEnc *vorbisenc; + + vorbisenc = GST_VORBISENC (GST_PAD_PARENT (pad)); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_CONVERT: + { + GstFormat src_fmt, dest_fmt; + gint64 src_val, dest_val; + + gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, &dest_val); + if (!(res = + gst_vorbisenc_convert_sink (pad, src_fmt, src_val, &dest_fmt, + &dest_val))) + goto error; + gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val); + break; + } + default: + res = FALSE; + break; + } + +error: return res; } @@ -451,10 +490,8 @@ gst_vorbisenc_init (VorbisEnc * vorbisenc) gst_pad_set_event_function (vorbisenc->sinkpad, gst_vorbisenc_sink_event); gst_pad_set_chain_function (vorbisenc->sinkpad, gst_vorbisenc_chain); gst_pad_set_setcaps_function (vorbisenc->sinkpad, gst_vorbisenc_sink_setcaps); - gst_pad_set_convert_function (vorbisenc->sinkpad, - GST_DEBUG_FUNCPTR (gst_vorbisenc_convert_sink)); - gst_pad_set_formats_function (vorbisenc->sinkpad, - GST_DEBUG_FUNCPTR (gst_vorbisenc_get_formats)); + gst_pad_set_query_function (vorbisenc->sinkpad, + GST_DEBUG_FUNCPTR (gst_vorbisenc_sink_query)); vorbisenc->srcpad = gst_pad_new_from_template (gst_vorbisenc_src_template, "src"); @@ -462,10 +499,6 @@ gst_vorbisenc_init (VorbisEnc * vorbisenc) GST_DEBUG_FUNCPTR (gst_vorbisenc_src_query)); gst_pad_set_query_type_function (vorbisenc->srcpad, GST_DEBUG_FUNCPTR (gst_vorbisenc_get_query_types)); - gst_pad_set_convert_function (vorbisenc->srcpad, - GST_DEBUG_FUNCPTR (gst_vorbisenc_convert_src)); - gst_pad_set_formats_function (vorbisenc->srcpad, - GST_DEBUG_FUNCPTR (gst_vorbisenc_get_formats)); gst_element_add_pad (GST_ELEMENT (vorbisenc), vorbisenc->srcpad); vorbisenc->channels = -1; diff --git a/gst/playback/gstplaybin.c b/gst/playback/gstplaybin.c index abed3807e7..aa518a9642 100644 --- a/gst/playback/gstplaybin.c +++ b/gst/playback/gstplaybin.c @@ -108,16 +108,10 @@ static void gst_play_bin_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * spec); static GstElementStateReturn gst_play_bin_change_state (GstElement * element); -static const GstEventMask *gst_play_bin_get_event_masks (GstElement * element); static gboolean gst_play_bin_send_event (GstElement * element, GstEvent * event); -static const GstFormat *gst_play_bin_get_formats (GstElement * element); -static gboolean gst_play_bin_convert (GstElement * element, - GstFormat src_format, gint64 src_value, - GstFormat * dest_format, gint64 * dest_value); static const GstQueryType *gst_play_bin_get_query_types (GstElement * element); -static gboolean gst_play_bin_query (GstElement * element, GstQueryType type, - GstFormat * format, gint64 * value); +static gboolean gst_play_bin_query (GstElement * element, GstQuery * query); static GstElementClass *parent_class; @@ -206,11 +200,7 @@ gst_play_bin_class_init (GstPlayBinClass * klass) gstelement_klass->change_state = GST_DEBUG_FUNCPTR (gst_play_bin_change_state); - gstelement_klass->get_event_masks = - GST_DEBUG_FUNCPTR (gst_play_bin_get_event_masks); gstelement_klass->send_event = GST_DEBUG_FUNCPTR (gst_play_bin_send_event); - gstelement_klass->get_formats = GST_DEBUG_FUNCPTR (gst_play_bin_get_formats); - gstelement_klass->convert = GST_DEBUG_FUNCPTR (gst_play_bin_convert); gstelement_klass->get_query_types = GST_DEBUG_FUNCPTR (gst_play_bin_get_query_types); gstelement_klass->query = GST_DEBUG_FUNCPTR (gst_play_bin_query); @@ -862,12 +852,14 @@ gst_play_bin_change_state (GstElement * element) } +#if 0 static const GstEventMask * gst_play_bin_get_event_masks (GstElement * element) { /* FIXME, get the list from the number of installed sinks */ return NULL; } +#endif /* send an event to all the sinks */ static gboolean @@ -908,6 +900,7 @@ gst_play_bin_send_event (GstElement * element, GstEvent * event) return res; } +#if 0 static const GstFormat * gst_play_bin_get_formats (GstElement * element) { @@ -919,30 +912,7 @@ gst_play_bin_get_formats (GstElement * element) return formats; } - -static gboolean -gst_play_bin_convert (GstElement * element, - GstFormat src_format, gint64 src_value, - GstFormat * dest_format, gint64 * dest_value) -{ - gboolean res = FALSE; - GList *s; - GstPlayBin *play_bin; - - play_bin = GST_PLAY_BIN (element); - - /* do a conversion, loop over all sinks, stop as soon as one of the - * sinks returns a successful result */ - for (s = play_bin->seekables; s; s = g_list_next (s)) { - GstElement *element = GST_ELEMENT (s->data); - - res = gst_element_convert (element, src_format, src_value, - dest_format, dest_value); - if (res) - break; - } - return res; -} +#endif static const GstQueryType * gst_play_bin_get_query_types (GstElement * element) @@ -958,8 +928,7 @@ gst_play_bin_get_query_types (GstElement * element) } static gboolean -gst_play_bin_query (GstElement * element, GstQueryType type, - GstFormat * format, gint64 * value) +gst_play_bin_query (GstElement * element, GstQuery * query) { gboolean res = FALSE; GList *s; @@ -970,7 +939,7 @@ gst_play_bin_query (GstElement * element, GstQueryType type, for (s = play_bin->seekables; s; s = g_list_next (s)) { GstElement *element = GST_ELEMENT (s->data); - res = gst_element_query (element, type, format, value); + res = gst_element_query (element, query); if (res) break; } diff --git a/gst/playback/test3.c b/gst/playback/test3.c index 2dca54fc2a..aaba4f65eb 100644 --- a/gst/playback/test3.c +++ b/gst/playback/test3.c @@ -27,8 +27,7 @@ update_scale (GstElement * element) gint64 position; GstFormat format = GST_FORMAT_TIME; - gst_element_query (element, GST_QUERY_TOTAL, &format, &duration); - gst_element_query (element, GST_QUERY_POSITION, &format, &position); + gst_element_query_position (element, &format, &position, &duration); g_print ("%" G_GINT64_FORMAT " %" G_GINT64_FORMAT "\n", duration, position); diff --git a/gst/sine/gstsinesrc.c b/gst/sine/gstsinesrc.c index 1f71c5c14c..91be57ad8e 100644 --- a/gst/sine/gstsinesrc.c +++ b/gst/sine/gstsinesrc.c @@ -86,8 +86,7 @@ static void gst_sinesrc_populate_sinetable (GstSineSrc * src); static inline void gst_sinesrc_update_table_inc (GstSineSrc * src); static const GstQueryType *gst_sinesrc_get_query_types (GstPad * pad); -static gboolean gst_sinesrc_src_query (GstPad * pad, - GstQueryType type, GstFormat * format, gint64 * value); +static gboolean gst_sinesrc_src_query (GstPad * pad, GstQuery * query); static GstFlowReturn gst_sinesrc_create (GstBaseSrc * basesrc, guint64 offset, guint length, GstBuffer ** buffer); @@ -264,33 +263,43 @@ gst_sinesrc_get_query_types (GstPad * pad) } static gboolean -gst_sinesrc_src_query (GstPad * pad, - GstQueryType type, GstFormat * format, gint64 * value) +gst_sinesrc_src_query (GstPad * pad, GstQuery * query) { gboolean res = FALSE; GstSineSrc *src; src = GST_SINESRC (GST_PAD_PARENT (pad)); - switch (type) { + switch (GST_QUERY_TYPE (query)) { case GST_QUERY_POSITION: - switch (*format) { + { + GstFormat format; + gint64 current; + + gst_query_parse_position (query, &format, NULL, NULL); + + switch (format) { case GST_FORMAT_TIME: - *value = src->timestamp; + current = src->timestamp; res = TRUE; break; case GST_FORMAT_DEFAULT: /* samples */ - *value = src->offset / 2; /* 16bpp audio */ + current = src->offset / 2; /* 16bpp audio */ res = TRUE; break; case GST_FORMAT_BYTES: - *value = src->offset; + current = src->offset; res = TRUE; break; default: break; + + if (res) { + gst_query_set_position (query, format, current, -1); + } } break; + } default: break; } diff --git a/gst/subparse/gstsubparse.c b/gst/subparse/gstsubparse.c index d8c989c30a..1a6376278b 100644 --- a/gst/subparse/gstsubparse.c +++ b/gst/subparse/gstsubparse.c @@ -48,8 +48,10 @@ static void gst_subparse_base_init (GstSubparseClass * klass); static void gst_subparse_class_init (GstSubparseClass * klass); static void gst_subparse_init (GstSubparse * subparse); +#if 0 static const GstFormat *gst_subparse_formats (GstPad * pad); static const GstEventMask *gst_subparse_src_eventmask (GstPad * pad); +#endif static gboolean gst_subparse_src_event (GstPad * pad, GstEvent * event); static GstElementStateReturn gst_subparse_change_state (GstElement * element); @@ -131,10 +133,7 @@ gst_subparse_init (GstSubparse * subparse) subparse->srcpad = gst_pad_new_from_template (gst_static_pad_template_get (&src_templ), "src"); - gst_pad_set_formats_function (subparse->srcpad, gst_subparse_formats); gst_pad_set_event_function (subparse->srcpad, gst_subparse_src_event); - gst_pad_set_event_mask_function (subparse->srcpad, - gst_subparse_src_eventmask); gst_element_add_pad (GST_ELEMENT (subparse), subparse->srcpad); subparse->textbuf = g_string_new (NULL); @@ -145,6 +144,7 @@ gst_subparse_init (GstSubparse * subparse) * Source pad functions. */ +#if 0 static const GstFormat * gst_subparse_formats (GstPad * pad) { @@ -166,6 +166,7 @@ gst_subparse_src_eventmask (GstPad * pad) return masks; } +#endif static gboolean gst_subparse_src_event (GstPad * pad, GstEvent * event) diff --git a/gst/videotestsrc/gstvideotestsrc.c b/gst/videotestsrc/gstvideotestsrc.c index 6352f402ed..21d8d4e45b 100644 --- a/gst/videotestsrc/gstvideotestsrc.c +++ b/gst/videotestsrc/gstvideotestsrc.c @@ -72,9 +72,11 @@ static void gst_videotestsrc_get_property (GObject * object, guint prop_id, static void gst_videotestsrc_loop (GstPad * pad); static const GstQueryType *gst_videotestsrc_get_query_types (GstPad * pad); -static gboolean gst_videotestsrc_src_query (GstPad * pad, - GstQueryType type, GstFormat * format, gint64 * value); +static gboolean gst_videotestsrc_src_query (GstPad * pad, GstQuery * query); + +#if 0 static const GstEventMask *gst_videotestsrc_get_event_masks (GstPad * pad); +#endif static gboolean gst_videotestsrc_handle_src_event (GstPad * pad, GstEvent * event); @@ -460,8 +462,6 @@ gst_videotestsrc_init (GstVideotestsrc * videotestsrc) gst_pad_set_query_function (videotestsrc->srcpad, gst_videotestsrc_src_query); gst_pad_set_query_type_function (videotestsrc->srcpad, gst_videotestsrc_get_query_types); - gst_pad_set_event_mask_function (videotestsrc->srcpad, - gst_videotestsrc_get_event_masks); gst_pad_set_event_function (videotestsrc->srcpad, gst_videotestsrc_handle_src_event); @@ -491,27 +491,36 @@ gst_videotestsrc_get_query_types (GstPad * pad) } static gboolean -gst_videotestsrc_src_query (GstPad * pad, - GstQueryType type, GstFormat * format, gint64 * value) +gst_videotestsrc_src_query (GstPad * pad, GstQuery * query) { gboolean res = FALSE; GstVideotestsrc *videotestsrc = GST_VIDEOTESTSRC (GST_PAD_PARENT (pad)); - switch (type) { + switch (GST_QUERY_TYPE (query)) { case GST_QUERY_POSITION: - switch (*format) { + { + GstFormat format; + gint64 current; + + gst_query_parse_position (query, &format, NULL, NULL); + + switch (format) { case GST_FORMAT_TIME: - *value = videotestsrc->running_time; + current = videotestsrc->running_time; res = TRUE; break; case GST_FORMAT_DEFAULT: /* frames */ - *value = videotestsrc->n_frames; + current = videotestsrc->n_frames; res = TRUE; break; default: break; } + if (res) { + gst_query_set_position (query, format, current, -1); + } break; + } default: break; } @@ -519,6 +528,7 @@ gst_videotestsrc_src_query (GstPad * pad, return res; } +#if 0 static const GstEventMask * gst_videotestsrc_get_event_masks (GstPad * pad) { @@ -529,6 +539,7 @@ gst_videotestsrc_get_event_masks (GstPad * pad) return src_event_masks; } +#endif static gboolean gst_videotestsrc_handle_src_event (GstPad * pad, GstEvent * event) diff --git a/gst/videotestsrc/videotestsrc.c b/gst/videotestsrc/videotestsrc.c index f60cadd466..85cae5cf8e 100644 --- a/gst/videotestsrc/videotestsrc.c +++ b/gst/videotestsrc/videotestsrc.c @@ -698,6 +698,7 @@ paint_setup_I420 (paintinfo * p, unsigned char *dest) static void paint_hline_I420 (paintinfo * p, int x, int y, int w) { +#ifdef oil_splat_u8_ns int x1 = x / 2; int x2 = (x + w) / 2; int offset = y * p->ystride; @@ -706,6 +707,7 @@ paint_hline_I420 (paintinfo * p, int x, int y, int w) oil_splat_u8_ns (p->yp + offset + x, &p->color->Y, w); oil_splat_u8_ns (p->up + offset1 + x1, &p->color->U, x2 - x1); oil_splat_u8_ns (p->vp + offset1 + x1, &p->color->V, x2 - x1); +#endif } static void @@ -800,6 +802,7 @@ paint_setup_Y41B (paintinfo * p, unsigned char *dest) static void paint_hline_Y41B (paintinfo * p, int x, int y, int w) { +#ifdef oil_splat_u8_ns int x1 = x / 4; int x2 = (x + w) / 4; int offset = y * p->ystride; @@ -808,6 +811,7 @@ paint_hline_Y41B (paintinfo * p, int x, int y, int w) oil_splat_u8_ns (p->yp + offset + x, &p->color->Y, w); oil_splat_u8_ns (p->up + offset1 + x1, &p->color->U, x2 - x1); oil_splat_u8_ns (p->vp + offset1 + x1, &p->color->V, x2 - x1); +#endif } static void @@ -825,6 +829,7 @@ paint_setup_Y42B (paintinfo * p, unsigned char *dest) static void paint_hline_Y42B (paintinfo * p, int x, int y, int w) { +#ifdef oil_splat_u8_ns int x1 = x / 2; int x2 = (x + w) / 2; int offset = y * p->ystride; @@ -833,6 +838,7 @@ paint_hline_Y42B (paintinfo * p, int x, int y, int w) oil_splat_u8_ns (p->yp + offset + x, &p->color->Y, w); oil_splat_u8_ns (p->up + offset1 + x1, &p->color->U, x2 - x1); oil_splat_u8_ns (p->vp + offset1 + x1, &p->color->V, x2 - x1); +#endif } static void @@ -847,9 +853,11 @@ paint_setup_Y800 (paintinfo * p, unsigned char *dest) static void paint_hline_Y800 (paintinfo * p, int x, int y, int w) { +#ifdef oil_splat_u8_ns int offset = y * p->ystride; oil_splat_u8_ns (p->yp + offset + x, &p->color->Y, w); +#endif } #if 0 @@ -931,6 +939,7 @@ paint_setup_YUV9 (paintinfo * p, unsigned char *dest) static void paint_hline_YUV9 (paintinfo * p, int x, int y, int w) { +#ifdef oil_splat_u8_ns int x1 = x / 4; int x2 = (x + w) / 4; int offset = y * p->ystride; @@ -939,6 +948,7 @@ paint_hline_YUV9 (paintinfo * p, int x, int y, int w) oil_splat_u8_ns (p->yp + offset + x, &p->color->Y, w); oil_splat_u8_ns (p->up + offset1 + x1, &p->color->U, x2 - x1); oil_splat_u8_ns (p->vp + offset1 + x1, &p->color->V, x2 - x1); +#endif } static void diff --git a/sys/ximage/ximagesink.c b/sys/ximage/ximagesink.c index aa1b7bbdfa..d0d070b3e0 100644 --- a/sys/ximage/ximagesink.c +++ b/sys/ximage/ximagesink.c @@ -1129,31 +1129,8 @@ gst_ximagesink_show_frame (GstBaseSink * bsink, GstBuffer * buf) ximagesink = GST_XIMAGESINK (bsink); -#if 0 - if (GST_IS_EVENT (data)) { - gst_pad_event_default (pad, GST_EVENT (data)); - return; - } -#endif - g_mutex_lock (ximagesink->stream_lock); -#if 0 - /* update time */ - if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) { - ximagesink->time = GST_BUFFER_TIMESTAMP (buf); - } - GST_LOG_OBJECT (ximagesink, "clock wait: %" GST_TIME_FORMAT, - GST_TIME_ARGS (ximagesink->time)); -#endif - - /* FIXME */ -#if 0 - if (GST_VIDEOSINK_CLOCK (ximagesink)) { - gst_element_wait (GST_ELEMENT (ximagesink), ximagesink->time); - } -#endif - /* If this buffer has been allocated using our buffer management we simply put the ximage which is in the PRIVATE pointer */ if (GST_BUFFER_FREE_DATA_FUNC (buf) == gst_ximagesink_buffer_free) { @@ -1182,13 +1159,6 @@ gst_ximagesink_show_frame (GstBaseSink * bsink, GstBuffer * buf) gst_ximagesink_ximage_put (ximagesink, ximagesink->ximage); } -#if 0 - /* set correct time for next buffer */ - if (!GST_BUFFER_TIMESTAMP_IS_VALID (buf) && ximagesink->framerate > 0) { - ximagesink->time += GST_SECOND / ximagesink->framerate; - } -#endif - gst_ximagesink_handle_xevents (ximagesink); #if 0 gst_ximagesink_send_pending_navigation (ximagesink); diff --git a/tests/examples/seek/seek.c b/tests/examples/seek/seek.c index f89a7069af..2b7c763c48 100644 --- a/tests/examples/seek/seek.c +++ b/tests/examples/seek/seek.c @@ -9,7 +9,8 @@ static GList *rate_pads = NULL; static GList *seekable_elements = NULL; static GstElement *pipeline; -static guint64 duration; +static gint64 position; +static gint64 duration; static GtkAdjustment *adjustment; static GtkWidget *hscale; static gboolean stats = FALSE; @@ -24,6 +25,9 @@ static gulong changed_id; #define SOURCE "gnomevfssrc" #define ASINK "alsasink" //#define ASINK "osssink" +#define VSINK "xvimagesink" +//#define VSINK "ximagesink" +//#define VSINK "aasink" #define UPDATE_INTERVAL 500 @@ -334,7 +338,7 @@ make_theora_pipeline (const gchar * location) queue = gst_element_factory_make_or_warn ("queue", "queue"); decoder = gst_element_factory_make_or_warn ("theoradec", "decoder"); convert = gst_element_factory_make_or_warn ("ffmpegcolorspace", "convert"); - videosink = gst_element_factory_make_or_warn ("xvimagesink", "sink"); + videosink = gst_element_factory_make_or_warn (VSINK, "sink"); g_object_set (G_OBJECT (src), "location", location, NULL); @@ -407,7 +411,7 @@ make_vorbis_theora_pipeline (const gchar * location) v_decoder = gst_element_factory_make_or_warn ("theoradec", "v_dec"); v_convert = gst_element_factory_make_or_warn ("ffmpegcolorspace", "v_convert"); - videosink = gst_element_factory_make_or_warn ("xvimagesink", "v_sink"); + videosink = gst_element_factory_make_or_warn (VSINK, "v_sink"); gst_element_link_many (v_queue, v_decoder, v_convert, videosink, NULL); gst_bin_add (GST_BIN (video_bin), v_queue); @@ -472,7 +476,7 @@ make_avi_msmpeg4v3_mp3_pipeline (const gchar * location) v_decoder = gst_element_factory_make_or_warn ("ffdec_msmpeg4", "v_dec"); v_convert = gst_element_factory_make_or_warn ("ffmpegcolorspace", "v_convert"); - videosink = gst_element_factory_make_or_warn ("xvimagesink", "v_sink"); + videosink = gst_element_factory_make_or_warn (VSINK, "v_sink"); gst_element_link_many (v_queue, v_decoder, v_convert, videosink, NULL); gst_bin_add (GST_BIN (video_bin), v_queue); @@ -794,7 +798,8 @@ query_rates (void) format = seek_formats[i].format; - if (gst_pad_convert (pad, GST_FORMAT_TIME, GST_SECOND, &format, &value)) { + if (gst_pad_query_convert (pad, GST_FORMAT_TIME, GST_SECOND, &format, + &value)) { g_print ("%s %13" G_GINT64_FORMAT " | ", seek_formats[i].name, value); } else { g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*"); @@ -808,66 +813,6 @@ query_rates (void) } } -G_GNUC_UNUSED static void -query_durations_elems () -{ - GList *walk = seekable_elements; - - while (walk) { - GstElement *element = GST_ELEMENT (walk->data); - gint i = 0; - - g_print ("durations %8.8s: ", GST_ELEMENT_NAME (element)); - while (seek_formats[i].name) { - gboolean res; - gint64 value; - GstFormat format; - - format = seek_formats[i].format; - res = gst_element_query (element, GST_QUERY_TOTAL, &format, &value); - if (res) { - g_print ("%s %13" G_GINT64_FORMAT " | ", seek_formats[i].name, value); - } else { - g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*"); - } - i++; - } - g_print (" %s\n", GST_ELEMENT_NAME (element)); - - walk = g_list_next (walk); - } -} - -G_GNUC_UNUSED static void -query_durations_pads () -{ - GList *walk = seekable_pads; - - while (walk) { - GstPad *pad = GST_PAD (walk->data); - gint i = 0; - - g_print ("durations %8.8s: ", GST_PAD_NAME (pad)); - while (seek_formats[i].name) { - gboolean res; - gint64 value; - GstFormat format; - - format = seek_formats[i].format; - res = gst_pad_query (pad, GST_QUERY_TOTAL, &format, &value); - if (res) { - g_print ("%s %13" G_GINT64_FORMAT " | ", seek_formats[i].name, value); - } else { - g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*"); - } - i++; - } - g_print (" %s:%s\n", GST_DEBUG_PAD_NAME (pad)); - - walk = g_list_next (walk); - } -} - G_GNUC_UNUSED static void query_positions_elems () { @@ -879,16 +824,17 @@ query_positions_elems () g_print ("positions %8.8s: ", GST_ELEMENT_NAME (element)); while (seek_formats[i].name) { - gboolean res; - gint64 value; + gint64 position, total; GstFormat format; format = seek_formats[i].format; - res = gst_element_query (element, GST_QUERY_POSITION, &format, &value); - if (res) { - g_print ("%s %13" G_GINT64_FORMAT " | ", seek_formats[i].name, value); + + if (gst_element_query_position (element, &format, &position, &total)) { + g_print ("%s %13" G_GINT64_FORMAT " / %13" G_GINT64_FORMAT " | ", + seek_formats[i].name, position, total); } else { - g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*"); + g_print ("%s %13.13s / %13.13s | ", seek_formats[i].name, "*NA*", + "*NA*"); } i++; } @@ -909,17 +855,19 @@ query_positions_pads () g_print ("positions %8.8s: ", GST_PAD_NAME (pad)); while (seek_formats[i].name) { - gboolean res; - gint64 value; GstFormat format; + gint64 position, total; format = seek_formats[i].format; - res = gst_pad_query (pad, GST_QUERY_POSITION, &format, &value); - if (res) { - g_print ("%s %13" G_GINT64_FORMAT " | ", seek_formats[i].name, value); + + if (gst_pad_query_position (pad, &format, &position, &total)) { + g_print ("%s %13" G_GINT64_FORMAT " / %13" G_GINT64_FORMAT " | ", + seek_formats[i].name, position, total); } else { - g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*"); + g_print ("%s %13.13s / %13.13s | ", seek_formats[i].name, "*NA*", + "*NA*"); } + i++; } g_print (" %s:%s\n", GST_DEBUG_PAD_NAME (pad)); @@ -932,34 +880,25 @@ static gboolean update_scale (gpointer data) { GstClock *clock; - guint64 position; - GstFormat format = GST_FORMAT_TIME; - gboolean res; + GstFormat format; + position = 0; duration = 0; clock = gst_pipeline_get_clock (GST_PIPELINE (pipeline)); + format = GST_FORMAT_TIME; + if (elem_seek) { if (seekable_elements) { GstElement *element = GST_ELEMENT (seekable_elements->data); - res = gst_element_query (element, GST_QUERY_TOTAL, &format, &duration); - if (!res) - duration = 0; - res = gst_element_query (element, GST_QUERY_POSITION, &format, &position); - if (!res) - position = 0; + gst_element_query_position (element, &format, &position, &duration); } } else { if (seekable_pads) { GstPad *pad = GST_PAD (seekable_pads->data); - res = gst_pad_query (pad, GST_QUERY_TOTAL, &format, &duration); - if (!res) - duration = 0; - res = gst_pad_query (pad, GST_QUERY_POSITION, &format, &position); - if (!res) - position = 0; + gst_pad_query_position (pad, &format, &position, &duration); } } @@ -970,10 +909,8 @@ update_scale (gpointer data) } if (elem_seek) { - query_durations_elems (); query_positions_elems (); } else { - query_durations_pads (); query_positions_pads (); } query_rates (); @@ -1107,6 +1044,7 @@ play_cb (GtkButton * button, gpointer data) gst_element_get_state (pipeline, &state, NULL, NULL); if (state != GST_STATE_PLAYING) { + g_print ("PLAY pipeline\n"); gst_element_set_state (pipeline, GST_STATE_PLAYING); update_id = gtk_timeout_add (UPDATE_INTERVAL, (GtkFunction) update_scale, pipeline); @@ -1120,6 +1058,7 @@ pause_cb (GtkButton * button, gpointer data) gst_element_get_state (pipeline, &state, NULL, NULL); if (state != GST_STATE_PAUSED) { + g_print ("PAUSE pipeline\n"); gst_element_set_state (pipeline, GST_STATE_PAUSED); gtk_timeout_remove (update_id); } @@ -1132,6 +1071,7 @@ stop_cb (GtkButton * button, gpointer data) gst_element_get_state (pipeline, &state, NULL, NULL); if (state != GST_STATE_READY) { + g_print ("READY pipeline\n"); gst_element_set_state (pipeline, GST_STATE_READY); gtk_adjustment_set_value (adjustment, 0.0); gtk_timeout_remove (update_id); @@ -1260,8 +1200,10 @@ main (int argc, char **argv) } gtk_main (); + g_print ("NULL pipeline\n"); gst_element_set_state (pipeline, GST_STATE_NULL); + g_print ("free pipeline\n"); gst_object_unref (GST_OBJECT (pipeline)); return 0;