From patchwork Wed Nov 29 13:25:22 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stanimir Varbanov X-Patchwork-Id: 120000 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp3052287qgn; Wed, 29 Nov 2017 05:26:01 -0800 (PST) X-Google-Smtp-Source: AGs4zMala+/S2C6xalF1y8ukGAON8/oEI7iWGQiZolu5xfJFxov3puyUdUCBrr0+i6JORWbuD09A X-Received: by 10.84.135.162 with SMTP id 31mr2874788plj.23.1511961961272; Wed, 29 Nov 2017 05:26:01 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1511961961; cv=none; d=google.com; s=arc-20160816; b=OeuCKbaxDUUSbhZVCQsXElR0cpXdX+ZjsKgetjI6hDeHOmhe0Hk8sCN9mZTmSbOWlN 5eDA2MPO5IMfbFQFD9LzyUIJP2mD88UgHj9ad85I5rtmMV8sCUdeldKW5ct6Dd4lo4sL 5sdBIXZlPunZkq0wrf170r0KEJbLWI8JsSzNt1XLJSXFzyVAPtDWAfi3MOnuPxRJmiYW FltNB2lacmpx4uquqZPNkOqMOd2fEAcjjuIUrVjXk1lL717tr5u+gsCtxWDNINTmZjt/ VMZr1eGuakprucT7NKbO6gzFktYmJlSFwAPBf9/hGsU5jsodWf2nrI8INecxZCBKiaIm EzrQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=RrBAnGZVRTOocWmAyYSUO0Z4dr7iZDsdP63b40/2CtQ=; b=ioW6AAZcO9MCvLYMaY1Cu324fPthiTXdsPE6RRH6DIyr8u7c4vam/hL/E0z4dLLVHh po2pvHOU1hR2mHcV/8SHLETvJz9Va2wGEMXC+RqOTWOXyF2eB2xlvoLi1HHrydVaTr19 il1xPooa814MFTiGvZUWeQ7ya9stOynGtmgfn2dhAt7WUxCuWxl6P5TIQIRval0XmW9w m2t8lxaHMS+ldFv97GZk/keYfNno7DOviWkxIZujai+TH4f5QMVM7TrXKz5B+yNevY7A 4r6ZJiHhI5LZQh+AgXW+qCUFL1VLg3dO0SoFts08n781HiXq/WHf3nCQyywnxaRqUBNu KZpA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=iRzZ5erk; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id x13si1282474pgo.140.2017.11.29.05.26.01; Wed, 29 Nov 2017 05:26:01 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=iRzZ5erk; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753819AbdK2NZ6 (ORCPT + 28 others); Wed, 29 Nov 2017 08:25:58 -0500 Received: from mail-wr0-f196.google.com ([209.85.128.196]:45248 "EHLO mail-wr0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752484AbdK2NZx (ORCPT ); Wed, 29 Nov 2017 08:25:53 -0500 Received: by mail-wr0-f196.google.com with SMTP id h1so3357765wre.12 for ; Wed, 29 Nov 2017 05:25:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=RrBAnGZVRTOocWmAyYSUO0Z4dr7iZDsdP63b40/2CtQ=; b=iRzZ5erkIUKWyrUobS9qH2ydtQJ9jjIcLYx5SjDMJwynZsRpz7KKvQsW77/JV/R5p4 wVdGevZpP+jaBGipDcN//LRBgvJrb/+qTkZWx1SfnwjqZgnVkVBOQSumoho4u43SJZPt CTkxl5HcIBWRHb2cR2uE3BVTJyEBXQwAmgsHk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=RrBAnGZVRTOocWmAyYSUO0Z4dr7iZDsdP63b40/2CtQ=; b=OrtSI8sifxmwrJ+6uT8BnzHxPQ5lrx2sX7PziZIzaeuKKoUzTlnW1/HxGzCKYTiF9e gr7+1rLH1zVkKB9KGrJiQuThvKxQX+IJXJumDYIEnVScAfqdc1hpXrR2zMvVsmBaO9se e6vmUoiez2qMds8JMVgorA9Zd4RsxM7NhLsCQK78ikPRCgkrlvr5p+wIXGRx+jaeLE6r p7kxBFyxgkrwrjDJLJnWICZf8Neckxx11jdj9qf+TwznVYWgAndiQa2UoWpcWeqwCcmb S5OgiL/4X2mz80q90bCRzvtW2AFYIiOE6KBTsKI7g1S9eG644Dlyy2whPBg8azuYlZtt nLeQ== X-Gm-Message-State: AJaThX68nx1W1rcB2TFjm/5sheLvhsnsxG1hCS1x/7YfpUNc07by/uMj qLFhnojYxvfIbFfACtfQq/AoSA== X-Received: by 10.223.136.162 with SMTP id f31mr2243915wrf.130.1511961952301; Wed, 29 Nov 2017 05:25:52 -0800 (PST) Received: from localhost.localdomain ([37.157.136.206]) by smtp.gmail.com with ESMTPSA id k42sm3159261wre.80.2017.11.29.05.25.51 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 29 Nov 2017 05:25:51 -0800 (PST) From: Stanimir Varbanov To: Hans Verkuil Cc: Mauro Carvalho Chehab , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, Stanimir Varbanov Subject: [PATCH 2/2] venus: venc: set correctly GOP size and number of B-frames Date: Wed, 29 Nov 2017 15:25:22 +0200 Message-Id: <20171129132522.9140-2-stanimir.varbanov@linaro.org> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171129132522.9140-1-stanimir.varbanov@linaro.org> References: <20171129132522.9140-1-stanimir.varbanov@linaro.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This change fixes the calculation of B-frames and GOP size by adopt v4l2 controls with the firmware interface expectations. Signed-off-by: Stanimir Varbanov --- drivers/media/platform/qcom/venus/venc.c | 15 ++++--- drivers/media/platform/qcom/venus/venc_ctrls.c | 60 +++++++++++++++++++++++++- 2 files changed, 69 insertions(+), 6 deletions(-) -- 2.11.0 diff --git a/drivers/media/platform/qcom/venus/venc.c b/drivers/media/platform/qcom/venus/venc.c index 36d31540c59d..e3a10a852cad 100644 --- a/drivers/media/platform/qcom/venus/venc.c +++ b/drivers/media/platform/qcom/venus/venc.c @@ -685,8 +685,13 @@ static int venc_set_properties(struct venus_inst *inst) return ret; } + /* IDR periodicity, n: + * n = 0 - only the first I-frame is IDR frame + * n = 1 - all I-frames will be IDR frames + * n > 1 - every n-th I-frame will be IDR frame + */ ptype = HFI_PROPERTY_CONFIG_VENC_IDR_PERIOD; - idrp.idr_period = ctr->gop_size; + idrp.idr_period = 0; ret = hfi_session_set_property(inst, ptype, &idrp); if (ret) return ret; @@ -700,10 +705,6 @@ static int venc_set_properties(struct venus_inst *inst) return ret; } - /* intra_period = pframes + bframes + 1 */ - if (!ctr->num_p_frames) - ctr->num_p_frames = 2 * 15 - 1, - ptype = HFI_PROPERTY_CONFIG_VENC_INTRA_PERIOD; intra_period.pframes = ctr->num_p_frames; intra_period.bframes = ctr->num_b_frames; @@ -800,6 +801,10 @@ static int venc_init_session(struct venus_inst *inst) if (ret) goto deinit; + ret = venc_set_properties(inst); + if (ret) + goto deinit; + return 0; deinit: hfi_session_deinit(inst); diff --git a/drivers/media/platform/qcom/venus/venc_ctrls.c b/drivers/media/platform/qcom/venus/venc_ctrls.c index ab0fe51ff0f7..53130d4774d3 100644 --- a/drivers/media/platform/qcom/venus/venc_ctrls.c +++ b/drivers/media/platform/qcom/venus/venc_ctrls.c @@ -30,10 +30,58 @@ #define AT_SLICE_BOUNDARY \ V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED_AT_SLICE_BOUNDARY +static int venc_calc_bpframes(u32 gop_size, u32 conseq_b, u32 *bf, u32 *pf) +{ + uint32_t half = (gop_size - 1) >> 1; + uint32_t b, p, ratio; + bool found = false; + + if (!gop_size) + return -EINVAL; + + *bf = *pf = 0; + + if (!conseq_b) { + *pf = gop_size - 1; + return 0; + } + + b = p = half; + + for (; b <= gop_size - 1; b++, p--) { + if (b % p) + continue; + + ratio = b; + do_div(ratio, p); + + if (ratio == conseq_b) { + found = true; + break; + } + + if (ratio > conseq_b) + break; + } + + if (found == false) + return -EINVAL; + + if (b + p + 1 != gop_size) + return -EINVAL; + + *bf = b; + *pf = p; + + return 0; +} + static int venc_op_s_ctrl(struct v4l2_ctrl *ctrl) { struct venus_inst *inst = ctrl_to_inst(ctrl); struct venc_controls *ctr = &inst->controls.enc; + u32 bframes; + int ret; switch (ctrl->id) { case V4L2_CID_MPEG_VIDEO_BITRATE_MODE: @@ -102,6 +150,11 @@ static int venc_op_s_ctrl(struct v4l2_ctrl *ctrl) case V4L2_CID_MPEG_VIDEO_CYCLIC_INTRA_REFRESH_MB: break; case V4L2_CID_MPEG_VIDEO_GOP_SIZE: + ret = venc_calc_bpframes(ctrl->val, ctr->num_b_frames, &bframes, + &ctr->num_p_frames); + if (ret) + return ret; + ctr->gop_size = ctrl->val; break; case V4L2_CID_MPEG_VIDEO_H264_I_PERIOD: @@ -114,7 +167,12 @@ static int venc_op_s_ctrl(struct v4l2_ctrl *ctrl) ctr->vp8_max_qp = ctrl->val; break; case V4L2_CID_MPEG_VIDEO_B_FRAMES: - ctr->num_b_frames = ctrl->val; + ret = venc_calc_bpframes(ctr->gop_size, ctrl->val, &bframes, + &ctr->num_p_frames); + if (ret) + return ret; + + ctr->num_b_frames = bframes; break; default: return -EINVAL;