typefindhelper: Introduce a new API for working with a GstTypeFind *

Introduce a new API that can return a GstTypeFind * with helper functions
and data set around buffer data.

While at it, drop factory field from GstTypeFindBufHelper. While it was
useful for logging, it was not passed through function arguments and keeping
it for logging would require an additional API increasing the API surface
and making it harder to use.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3296>
This commit is contained in:
Sanchayan Maity 2022-10-31 18:33:19 +05:30 committed by GStreamer Marge Bot
parent 036b77b519
commit 89da632219
2 changed files with 149 additions and 15 deletions

View file

@ -94,8 +94,8 @@ helper_find_peek (gpointer data, gint64 offset, guint size)
helper = (GstTypeFindHelper *) data; helper = (GstTypeFindHelper *) data;
GST_LOG_OBJECT (helper->obj, "'%s' called peek (%" G_GINT64_FORMAT GST_LOG_OBJECT (helper->obj, "Typefind factory called peek (%" G_GINT64_FORMAT
", %u)", GST_OBJECT_NAME (helper->factory), offset, size); ", %u)", offset, size);
if (size == 0) if (size == 0)
return NULL; return NULL;
@ -229,8 +229,8 @@ helper_find_suggest (gpointer data, guint probability, GstCaps * caps)
GstTypeFindHelper *helper = (GstTypeFindHelper *) data; GstTypeFindHelper *helper = (GstTypeFindHelper *) data;
GST_LOG_OBJECT (helper->obj, GST_LOG_OBJECT (helper->obj,
"'%s' called suggest (%u, %" GST_PTR_FORMAT ")", "Typefind factory called suggest (%u, %" GST_PTR_FORMAT ")",
GST_OBJECT_NAME (helper->factory), probability, caps); probability, caps);
if (probability > helper->best_probability) { if (probability > helper->best_probability) {
gst_caps_replace (&helper->caps, caps); gst_caps_replace (&helper->caps, caps);
@ -243,8 +243,8 @@ helper_find_get_length (gpointer data)
{ {
GstTypeFindHelper *helper = (GstTypeFindHelper *) data; GstTypeFindHelper *helper = (GstTypeFindHelper *) data;
GST_LOG_OBJECT (helper->obj, "'%s' called get_length, returning %" GST_LOG_OBJECT (helper->obj, "Typefind factory called get_length, returning %"
G_GUINT64_FORMAT, GST_OBJECT_NAME (helper->factory), helper->size); G_GUINT64_FORMAT, helper->size);
return helper->size; return helper->size;
} }
@ -495,10 +495,23 @@ typedef struct
gsize size; gsize size;
GstTypeFindProbability best_probability; GstTypeFindProbability best_probability;
GstCaps *caps; GstCaps *caps;
GstTypeFindFactory *factory; /* for logging */
GstObject *obj; /* for logging */ GstObject *obj; /* for logging */
} GstTypeFindBufHelper; } GstTypeFindBufHelper;
/**
* GstTypeFindData:
*
* The opaque #GstTypeFindData structure.
*
* Since: 1.22
*
*/
struct _GstTypeFindData
{
GstTypeFind find;
GstTypeFindBufHelper helper;
};
/* /*
* buf_helper_find_peek: * buf_helper_find_peek:
* @data: helper data struct * @data: helper data struct
@ -516,15 +529,15 @@ buf_helper_find_peek (gpointer data, gint64 off, guint size)
GstTypeFindBufHelper *helper; GstTypeFindBufHelper *helper;
helper = (GstTypeFindBufHelper *) data; helper = (GstTypeFindBufHelper *) data;
GST_LOG_OBJECT (helper->obj, "'%s' called peek (%" G_GINT64_FORMAT ", %u)", GST_LOG_OBJECT (helper->obj,
GST_OBJECT_NAME (helper->factory), off, size); "Typefind factory called peek (%" G_GINT64_FORMAT ", %u)", off, size);
if (size == 0) if (size == 0)
return NULL; return NULL;
if (off < 0) { if (off < 0) {
GST_LOG_OBJECT (helper->obj, "'%s' wanted to peek at end; not supported", GST_LOG_OBJECT (helper->obj,
GST_OBJECT_NAME (helper->factory)); "Typefind factory wanted to peek at end; not supported");
return NULL; return NULL;
} }
@ -556,8 +569,8 @@ buf_helper_find_suggest (gpointer data, guint probability, GstCaps * caps)
GstTypeFindBufHelper *helper = (GstTypeFindBufHelper *) data; GstTypeFindBufHelper *helper = (GstTypeFindBufHelper *) data;
GST_LOG_OBJECT (helper->obj, GST_LOG_OBJECT (helper->obj,
"'%s' called suggest (%u, %" GST_PTR_FORMAT ")", "Typefind factory called suggest (%u, %" GST_PTR_FORMAT ")",
GST_OBJECT_NAME (helper->factory), probability, caps); probability, caps);
/* Note: not >= as we call typefinders in order of rank, highest first */ /* Note: not >= as we call typefinders in order of rank, highest first */
if (probability > helper->best_probability) { if (probability > helper->best_probability) {
@ -638,6 +651,7 @@ gst_type_find_helper_for_data_with_extension (GstObject * obj,
GstTypeFindProbability * prob) GstTypeFindProbability * prob)
{ {
GstTypeFindBufHelper helper; GstTypeFindBufHelper helper;
GstTypeFindFactory *factory;
GstTypeFind find; GstTypeFind find;
GList *l, *type_list; GList *l, *type_list;
GstCaps *result = NULL; GstCaps *result = NULL;
@ -662,8 +676,8 @@ gst_type_find_helper_for_data_with_extension (GstObject * obj,
type_list = prioritize_extension (obj, type_list, extension); type_list = prioritize_extension (obj, type_list, extension);
for (l = type_list; l; l = l->next) { for (l = type_list; l; l = l->next) {
helper.factory = GST_TYPE_FIND_FACTORY (l->data); factory = GST_TYPE_FIND_FACTORY (l->data);
gst_type_find_factory_call_function (helper.factory, &find); gst_type_find_factory_call_function (factory, &find);
if (helper.best_probability >= GST_TYPE_FIND_MAXIMUM) if (helper.best_probability >= GST_TYPE_FIND_MAXIMUM)
break; break;
} }
@ -1028,3 +1042,114 @@ gst_type_find_list_factories_for_caps (GstObject * obj, GstCaps * caps)
return g_list_reverse (factories); return g_list_reverse (factories);
} }
/**
* gst_type_find_data_new: (skip)
* @obj: (nullable): object doing the typefinding, or %NULL (used for logging)
* @data: (transfer none) (array length=size): a pointer with data to typefind
* @size: the size of @data
*
* Free-function: gst_type_find_data_free
*
* Returns: (transfer full): the #GstTypeFindData. The caller should free
* the returned #GstTypeFindData with gst_type_find_data_free().
*
* Since: 1.22
*
*/
GstTypeFindData *
gst_type_find_data_new (GstObject * obj, const guint8 * data, gsize size)
{
GstTypeFindData *find_data;
g_return_val_if_fail (data != NULL, NULL);
g_return_val_if_fail (size != 0, NULL);
find_data = g_new0 (GstTypeFindData, 1);
find_data->helper.data = data;
find_data->helper.size = size;
find_data->helper.best_probability = GST_TYPE_FIND_NONE;
find_data->helper.caps = NULL;
find_data->helper.obj = obj;
find_data->find.data = (gpointer) (&find_data->helper);
find_data->find.peek = buf_helper_find_peek;
find_data->find.suggest = buf_helper_find_suggest;
find_data->find.get_length = NULL;
return find_data;
}
/**
* gst_type_find_data_get_probability: (skip)
* @data: GstTypeFindData *
*
* Returns #GstCaps associated with #GstTypeFindData
*
* Returns: (transfer full) (nullable): #GstCaps.
*
* Since: 1.22
*
*/
GstCaps *
gst_type_find_data_get_caps (GstTypeFindData * data)
{
g_return_val_if_fail (data != NULL, NULL);
return gst_caps_ref (data->helper.caps);
}
/**
* gst_type_find_data_get_probability: (skip)
* @data: GstTypeFindData *
*
* Returns #GstTypeFindProbability associated with #GstTypeFindData
*
* Returns: (transfer full): #GstTypeFindProbability.
*
* Since: 1.22
*
*/
GstTypeFindProbability
gst_type_find_data_get_probability (GstTypeFindData * data)
{
g_return_val_if_fail (data != NULL, GST_TYPE_FIND_NONE);
return data->helper.best_probability;
}
/**
* gst_type_find_data_get_typefind: (skip)
* @data: GstTypeFindData *
*
* Returns #GstTypeFind associated with #GstTypeFindData
*
* Returns: (transfer full) (nullable): #GstTypeFind.
*
* Since: 1.22
*
*/
GstTypeFind *
gst_type_find_data_get_typefind (GstTypeFindData * data)
{
g_return_val_if_fail (data != NULL, NULL);
return &data->find;
}
/**
* gst_type_find_data_get_probability: (skip)
* @data: GstTypeFindData * to free
*
* Since: 1.22
*
*/
void
gst_type_find_data_free (GstTypeFindData * data)
{
if (data && data->helper.caps)
gst_caps_unref (data->helper.caps);
g_free (data);
}

View file

@ -29,6 +29,15 @@
G_BEGIN_DECLS G_BEGIN_DECLS
typedef struct _GstTypeFindData GstTypeFindData;
GstTypeFindData * gst_type_find_data_new (GstObject * obj,
const guint8 * data, gsize size);
GstCaps * gst_type_find_data_get_caps (GstTypeFindData * data);
GstTypeFindProbability gst_type_find_data_get_probability (GstTypeFindData * data);
GstTypeFind * gst_type_find_data_get_typefind (GstTypeFindData * data);
void gst_type_find_data_free (GstTypeFindData * data);
GST_BASE_API GST_BASE_API
GstCaps * gst_type_find_helper (GstPad *src, guint64 size); GstCaps * gst_type_find_helper (GstPad *src, guint64 size);