From patchwork Fri May 3 19:54:57 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ismael Luceno X-Patchwork-Id: 18298 X-Patchwork-Delegate: hverkuil@xs4all.nl Received: from mail.tu-berlin.de ([130.149.7.33]) by www.linuxtv.org with esmtp (Exim 4.72) (envelope-from ) id 1UYM4v-0007wC-FM; Fri, 03 May 2013 21:55:37 +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.72/mailfrontend-6) with esmtp id 1UYM4t-0006VV-4f; Fri, 03 May 2013 21:55:37 +0200 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934240Ab3ECTzd (ORCPT + 1 other); Fri, 3 May 2013 15:55:33 -0400 Received: from mail-gh0-f176.google.com ([209.85.160.176]:62662 "EHLO mail-gh0-f176.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934217Ab3ECTzc (ORCPT ); Fri, 3 May 2013 15:55:32 -0400 Received: by mail-gh0-f176.google.com with SMTP id z17so342852ghb.21 for ; Fri, 03 May 2013 12:55:32 -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=SRX4OhDouwCmM/+ZiPAqQfM9zf5fjD+VPKAVXBD2Cs0=; b=pXaR77rNH9W4Z52Fc3WwlefJiRddJ0pENAYKzxOw2ml0Ue3CsJuXu27wIH9ZCcpwE9 RFFDB5nTfaz4jzIc2LYf4z5bu/wAlf+Qw0Gv3uHWSpM8HL2+CwK/NY/bUi6TawbcMzfr EyCzlR8DLVXAgW5vSRijjEdIc/x79VvG1Ujdb+QKBen9ICfWwGhh0r2YgCJarmFGGJng /47RiL77hNILitE1NM0V5dUpwh8iuE/E97qKUDr6YWVG4vLHrqMSJwgcc/KyCpbck2Gk Vh53/Lq85lyV28nwitc/celxAEEImW9tz2M5IVmHkBkLXVZnUQCUo1R1ViK5FcohF4iy H3Hw== X-Received: by 10.236.16.202 with SMTP id h50mr10647559yhh.39.1367610932265; Fri, 03 May 2013 12:55:32 -0700 (PDT) Received: from localhost.localdomain ([170.51.69.64]) by mx.google.com with ESMTPSA id v27sm23311452yhj.12.2013.05.03.12.55.23 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Fri, 03 May 2013 12:55:31 -0700 (PDT) From: Ismael Luceno To: linux-media@vger.kernel.org Cc: Hans Verkuil , Ismael Luceno Subject: [PATCH v2] solo6x10: Approximate frame intervals with non-standard denominator Date: Fri, 3 May 2013 16:54:57 -0300 Message-Id: <1367610897-29942-1-git-send-email-ismael.luceno@corp.bluecherry.net> X-Mailer: git-send-email 1.8.2.1 Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-PMX-Version: 6.0.0.2142326, Antispam-Engine: 2.7.2.2107409, Antispam-Data: 2013.5.3.194517 X-PMX-Spam: Gauge=IIIIIIII, Probability=8%, Report=' MULTIPLE_RCPTS 0.1, HTML_00_01 0.05, HTML_00_10 0.05, BODYTEXTP_SIZE_3000_LESS 0, BODY_SIZE_2000_2999 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 --- 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 98e2902..a4c5896 100644 --- a/drivers/staging/media/solo6x10/solo6x10-v4l2-enc.c +++ b/drivers/staging/media/solo6x10/solo6x10-v4l2-enc.c @@ -996,12 +996,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; @@ -1009,36 +1008,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 (!n || !d) + return 1; + if (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,