static gboolean gst_ts_shifter_query (GstElement * element, GstQuery * query) { gboolean ret = TRUE; GstTSShifter *ts = GST_TS_SHIFTER (element); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_POSITION: { gint64 pos = -1; GstFormat format; /* get format */ gst_query_parse_position (query, &format, NULL); switch (format) { case GST_FORMAT_BYTES: pos = ts->cur_bytes; break; default: GST_WARNING_OBJECT (ts, "dropping query in %s format, don't " "know how to handle", gst_format_get_name (format)); ret = FALSE; break; } /* set updated position */ if (ret) gst_query_set_position (query, format, pos); break; } case GST_QUERY_DURATION: { GstFormat format; gst_query_parse_duration (query, &format, NULL); if (format == GST_FORMAT_BYTES) { GST_LOG_OBJECT (ts, "replying duration query with %" G_GUINT64_FORMAT, gst_ts_cache_get_total_bytes_received (ts->cache)); gst_query_set_duration (query, GST_FORMAT_BYTES, gst_ts_cache_get_total_bytes_received (ts->cache)); ret = TRUE; } else { ret = FALSE; } break; } case GST_QUERY_SEEKING: { GstFormat fmt; gst_query_parse_seeking (query, &fmt, NULL, NULL, NULL); if (fmt == GST_FORMAT_BYTES) { gst_query_set_seeking (query, fmt, TRUE, 0, -1); ret = TRUE; } else { ret = FALSE; } break; } case GST_QUERY_LATENCY: { gst_query_set_latency (query, FALSE, 0, -1); break; } case GST_QUERY_BUFFERING: { GstFormat format; guint64 bytes_begin, bytes_end; gst_query_parse_buffering_range (query, &format, NULL, NULL, NULL); if (format != GST_FORMAT_BYTES) { ret = FALSE; break; } gst_ts_cache_buffered_range (ts->cache, &bytes_begin, &bytes_end); gst_query_set_buffering_range (query, format, bytes_begin, bytes_end, -1); ret = TRUE; break; } default: ret = FALSE; break; } return ret; }
void BufferingQuery::setBufferingRange(Format rangeFormat, qint64 rangeStart, qint64 rangeStop, qint64 estimatedTotal) { gst_query_set_buffering_range(object<GstQuery>(), static_cast<GstFormat>(rangeFormat), rangeStart, rangeStop, estimatedTotal); }