diff options
author | Guennadi Liakhovetski <g.liakhovetski@gmx.de> | 2010-08-27 12:41:44 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2010-10-20 23:06:18 -0400 |
commit | 79c6ff93c74e793ccceb464ee3698478c812ce79 (patch) | |
tree | 9750ba1a7d14619e8e74449513af0a31ccf8c803 /drivers/media/video/v4l2-common.c | |
parent | 45f4d4e8799ff1d7ef72747203935f1f2533743d (diff) |
V4L/DVB: V4L2: add a generic function to find the nearest discrete format to the required one
Many video drivers implement a fixed set of frame formats and thus face a task
of finding the best match for a user-requested format. Implementing this in a
generic function has also an advantage, that different drivers with similar
supported format sets will select the same format for the user, which improves
consistency across drivers.
Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/v4l2-common.c')
-rw-r--r-- | drivers/media/video/v4l2-common.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/drivers/media/video/v4l2-common.c b/drivers/media/video/v4l2-common.c index 8ee1179be92..31ae1a13861 100644 --- a/drivers/media/video/v4l2-common.c +++ b/drivers/media/video/v4l2-common.c | |||
@@ -676,3 +676,27 @@ int v4l_fill_dv_preset_info(u32 preset, struct v4l2_dv_enum_preset *info) | |||
676 | return 0; | 676 | return 0; |
677 | } | 677 | } |
678 | EXPORT_SYMBOL_GPL(v4l_fill_dv_preset_info); | 678 | EXPORT_SYMBOL_GPL(v4l_fill_dv_preset_info); |
679 | |||
680 | struct v4l2_frmsize_discrete *v4l2_find_nearest_format(struct v4l2_discrete_probe *probe, | ||
681 | s32 width, s32 height) | ||
682 | { | ||
683 | int i; | ||
684 | u32 error, min_error = UINT_MAX; | ||
685 | struct v4l2_frmsize_discrete *size, *best = NULL; | ||
686 | |||
687 | if (!probe) | ||
688 | return best; | ||
689 | |||
690 | for (i = 0, size = probe->sizes; i < probe->num_sizes; i++, size++) { | ||
691 | error = abs(size->width - width) + abs(size->height - height); | ||
692 | if (error < min_error) { | ||
693 | min_error = error; | ||
694 | best = size; | ||
695 | } | ||
696 | if (!error) | ||
697 | break; | ||
698 | } | ||
699 | |||
700 | return best; | ||
701 | } | ||
702 | EXPORT_SYMBOL_GPL(v4l2_find_nearest_format); | ||