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;
}
Example #2
0
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);
}