base: update for query API changes

This commit is contained in:
Tim-Philipp Müller 2011-07-27 00:26:43 +01:00
parent ef8ca3549e
commit 913e5e310c
3 changed files with 47 additions and 58 deletions

View file

@ -1258,14 +1258,13 @@ gst_base_parse_update_duration (GstBaseParse * baseparse)
peer = gst_pad_get_peer (parse->sinkpad);
if (peer) {
GstFormat pformat = GST_FORMAT_BYTES;
gboolean qres = FALSE;
gint64 ptot, dest_value;
qres = gst_pad_query_duration (peer, &pformat, &ptot);
qres = gst_pad_query_duration (peer, GST_FORMAT_BYTES, &ptot);
gst_object_unref (GST_OBJECT (peer));
if (qres) {
if (gst_base_parse_convert (parse, pformat, ptot,
if (gst_base_parse_convert (parse, GST_FORMAT_BYTES, ptot,
GST_FORMAT_TIME, &dest_value)) {
parse->priv->estimated_duration = dest_value;
GST_LOG_OBJECT (parse,
@ -1518,10 +1517,8 @@ gst_base_parse_check_seekability (GstBaseParse * parse)
/* try harder to query upstream size if we didn't get it the first time */
if (seekable && stop == -1) {
GstFormat fmt = GST_FORMAT_BYTES;
GST_DEBUG_OBJECT (parse, "doing duration query to fix up unset stop");
gst_pad_query_peer_duration (parse->sinkpad, &fmt, &stop);
gst_pad_query_peer_duration (parse->sinkpad, GST_FORMAT_BYTES, &stop);
}
/* if upstream doesn't know the size, it's likely that it's not seekable in
@ -1557,10 +1554,9 @@ done:
static void
gst_base_parse_check_upstream (GstBaseParse * parse)
{
GstFormat fmt = GST_FORMAT_TIME;
gint64 stop;
if (gst_pad_query_peer_duration (parse->sinkpad, &fmt, &stop))
if (gst_pad_query_peer_duration (parse->sinkpad, GST_FORMAT_TIME, &stop))
if (GST_CLOCK_TIME_IS_VALID (stop) && stop) {
/* upstream has one, accept it also, and no further updates */
gst_base_parse_set_duration (parse, GST_FORMAT_TIME, stop, 0);
@ -2490,10 +2486,8 @@ gst_base_parse_handle_previous_fragment (GstBaseParse * parse)
if (parse->priv->exact_position) {
offset = gst_base_parse_find_offset (parse, ts, TRUE, NULL);
} else {
GstFormat dstformat = GST_FORMAT_BYTES;
if (!gst_pad_query_convert (parse->srcpad, GST_FORMAT_TIME, ts,
&dstformat, &offset)) {
GST_FORMAT_BYTES, &offset)) {
GST_DEBUG_OBJECT (parse, "conversion failed, only BYTE based");
}
}
@ -3559,7 +3553,6 @@ gst_base_parse_handle_seek (GstBaseParse * parse, GstEvent * event)
gboolean flush, update, res = TRUE, accurate;
gint64 cur, stop, seekpos, seekstop;
GstSegment seeksegment = { 0, };
GstFormat dstformat;
GstClockTime start_ts;
gst_event_parse_seek (event, &rate, &format, &flags,
@ -3626,12 +3619,11 @@ gst_base_parse_handle_seek (GstBaseParse * parse, GstEvent * event)
NULL);
} else {
start_ts = seeksegment.position;
dstformat = GST_FORMAT_BYTES;
if (!gst_pad_query_convert (parse->srcpad, format, seeksegment.position,
&dstformat, &seekpos))
GST_FORMAT_BYTES, &seekpos))
goto convert_failed;
if (!gst_pad_query_convert (parse->srcpad, format, seeksegment.stop,
&dstformat, &seekstop))
GST_FORMAT_BYTES, &seekstop))
goto convert_failed;
}

View file

