From patchwork Thu Aug 5 18:03:46 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guennadi Liakhovetski X-Patchwork-Id: 117370 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter.kernel.org (8.14.4/8.14.3) with ESMTP id o75I3U4b014081 for ; Thu, 5 Aug 2010 18:03:30 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756396Ab0HESD3 (ORCPT ); Thu, 5 Aug 2010 14:03:29 -0400 Received: from mailout-de.gmx.net ([213.165.64.23]:33322 "HELO mail.gmx.net" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with SMTP id S1753538Ab0HESD2 (ORCPT ); Thu, 5 Aug 2010 14:03:28 -0400 Received: (qmail invoked by alias); 05 Aug 2010 18:03:26 -0000 Received: from p57BD0CFA.dip0.t-ipconnect.de (EHLO axis700.grange) [87.189.12.250] by mail.gmx.net (mp021) with SMTP; 05 Aug 2010 20:03:26 +0200 X-Authenticated: #20450766 X-Provags-ID: V01U2FsdGVkX19NxS8eJcRN9dH6+Ms6pm0YTkxyE1xrdSIW+sMwJx sQi49PZ5PPgAVt Received: from lyakh (helo=localhost) by axis700.grange with local-esmtp (Exim 4.63) (envelope-from ) id 1Oh4nC-0006pr-6S; Thu, 05 Aug 2010 20:03:46 +0200 Date: Thu, 5 Aug 2010 20:03:46 +0200 (CEST) From: Guennadi Liakhovetski To: Linux Media Mailing List cc: Hans Verkuil , Laurent Pinchart Subject: [PATCH/RFC] V4L2: add a generic function to find the nearest discrete format Message-ID: MIME-Version: 1.0 X-Y-GMX-Trusted: 0 Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter.kernel.org [140.211.167.41]); Thu, 05 Aug 2010 18:03:30 +0000 (UTC) diff --git a/drivers/media/video/v4l2-common.c b/drivers/media/video/v4l2-common.c index 4e53b0b..90727e6 100644 --- a/drivers/media/video/v4l2-common.c +++ b/drivers/media/video/v4l2-common.c @@ -1144,3 +1144,29 @@ int v4l_fill_dv_preset_info(u32 preset, struct v4l2_dv_enum_preset *info) return 0; } EXPORT_SYMBOL_GPL(v4l_fill_dv_preset_info); + +struct v4l2_frmsize_discrete *v4l2_find_nearest_format(struct v4l2_discrete_probe *probe, + s32 width, s32 height) +{ + int i; + u32 error, min_error = ~0; + struct v4l2_frmsize_discrete *size, *best = NULL; + + if (!probe) + return best; + + for (i = 0, size = probe->sizes; i < probe->num_sizes; i++, size++) { + if (probe->probe && !probe->probe(probe)) + continue; + error = abs(size->width - width) + abs(size->height - height); + if (error < min_error) { + min_error = error; + best = size; + } + if (!error) + break; + } + + return best; +} +EXPORT_SYMBOL_GPL(v4l2_find_nearest_format); diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h index 047f7e6..f622bba 100644 --- a/include/linux/videodev2.h +++ b/include/linux/videodev2.h @@ -394,6 +394,16 @@ struct v4l2_frmsize_discrete { __u32 height; /* Frame height [pixel] */ }; +struct v4l2_discrete_probe { + struct v4l2_frmsize_discrete *sizes; + int num_sizes; + void *priv; + bool (*probe)(struct v4l2_discrete_probe *); +}; + +struct v4l2_frmsize_discrete *v4l2_find_nearest_format(struct v4l2_discrete_probe *probe, + s32 width, s32 height); + struct v4l2_frmsize_stepwise { __u32 min_width; /* Minimum frame width [pixel] */ __u32 max_width; /* Maximum frame width [pixel] */