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: 10082127 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 EA7E460353 for ; Wed, 29 Nov 2017 13:26:11 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id DBA642974C for ; Wed, 29 Nov 2017 13:26:11 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id D08EB297EB; Wed, 29 Nov 2017 13:26:11 +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=-7.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, RCVD_IN_DNSWL_HI autolearn=unavailable version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7B68C2974C for ; Wed, 29 Nov 2017 13:26:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753359AbdK2NZ5 (ORCPT ); Wed, 29 Nov 2017 08:25:57 -0500 Received: from mail-wr0-f195.google.com ([209.85.128.195]:43193 "EHLO mail-wr0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753433AbdK2NZx (ORCPT ); Wed, 29 Nov 2017 08:25:53 -0500 Received: by mail-wr0-f195.google.com with SMTP id z34so3377886wrz.10 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=HmhvCp8UEqrWvAg4KEz9ve6Uyjp2Apiv1/J5ZeGBBLhLrJcFOmmNpSfoNuPhS31Rg+ emV9/elcApe4S3Yit16Qu82Tl2KvgGbLjeKUbRtymKmO7tZJ/5iEjx2if9pU6kOM4nBG ujdvOnPM9is1O0OZHP8U88bZ7Bz6sFKW5JRvw7lZ46aUxdccZckJ/n37bnNo0foMvB+A X24qrxISklCsqTU6Ks9XxbBxnVsj6gd1N6VEmoGrRbiQUB5FFxREkdfB8qI3JMMm/btI Xp8KwvFGIXhH2jp/7goe4v5euHqIsfLto8SgtUz5LqsFaSkiGgM1e5T0phj4xmwYyta9 UeKw== X-Gm-Message-State: AJaThX50ZtL0snC/sYZcOYxk1k2Ee3facpuDbsq6oL0CjYS3m24B/Az/ 2TCrTfwPkazpomwkDBdpsv86SQ== X-Google-Smtp-Source: AGs4zMY708AXjAsQ4Ely/hfCEIya2dV6yNlo7ak3ZdcxGkYRDUiR9L5yivrV+aIGaVqMTZ8+xH90zw== 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-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP 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(-) 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;