From patchwork Wed Apr 26 13:23:37 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pavel Machek X-Patchwork-Id: 9701373 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 0BA7E603F4 for ; Wed, 26 Apr 2017 13:24:10 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 02A0028178 for ; Wed, 26 Apr 2017 13:24:10 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E94A928387; Wed, 26 Apr 2017 13:24:09 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID autolearn=ham version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [65.50.211.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id EA54628178 for ; Wed, 26 Apr 2017 13:24:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender:Content-Type:Cc: List-Subscribe:List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id: In-Reply-To:MIME-Version:References:Message-ID:Subject:To:From:Date:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=LReztD6T2XQHcKGLEVpXrodESVXdTY+bvLCZU8hY0NU=; b=O2pQpADDwOBr2WqyAG+DZQHLy CCm2bZIfUxj+tyOWzSalVZuzGmaNT7P8EdT/BOWKj0o1+X0KemvdeCsxNlkkIVjtPmmekhqhVPooR H9dUOahsVg8cyDIHYNKA3f85X1T+LvNK64OntkKykGMk907G2xXBx0EX5lH9S1Dc+zzCH4G5b0lym XD/nUfEV9M1ihrqajFqUZWk9bG3Xro5R29gzkSYJYD0uO8356OEH0Vmidxy96Q0WD4M/KMBAfaEUz X5ghsEXJjq1M880oTz/igLHH0u13bscQDBR33VivZqgCDphcqfWZTILoGowFK/aR4qQaBFeKZtuyG JaIIQjO9w==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.87 #1 (Red Hat Linux)) id 1d3MvP-0000kd-38; Wed, 26 Apr 2017 13:24:07 +0000 Received: from atrey.karlin.mff.cuni.cz ([195.113.26.193]) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1d3MvL-0000jE-Tf for linux-arm-kernel@lists.infradead.org; Wed, 26 Apr 2017 13:24:06 +0000 Received: by atrey.karlin.mff.cuni.cz (Postfix, from userid 512) id 5726881A60; Wed, 26 Apr 2017 15:23:38 +0200 (CEST) Date: Wed, 26 Apr 2017 15:23:37 +0200 From: Pavel Machek To: Mauro Carvalho Chehab Subject: [patch] autogain support for bayer10 format (was Re: [patch] propagating controls in libv4l2) Message-ID: <20170426132337.GA6482@amd> References: <1487074823-28274-2-git-send-email-sakari.ailus@linux.intel.com> <20170414232332.63850d7b@vento.lan> <20170416091209.GB7456@valkosipuli.retiisi.org.uk> <20170419105118.72b8e284@vento.lan> <20170424093059.GA20427@amd> <20170424103802.00d3b554@vento.lan> <20170424212914.GA20780@amd> <20170424224724.5bb52382@vento.lan> <20170426105300.GA857@amd> <20170426081330.6ca10e42@vento.lan> MIME-Version: 1.0 In-Reply-To: <20170426081330.6ca10e42@vento.lan> User-Agent: Mutt/1.5.23 (2014-03-12) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20170426_062404_290139_5AFAB091 X-CRM114-Status: GOOD ( 27.42 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: ivo.g.dimitrov.75@gmail.com, linux-media@vger.kernel.org, khilman@kernel.org, tony@atomide.com, aaro.koskinen@iki.fi, kernel list , sre@kernel.org, abcloriens@gmail.com, Sakari Ailus , pali.rohar@gmail.com, Sakari Ailus , linux-omap@vger.kernel.org, patrikbachan@gmail.com, linux-arm-kernel , serge@hallyn.com Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP Hi! > > > I don't see why it would be hard to open files or have threads inside > > > a library. There are several libraries that do that already, specially > > > the ones designed to be used on multimidia apps. > > > > Well, This is what the libv4l2 says: > > > > This file implements libv4l2, which offers v4l2_ prefixed versions > > of > > open/close/etc. The API is 100% the same as directly opening > > /dev/videoX > > using regular open/close/etc, the big difference is that format > > conversion > > > > but if I open additional files in v4l2_open(), API is no longer the > > same, as unix open() is defined to open just one file descriptor. > > > > Now. There is autogain support in libv4lconvert, but it expects to use > > same fd for camera and for the gain... which does not work with > > subdevs. > > > > Of course, opening subdevs by name like this is not really > > acceptable. But can you suggest a method that is? > > There are two separate things here: > > 1) Autofoucs for a device that doesn't use subdev API > 2) libv4l2 support for devices that require MC and subdev API Actually there are three: 0) autogain. Unfortunately, I need autogain first before autofocus has a chance... And that means... bayer10 support for autogain. Plus, I changed avg_lum to long long. Quick calculation tells me int could overflow with few megapixel sensor. Oh, btw http://ytse.tricolour.net/docs/LowLightOptimization.html no longer works. Regards, Pavel diff --git a/lib/libv4lconvert/processing/autogain.c b/lib/libv4lconvert/processing/autogain.c index c6866d6..0b52d0f 100644 --- a/lib/libv4lconvert/processing/autogain.c +++ b/lib/libv4lconvert/processing/autogain.c @@ -68,6 +71,41 @@ static void autogain_adjust(struct v4l2_queryctrl *ctrl, int *value, } } +static int get_luminosity_bayer10(uint16_t *buf, const struct v4l2_format *fmt) +{ + long long avg_lum = 0; + int x, y; + + buf += fmt->fmt.pix.height * fmt->fmt.pix.bytesperline / 4 + + fmt->fmt.pix.width / 4; + + for (y = 0; y < fmt->fmt.pix.height / 2; y++) { + for (x = 0; x < fmt->fmt.pix.width / 2; x++) + avg_lum += *buf++; + buf += fmt->fmt.pix.bytesperline - fmt->fmt.pix.width / 2; + } + avg_lum /= fmt->fmt.pix.height * fmt->fmt.pix.width / 4; + avg_lum /= 4; + return avg_lum; +} + +static int get_luminosity_bayer8(unsigned char *buf, const struct v4l2_format *fmt) +{ + long long avg_lum = 0; + int x, y; + + buf += fmt->fmt.pix.height * fmt->fmt.pix.bytesperline / 4 + + fmt->fmt.pix.width / 4; + + for (y = 0; y < fmt->fmt.pix.height / 2; y++) { + for (x = 0; x < fmt->fmt.pix.width / 2; x++) + avg_lum += *buf++; + buf += fmt->fmt.pix.bytesperline - fmt->fmt.pix.width / 2; + } + avg_lum /= fmt->fmt.pix.height * fmt->fmt.pix.width / 4; + return avg_lum; +} + /* auto gain and exposure algorithm based on the knee algorithm described here: http://ytse.tricolour.net/docs/LowLightOptimization.html */ static int autogain_calculate_lookup_tables( @@ -100,17 +142,16 @@ static int autogain_calculate_lookup_tables( switch (fmt->fmt.pix.pixelformat) { + case V4L2_PIX_FMT_SGBRG10: + case V4L2_PIX_FMT_SGRBG10: + case V4L2_PIX_FMT_SBGGR10: + case V4L2_PIX_FMT_SRGGB10: + avg_lum = get_luminosity_bayer10((void *) buf, fmt); + break; + case V4L2_PIX_FMT_SGBRG8: case V4L2_PIX_FMT_SGRBG8: case V4L2_PIX_FMT_SBGGR8: case V4L2_PIX_FMT_SRGGB8: - buf += fmt->fmt.pix.height * fmt->fmt.pix.bytesperline / 4 + - fmt->fmt.pix.width / 4; - - for (y = 0; y < fmt->fmt.pix.height / 2; y++) { - for (x = 0; x < fmt->fmt.pix.width / 2; x++) - avg_lum += *buf++; - buf += fmt->fmt.pix.bytesperline - fmt->fmt.pix.width / 2; - } - avg_lum /= fmt->fmt.pix.height * fmt->fmt.pix.width / 4; + avg_lum = get_luminosity_bayer8(buf, fmt); break; case V4L2_PIX_FMT_RGB24: diff --git a/lib/libv4lconvert/processing/libv4lprocessing.c b/lib/libv4lconvert/processing/libv4lprocessing.c index b061f50..b98d024 100644 --- a/lib/libv4lconvert/processing/libv4lprocessing.c +++ b/lib/libv4lconvert/processing/libv4lprocessing.c @@ -164,6 +165,10 @@ void v4lprocessing_processing(struct v4lprocessing_data *data, case V4L2_PIX_FMT_SGRBG8: case V4L2_PIX_FMT_SBGGR8: case V4L2_PIX_FMT_SRGGB8: + case V4L2_PIX_FMT_SGBRG10: + case V4L2_PIX_FMT_SGRBG10: + case V4L2_PIX_FMT_SBGGR10: + case V4L2_PIX_FMT_SRGGB10: case V4L2_PIX_FMT_RGB24: case V4L2_PIX_FMT_BGR24: break;