@ -2073,8 +2073,8 @@ gst_base_sink_wait_clock (GstBaseSink * sink, GstClockTime time,
/* FIXME: Casting to GstClockEntry only works because the types
* are the same */
if (G_LIKELY (sink->priv->cached_clock_id != NULL
&& GST_CLOCK_ENTRY_CLOCK ((GstClockEntry *) sink->
priv->cached_clock_id) == clock)) {
&& GST_CLOCK_ENTRY_CLOCK ((GstClockEntry *) sink->priv->
cached_clock_id) == clock)) {
if (!gst_clock_single_shot_id_reinit (clock, sink->priv->cached_clock_id,
time)) {
gst_clock_id_unref (sink->priv->cached_clock_id);
@ -3727,16 +3727,15 @@ gst_base_sink_default_prepare_seek_segment (GstBaseSink * sink,
GstSeekType cur_type, stop_type;
gint64 cur, stop;
GstSeekFlags flags;
GstFormat seek_format, dest_format;
GstFormat seek_format;
gdouble rate;
gboolean update;
gboolean res = TRUE;
gst_event_parse_seek (event, &rate, &seek_format, &flags,
&cur_type, &cur, &stop_type, &stop);
dest_format = segment->format;
if (seek_format == dest_format) {
if (seek_format == segment->format) {
gst_segment_do_seek (segment, rate, seek_format, flags,
cur_type, cur, stop_type, stop, &update);
return TRUE;
@ -3745,7 +3744,7 @@ gst_base_sink_default_prepare_seek_segment (GstBaseSink * sink,
if (cur_type != GST_SEEK_TYPE_NONE) {
/* FIXME: Handle seek_cur & seek_end by converting the input segment vals */
res =
gst_pad_query_convert (sink->sinkpad, seek_format, cur, &dest_format,
gst_pad_query_convert (sink->sinkpad, seek_format, cur, segment->format,
&cur);
cur_type = GST_SEEK_TYPE_SET;
}
@ -3753,13 +3752,13 @@ gst_base_sink_default_prepare_seek_segment (GstBaseSink * sink,
if (res && stop_type != GST_SEEK_TYPE_NONE) {
/* FIXME: Handle seek_cur & seek_end by converting the input segment vals */
res =
gst_pad_query_convert (sink->sinkpad, seek_format, stop, &dest_format,
&stop);
gst_pad_query_convert (sink->sinkpad, seek_format, stop,
segment->format, &stop);
stop_type = GST_SEEK_TYPE_SET;
}
/* And finally, configure our output segment in the desired format */
gst_segment_do_seek (segment, rate, dest_format, flags, cur_type, cur,
gst_segment_do_seek (segment, rate, segment->format, flags, cur_type, cur,
stop_type, stop, &update);
if (!res)
@ -4324,22 +4323,19 @@ gst_base_sink_pad_activate_pull (GstPad * pad, gboolean active)
bclass = GST_BASE_SINK_GET_CLASS (basesink);
if (active) {
GstFormat format;
gint64 duration;
/* we mark we have a newsegment here because pull based
* mode works just fine without having a newsegment before the
* first buffer */
format = GST_FORMAT_BYTES;
gst_segment_init (&basesink->segment, format);
gst_segment_init (&basesink->clip_segment, format);
gst_segment_init (&basesink->segment, GST_FORMAT_BYTES);
gst_segment_init (&basesink->clip_segment, GST_FORMAT_BYTES);
GST_OBJECT_LOCK (basesink);
basesink->have_newsegment = TRUE;
GST_OBJECT_UNLOCK (basesink);
/* get the peer duration in bytes */
result = gst_pad_query_peer_duration (pad, &format, &duration);
result = gst_pad_query_peer_duration (pad, GST_FORMAT_BYTES, &duration);
if (result) {
GST_DEBUG_OBJECT (basesink,
"setting duration in bytes to %" G_GINT64_FORMAT, duration);
@ -4460,7 +4456,7 @@ gst_base_sink_get_position (GstBaseSink * basesink, GstFormat format,
{
GstClock *clock = NULL;
gboolean res = FALSE;
GstFormat oformat, tformat;
GstFormat oformat;
GstSegment *segment;
GstClockTime now, latency;
GstClockTimeDiff base_time;
@ -4491,8 +4487,6 @@ gst_base_sink_get_position (GstBaseSink * basesink, GstFormat format,
else
segment = &basesink->segment;
/* our intermediate time format */
tformat = GST_FORMAT_TIME;
/* get the format in the segment */
oformat = segment->format;
@ -4597,23 +4591,23 @@ gst_base_sink_get_position (GstBaseSink * basesink, GstFormat format,
GST_TIME_ARGS (last));
*cur = last;
} else {
if (oformat != tformat) {
if (oformat != GST_FORMAT_TIME) {
/* convert base, time and duration to time */
if (!gst_pad_query_convert (basesink->sinkpad, oformat, base, &tformat,
&base))
if (!gst_pad_query_convert (basesink->sinkpad, oformat, base,
GST_FORMAT_TIME, &base))
goto convert_failed;
if (!gst_pad_query_convert (basesink->sinkpad, oformat, duration,
&tformat, &duration))
GST_FORMAT_TIME, &duration))
goto convert_failed;
if (!gst_pad_query_convert (basesink->sinkpad, oformat, time, &tformat,
&time))
if (!gst_pad_query_convert (basesink->sinkpad, oformat, time,
GST_FORMAT_TIME, &time))
goto convert_failed;
if (!gst_pad_query_convert (basesink->sinkpad, oformat, last, &tformat,
&last))
if (!gst_pad_query_convert (basesink->sinkpad, oformat, last,
GST_FORMAT_TIME, &last))
goto convert_failed;
/* assume time format from now on */
oformat = tformat;
oformat = GST_FORMAT_TIME;
}
if (!in_paused && with_clock) {
@ -4658,7 +4652,7 @@ gst_base_sink_get_position (GstBaseSink * basesink, GstFormat format,
if (oformat != format) {
/* convert to final format */
if (!gst_pad_query_convert (basesink->sinkpad, oformat, *cur, &format, cur))
if (!gst_pad_query_convert (basesink->sinkpad, oformat, *cur, format, cur))
goto convert_failed;
}
@ -4699,20 +4693,22 @@ gst_base_sink_get_duration (GstBaseSink * basesink, GstFormat format,
gboolean res = FALSE;
if (basesink->pad_mode == GST_ACTIVATE_PULL) {
GstFormat uformat = GST_FORMAT_BYTES;
gint64 uduration;
/* get the duration in bytes, in pull mode that's all we are sure to
* know. We have to explicitly get this value from upstream instead of
* using our cached value because it might change. Duration caching
* should be done at a higher level. */
res = gst_pad_query_peer_duration (basesink->sinkpad, &uformat, &uduration);
res =
gst_pad_query_peer_duration (basesink->sinkpad, GST_FORMAT_BYTES,
&uduration);
if (res) {
basesink->segment.duration = uduration;
if (format != uformat) {
if (format != GST_FORMAT_BYTES) {
/* convert to the requested format */
res = gst_pad_query_convert (basesink->sinkpad, uformat, uduration,
&format, dur);
res =
gst_pad_query_convert (basesink->sinkpad, GST_FORMAT_BYTES,
uduration, format, dur);
} else {
*dur = uduration;
}
@ -4770,20 +4766,21 @@ default_element_query (GstElement * element, GstQuery * query)
/* we can handle a few things if upstream failed */
if (format == GST_FORMAT_PERCENT) {
gint64 dur = 0;
GstFormat uformat = GST_FORMAT_TIME;
res = gst_base_sink_get_position (basesink, GST_FORMAT_TIME, &cur,
&upstream);
if (!res && upstream) {
res = gst_pad_query_peer_position (basesink->sinkpad, &uformat,
res =
gst_pad_query_peer_position (basesink->sinkpad, GST_FORMAT_TIME,
&cur);
}
if (res) {
res = gst_base_sink_get_duration (basesink, GST_FORMAT_TIME, &dur,
&upstream);
if (!res && upstream) {
res = gst_pad_query_peer_duration (basesink->sinkpad, &uformat,
&dur);
res =
gst_pad_query_peer_duration (basesink->sinkpad,
GST_FORMAT_TIME, &dur);
}
}
if (res) {

View file

@ -900,7 +900,7 @@ gst_base_src_default_query (GstBaseSrc * src, GstQuery * query)
/* convert to requested format */
res =
gst_pad_query_convert (src->srcpad, seg_format,
position, &format, &position);
position, format, &position);
} else
res = TRUE;
@ -949,7 +949,7 @@ gst_base_src_default_query (GstBaseSrc * src, GstQuery * query)
* but we cannot answer the query, we must return FALSE. */
res =
gst_pad_query_convert (src->srcpad, seg_format,
duration, &format, &duration);
duration, format, &duration);
} else {
/* The subclass did not configure a duration, we assume that the
* media has an unknown duration then and we return TRUE to report
@ -1086,13 +1086,13 @@ gst_base_src_default_query (GstBaseSrc * src, GstQuery * query)
* but report TRUE. */
if (format != GST_FORMAT_PERCENT && stop != -1) {
res = gst_pad_query_convert (src->srcpad, seg_format,
stop, &format, &stop);
stop, format, &stop);
} else {
res = TRUE;
}
if (res && format != GST_FORMAT_PERCENT && start != -1)
res = gst_pad_query_convert (src->srcpad, seg_format,
start, &format, &start);
start, format, &start);
gst_query_set_buffering_range (query, format, start, stop, estimated);
break;
@ -1210,7 +1210,7 @@ gst_base_src_default_prepare_seek_segment (GstBaseSrc * src, GstEvent * event,
if (cur_type != GST_SEEK_TYPE_NONE) {
/* FIXME: Handle seek_cur & seek_end by converting the input segment vals */
res =
gst_pad_query_convert (src->srcpad, seek_format, cur, &dest_format,
gst_pad_query_convert (src->srcpad, seek_format, cur, dest_format,
&cur);
cur_type = GST_SEEK_TYPE_SET;
}
@ -1218,7 +1218,7 @@ gst_base_src_default_prepare_seek_segment (GstBaseSrc * src, GstEvent * event,
if (res && stop_type != GST_SEEK_TYPE_NONE) {
/* FIXME: Handle seek_cur & seek_end by converting the input segment vals */
res =
gst_pad_query_convert (src->srcpad, seek_format, stop, &dest_format,
gst_pad_query_convert (src->srcpad, seek_format, stop, dest_format,
&stop);
stop_type = GST_SEEK_TYPE_SET;
}