gst/gstbin.c: Position query should also take max of all streams.

Original commit message from CVS:
* gst/gstbin.c: (gst_bin_handle_message_func),
(bin_query_max_init), (bin_query_position_fold),
(bin_query_position_done), (gst_bin_query):
Position query should also take max of all streams.
This commit is contained in:
Wim Taymans 2006-03-20 10:56:08 +00:00
parent b7edbd2caf
commit f35fc7a902
2 changed files with 49 additions and 4 deletions

View file

@ -1,3 +1,10 @@
2006-03-20 Wim Taymans <wim@fluendo.com>
* gst/gstbin.c: (gst_bin_handle_message_func),
(bin_query_max_init), (bin_query_position_fold),
(bin_query_position_done), (gst_bin_query):
Position query should also take max of all streams.
2006-03-20 Wim Taymans <wim@fluendo.com> 2006-03-20 Wim Taymans <wim@fluendo.com>
* plugins/elements/gstfakesrc.c: (gst_fake_src_class_init), * plugins/elements/gstfakesrc.c: (gst_fake_src_class_init),

View file

@ -2203,10 +2203,10 @@ typedef struct
typedef void (*QueryInitFunction) (GstBin * bin, QueryFold * fold); typedef void (*QueryInitFunction) (GstBin * bin, QueryFold * fold);
typedef void (*QueryDoneFunction) (GstBin * bin, QueryFold * fold); typedef void (*QueryDoneFunction) (GstBin * bin, QueryFold * fold);
/* for duration we collect all durations and take the MAX of /* for duration/position we collect all durations/positions and take
* all valid results */ * the MAX of all valid results */
static void static void
bin_query_duration_init (GstBin * bin, QueryFold * fold) bin_query_max_init (GstBin * bin, QueryFold * fold)
{ {
fold->max = -1; fold->max = -1;
} }
@ -2250,6 +2250,37 @@ bin_query_duration_done (GstBin * bin, QueryFold * fold)
#endif #endif
} }
static gboolean
bin_query_position_fold (GstElement * item, GValue * ret, QueryFold * fold)
{
if (gst_element_query (item, fold->query)) {
gint64 position;
g_value_set_boolean (ret, TRUE);
gst_query_parse_position (fold->query, NULL, &position);
GST_DEBUG_OBJECT (item, "got position %" G_GINT64_FORMAT, position);
if (position > fold->max)
fold->max = position;
}
gst_object_unref (item);
return TRUE;
}
static void
bin_query_position_done (GstBin * bin, QueryFold * fold)
{
GstFormat format;
gst_query_parse_position (fold->query, &format, NULL);
/* store max in query result */
gst_query_set_position (fold->query, format, fold->max);
GST_DEBUG_OBJECT (bin, "max position %" G_GINT64_FORMAT, fold->max);
}
/* generic fold, return first valid result */ /* generic fold, return first valid result */
static gboolean static gboolean
bin_query_generic_fold (GstElement * item, GValue * ret, QueryFold * fold) bin_query_generic_fold (GstElement * item, GValue * ret, QueryFold * fold)
@ -2315,10 +2346,17 @@ gst_bin_query (GstElement * element, GstQuery * query)
GST_OBJECT_UNLOCK (bin); GST_OBJECT_UNLOCK (bin);
#endif #endif
fold_func = (GstIteratorFoldFunction) bin_query_duration_fold; fold_func = (GstIteratorFoldFunction) bin_query_duration_fold;
fold_init = bin_query_duration_init; fold_init = bin_query_max_init;
fold_done = bin_query_duration_done; fold_done = bin_query_duration_done;
break; break;
} }
case GST_QUERY_POSITION:
{
fold_func = (GstIteratorFoldFunction) bin_query_position_fold;
fold_init = bin_query_max_init;
fold_done = bin_query_position_done;
break;
}
default: default:
fold_func = (GstIteratorFoldFunction) bin_query_generic_fold; fold_func = (GstIteratorFoldFunction) bin_query_generic_fold;
break; break;