From patchwork Fri Dec 1 15:08:01 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stanimir Varbanov X-Patchwork-Id: 120347 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp1257249qgn; Fri, 1 Dec 2017 07:08:18 -0800 (PST) X-Google-Smtp-Source: AGs4zMZ0qdmx3cZeUMEZNmFKS9ZF1OedYeCAbG6VyDncaMRxI0hlY5LV5swrf27lVY5DjJXQmUc8 X-Received: by 10.99.97.23 with SMTP id v23mr6342205pgb.210.1512140898650; Fri, 01 Dec 2017 07:08:18 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1512140898; cv=none; d=google.com; s=arc-20160816; b=kBR4w1BMAFmE5ypKmSDAGAyndAvb6yWd0lQoTwr8UiU4ofnIReWAID3nb5gPi+lgN0 L/iJa22NvNpbVQrGawXWF2s7S9JTgrBzm4Gf6SAD+3HyRvgDSQ49kqLb0DGWpsV3oOBb kKtXM14XVnFqsAF6EVoe6FipyhVT8j2HG6d78BXbNfWk9tIvQhQcXE2H9YEixeQpfrMQ J/7Ch0/mrRiZuFlxgjCRwp/yrM0rJP4297igzNQgWYfpNQj7dW9ps2uvtbzevnAGkVy7 DlTi42UHkJATdZSXlKJDKCMfCVVNFqX3t9WYzrjr+TvkLIHjdfeu5HibdIb2i8fYTJrx MRhg== 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=2HXOJL4mYHJDno2zOwvSVpgrfjggH1vAP5wOIAaFvVU=; b=zNMkcnkuWWnNYt9h8v2QI7t/KZEgZAHWAREqumDmpb1DgN76vrCln+iLo6ul4PZrGT 3nxHOb1xW9CHYnaI16Gbs0ZFAhtvWQwYx325hsD25DYAMqRmcz6TexHFw8BLK2dzuOir NIjL4tmRzCSWDy6tH6Nggz/BUP9oMNCkoTvSjbCaVHePnEvvQKDEMU9bF8NAYLI5Tnle 9CzUU2pbQuJwmFQQ5kRgCF5k7ezqsL4hyfuMAIX4sd6RRZzF+FxWzIO/Fa6jmEBTCO8R Y3FNG2oWSWzXc7E3gjIVNp2C5ld2hyRAdudas/OapnHK7d4nmO1rWrDvfgxuG41unr92 lE9Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=GKn117jD; spf=pass (google.com: best guess record for domain of linux-media-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-media-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 u9si5150827plz.497.2017.12.01.07.08.18; Fri, 01 Dec 2017 07:08:18 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-media-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=GKn117jD; spf=pass (google.com: best guess record for domain of linux-media-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-media-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 S1752604AbdLAPIR (ORCPT + 4 others); Fri, 1 Dec 2017 10:08:17 -0500 Received: from mail-wr0-f196.google.com ([209.85.128.196]:35324 "EHLO mail-wr0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751031AbdLAPIQ (ORCPT ); Fri, 1 Dec 2017 10:08:16 -0500 Received: by mail-wr0-f196.google.com with SMTP id g53so10459233wra.2 for ; Fri, 01 Dec 2017 07:08:15 -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=2HXOJL4mYHJDno2zOwvSVpgrfjggH1vAP5wOIAaFvVU=; b=GKn117jDRZOFZ6UYNtiDI9yFQjSkHR8gJEIvWPCB9Qii545RWL6asizwi8QJeV5LQ2 siCoPk9HjwZp59nTwUqO+GWjQ6Z6Jig0e6//BxeZutyq/Tj6uLL1gVz9PaiD0JmaPft7 fuLAONpVdLzdcFJbiEWals8Hdv1y0B/3J+FFs= 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=2HXOJL4mYHJDno2zOwvSVpgrfjggH1vAP5wOIAaFvVU=; b=IdSq5MkYtzYwESPmcs+OWZxyj1o7V+fk+tJLO3trZBkjS7M8H8STmIZ2X2vOGi14P9 0clK5oCeYw0zYhdmKHdxjTpiD9x4ZL8NWsVRfbOes8fgdQqpQif6W0+Z6iHj0KE/wvLi rL4eyhGJh+NTgmNVLodaUn61vxjZTqkXFc0wljgV9YYHE11Hlhz2msRwesC2Wtlymd06 Ep/cFjMECqBlxvukKFguf+bluS2TX9/VaBscAJdOrd/3L65scEwbB4DCEYYGJm6yygHe wKW0s42KFU2JaqmUE2k8rBaspeCPpNnm2iUHu2o4JGN2Z/Io/6RAU8GxqJOYutmLDrMu PMDg== X-Gm-Message-State: AJaThX5e1pI8ut3y7AfA5qqKbF3gWy2v9UO7iB18x8EvPw2ATTRATf3H mAEjD6HIQcjTlPda5qyeQnZ/iA== X-Received: by 10.223.158.136 with SMTP id a8mr5621104wrf.47.1512140894985; Fri, 01 Dec 2017 07:08:14 -0800 (PST) Received: from localhost.localdomain ([37.157.136.206]) by smtp.gmail.com with ESMTPSA id 141sm1362811wmt.30.2017.12.01.07.08.13 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 01 Dec 2017 07:08:14 -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 v2] venus: venc: set correctly GOP size and number of B-frames Date: Fri, 1 Dec 2017 17:08:01 +0200 Message-Id: <20171201150801.2934-1-stanimir.varbanov@linaro.org> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171129132522.9140-2-stanimir.varbanov@linaro.org> References: <20171129132522.9140-2-stanimir.varbanov@linaro.org> Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@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 --- Drop usage of do_div to avoid compiler warnings on 32bit systems. drivers/media/platform/qcom/venus/venc.c | 15 ++++--- drivers/media/platform/qcom/venus/venc_ctrls.c | 59 +++++++++++++++++++++++++- 2 files changed, 68 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..8dbb32ebae89 100644 --- a/drivers/media/platform/qcom/venus/venc_ctrls.c +++ b/drivers/media/platform/qcom/venus/venc_ctrls.c @@ -30,10 +30,57 @@ #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 / 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 +149,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 +166,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;