+2005-05-02 Wim Taymans <wim@fluendo.com>
+
+ * docs/design/draft-push-pull.txt:
+ * docs/design/draft-query.txt:
+ * gst/base/gstbasesrc.c: (gst_basesrc_get_range_unlocked),
+ (gst_basesrc_start):
+ Added draft for new query API.
+ Added draft for better selecting scheduling methods.
+ Make basesrc ignore length if the subclass does not support
+ it.
+
2005-05-02 Thomas Vander Stichele <thomas at apestaart dot org>
* gst/Makefile.am:
--- /dev/null
+DRAFT Query
+-----------
+
+Purpose
+
+ Queries are used to get information about the stream.
+ A query is started on a specific pad and travels up or downstream.
+
+Types of queries
+
+ - get length of stream
+ - get position in stream
+ - get seeking capabilities
+ - get latency
+ - convert one value to another
+ - query supported formats
+ - query internal links.
+
+Current implementation
+
+ The current implementation of query requires pads to implement the
+ following functions:
+
+ gboolean (*GstPadConvertFunction) (GstPad *pad,
+ GstFormat src_format, gint64 src_value,
+ GstFormat *dest_format, gint64 *dest_value);
+ gboolean (*GstPadQueryFunction) (GstPad *pad, GstQueryType type,
+ GstFormat *format, gint64 *value);
+ GList* (*GstPadIntLinkFunction) (GstPad *pad);
+ const GstFormat* (*GstPadFormatsFunction) (GstPad *pad);
+ const GstEventMask* (*GstPadEventMaskFunction) (GstPad *pad);
+ const GstQueryType* (*GstPadQueryTypeFunction) (GstPad *pad);
+
+ Most of these functions are not very extensible in particular,
+ the queryfunction can only return one value.
+
+
+Requirements
+
+ - multiple return values, grouped together when they make sense.
+ - one pad function to perform the query
+ - extensible queries.
+
+Proposition
+
+ - define GstQuery extending GstData and containing a GstStructure (see GstMessage)
+ - define standard query types (see proposed types)
+ - define methods to create a parse the results in the GstQuery.
+ - define pad method:
+
+ gboolean (*GstPadQueryFunction) (GstPad *pad, GstQuery *query);
+
+ pad returns result in query structure and TRUE as result or FALSE when
+ query is not supported.
+
+Proposed types
+
+ - GST_QUERY_SEEKING:
+
+ - get info on how seeking can be done
+ - getrange, with/without offset/size
+ - ranges where seeking is efficient (for caching network sources)
+ - flags describing seeking behaviour (forward, backward, segments,
+ play backwards, ...)
+
+ - GST_QUERY_POSITION:
+
+ - get info on current position of the stream
+ - start position
+ - current position
+ - end position
+ - length
+
+ - GST_QUERY_LATENCY:
+
+ - get amount of buffering
+
+ - GST_QUERY_CONVERT:
+
+ - convert format/value to another format/value pair.
+
+ - GST_QUERY_FORMATS:
+
+ - return list of supported formats.
+
+ - GST_QUERY_LINKS:
+
+ - return list of internal link pads.
+
+Also????
+
+ - GST_QUERY_CAPS:
+
}
}
if (length == 0)
- return GST_FLOW_UNEXPECTED;
+ goto unexpected_length;
ret = bclass->create (src, offset, length, buf);
GST_DEBUG_OBJECT (src, "no create function");
return GST_FLOW_ERROR;
}
+unexpected_length:
+ {
+ GST_DEBUG_OBJECT (src, "unexpected length %u", length);
+ return GST_FLOW_UNEXPECTED;
+ }
}
static GstFlowReturn
/* figure out the size */
if (bclass->get_size) {
result = bclass->get_size (basesrc, &basesrc->size);
+ if (result == FALSE)
+ basesrc->size = -1;
} else {
result = FALSE;
basesrc->size = -1;
}
}
if (length == 0)
- return GST_FLOW_UNEXPECTED;
+ goto unexpected_length;
ret = bclass->create (src, offset, length, buf);
GST_DEBUG_OBJECT (src, "no create function");
return GST_FLOW_ERROR;
}
+unexpected_length:
+ {
+ GST_DEBUG_OBJECT (src, "unexpected length %u", length);
+ return GST_FLOW_UNEXPECTED;
+ }
}
static GstFlowReturn
/* figure out the size */
if (bclass->get_size) {
result = bclass->get_size (basesrc, &basesrc->size);
+ if (result == FALSE)
+ basesrc->size = -1;
} else {
result = FALSE;
basesrc->size = -1;