summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 83cb985)
raw | patch | inline | side by side (parent: 83cb985)
author | Rob Clark <rob@ti.com> | |
Wed, 19 May 2010 20:48:09 +0000 (15:48 -0500) | ||
committer | Nikhil Devshatwar <a0132237@ti.com> | |
Wed, 15 May 2013 11:20:49 +0000 (16:50 +0530) |
This query is used by buffer allocator, for example a video sink element,
to find out any minimum buffer requirements of upstream elements that uses
pad_alloc() to allocate buffers. For example, some cameras may have need
for additional padding/boarder around the frame (for vstab), or some video
decoders may have requirements for a certain minimum number of buffers (so
they can hold refs to reference-frames)
to find out any minimum buffer requirements of upstream elements that uses
pad_alloc() to allocate buffers. For example, some cameras may have need
for additional padding/boarder around the frame (for vstab), or some video
decoders may have requirements for a certain minimum number of buffers (so
they can hold refs to reference-frames)
gst/gstquark.c | patch | blob | history | |
gst/gstquark.h | patch | blob | history | |
gst/gstquery.c | patch | blob | history | |
gst/gstquery.h | patch | blob | history |
diff --git a/gst/gstquark.c b/gst/gstquark.c
index 91a201271d365ad794ee163b122e3a96273a8ee9..0459b4e2c4b0c76f19aee337c1bfdff04d2e7e43 100644 (file)
--- a/gst/gstquark.c
+++ b/gst/gstquark.c
"intermediate", "GstMessageStepStart", "active", "eos", "sink-message",
"message", "GstMessageQOS", "running-time", "stream-time", "jitter",
"quality", "processed", "dropped", "buffering-ranges", "GstMessageProgress",
- "code", "text", "percent", "timeout"
+ "code", "text", "percent", "timeout",
+ "GstQueryBuffers", "caps", "count", "width", "height"
};
GQuark _priv_gst_quark_table[GST_QUARK_MAX];
diff --git a/gst/gstquark.h b/gst/gstquark.h
index 6e16ee5d7c942f9719e9d4b84a2f23b4e8148ddb..350f9fc68c513b6a349967015d9fd0d245407d28 100644 (file)
--- a/gst/gstquark.h
+++ b/gst/gstquark.h
GST_QUARK_TEXT = 103,
GST_QUARK_PERCENT = 104,
GST_QUARK_TIMEOUT = 105,
+ GST_QUARK_QUERY_BUFFERS = 106,
+ GST_QUARK_CAPS = 107,
+ GST_QUARK_COUNT = 108,
+ GST_QUARK_WIDTH = 109,
+ GST_QUARK_HEIGHT = 110,
- GST_QUARK_MAX = 106
+ GST_QUARK_MAX = 111
} GstQuarkId;
extern GQuark _priv_gst_quark_table[GST_QUARK_MAX];
diff --git a/gst/gstquery.c b/gst/gstquery.c
index 2b1c382294b5008617f0f2756de355ef09318205..1d7f5f99b4e6a354e538ac3456d70e8941c5fb57 100644 (file)
--- a/gst/gstquery.c
+++ b/gst/gstquery.c
{GST_QUERY_BUFFERING, "buffering", "Buffering status", 0},
{GST_QUERY_CUSTOM, "custom", "Custom query", 0},
{GST_QUERY_URI, "uri", "URI of the source or sink", 0},
+ {GST_QUERY_BUFFERS, "buffers", "Minimum buffer requirements", 0},
{GST_QUERY_NONE, NULL, NULL, 0}
};
*uri = g_value_dup_string (gst_structure_id_get_value (query->structure,
GST_QUARK (URI)));
}
+
+/**
+ * gst_query_new_buffers:
+ * @caps: the #GstCaps for the buffers that are going to be allocated
+ *
+ * Constructs a new buffer requirements query object to query buffer
+ * requirements for a particular caps. Use gst_query_unref() when done
+ * with it.
+ *
+ * Returns: A #GstQuery
+ */
+GstQuery *
+gst_query_new_buffers (GstCaps * caps)
+{
+ GstQuery *query;
+ GstStructure *structure;
+
+ /* XXX could add size here, for linear (non YUV/RGB) buffers? But I'm not
+ * entirely sure what is the use-case for that.. it should be easy enough
+ * to add more optional reply fields later
+ */
+ structure = gst_structure_id_new (GST_QUARK (QUERY_BUFFERS),
+ GST_QUARK (CAPS), GST_TYPE_CAPS, caps,
+ GST_QUARK (COUNT), G_TYPE_INT, -1,
+ GST_QUARK (WIDTH), G_TYPE_INT, -1,
+ GST_QUARK (HEIGHT), G_TYPE_INT, -1, NULL);
+
+ query = gst_query_new (GST_QUERY_BUFFERS, structure);
+
+ return query;
+}
+
+/**
+ * gst_query_set_buffers_count:
+ * @count: minimum number of buffers required
+ *
+ * Answer a buffers query by setting the minimum number of buffers required.
+ * If there is no minimum buffer count requirement, don't set this field in
+ * the query.
+ */
+void
+gst_query_set_buffers_count (GstQuery * query, gint count)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_BUFFERS);
+
+ structure = gst_query_get_structure (query);
+ gst_structure_id_set (structure, GST_QUARK (COUNT), G_TYPE_INT, count, NULL);
+}
+
+/**
+ * gst_query_set_buffers_dimensions:
+ * @width: minimum buffer width
+ * @height: minimum buffer height
+ *
+ * Answer a buffers query by setting the minimum buffer dimensions required.
+ * If there is no minimum buffer dimensions (beyond the width/height specified
+ * in the #GstCaps), don't set this field in the query.
+ */
+void
+gst_query_set_buffers_dimensions (GstQuery * query, gint width, gint height)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_BUFFERS);
+
+ structure = gst_query_get_structure (query);
+ gst_structure_id_set (structure,
+ GST_QUARK (WIDTH), G_TYPE_INT, width,
+ GST_QUARK (HEIGHT), G_TYPE_INT, height, NULL);
+}
+
+/**
+ * gst_query_parse_buffers_caps:
+ * @query: a #GstQuery
+ * @caps: the storage for the #GstCaps pointer, or NULL
+ *
+ * Parse a buffers query.
+ */
+void
+gst_query_parse_buffers_caps (GstQuery * query, const GstCaps ** caps)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_BUFFERS);
+
+ structure = gst_query_get_structure (query);
+ if (caps)
+ *caps = gst_value_get_caps (gst_structure_id_get_value (structure,
+ GST_QUARK (CAPS)));
+}
+
+/**
+ * gst_query_parse_buffers_count:
+ * @query: a #GstQuery
+ * @count: the storage for minimum number of buffers, or NULL
+ *
+ * Parse a buffers query answer to see the minimum number of buffers
+ * required. A returned value of -1 means there is no minimum requirement
+ */
+void
+gst_query_parse_buffers_count (GstQuery * query, gint * count)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_BUFFERS);
+
+ structure = gst_query_get_structure (query);
+ if (count)
+ *count = g_value_get_int (gst_structure_id_get_value (structure,
+ GST_QUARK (COUNT)));
+}
+
+/**
+ * gst_query_parse_buffers_dimensions:
+ * @query: a #GstQuery
+ * @width: the storage for minimum width, or NULL
+ * @height: the storage for minimum height, or NULL
+ *
+ * Parse a buffers query answer to see the minimum buffer dimensions required.
+ * A returned value of -1 for either dimension means there is no minimum
+ * requirement in that axis
+ */
+void
+gst_query_parse_buffers_dimensions (GstQuery * query, gint * width,
+ gint * height)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_BUFFERS);
+
+ structure = gst_query_get_structure (query);
+ if (width)
+ *width = g_value_get_int (gst_structure_id_get_value (structure,
+ GST_QUARK (WIDTH)));
+ if (height)
+ *height = g_value_get_int (gst_structure_id_get_value (structure,
+ GST_QUARK (HEIGHT)));
+}
diff --git a/gst/gstquery.h b/gst/gstquery.h
index 2166537ef2bc3a45e825b0d48bfdae1c787def38..8dd710abdedec5f4fdbef59482803cc3a8ef4768 100644 (file)
--- a/gst/gstquery.h
+++ b/gst/gstquery.h
#include <gst/gstminiobject.h>
#include <gst/gststructure.h>
#include <gst/gstformat.h>
+#include <gst/gstcaps.h>
G_BEGIN_DECLS
* @GST_QUERY_CUSTOM: a custom application or element defined query. Since
* 0.10.22.
* @GST_QUERY_URI: query the URI of the source or sink. Since 0.10.22.
+ * @GST_QUERY_BUFFERS: query the upstream users of pad_alloc()'d buffers to
+ * find any particular requirements about buffer size (padding) or numbers of
+ * buffers. Since ?.?.?.
*
* Standard predefined Query types
*/
GST_QUERY_FORMATS,
GST_QUERY_BUFFERING,
GST_QUERY_CUSTOM,
- GST_QUERY_URI
+ GST_QUERY_URI,
+ GST_QUERY_BUFFERS
} GstQueryType;
/**
void gst_query_parse_uri (GstQuery *query, gchar **uri);
void gst_query_set_uri (GstQuery *query, const gchar *uri);
+/* buffer requirements query */
+GstQuery * gst_query_new_buffers (GstCaps * caps);
+void gst_query_set_buffers_count (GstQuery * query, gint count);
+void gst_query_set_buffers_dimensions (GstQuery * query, gint width, gint height);
+void gst_query_parse_buffers_caps (GstQuery * query, const GstCaps ** caps);
+void gst_query_parse_buffers_count (GstQuery * query, gint * count);
+void gst_query_parse_buffers_dimensions (GstQuery * query, gint * width, gint * height);
+
+
G_END_DECLS
#endif /* __GST_QUERY_H__ */