libadf: filter overlay engines by a list of acceptable formats

Change-Id: Ibb294f0520a7a7a6a2a89e1e3eb3c335906d3e66
Signed-off-by: Greg Hackmann <ghackmann@google.com>
This commit is contained in:
Greg Hackmann 2013-11-12 10:38:36 -08:00
parent ebb26c71fe
commit 47e0c8d849
2 changed files with 25 additions and 12 deletions

View File

@ -494,8 +494,8 @@ done:
static ssize_t adf_overlay_engines_filter(struct adf_device *dev,
adf_id_t *in, size_t n_in, adf_id_t **out,
bool (*filter)(struct adf_overlay_engine_data *data, __u32 match),
__u32 match)
bool (*filter)(struct adf_overlay_engine_data *data, void *cookie),
void *cookie)
{
size_t n = 0;
ssize_t ret;
@ -515,7 +515,7 @@ static ssize_t adf_overlay_engines_filter(struct adf_device *dev,
if (ret < 0)
goto done;
if (!filter(&data, match))
if (!filter(&data, cookie))
continue;
adf_id_t *new_ids = realloc(ids_ret, (n + 1) * sizeof(ids_ret[0]));
@ -539,21 +539,32 @@ done:
return ret;
}
static bool adf_overlay_engine_format_filter(struct adf_overlay_engine_data *data,
__u32 format)
struct format_filter_cookie {
const __u32 *formats;
size_t n_formats;
};
static bool adf_overlay_engine_format_filter(
struct adf_overlay_engine_data *data, void *cookie)
{
struct format_filter_cookie *c = cookie;
size_t i;
for (i = 0; i < data->n_supported_formats; i++)
if (data->supported_formats[i] == format)
return true;
for (i = 0; i < data->n_supported_formats; i++) {
size_t j;
for (j = 0; j < c->n_formats; j++)
if (data->supported_formats[i] == c->formats[j])
return true;
}
return false;
}
ssize_t adf_overlay_engines_filter_by_format(struct adf_device *dev,
__u32 format, adf_id_t *in, size_t n_in, adf_id_t **out)
const __u32 *formats, size_t n_formats, adf_id_t *in, size_t n_in,
adf_id_t **out)
{
struct format_filter_cookie cookie = { formats, n_formats };
return adf_overlay_engines_filter(dev, in, n_in, out,
adf_overlay_engine_format_filter, format);
adf_overlay_engine_format_filter, &cookie);
}
int adf_overlay_engine_open(struct adf_device *dev, adf_id_t id, int flags)

View File

@ -182,10 +182,12 @@ ssize_t adf_overlay_engines_for_interface(struct adf_device *dev,
/**
* Filters a list of overlay engines by supported buffer format.
*
* The caller must free() the returned list of overlay engine IDs.
* Returns the overlay engines which support at least one of the specified
* formats. The caller must free() the returned list of overlay engine IDs.
*/
ssize_t adf_overlay_engines_filter_by_format(struct adf_device *dev,
__u32 format, adf_id_t *in, size_t n_in, adf_id_t **out);
const __u32 *formats, size_t n_formats, adf_id_t *in, size_t n_in,
adf_id_t **out);
/**
* Opens an ADF overlay engine.