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 | |
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>
-rw-r--r-- | drivers/media/video/v4l2-common.c | 24 | ||||
-rw-r--r-- | include/linux/videodev2.h | 8 |
2 files changed, 32 insertions, 0 deletions
diff --git a/drivers/media/video/v4l2-common.c b/drivers/media/video/v4l2-common.c index 8ee1179be926..31ae1a138613 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); | ||
diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h index b06479f63271..957d5b093847 100644 --- a/include/linux/videodev2.h +++ b/include/linux/videodev2.h | |||
@@ -397,6 +397,14 @@ struct v4l2_frmsize_discrete { | |||
397 | __u32 height; /* Frame height [pixel] */ | 397 | __u32 height; /* Frame height [pixel] */ |
398 | }; | 398 | }; |
399 | 399 | ||
400 | struct v4l2_discrete_probe { | ||
401 | const struct v4l2_frmsize_discrete *sizes; | ||
402 | int num_sizes; | ||
403 | }; | ||
404 | |||
405 | struct v4l2_frmsize_discrete *v4l2_find_nearest_format(struct v4l2_discrete_probe *probe, | ||
406 | s32 width, s32 height); | ||
407 | |||
400 | struct v4l2_frmsize_stepwise { | 408 | struct v4l2_frmsize_stepwise { |
401 | __u32 min_width; /* Minimum frame width [pixel] */ | 409 | __u32 min_width; /* Minimum frame width [pixel] */ |
402 | __u32 max_width; /* Maximum frame width [pixel] */ | 410 | __u32 max_width; /* Maximum frame width [pixel] */ |