From patchwork Wed Apr 10 21:28:05 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ismael Luceno X-Patchwork-Id: 17872 Received: from mail.tu-berlin.de ([130.149.7.33]) by www.linuxtv.org with esmtp (Exim 4.72) (envelope-from ) id 1UQ2gK-0002b6-WC; Wed, 10 Apr 2013 23:35:53 +0200 X-tubIT-Incoming-IP: 209.132.180.67 Received: from vger.kernel.org ([209.132.180.67]) by mail.tu-berlin.de (exim-4.75/mailfrontend-3) with esmtp id 1UQ2gK-0001ct-Cy; Wed, 10 Apr 2013 23:35:52 +0200 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S935262Ab3DJVfu (ORCPT + 1 other); Wed, 10 Apr 2013 17:35:50 -0400 Received: from mail-yh0-f44.google.com ([209.85.213.44]:40236 "EHLO mail-yh0-f44.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1761894Ab3DJVft (ORCPT ); Wed, 10 Apr 2013 17:35:49 -0400 X-Greylist: delayed 433 seconds by postgrey-1.27 at vger.kernel.org; Wed, 10 Apr 2013 17:35:49 EDT Received: by mail-yh0-f44.google.com with SMTP id m1so148419yhg.31 for ; Wed, 10 Apr 2013 14:35:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:sender:from:to:cc:subject:date:message-id:x-mailer; bh=XaeY3s3rWszbeMrfEvEwUe/mTxW4evJHisvlVz4QBC4=; b=OOXXkB6wSkGqC9zhS90nJn3Rr5ihWTSVl/jZp1In72q1Gx7CFp/f41MYnmils4Ub38 Dhg+m7FT8gVT0FbVohcFelycYxh4t5CZRnZbE6dbSL0JdL0FKeWPJCrzW58z04D5IcCz dtw+2xvrYZMlHy/CkoYP7dEBI7TwYwxPwJsqvVW8yu9Y4lowvvxE+WVhBlCm3HUe8piJ R5pYgFRdLtK4/DFCprBQXtGpGritU5zlAAejW+Dp5i3B3cUP7rR80aHbCOdt0bL79ur2 zqslUkgzuVwIYZgXy4BNXt+OuVcuSITW0pS1L1Fwjlcf+mWPg6+oLkp8n9x9sOJVy5UK f+Lw== X-Received: by 10.236.96.231 with SMTP id r67mr2406984yhf.108.1365629316267; Wed, 10 Apr 2013 14:28:36 -0700 (PDT) Received: from localhost.localdomain (65-252-17-190.fibertel.com.ar. [190.17.252.65]) by mx.google.com with ESMTPS id s10sm2317807yho.13.2013.04.10.14.28.32 (version=TLSv1 cipher=RC4-SHA bits=128/128); Wed, 10 Apr 2013 14:28:34 -0700 (PDT) From: Ismael Luceno To: linux-media@vger.kernel.org Cc: Alex Dvoretsky , Hans Verkuil , Mauro Carvalho Chehab , Ismael Luceno Subject: [PATCH] solo6x10: Approximate frame intervals with non-standard denominator Date: Wed, 10 Apr 2013 18:28:05 -0300 Message-Id: <1365629285-22793-1-git-send-email-ismael.luceno@corp.bluecherry.net> X-Mailer: git-send-email 1.8.2 Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-PMX-Version: 5.6.1.2065439, Antispam-Engine: 2.7.2.376379, Antispam-Data: 2013.4.10.212715 X-PMX-Spam: Gauge=IIIIIIII, Probability=8%, Report=' MULTIPLE_RCPTS 0.1, HTML_00_01 0.05, HTML_00_10 0.05, BODY_SIZE_3000_3999 0, BODY_SIZE_5000_LESS 0, BODY_SIZE_7000_LESS 0, DKIM_SIGNATURE 0, URI_ENDS_IN_HTML 0, __ANY_URI 0, __CP_URI_IN_BODY 0, __HAS_FROM 0, __HAS_MSGID 0, __HAS_X_MAILER 0, __HAS_X_MAILING_LIST 0, __MIME_TEXT_ONLY 0, __MULTIPLE_RCPTS_CC_X2 0, __SANE_MSGID 0, __TO_MALFORMED_2 0, __TO_NO_NAME 0, __URI_NO_WWW 0, __URI_NS , __YOUTUBE_RCVD 0' Instead of falling back to 1/25 (PAL) or 1/30 (NTSC). Signed-off-by: Ismael Luceno # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # On branch media # Changes to be committed: # (use "git reset HEAD ..." to unstage) # # modified: drivers/staging/media/solo6x10/solo6x10-v4l2-enc.c # # Untracked files: # (use "git add ..." to include in what will be committed) # # buildtest/ --- drivers/staging/media/solo6x10/solo6x10-v4l2-enc.c | 38 +++++++++------------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/drivers/staging/media/solo6x10/solo6x10-v4l2-enc.c b/drivers/staging/media/solo6x10/solo6x10-v4l2-enc.c index 6c7d20f..6965307 100644 --- a/drivers/staging/media/solo6x10/solo6x10-v4l2-enc.c +++ b/drivers/staging/media/solo6x10/solo6x10-v4l2-enc.c @@ -975,12 +975,11 @@ static int solo_g_parm(struct file *file, void *priv, struct v4l2_streamparm *sp) { struct solo_enc_dev *solo_enc = video_drvdata(file); - struct solo_dev *solo_dev = solo_enc->solo_dev; struct v4l2_captureparm *cp = &sp->parm.capture; cp->capability = V4L2_CAP_TIMEPERFRAME; cp->timeperframe.numerator = solo_enc->interval; - cp->timeperframe.denominator = solo_dev->fps; + cp->timeperframe.denominator = solo_enc->solo_dev->fps; cp->capturemode = 0; /* XXX: Shouldn't we be able to get/set this from videobuf? */ cp->readbuffers = 2; @@ -988,36 +987,29 @@ static int solo_g_parm(struct file *file, void *priv, return 0; } +static inline int calc_interval(u8 fps, u32 n, u32 d) +{ + if (unlikely(!n || !d)) + return 1; + if (likely(d == fps)) + return n; + n *= fps; + return min(15U, n / d + (n % d >= (fps >> 1))); +} + static int solo_s_parm(struct file *file, void *priv, struct v4l2_streamparm *sp) { struct solo_enc_dev *solo_enc = video_drvdata(file); - struct solo_dev *solo_dev = solo_enc->solo_dev; - struct v4l2_captureparm *cp = &sp->parm.capture; + struct v4l2_fract *t = &sp->parm.capture.timeperframe; + u8 fps = solo_enc->solo_dev->fps; if (vb2_is_streaming(&solo_enc->vidq)) return -EBUSY; - if ((cp->timeperframe.numerator == 0) || - (cp->timeperframe.denominator == 0)) { - /* reset framerate */ - cp->timeperframe.numerator = 1; - cp->timeperframe.denominator = solo_dev->fps; - } - - if (cp->timeperframe.denominator != solo_dev->fps) - cp->timeperframe.denominator = solo_dev->fps; - - if (cp->timeperframe.numerator > 15) - cp->timeperframe.numerator = 15; - - solo_enc->interval = cp->timeperframe.numerator; - - cp->capability = V4L2_CAP_TIMEPERFRAME; - cp->readbuffers = 2; - + solo_enc->interval = calc_interval(fps, t->numerator, t->denominator); solo_update_mode(solo_enc); - return 0; + return solo_g_parm(file, priv, sp); } static long solo_enc_default(struct file *file, void *fh,