From nobody Sat Jul 25 18:54:00 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 957FD30675C for ; Tue, 14 Jul 2026 19:00:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784055669; cv=none; b=akPqF+9hF7A56C7JRPmWqnL1W5gghsNlMTFYoA7DGPKylA7INtTUALETvpf6QissCX2zZbW6X9pXQLHqULa2x+w+fBOUxQSeP8xVFW5VO1q4aKl/Lt2fI0PbU9wpwLxoTBubAD0DpXMHrr7Esep0C/8/tTIoMZKofohFz9ytDrA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784055669; c=relaxed/simple; bh=7GK9DDlQMpT8QfDTHGaKj8I2AooJphTa7MXU9UGm/CY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ie5tkpaMb2qu5seHhWBp8aVsbeJhLRUyjoyqjYDSKXFfsOv/Rso8maxeVZba3gqoXaV091UGruyGY0LLZJO8z+l6l6QJTZEA294P3u2UaadiI0Q8t5+hFJjC6xzBXD3NfP/TjkbPVCDds7u3kzpXs/+STL9gsJndd9Kdek+SdaU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=ajxEi+LR; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=XWvjZmBY; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="ajxEi+LR"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="XWvjZmBY" Received: from pps.filterd (m0279862.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 66EIwEs31267106 for ; Tue, 14 Jul 2026 19:00:32 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= 88t5Q1rCrRBovk001PxYQwOFDJ/w1W3H4voGdGdGz1Y=; b=ajxEi+LRyXllk3mR fpOeC2RAeYOad0K9GUVP/LvyIycqMmb5cw6qFmX4MxwRN+iNctrehLAvighMW9Du gU0P5pHj0p16sVolAonr2f3gAwYlCfmLy3M3zCKhmB90bDUk9P9ZHvEZWBZD8rap JCJv5NaOAs24tYqZzxnWIZEvYk988+35pR3CzBN0HgfSY+GRJPz/RSECPSSMfavZ cry0E+ogKB8PJ5QXE3sPyxcf0hy2O1m6E6TLaTYhPhBirLKaHoiiDCqIQ+5zb3sv EFiCtDXWuCzoYK2nSLEFz3LEe1rUpZypG7mJl5+NDCrXk9xEEHoDIurAeCnhIWIU o03v4g== Received: from mail-pj1-f71.google.com (mail-pj1-f71.google.com [209.85.216.71]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4fdnp0hfax-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 14 Jul 2026 19:00:31 +0000 (GMT) Received: by mail-pj1-f71.google.com with SMTP id 98e67ed59e1d1-38dc0eee75dso1114198a91.0 for ; Tue, 14 Jul 2026 12:00:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1784055631; x=1784660431; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=88t5Q1rCrRBovk001PxYQwOFDJ/w1W3H4voGdGdGz1Y=; b=XWvjZmBYWqw0NIgzT43Y3TssVzOeCWpf1fw/aM7Ba38vo+X5n7K5r4kNDlJN9xAhU+ aJfqTsz/rO9lH38DPnnmzaLyyafKhGJGJUaMI5Mk5/HG55Mk0O8yA+qqFZ9G0vHYEPvE t0mncUEl7N8S6qIKDOfPGsozjjrZx0RHvHtqgG1idgomyXOEK9Kqm0OyrANfnkyRiH9d V++VsvFbmc70H6RjCAd3AmJSCCXkQv8NZYqD0a2zys87VWOZWfbSmpblAnmQ2DPlWC+q 8a+Oe5IKyg3YGZZyFCcjpIpQoq4MeeW5iMgudkX9sDJDKPoYnp132yTAMbWCeJoEEdIr i3vg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784055631; x=1784660431; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=88t5Q1rCrRBovk001PxYQwOFDJ/w1W3H4voGdGdGz1Y=; b=cSdxg9aRfJzO78CNmlbZqMPYN4M4AkldjTrU86gtY23LeZ9lw+eC3ZwFcfPT5YSJIV LuY1Y9uwHq19diMYY1N4MtnMKHFZMvA1DrpiZayNVVbtSbyeDPvkPpnTQlVG1PeAnwuW nXX5CvkcnUECYwENEL3dxIZG/9L1NVhkiS3kKTVZpyOwyHfFGP+B+O9J4GMPr9nlrz5U F2BgCkbY+S8U00nuspCZvE14sIL/kjEwvrrVID9behkheu34DM0C/+lMo0vfjKTtJ89Z 5nm4KyzB8jNYIsQ+UrXgNqdSRRnEHpYKk8jrihasq31WyClnT+smZnapKwaZEV2SyZpK IoVA== X-Forwarded-Encrypted: i=1; AHgh+Rr122Kh/h1UxGrrBN65YjzsrRXAVFCaFYvkEHM8rSd3PiMu/t9CdncO6LBSdSsOrHboXDWtbqvfY6hw7Fs=@vger.kernel.org X-Gm-Message-State: AOJu0YxmXTUgIQrxy/d34C6ey+JXVWwV8HaCM7uWkBz8Ncp4Y5zOaJGi j7BIZ+B/KsF7UdrlCDiui8luaWPX4c7pia5/nF5gscx5XEttqTwsd8ysDHosLi2HmheTEXsiqnt 1mtWnzk37BiexiIJmsmQUxoP58RwI0gc27J+ItSTECf5eIX8vDzuGGMXRiF2UUctHqjQ= X-Gm-Gg: AfdE7clr2aLNe5c7DYVLu7Q94Flz77fw+wwaOQFLq+09TZksnhFAnk5+HZU7hWhtRRx s9vsFiewFyQtgy1uiAxPym1vIZ/zJP6z1rxfMNOnOfhoKAm6nItgW1ZPdN9ZB89QJqTZXYDOoNi K10frRzq92mZk6rPXGlSFcLNa9w8JYoTdbokuLTIs5zcB9sFZOXTrZFthRoyMDJCwVwsK8Fko7/ sfPUpuSaEnDiW+gcXCHQsIANgdEEWBBo2GExtk9R/E1C1MmSKU4qasINnBDl13QSm1Uzb8/NbT7 kGE4nwO9iOGsAdl6QtJu0GP5D0TczL3tQtJL+GIn5ydCheyCWOVDszEZyPS0+d8vqV6EEOtp+Is n4r72rA7jyM/jCgTckaaSf/bZuKfwDXZQVmCMpf7mg9UMk1eum7wANkUUcEJGdYf0zJ0z0G8= X-Received: by 2002:a17:90b:4c0f:b0:37d:f70f:fbf8 with SMTP id 98e67ed59e1d1-38dc76069b8mr9790212a91.0.1784055631073; Tue, 14 Jul 2026 12:00:31 -0700 (PDT) X-Received: by 2002:a17:90b:4c0f:b0:37d:f70f:fbf8 with SMTP id 98e67ed59e1d1-38dc76069b8mr9790176a91.0.1784055630350; Tue, 14 Jul 2026 12:00:30 -0700 (PDT) Received: from gu-dmadival-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-3119d5cf176sm56634528eec.12.2026.07.14.12.00.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Jul 2026 12:00:30 -0700 (PDT) From: Deepa Guthyappa Madivalara Date: Tue, 14 Jul 2026 12:00:25 -0700 Subject: [PATCH v2 1/3] media: uapi: Introduce new control for video encoder ROI Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260714-enc_roi_enable-v2-1-63683f9dbcef@oss.qualcomm.com> References: <20260714-enc_roi_enable-v2-0-63683f9dbcef@oss.qualcomm.com> In-Reply-To: <20260714-enc_roi_enable-v2-0-63683f9dbcef@oss.qualcomm.com> To: Mauro Carvalho Chehab , Vikash Garodia , Dikshita Agarwal , Abhinav Kumar , Bryan O'Donoghue Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, Deepa Guthyappa Madivalara , kernel test robot X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1784055628; l=7340; i=deepa.madivalara@oss.qualcomm.com; s=20250814; h=from:subject:message-id; bh=7GK9DDlQMpT8QfDTHGaKj8I2AooJphTa7MXU9UGm/CY=; b=7dvywaOemnD8FH1LcfJy29+t4Ch1JXP8Jy1FuXpWHl+ATOsyXIX1JoF6b4N1YsfBlTqZR9lcG z/0HxHMeRcXCfwmUfadSJQwVg0qzQIdXC0SHpNeXwOgEsXRSy4b75iF X-Developer-Key: i=deepa.madivalara@oss.qualcomm.com; a=ed25519; pk=MOEXgyokievn+bgpHdS6Ixh/KQYyS90z2mqIbQ822FQ= X-Proofpoint-Spam-Info: AW1haW4tMjYwNzE0MDE5NiBTYWx0ZWRfX1lsisofVBXva bpCGyQVb+dBgPMvhLPHn4juqS9EJjvGmR1Vu0qIPmAeqdnn0HAqjaGHpSeFiAjxaFLBkFEpgZnS UYVpR/13g6QrGU/zJtsF4ZLd182/otk= X-Proofpoint-GUID: 6E3ffQVciFJ8NcgSa2kwNmpMS1EvVxDb X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzE0MDE5NiBTYWx0ZWRfXwimxJAAz42Ry DSvCsjAU2R87LGF6ozzMQ4TQucDOKHvaQQy+jcgUaDvY8ZhjTUitt1lvrmeGqQNQuWjhi09fMQn W+cALxlpTEuVW+SzoaYYzuZvV2zI0oYW75Lss2jrgy8O4XAIbtoDG40+jl4Si+tPwHF8Sf3vbFf XGMRajV9iLkzaJvlzKpntH6BBPm9jXwAsDeaai8cCUCYZEP1LYW5Ggpti/prEPFo9pLniIncP9S MoQpP+aGz8MdOPrtUlrQKp/dtZ+P5QcFtY+6EvCTF+zZPoU7wDeiLKgRQbCXUban9FazUIVlqST MM4ZAw97uuq0Z3QsJ6mMPqa2D+EBWWCrLXAMQa+BOQJOemC9Gy12AcdKy1E81runzGQoKlOS0+O P+4p5ojzGraD9CLzBgB6UcUwgQJ87hTJWSJtfkJzp86vsFP+KgK5G4DybJykLKwk41DGPIK2nLy a4vKhaM/T4zpu144NGg== X-Authority-Analysis: v=2.4 cv=FtM1OWrq c=1 sm=1 tr=0 ts=6a56874f cx=c_pps a=UNFcQwm+pnOIJct1K4W+Mw==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=IkcTkHD0fZMA:10 a=RAioF0-LDSMA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_K5XuSEh1TEqbUxoQ0s3:22 a=EUspDBNiAAAA:8 a=o2p6THidDhOa5OcZzacA:9 a=QEXdDO2ut3YA:10 a=uKXjsCUrEbL0IQVhDsJ9:22 X-Proofpoint-ORIG-GUID: 6E3ffQVciFJ8NcgSa2kwNmpMS1EvVxDb X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-07-14_05,2026-07-14_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 adultscore=0 priorityscore=1501 bulkscore=0 phishscore=0 clxscore=1015 impostorscore=0 spamscore=0 malwarescore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607140196 Add custom control, V4L2_CID_MPEG_VIDEO_ROI_MB_DELTA_QP for video encoder Region of Interest to allow applications to specify different quality levels for specific regions in video frames. Define V4L2_CID_MPEG_VIDEO_ROI_MB_SIZE to retrieve supported MB size based on codec from the hardware encoder and set the corresponding ROI MB delta_qp map that adjusts quantization relative to the frame QP's base value. This enables use cases like prioritizing quality for faces in video conferencing or important objects in surveillance footage while reducing bitrate for less critical areas. Signed-off-by: Deepa Guthyappa Madivalara --- Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst | 14 ++++++++++= ++++ .../userspace-api/media/v4l/videodev2.h.rst.exceptions | 1 + .../userspace-api/media/v4l/vidioc-g-ext-ctrls.rst | 4 ++++ Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst | 6 ++++++ include/media/v4l2-ctrls.h | 1 + include/uapi/linux/v4l2-controls.h | 2 ++ include/uapi/linux/videodev2.h | 3 +++ 7 files changed, 31 insertions(+) diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst b/Do= cumentation/userspace-api/media/v4l/ext-ctrls-codec.rst index ab865a1a6ba929f1725ce2ab0fd3aeee4a69329a..1995e7335fb29611151c61561df= 577f2bdac7a48 100644 --- a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst @@ -1674,6 +1674,20 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type - Codecs need to always use the specified range, rather then a HW custom= range. Applicable to encoders =20 +``V4L2_CID_MPEG_VIDEO_ROI_MB_DELTA_QP (integer)`` + This custom control is used to set ROI MB map delta_Qp for whole frame. + The frame is divided into grid with MB Size returned from querying + V4L2_CID_MPEG_VIDEO_ROI_MB_SIZE. Each block is configured with delta_Qp + in raster order. The valid range for delta_Qp is encoder dependent. + Applicable to encoders. + +``V4L2_CID_MPEG_VIDEO_ROI_MB_SIZE (integer)`` + This read-only control returns the MB Size for ROI MB delta_Qp map. + Its valid range depends on encoder supported codec format. + Example: For H.264, 16 is returned for 16x16 MB size. + For HEVC, 32 is returned for 32x32 MB size. + Depending on the size returned, delta_Qp Map is set to the encoder. + .. raw:: latex =20 \normalsize diff --git a/Documentation/userspace-api/media/v4l/videodev2.h.rst.exceptio= ns b/Documentation/userspace-api/media/v4l/videodev2.h.rst.exceptions index 6182b4e2d2ee002c0d3562e1cc3bc2fd9c4286d6..b036ed3ec2f0744175cad1cbc4e= 73fe828e0c955 100644 --- a/Documentation/userspace-api/media/v4l/videodev2.h.rst.exceptions +++ b/Documentation/userspace-api/media/v4l/videodev2.h.rst.exceptions @@ -141,6 +141,7 @@ replace symbol V4L2_CTRL_TYPE_STRING :c:type:`V4L.v4l2_= ctrl_type` replace symbol V4L2_CTRL_TYPE_U16 :c:type:`V4L.v4l2_ctrl_type` replace symbol V4L2_CTRL_TYPE_U32 :c:type:`V4L.v4l2_ctrl_type` replace symbol V4L2_CTRL_TYPE_U8 :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_S8 :c:type:`V4L.v4l2_ctrl_type` replace symbol V4L2_CTRL_TYPE_MPEG2_SEQUENCE :c:type:`V4L.v4l2_ctrl_type` replace symbol V4L2_CTRL_TYPE_MPEG2_PICTURE :c:type:`V4L.v4l2_ctrl_type` replace symbol V4L2_CTRL_TYPE_MPEG2_QUANTISATION :c:type:`V4L.v4l2_ctrl_ty= pe` diff --git a/Documentation/userspace-api/media/v4l/vidioc-g-ext-ctrls.rst b= /Documentation/userspace-api/media/v4l/vidioc-g-ext-ctrls.rst index b8698b85bd808979fc590715125f689880e5a30e..8d5eec357509700c9a582b98c14= 843bb5e483be0 100644 --- a/Documentation/userspace-api/media/v4l/vidioc-g-ext-ctrls.rst +++ b/Documentation/userspace-api/media/v4l/vidioc-g-ext-ctrls.rst @@ -185,6 +185,10 @@ still cause this situation. - ``p_u32`` - A pointer to a matrix control of unsigned 32-bit values. Valid if this control is of type ``V4L2_CTRL_TYPE_U32``. + * - __s8 * + - ``p_s8`` + - A pointer to a matrix control of signed 8-bit values. Valid if + this control is of type ``V4L2_CTRL_TYPE_S8``. * - __s32 * - ``p_s32`` - A pointer to a matrix control of signed 32-bit values. Valid if diff --git a/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst b/D= ocumentation/userspace-api/media/v4l/vidioc-queryctrl.rst index 82c8b52e771ce9301491b3f752e501a8fe7e2434..57e1652ae72e0324742142446ac= f32a16b94941c 100644 --- a/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst +++ b/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst @@ -425,6 +425,12 @@ See also the examples in :ref:`control`. - any - An unsigned 32-bit valued control ranging from minimum to maximum inclusive. The step value indicates the increment between values. + * - ``V4L2_CTRL_TYPE_S8`` + - any + - any + - any + - A signed 8-bit valued control ranging from minimum to maximum + inclusive. The step value indicates the increment between values. * - ``V4L2_CTRL_TYPE_MPEG2_QUANTISATION`` - n/a - n/a diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h index 327976b14d50b73a631e4d2ed95d9f4d146c45ab..a1806ddbc797efa52e83cd3f685= ef70d5b5483d2 100644 --- a/include/media/v4l2-ctrls.h +++ b/include/media/v4l2-ctrls.h @@ -64,6 +64,7 @@ union v4l2_ctrl_ptr { s32 *p_s32; s64 *p_s64; u8 *p_u8; + s8 *p_s8; u16 *p_u16; u32 *p_u32; char *p_char; diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-c= ontrols.h index affec0ab4781507be761cb791ff737460acf9cb7..00a2c48630bd198faa9a2b833a9= aa346d8357555 100644 --- a/include/uapi/linux/v4l2-controls.h +++ b/include/uapi/linux/v4l2-controls.h @@ -920,6 +920,8 @@ enum v4l2_mpeg_video_av1_level { }; =20 #define V4L2_CID_MPEG_VIDEO_AVERAGE_QP (V4L2_CID_CODEC_BASE + 657) +#define V4L2_CID_MPEG_VIDEO_ROI_MB_DELTA_QP (V4L2_CID_CODEC_BASE + 658) +#define V4L2_CID_MPEG_VIDEO_ROI_MB_SIZE (V4L2_CID_CODEC_BASE + 659) =20 /* MPEG-class control IDs specific to the CX2341x driver as defined by V4= L2 */ #define V4L2_CID_CODEC_CX2341X_BASE (V4L2_CTRL_CLASS_CODEC | 0x1000) diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h index eda4492e40dc14a90a230601d8e23b0e13845d34..1e307781645543960e4b73ba46f= df83279fda4dd 100644 --- a/include/uapi/linux/videodev2.h +++ b/include/uapi/linux/videodev2.h @@ -1880,6 +1880,7 @@ struct v4l2_ext_control { __s64 value64; char __user *string; __u8 __user *p_u8; + __s8 __user *p_s8; __u16 __user *p_u16; __u32 __user *p_u32; __s32 __user *p_s32; @@ -1957,6 +1958,7 @@ enum v4l2_ctrl_type { V4L2_CTRL_TYPE_U8 =3D 0x0100, V4L2_CTRL_TYPE_U16 =3D 0x0101, V4L2_CTRL_TYPE_U32 =3D 0x0102, + V4L2_CTRL_TYPE_S8 =3D 0x0103, V4L2_CTRL_TYPE_AREA =3D 0x0106, V4L2_CTRL_TYPE_RECT =3D 0x0107, =20 @@ -1993,6 +1995,7 @@ enum v4l2_ctrl_type { V4L2_CTRL_TYPE_AV1_TILE_GROUP_ENTRY =3D 0x281, V4L2_CTRL_TYPE_AV1_FRAME =3D 0x282, V4L2_CTRL_TYPE_AV1_FILM_GRAIN =3D 0x283, + }; =20 /* Used in the VIDIOC_QUERYCTRL ioctl for querying controls */ --=20 2.34.1 From nobody Sat Jul 25 18:54:00 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 73785353A9D for ; Tue, 14 Jul 2026 19:00:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784055662; cv=none; b=m8VRTqGyi1ot/FAObrc/WW154bv1gSkPmwXpOe/xnR+c6l/YJEiB/ZbkGNMA0E9xfb5EzO06wBDB6WTklyfuAKNGvPP6AyDbZEATBX/rdz7uZNxpc5Myh+ud3Dfu/+dtAZt0L1qsqx9md6nUx4kG3ImYiT8leAuXCZ7I22rdJgg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784055662; c=relaxed/simple; bh=Vs+Xz11NwshWpusj/GLSlzFZoBVvFw1FfW1E2XVtmFM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=LnEcL/V+rkx3W+BCFG2r6sHolM9+KStplG+WkENOEHH1wAkBYSEQuF1WsL6FGGHby3/zkFXeywnGhvUKYP12or9a1/D7Us5KV+wy1Q/+bc293kf79PCJGiazZPJhl4i0bp0DwstecbOVEdrjObOM+cQOCJ/ePy/ckPzScLhvJkY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=ntLDKs2f; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=P05NHPSe; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="ntLDKs2f"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="P05NHPSe" Received: from pps.filterd (m0279862.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 66EIwLs61267254 for ; Tue, 14 Jul 2026 19:00:32 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= VuN2KvyH7xNc5tPonuLvz3YrBSAEUeGAvGNJm5LjkOI=; b=ntLDKs2fRXparKR2 TbBIBJctpv0kyLtpgdMby49/G1OHbCsXhpiXD3tj0/+MDlYFU/c0+KvnoILi+lwM xtn6JrEz25ZzgoyDfkQtWKhEqsC3jcmNzDSovZsVc/yiK5ns8KIquRbFutWZBwRX TR+l4cexxs5BOUuKIuxOnPuTY5vuxtQJzkjkvY14uyfBXt7VKvrZiWgdE2gONWA9 qThATKQT3nFbxqZ7KuA4jOf1RoC1jhuSILH1B8NMjCusrVHVNig9R9IyavdyfV70 8j7oBmcYK/KlNyyW554BBDbYNV712rXoLHGdnJKnVR3D6by6lXx67HsIQ5hWWqhe 1DCMbw== Received: from mail-pj1-f72.google.com (mail-pj1-f72.google.com [209.85.216.72]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4fdnp0hfb3-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 14 Jul 2026 19:00:32 +0000 (GMT) Received: by mail-pj1-f72.google.com with SMTP id 98e67ed59e1d1-382befb9555so1315290a91.1 for ; Tue, 14 Jul 2026 12:00:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1784055632; x=1784660432; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=VuN2KvyH7xNc5tPonuLvz3YrBSAEUeGAvGNJm5LjkOI=; b=P05NHPSercUg6NK9mWYMPDMd444i3mRPu6A+eZprsaNH4IL+AgaRR6H78hWS1WGNvN 4yuy4aXndr+QM0FmEcjShzSn7IxK6eBzc+Gp6jaXLqjLLK34Uf98S1SURimx2zSmkZAd VGG5Jl2l9+Plf21MMYFJuJwQBT6xqzO+lycvaXuSeCmqw3FBnU7d0KSyMKWSynIEwamj OF8o5q00Vhl3+EXlPg8zM7paYbNjUyW6kGEq8LiKWhE9OYpwPXO01zwV8VNnZiywW3Py hKrCzsX6Qk/8+CuRl62JNVdBiKzqcy89exx1KH47sg+01T2zXMjpSgIX1XG1Lwfe4edt kU4A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784055632; x=1784660432; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=VuN2KvyH7xNc5tPonuLvz3YrBSAEUeGAvGNJm5LjkOI=; b=EYdp+D2YSoHoLUkywOvSh9PzB2CHJzZYl6lHw2VLYEinV41+hRlKEWIcYedFA77msR qqEyiQxozOTGFH91Vgnb5IezqsAEMjaLphkjvCd81c52h+KituWFBW/SPt8b2EYTFWJn kW9y05SrY6/OmI9QGTgzlAf0us1hNJVtTTNmbYWpt1L0+U1gkhRrslSUGyqcJmBg2ZMC nGJ7yYjdGQQ7pwl9l97dN1edANUQdnq+h4bE2bRQ4A/ZvdYuy8vIDfEx8RLDcU3QlGhF +0DXifnVsPjKc+OTemQvEQgoLUobmv7L1ijK8r5dkqokG+O9uQNIWoBHvbmoAxv0jSal HcHA== X-Forwarded-Encrypted: i=1; AHgh+RoG0BrNwuhcT3rJZfIZtfC2/QATB6dNCV6846pPcGANpE+3ni9ukJ62mC5ckLGOKe6gUzVxMZVlGuvUMiY=@vger.kernel.org X-Gm-Message-State: AOJu0YwG2yqe4RyDndB5ZFDWuNkoWfhfJ20PhbOGYl/0tnYO/76XBnaq svCRE1MW2ElVzmHTZhyFgeOr4yWSyvloH4iTsjolgKkRdYQqbXeCZSnhlxeFFPVkecV9RHxq9Xe KkIkMnHHSLz3ZnCF+Rbq/j1UeqLKx1sRouQIXXGgLPKgvcH3viVT/zM5gXejUjgiXa30= X-Gm-Gg: AfdE7ckLFynFarwGlBvDyvkSgbDQGpV0ep4hyqK30Dmpqx/Qb8dUusIo2zmI+WNi4Vl QawHDymiuGTxHVy4+FZwYNxPYjO+3z5yY3k76cpT3d5F7zsKaXpu1Gnbq7jelKRF+cXLgcg7Q0w VdOaKH654Hmk7kliF9rjqWBgJhHSqoqFimJ4kmys5vegLB+MOo+5rhYZpLJlhq1dBg1IRbxjatF vGCdl+0/6hw/PG5c9tObnqkSeXbwFVJDQDHNBAOFVbxO/RLzyVHpJtJgPIG1vd6+K7dWfxgQnLt 4toc2TnOuLKUqgZoAs6ZuqIucWYHA03CFA9IEY4VNUMf/5VwXTzZ51o9S+BURqKReHO3OtsMjvn XOiy0YU4Tir044nv2RL3EFgldWtn997Oi/Y9OK7OOe5bQenpBcAY6yX12k1OaLwkmXFkubEU= X-Received: by 2002:a17:90b:2dc1:b0:37f:e7e7:ad1 with SMTP id 98e67ed59e1d1-38dc7c0eb95mr10610100a91.5.1784055631861; Tue, 14 Jul 2026 12:00:31 -0700 (PDT) X-Received: by 2002:a17:90b:2dc1:b0:37f:e7e7:ad1 with SMTP id 98e67ed59e1d1-38dc7c0eb95mr10610063a91.5.1784055631237; Tue, 14 Jul 2026 12:00:31 -0700 (PDT) Received: from gu-dmadival-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-3119d5cf176sm56634528eec.12.2026.07.14.12.00.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Jul 2026 12:00:30 -0700 (PDT) From: Deepa Guthyappa Madivalara Date: Tue, 14 Jul 2026 12:00:26 -0700 Subject: [PATCH v2 2/3] media: v4l2-core: Add support for video encoder ROI control Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260714-enc_roi_enable-v2-2-63683f9dbcef@oss.qualcomm.com> References: <20260714-enc_roi_enable-v2-0-63683f9dbcef@oss.qualcomm.com> In-Reply-To: <20260714-enc_roi_enable-v2-0-63683f9dbcef@oss.qualcomm.com> To: Mauro Carvalho Chehab , Vikash Garodia , Dikshita Agarwal , Abhinav Kumar , Bryan O'Donoghue Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, Deepa Guthyappa Madivalara , kernel test robot X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1784055629; l=6648; i=deepa.madivalara@oss.qualcomm.com; s=20250814; h=from:subject:message-id; bh=Vs+Xz11NwshWpusj/GLSlzFZoBVvFw1FfW1E2XVtmFM=; b=w1bKnZDnzQRaC5KmOqiT8LaQarRRPRjbcH6pbgtdj6PiiWVO/Og/G0vATKAZQDplea0EOD2+a UGu3NhW5DdvAx85/nWUrf5NPqESCUIbLN3p9NGPsbB/3p/yWSICBX2R X-Developer-Key: i=deepa.madivalara@oss.qualcomm.com; a=ed25519; pk=MOEXgyokievn+bgpHdS6Ixh/KQYyS90z2mqIbQ822FQ= X-Proofpoint-Spam-Info: AW1haW4tMjYwNzE0MDE5NiBTYWx0ZWRfX+1+mTUNN8Kj/ K9G9LZPWclKhmLR2HiZwwmnxtAOCgp63K09nzuQ0HAs2qxVVtwsG/3VDd9DhVpXj4/ryqSSzjAs brABVKwatfQrHArmsSzAX9eJrZPcEMs= X-Proofpoint-GUID: 3gprA85-bRW1TIh3tikCYbiUzpK8iUDy X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzE0MDE5NiBTYWx0ZWRfX5xdJ8GeNAqoH jJ33pqd7noC3SHwdrYOaDF2lyNxkqpbHdAun/RTEptZIyo6V0XnivljRYq/II8Gg5y9eCLfqQ8/ c98Z/VqDRxMImMzf+PotoWlU5KyLJfb/tixss94Q6Q8dU/51xMrtvLN+VyoTIGoh95wZ3d+OS+D P9Q8Lg2Ooqqoo/bhL+ndHUiyPP4osqqqh/KvbuekUmzckNTFWdEE+Easml9ZeYTo5FB70OT8wj0 A24fIuJUi1jYWmRZ5k3ney6V4hu0oVx1Rs2OhsJ3czq42EmLAKAT1culr08o2WdgHeMaaGaJUqV RQhoYTCUDuwgZrmAUwUr7NoOHTIUl+sqjUIWnGPYu/B1u+K3JTvlaIx+ls3h5ZazWo6UCL4HTWc PO3KiBSfsbAT2NC7rsLMnO1OtNbfXpvWlf5MkdtF/F7kXjlShUp+rWChrBg77c34DBek/fQmj+U 2xty0/pKHXe+hrq1hHQ== X-Authority-Analysis: v=2.4 cv=FtM1OWrq c=1 sm=1 tr=0 ts=6a568750 cx=c_pps a=RP+M6JBNLl+fLTcSJhASfg==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=IkcTkHD0fZMA:10 a=RAioF0-LDSMA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_K5XuSEh1TEqbUxoQ0s3:22 a=EUspDBNiAAAA:8 a=9XNArsbAKfxwOWEdJiAA:9 a=QEXdDO2ut3YA:10 a=iS9zxrgQBfv6-_F4QbHw:22 X-Proofpoint-ORIG-GUID: 3gprA85-bRW1TIh3tikCYbiUzpK8iUDy X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-07-14_05,2026-07-14_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 adultscore=0 priorityscore=1501 bulkscore=0 phishscore=0 clxscore=1015 impostorscore=0 spamscore=0 malwarescore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607140196 Add necessary support for controls V4L2_CID_MPEG_VIDEO_ROI_MB_DELTA_QP and V4L2_CID_MPEG_VIDEO_ROI_MB_SIZE. Signed-off-by: Deepa Guthyappa Madivalara --- drivers/media/v4l2-core/v4l2-ctrls-api.c | 1 + drivers/media/v4l2-core/v4l2-ctrls-core.c | 40 +++++++++++++++++++++++++++= ++-- drivers/media/v4l2-core/v4l2-ctrls-defs.c | 10 ++++++++ include/media/v4l2-ctrls.h | 3 ++- 4 files changed, 51 insertions(+), 3 deletions(-) diff --git a/drivers/media/v4l2-core/v4l2-ctrls-api.c b/drivers/media/v4l2-= core/v4l2-ctrls-api.c index 93d8d4012d0f4fef004e417d0aee2ae44b1b30bd..7d41cfd7378baaa929d4da0266c= 45f731bb54285 100644 --- a/drivers/media/v4l2-core/v4l2-ctrls-api.c +++ b/drivers/media/v4l2-core/v4l2-ctrls-api.c @@ -980,6 +980,7 @@ int __v4l2_ctrl_modify_range(struct v4l2_ctrl *ctrl, case V4L2_CTRL_TYPE_U8: case V4L2_CTRL_TYPE_U16: case V4L2_CTRL_TYPE_U32: + case V4L2_CTRL_TYPE_S8: if (ctrl->is_array) return -EINVAL; ret =3D check_range(ctrl->type, min, max, step, def); diff --git a/drivers/media/v4l2-core/v4l2-ctrls-core.c b/drivers/media/v4l2= -core/v4l2-ctrls-core.c index ba047d7d86010bf0cf8f8fbf2dc343883d6bdae0..15b69dce0127e7c8546c2d23ae5= 458ace10301a0 100644 --- a/drivers/media/v4l2-core/v4l2-ctrls-core.c +++ b/drivers/media/v4l2-core/v4l2-ctrls-core.c @@ -287,6 +287,14 @@ static void __v4l2_ctrl_type_op_init(const struct v4l2= _ctrl *ctrl, u32 from_idx, memset(ptr.p_u32 + from_idx, 0, elems * sizeof(u32)); } break; + case V4L2_CTRL_TYPE_S8: + if (value) { + for (i =3D from_idx; i < tot_elems; i++) + ptr.p_s8[i] =3D value; + } else { + memset(ptr.p_s8 + from_idx, 0, elems * sizeof(s8)); + } + break; default: for (i =3D from_idx; i < tot_elems; i++) { switch (which) { @@ -367,6 +375,9 @@ void v4l2_ctrl_type_op_log(const struct v4l2_ctrl *ctrl) case V4L2_CTRL_TYPE_U32: pr_cont("%u", (unsigned)*ptr.p_u32); break; + case V4L2_CTRL_TYPE_S8: + pr_cont("%d", *ptr.p_s8); + break; case V4L2_CTRL_TYPE_AREA: pr_cont("%ux%u", ptr.p_area->width, ptr.p_area->height); break; @@ -481,6 +492,21 @@ EXPORT_SYMBOL(v4l2_ctrl_type_op_log); 0; \ }) =20 +#define ROUND_TO_RANGE_SIGNED(val, offset_type, ctrl) \ +({ \ + offset_type offset; \ + if ((ctrl)->maximum >=3D 0 && \ + val >=3D (ctrl)->maximum - (s32)((ctrl)->step / 2)) \ + val =3D (ctrl)->maximum; \ + else \ + val +=3D (s32)((ctrl)->step / 2); \ + val =3D clamp_t(typeof(val), val, \ + (ctrl)->minimum, (ctrl)->maximum); \ + offset =3D (val) - (ctrl)->minimum; \ + offset =3D (ctrl)->step * (offset / (s32)(ctrl)->step); \ + val =3D (ctrl)->minimum + offset; \ +}) + /* Validate a new control */ =20 #define zero_padding(s) \ @@ -1365,6 +1391,8 @@ static int std_validate_compound(const struct v4l2_ct= rl *ctrl, u32 idx, return -EINVAL; break; =20 + case V4L2_CID_MPEG_VIDEO_ROI_MB_DELTA_QP: + break; default: return -EINVAL; } @@ -1378,6 +1406,7 @@ static int std_validate_elem(const struct v4l2_ctrl *= ctrl, u32 idx, size_t len; u64 offset; s64 val; + s32 tmp; =20 switch ((u32)ctrl->type) { case V4L2_CTRL_TYPE_INTEGER: @@ -1403,7 +1432,11 @@ static int std_validate_elem(const struct v4l2_ctrl = *ctrl, u32 idx, return ROUND_TO_RANGE(ptr.p_u16[idx], u16, ctrl); case V4L2_CTRL_TYPE_U32: return ROUND_TO_RANGE(ptr.p_u32[idx], u32, ctrl); - + case V4L2_CTRL_TYPE_S8: + tmp =3D ptr.p_s8[idx]; + ROUND_TO_RANGE_SIGNED(tmp, s32, ctrl); + ptr.p_s8[idx] =3D (s8)tmp; + return 0; case V4L2_CTRL_TYPE_BOOLEAN: ptr.p_s32[idx] =3D !!ptr.p_s32[idx]; return 0; @@ -1556,6 +1589,7 @@ void cur_to_new(struct v4l2_ctrl *ctrl) return; if (ctrl->is_dyn_array) ctrl->new_elems =3D ctrl->elems; + ptr_to_ptr(ctrl, ctrl->p_cur, ctrl->p_new, ctrl->new_elems); } =20 @@ -1998,6 +2032,9 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ct= rl_handler *hdl, case V4L2_CTRL_TYPE_U32: elem_size =3D sizeof(u32); break; + case V4L2_CTRL_TYPE_S8: + elem_size =3D sizeof(s8); + break; case V4L2_CTRL_TYPE_MPEG2_SEQUENCE: elem_size =3D sizeof(struct v4l2_ctrl_mpeg2_sequence); break; @@ -2215,7 +2252,6 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ct= rl_handler *hdl, =20 if (flags & V4L2_CTRL_FLAG_HAS_WHICH_MIN_MAX) { void *ptr =3D ctrl->p_def.p; - if (p_min.p_const) { ptr +=3D elem_size; ctrl->p_min.p =3D ptr; diff --git a/drivers/media/v4l2-core/v4l2-ctrls-defs.c b/drivers/media/v4l2= -core/v4l2-ctrls-defs.c index e062f2088490470c42d6c579ff7675be454a29b0..8f895060799ea13443143edd398= dfb97f4ba0085 100644 --- a/drivers/media/v4l2-core/v4l2-ctrls-defs.c +++ b/drivers/media/v4l2-core/v4l2-ctrls-defs.c @@ -974,6 +974,8 @@ const char *v4l2_ctrl_get_name(u32 id) case V4L2_CID_MPEG_VIDEO_AVERAGE_QP: return "Average QP Value"; case V4L2_CID_FWHT_I_FRAME_QP: return "FWHT I-Frame QP Value"; case V4L2_CID_FWHT_P_FRAME_QP: return "FWHT P-Frame QP Value"; + case V4L2_CID_MPEG_VIDEO_ROI_MB_DELTA_QP: return "Encoder ROI MB Delta Q= P"; + case V4L2_CID_MPEG_VIDEO_ROI_MB_SIZE: return "Encoder ROI MB Size"; =20 /* VPX controls */ case V4L2_CID_MPEG_VIDEO_VPX_NUM_PARTITIONS: return "VPX Number of Parti= tions"; @@ -1622,6 +1624,14 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum = v4l2_ctrl_type *type, case V4L2_CID_COLORIMETRY_HDR10_MASTERING_DISPLAY: *type =3D V4L2_CTRL_TYPE_HDR10_MASTERING_DISPLAY; break; + case V4L2_CID_MPEG_VIDEO_ROI_MB_DELTA_QP: + *type =3D V4L2_CTRL_TYPE_S8; + *flags |=3D V4L2_CTRL_FLAG_DYNAMIC_ARRAY; + break; + case V4L2_CID_MPEG_VIDEO_ROI_MB_SIZE: + *type =3D V4L2_CTRL_TYPE_U8; + *flags |=3D V4L2_CTRL_FLAG_READ_ONLY; + break; default: *type =3D V4L2_CTRL_TYPE_INTEGER; break; diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h index a1806ddbc797efa52e83cd3f685ef70d5b5483d2..9a68a3555e349f1e55aa01af5c1= 0f08201d62bae 100644 --- a/include/media/v4l2-ctrls.h +++ b/include/media/v4l2-ctrls.h @@ -27,6 +27,7 @@ struct video_device; =20 /** * union v4l2_ctrl_ptr - A pointer to a control value. + * @p_s8: Pointer to a 8-bit signed value. * @p_s32: Pointer to a 32-bit signed value. * @p_s64: Pointer to a 64-bit signed value. * @p_u8: Pointer to a 8-bit unsigned value. @@ -61,10 +62,10 @@ struct video_device; * @p_const: Pointer to a constant compound value. */ union v4l2_ctrl_ptr { + s8 *p_s8; s32 *p_s32; s64 *p_s64; u8 *p_u8; - s8 *p_s8; u16 *p_u16; u32 *p_u32; char *p_char; --=20 2.34.1 From nobody Sat Jul 25 18:54:00 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CE7493CAA41 for ; Tue, 14 Jul 2026 19:00:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784055668; cv=none; b=AKgazZk6UtpK4EEETct7cTi7F9EMC+DOrvfwNLQVXPHZ3jpXxIsT0HrN/IlbMTTBrNuicDIoKIkcRn2hjQIhx44VlkwyUqS4WR42zal8UHXLOwvRkA96iM/mmUpFqUUdPwnq8dTuCHVCP6jaBOXmjtavpA46Kx9xPR6qHd/hql0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784055668; c=relaxed/simple; bh=buk4xI+JCLuZ23C+HsYLQi0J8+zn1QOiLeR4ODO2eBc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=hRT8PMU2/ItetjUPsO5aoM/eoZEjDdEK+o6U003hmOX5pcxEnsZFbYtpio2X/hUuI40cEvi81QJtAooERYr40Jy9QzC/DNmEnTZE7xqZ+dLFrE78znxUMACNk9GbU7dfbKtoljt2bv4wSOrO66ALarOLA3yOZ+vMoqRKDk7yTV8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=XJfocCXu; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=B9KMxYH6; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="XJfocCXu"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="B9KMxYH6" Received: from pps.filterd (m0279863.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 66EIwc8v1455552 for ; Tue, 14 Jul 2026 19:00:34 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= 2/WIsoLhcv7tcYsYXMHFs/oSDYp2hT7z2bHGlAenfcs=; b=XJfocCXu8sehwSr6 ympSeHuGEd+OOJNbIr8YTIpS4rp5gDsytN2OMpcMGMq1s8Gw0bbYAHZrv0hU25+9 r0utz80z4/3bKBVZU4IauX9N7a4t2IqBBuS2FThCmbYvM1fz8qP8wKAXUIWptryO cMDnX0GVq26latOu1pzCcyOwR4HI1wqOyg0dai2Wi1ChEmd0350fvXtkjOmhasWO 3jDxRSoJgyYbUBvsrOzc1OYOUS+tP1kfOUyNFqbKuIoVL0qGRYuH1PAbwfU9ni/o ovFtzR5yDTvaKla9ib+iI0FbfWiszf/l4OuSx2biC3VT9oZgmlDQBH/O0fD7vw/G nBf5JA== Received: from mail-pj1-f71.google.com (mail-pj1-f71.google.com [209.85.216.71]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4fdmjq1r0w-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 14 Jul 2026 19:00:33 +0000 (GMT) Received: by mail-pj1-f71.google.com with SMTP id 98e67ed59e1d1-38de4c60f0eso645102a91.3 for ; Tue, 14 Jul 2026 12:00:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1784055633; x=1784660433; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=2/WIsoLhcv7tcYsYXMHFs/oSDYp2hT7z2bHGlAenfcs=; b=B9KMxYH6DhbGEBW4VdZAEc8jVlxu1pH1QH/l+a8wHISDmSq7F7PdEf2qTmqEMJFQhv n+aYgzYrPZGlj0/civTZRKXiz0/813jwFPP2kQ+H/To+HBbzaXI40rigRtFVojnl2aUw E1V56zozTxx9/RDy39wIPZyGWIpoav0L+akK4/PP6f4lutI3dYHCisa5AMdqs+m+vsEU /UlXah7JE9LBfVnwWEI2PUFKeIFy0etnU1SzedQeGGiyTMFbk7zf9dUn8QenH+t44my8 Y1NFrthviKUudFcD9WHA3pe7gWa15g85kUpghsSlUeasG0/w171ZQ2xcXXIgUtCahTQL 161w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784055633; x=1784660433; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=2/WIsoLhcv7tcYsYXMHFs/oSDYp2hT7z2bHGlAenfcs=; b=JvuuNH1ANMLYN3Qm4bP9pr2olATTYuCPIUR/ltk5fb4WbnVuvMi93Kl8iNcx/Pm3qa DFCLe1XPzH3JEdNNfgSJwG//hL7kb/w18ZXAa8aJqQMyYRwoPqys15+TCCdguMBrPEya tg71nvyiOK80FeDVTLkwyNYltW2xBuBaIrcK5i2gkQcTwXn9O4eg2sHvXzoEu83uaWZI 9l+R1eAUrZc7KbgV4OKQII4mMF/rY7GjtZ0PBIAlvMNqBCQHVvm3u+NIJsoYlp1Q7BvW 3znpJieR/YYaOpDsgu8oPsmCOvqEoN4VNu4Y1EeTerqlm0pGghP/26RQTRi/6zZb8AB6 7aGA== X-Forwarded-Encrypted: i=1; AHgh+Rr5cxz0ZfLsS4vsV+Ml8K9FrzcQW60SSWM5cxDDqbbqqzxCjTkpzbk4mS4CG2gCof2xbB+DPYxJNbF2h9w=@vger.kernel.org X-Gm-Message-State: AOJu0YyVEdIP+zd6olAU9TWHdRKJJkfcJQ7AXQLStd4NE89lhGl48GwX 4Si65us89YyX0hMagn86+J/HUS79jOLq9V2dRedLuiYrxJ95YhDdlK6t/05ltap4hcrIiXBI9nI IhGGOdjC1vA395cHCCq3zCIi+Ks0BXSCce/Z2NkUke1MaTy8lIdZanyWCHyPtlGySRco= X-Gm-Gg: AfdE7clRWzFFQIEcxaxPl62JChwnIEgJVdQUAjiomv6RVVSnrA85Am6qUzJ1dlpU60P jHaq7tuawAG0adfafb8z8vNhssMvjsr0IY1zGWVyrceKQnssbpSeIMWECXEPw8yQmS373DeV/V+ Fro09BO8oQJ5EIqicSJ1bBoUj7lBSagLyFf1jewgcaCL763O7uv1igiIMpO6x0J+ZNIVISho+WR 59CXNdOiQRd4qT7So44/+1peU6u2GUioC/uHTfToF3Qq0bhjXUKFLxtwRwmnZmjgYpVbfJ6FC+T iIz5ZWNCsUNQhgt4ZMGOa3r3IOYSYWjD+FnYOdMKxaaO7YaaZPF87iG0sk0lMEfhfHZGQq1t5rz d52pXNXbhcaWJxuQgdeDUUo5hzxmH7EIteK2Ix5gKiwB89zJg0Qi8P8ryikcAbrZ8l+NNi58= X-Received: by 2002:a17:90b:3b8d:b0:381:bcfb:e710 with SMTP id 98e67ed59e1d1-38dc7b2d49emr11824523a91.3.1784055632591; Tue, 14 Jul 2026 12:00:32 -0700 (PDT) X-Received: by 2002:a17:90b:3b8d:b0:381:bcfb:e710 with SMTP id 98e67ed59e1d1-38dc7b2d49emr11824494a91.3.1784055631994; Tue, 14 Jul 2026 12:00:31 -0700 (PDT) Received: from gu-dmadival-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-3119d5cf176sm56634528eec.12.2026.07.14.12.00.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Jul 2026 12:00:31 -0700 (PDT) From: Deepa Guthyappa Madivalara Date: Tue, 14 Jul 2026 12:00:27 -0700 Subject: [PATCH v2 3/3] media: iris: Add ROI support framework for iris video encoder Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260714-enc_roi_enable-v2-3-63683f9dbcef@oss.qualcomm.com> References: <20260714-enc_roi_enable-v2-0-63683f9dbcef@oss.qualcomm.com> In-Reply-To: <20260714-enc_roi_enable-v2-0-63683f9dbcef@oss.qualcomm.com> To: Mauro Carvalho Chehab , Vikash Garodia , Dikshita Agarwal , Abhinav Kumar , Bryan O'Donoghue Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, Deepa Guthyappa Madivalara , kernel test robot X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1784055629; l=27597; i=deepa.madivalara@oss.qualcomm.com; s=20250814; h=from:subject:message-id; bh=buk4xI+JCLuZ23C+HsYLQi0J8+zn1QOiLeR4ODO2eBc=; b=3EjZC4ymoxloW4uzyGboo24zAkt1MoDzTOZeh5WBCEf68VJrCla6/jVHnlAPPJUsYY3Um/N3i 806MYL+4G97C06ctJR+pGCCF0z4nDBSkRreNcu/WA4r5ghYhRdZHBAd X-Developer-Key: i=deepa.madivalara@oss.qualcomm.com; a=ed25519; pk=MOEXgyokievn+bgpHdS6Ixh/KQYyS90z2mqIbQ822FQ= X-Authority-Analysis: v=2.4 cv=LqmiDHdc c=1 sm=1 tr=0 ts=6a568751 cx=c_pps a=UNFcQwm+pnOIJct1K4W+Mw==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=IkcTkHD0fZMA:10 a=RAioF0-LDSMA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=yOCtJkima9RkubShWh1s:22 a=EUspDBNiAAAA:8 a=GsgF-zhxtwJLDi3U7-kA:9 a=QEXdDO2ut3YA:10 a=uKXjsCUrEbL0IQVhDsJ9:22 X-Proofpoint-GUID: cWs7WMRv2TKCj6NhVmG-HttCq5BA9ClF X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzE0MDE5NiBTYWx0ZWRfXweSuccU79Iol 3g7fhd2G3du/oTW/HfF0m3qkivgBemmgvcwf9O7gyt6kgRwf01DotDfCzMbwUUbtScILVmD/mzZ LY1d4jbQl66f13UtvYgn8PJ5qMt6YKWXgbsdqGRfK2J22jXvUtTFL9qPL5s+nB2nrC4IgvJtpUm 6u2G5rq0qIn1dxNlZ4GaHSUgmfVYHgM6PzfiocXBfHIh4JKOsPwsTPBhK92zYOAe2mdrdDzKNvM JowcDG1lmFw8X9FMglIFx18trEVOiOQFiHXcfGqDX1BrTEIHVXYB8t8t1u+t7fJG+KNuJ4vVVOe uyGQlq3MC3LzLoQI9VxZlfYHttQRYVmTqLpAks+BsrAgFMChr3py8HOpusfk0jn7Yf4zaUuNNm1 ygPMhrW81WqbOjOMgahHqhtf5GeARIWAes3yXmqtBPicBT1WMR1TTI7ckMh4i7VxZn8SX0al49f bCNdbfrPC02kihr5Agg== X-Proofpoint-Spam-Info: AW1haW4tMjYwNzE0MDE5NiBTYWx0ZWRfX4Mmqiy0e7HEz eCioFYi6Xq+IcKWAkmr5sSnXfu0ZpadrkAyJplnM2Eauhm1bPRHGx1Qbril0G28rikc6Sxo34MO OVR1imbEBOt41PgjLMKgtaJFz1e2g0Y= X-Proofpoint-ORIG-GUID: cWs7WMRv2TKCj6NhVmG-HttCq5BA9ClF X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-07-14_05,2026-07-14_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 priorityscore=1501 phishscore=0 lowpriorityscore=0 spamscore=0 bulkscore=0 clxscore=1015 adultscore=0 impostorscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607140196 Add ROI support in the iris driver, including control structures and default parameters. Extend support to set ROI parameters using custom control V4L2_CID_MPEG_VIDEO_ROI_MB_DELTA_QP. Implement internal buffer list support for BUF_ROIMB_DELTAQP that holds ROI MB based delta_qp as expected by the firmware. When an input arrives queue the corresponding ROI MB delta_qp buffer to firmware. Signed-off-by: Deepa Guthyappa Madivalara --- drivers/media/platform/qcom/iris/iris_buffer.c | 101 +++++++++++++++++= +++ drivers/media/platform/qcom/iris/iris_buffer.h | 22 +++++ drivers/media/platform/qcom/iris/iris_ctrls.c | 104 +++++++++++++++++= +++- drivers/media/platform/qcom/iris/iris_ctrls.h | 3 + drivers/media/platform/qcom/iris/iris_hfi_common.h | 1 + drivers/media/platform/qcom/iris/iris_hfi_gen2.c | 16 +++- .../platform/qcom/iris/iris_hfi_gen2_command.c | 62 ++++++++++++ .../platform/qcom/iris/iris_hfi_gen2_defines.h | 3 + .../platform/qcom/iris/iris_hfi_gen2_packet.c | 6 +- .../platform/qcom/iris/iris_hfi_gen2_packet.h | 3 + .../platform/qcom/iris/iris_hfi_gen2_response.c | 29 ++++++ .../platform/qcom/iris/iris_platform_common.h | 5 + drivers/media/platform/qcom/iris/iris_venc.c | 4 + drivers/media/platform/qcom/iris/iris_venc.h | 2 + drivers/media/platform/qcom/iris/iris_vidc.c | 2 + 15 files changed, 358 insertions(+), 5 deletions(-) diff --git a/drivers/media/platform/qcom/iris/iris_buffer.c b/drivers/media= /platform/qcom/iris/iris_buffer.c index 246ad0abbac3510113e1f760406c81b1461377a3..03dcce5c41c2901a1aab4f5e926= c5b3366924f57 100644 --- a/drivers/media/platform/qcom/iris/iris_buffer.c +++ b/drivers/media/platform/qcom/iris/iris_buffer.c @@ -5,11 +5,13 @@ =20 #include #include +#include =20 #include "iris_buffer.h" #include "iris_instance.h" #include "iris_power.h" #include "iris_vpu_buffer.h" +#include "iris_hfi_gen2_defines.h" =20 #define PIXELS_4K 4096 #define MAX_WIDTH 4096 @@ -762,6 +764,23 @@ int iris_destroy_dequeued_internal_buffers(struct iris= _inst *inst, u32 plane) return iris_destroy_internal_buffers(inst, plane, false); } =20 +int iris_destroy_roi_metadata_buffers(struct iris_inst *inst) +{ + struct iris_buffer *buf, *next; + struct iris_buffers *buffers; + int ret =3D 0; + + if (inst->domain =3D=3D ENCODER) { + buffers =3D &inst->buffers[BUF_ROIMB_DELTAQP]; + list_for_each_entry_safe(buf, next, &buffers->list, list) { + ret =3D iris_destroy_internal_buffer(inst, buf); + if (ret) + return ret; + } + } + + return ret; +} static int iris_release_internal_buffers(struct iris_inst *inst, enum iris_buffer_type buffer_type) { @@ -991,3 +1010,85 @@ int iris_vb2_buffer_done(struct iris_inst *inst, stru= ct iris_buffer *buf) =20 return 0; } + +static int iris_fill_roi_data(struct iris_inst *inst, struct iris_buffer *= buffer) +{ + s8 *p_array =3D (s8 *)inst->fw_caps[ROI_PARAMS].p_array; + u32 array_size =3D inst->fw_caps[ROI_PARAMS].elems; + struct metabuf_header *mbuf_hdr =3D buffer->kvaddr; + struct metapayload_header *mbuf_payload_hdr; + s16 *p_16; + u32 payload_offset; + + memset(mbuf_hdr, 0, sizeof(struct metabuf_header)); + mbuf_hdr->count =3D 1; + mbuf_hdr->size =3D sizeof(struct metabuf_header) + + sizeof(struct metapayload_header); + mbuf_hdr->version =3D 1 << 16; + mbuf_payload_hdr =3D (struct metapayload_header *)(mbuf_hdr + 1); + payload_offset =3D sizeof(struct metabuf_header) + + sizeof(struct metapayload_header); + + memset(mbuf_payload_hdr, 0, sizeof(struct metapayload_header)); + mbuf_payload_hdr->type =3D HFI_PROP_ROI_INFO; + mbuf_payload_hdr->size =3D array_size * 2; + mbuf_payload_hdr->version =3D 1 << 16; + mbuf_payload_hdr->offset =3D ALIGN(payload_offset, (u32)256); + mbuf_payload_hdr->flags =3D 0; + + /* Firmware expects 2bytes of delta_Qp, int16_t */ + p_16 =3D buffer->kvaddr + mbuf_payload_hdr->offset; + for (int i =3D 0; i < array_size; i++) + p_16[i] =3D p_array[i]; + + return 0; +} + +int iris_hfi_gen2_session_alloc_roi_metadata_buffer(struct iris_inst *inst) +{ + struct iris_buffers *buffers =3D &inst->buffers[BUF_ROIMB_DELTAQP]; + struct iris_core *core =3D inst->core; + struct iris_buffer *buffer, *first_buffer, *next; + bool found =3D false; + int ret =3D 0; + + if (!buffers->size) + return 0; + + list_for_each_entry_safe(buffer, next, &buffers->list, list) { + if (buffer->attr & BUF_ATTR_DEQUEUED) { + buffer->attr &=3D ~BUF_ATTR_DEQUEUED; + list_move(&buffer->list, &buffers->list); + found =3D true; + break; + } + } + if (!found) { + buffer =3D kzalloc_obj(*buffer); + if (!buffer) + return -ENOMEM; + + INIT_LIST_HEAD(&buffer->list); + buffer->type =3D BUF_ROIMB_DELTAQP; + buffer->index++; + buffer->buffer_size =3D buffers->size; + buffer->dma_attrs =3D DMA_ATTR_WRITE_COMBINE; + + buffer->kvaddr =3D dma_alloc_attrs(core->dev, buffer->buffer_size, + &buffer->device_addr, GFP_KERNEL, + buffer->dma_attrs); + + if (!buffer->kvaddr) { + kfree(buffer); + return -ENOMEM; + } + list_add(&buffer->list, &buffers->list); + } + + first_buffer =3D list_first_entry(&buffers->list, struct iris_buffer, lis= t); + ret =3D iris_fill_roi_data(inst, first_buffer); + if (ret) + return ret; + + return ret; +} diff --git a/drivers/media/platform/qcom/iris/iris_buffer.h b/drivers/media= /platform/qcom/iris/iris_buffer.h index 75bb767761824c4c02e0df9b765896cc093be333..5dc0a7f0354745fc2754eed682a= 046c2e7fe2b90 100644 --- a/drivers/media/platform/qcom/iris/iris_buffer.h +++ b/drivers/media/platform/qcom/iris/iris_buffer.h @@ -28,6 +28,7 @@ struct iris_inst; * @BUF_SCRATCH_2: buffer to store encoding context data for HW * @BUF_VPSS: buffer to store VPSS context data for HW * @BUF_PARTIAL: buffer for AV1 IBC data + * @BUF_ROIMB_DELTAQP: metadata buffer for ROI MB DeltaQp * @BUF_TYPE_MAX: max buffer types */ enum iris_buffer_type { @@ -44,6 +45,7 @@ enum iris_buffer_type { BUF_SCRATCH_2, BUF_VPSS, BUF_PARTIAL, + BUF_ROIMB_DELTAQP, BUF_TYPE_MAX, }; =20 @@ -107,6 +109,24 @@ struct iris_buffers { u32 size; }; =20 +/* Metadata buffer header */ +struct metabuf_header { + u32 count; + u32 size; + u32 version; + u32 reserved[5]; +}; + +/* Metadata buffer payload header */ +struct metapayload_header { + u32 type; + u32 size; + u32 version; + u32 offset; + u32 flags; + u32 reserved[3]; +}; + int iris_get_buffer_size(struct iris_inst *inst, enum iris_buffer_type buf= fer_type); void iris_get_internal_buffers(struct iris_inst *inst, u32 plane); int iris_create_internal_buffers(struct iris_inst *inst, u32 plane); @@ -121,5 +141,7 @@ int iris_queue_buffer(struct iris_inst *inst, struct ir= is_buffer *buf); int iris_queue_deferred_buffers(struct iris_inst *inst, enum iris_buffer_t= ype buf_type); int iris_vb2_buffer_done(struct iris_inst *inst, struct iris_buffer *buf); void iris_vb2_queue_error(struct iris_inst *inst); +int iris_hfi_gen2_session_alloc_roi_metadata_buffer(struct iris_inst *inst= ); +int iris_destroy_roi_metadata_buffers(struct iris_inst *inst); =20 #endif diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c b/drivers/media/= platform/qcom/iris/iris_ctrls.c index 10e33b8a73f60759c4f1cb17b5c95897f0e1468f..5bf1ff99e3376d89942fdd1a18e= 8552b87938496 100644 --- a/drivers/media/platform/qcom/iris/iris_ctrls.c +++ b/drivers/media/platform/qcom/iris/iris_ctrls.c @@ -154,6 +154,10 @@ static enum platform_inst_fw_cap_type iris_get_cap_id(= u32 id) return LAYER4_BITRATE_HEVC; case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L5_BR: return LAYER5_BITRATE_HEVC; + case V4L2_CID_MPEG_VIDEO_ROI_MB_DELTA_QP: + return ROI_PARAMS; + case V4L2_CID_MPEG_VIDEO_ROI_MB_SIZE: + return MB_SIZE; default: return INST_FW_CAP_MAX; } @@ -297,6 +301,10 @@ static u32 iris_get_v4l2_id(enum platform_inst_fw_cap_= type cap_id) return V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L4_BR; case LAYER5_BITRATE_HEVC: return V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L5_BR; + case ROI_PARAMS: + return V4L2_CID_MPEG_VIDEO_ROI_MB_DELTA_QP; + case MB_SIZE: + return V4L2_CID_MPEG_VIDEO_ROI_MB_SIZE; default: return 0; } @@ -323,6 +331,14 @@ static int iris_op_s_ctrl(struct v4l2_ctrl *ctrl) =20 inst->fw_caps[cap_id].value =3D ctrl->val; =20 + if (inst->fw_caps[cap_id].flags & CAP_FLAG_CUSTOM) { + if (cap_id =3D=3D ROI_PARAMS) { + inst->fw_caps[cap_id].p_array =3D + (const void *)ctrl->p_new.p; + inst->fw_caps[cap_id].elems =3D ctrl->new_elems; + } + } + if (vb2_is_streaming(q)) { if (cap[cap_id].set) cap[cap_id].set(inst, cap_id); @@ -331,8 +347,52 @@ static int iris_op_s_ctrl(struct v4l2_ctrl *ctrl) return 0; } =20 +static int iris_get_roi_mb_size(struct iris_inst *inst) +{ + return inst->codec =3D=3D V4L2_PIX_FMT_HEVC ? 32 : 16; +} + +static int iris_op_g_ctrl(struct v4l2_ctrl *ctrl) +{ + struct iris_inst *inst =3D container_of(ctrl->handler, struct iris_inst, = ctrl_handler); + enum platform_inst_fw_cap_type cap_id; + + cap_id =3D iris_get_cap_id(ctrl->id); + if (!iris_valid_cap_id(cap_id)) + return -EINVAL; + + if (cap_id =3D=3D MB_SIZE) + ctrl->val =3D iris_get_roi_mb_size(inst); + + return 0; +} + static const struct v4l2_ctrl_ops iris_ctrl_ops =3D { .s_ctrl =3D iris_op_s_ctrl, + .g_volatile_ctrl =3D iris_op_g_ctrl, +}; + +const struct v4l2_ctrl_config roi_mbqp_cfg =3D { + .ops =3D &iris_ctrl_ops, + .id =3D V4L2_CID_MPEG_VIDEO_ROI_MB_DELTA_QP, + .name =3D "Enc Mb ROI Delta QP", + .type =3D V4L2_CTRL_TYPE_S8, + .dims =3D {139264}, /* Max MBPF =3D 8192 * 4352 / 256 */ + .min =3D -31, + .max =3D 30, + .def =3D 0, + .step =3D 1, +}; + +static const struct v4l2_ctrl_config roi_mbqp_size =3D { + .ops =3D &iris_ctrl_ops, + .id =3D V4L2_CID_MPEG_VIDEO_ROI_MB_SIZE, + .name =3D "ROI Mb size", + .type =3D V4L2_CTRL_TYPE_U8, + .min =3D 16, + .max =3D 32, + .def =3D 16, + .step =3D 1, }; =20 int iris_ctrls_init(struct iris_inst *inst) @@ -357,7 +417,7 @@ int iris_ctrls_init(struct iris_inst *inst) return ret; =20 for (idx =3D 1; idx < INST_FW_CAP_MAX; idx++) { - struct v4l2_ctrl *ctrl; + struct v4l2_ctrl *ctrl =3D NULL; =20 v4l2_id =3D iris_get_v4l2_id(cap[idx].cap_id); if (!v4l2_id) @@ -375,6 +435,13 @@ int iris_ctrls_init(struct iris_inst *inst) cap[idx].max, ~(cap[idx].step_or_mask), cap[idx].value); + } else if (cap[idx].flags & CAP_FLAG_CUSTOM) { + if (cap[idx].cap_id =3D=3D ROI_PARAMS) + ctrl =3D v4l2_ctrl_new_custom(&inst->ctrl_handler, + &roi_mbqp_cfg, NULL); + if (cap[idx].cap_id =3D=3D MB_SIZE) + ctrl =3D v4l2_ctrl_new_custom(&inst->ctrl_handler, + &roi_mbqp_size, NULL); } else { ctrl =3D v4l2_ctrl_new_std(&inst->ctrl_handler, &iris_ctrl_ops, @@ -1499,3 +1566,38 @@ int iris_set_properties(struct iris_inst *inst, u32 = plane) =20 return 0; } + +int iris_set_metadata_delivery(struct iris_inst *inst, u32 plane) +{ + const struct iris_hfi_session_ops *hfi_ops =3D inst->hfi_session_ops; + int ret =3D 0; + + /*subscribe to metadata delivery only if ROI is enabled */ + if (!inst->fw_caps[ROI_PARAMS].p_array) + return ret; + + ret =3D hfi_ops->session_subscribe_metadata_delivery(inst, plane); + if (ret) + return ret; + + return ret; +} + +int iris_set_roi_params(struct iris_inst *inst, u32 plane) +{ + struct iris_buffers *buffers =3D &inst->buffers[BUF_ROIMB_DELTAQP]; + u32 metadata_header_bytes =3D 256; + u32 size =3D 0; + int ret =3D 0; + + if (!inst->fw_caps[ROI_PARAMS].p_array) + return -EINVAL; + + size =3D inst->fw_caps[ROI_PARAMS].elems * 2 + metadata_header_bytes; + buffers->size =3D ALIGN(size, 4096); + iris_hfi_gen2_session_alloc_roi_metadata_buffer(inst); + if (ret) + return ret; + + return 0; +} diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.h b/drivers/media/= platform/qcom/iris/iris_ctrls.h index 3c462ec9190be8935176b290588f224fe4f144a4..7a32fb42980617eb56ccbee730d= b053b1abf41d4 100644 --- a/drivers/media/platform/qcom/iris/iris_ctrls.h +++ b/drivers/media/platform/qcom/iris/iris_ctrls.h @@ -48,5 +48,8 @@ int iris_set_layer_count_gen1(struct iris_inst *inst, enu= m platform_inst_fw_cap_ int iris_set_layer_count_gen2(struct iris_inst *inst, enum platform_inst_f= w_cap_type cap_id); int iris_set_layer_bitrate(struct iris_inst *inst, enum platform_inst_fw_c= ap_type cap_id); int iris_set_properties(struct iris_inst *inst, u32 plane); +int iris_set_roi_params(struct iris_inst *inst, u32 plane); +int iris_set_metadata_delivery(struct iris_inst *inst, u32 plane); +int iris_set_roi_mb_size(struct iris_inst *inst); =20 #endif diff --git a/drivers/media/platform/qcom/iris/iris_hfi_common.h b/drivers/m= edia/platform/qcom/iris/iris_hfi_common.h index a27447eb2519962cb958b0e330a6d018310c3450..5692375cdd357f9b00760053fff= f5af4bd9cce9c 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_common.h +++ b/drivers/media/platform/qcom/iris/iris_hfi_common.h @@ -131,6 +131,7 @@ struct iris_hfi_session_ops { int (*session_drain)(struct iris_inst *inst, u32 plane); int (*session_resume_drain)(struct iris_inst *inst, u32 plane); int (*session_close)(struct iris_inst *inst); + int (*session_subscribe_metadata_delivery)(struct iris_inst *inst, u32 pl= ane); }; =20 struct hfi_subscription_params { diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2.c b/drivers/med= ia/platform/qcom/iris/iris_hfi_gen2.c index acc0ed8adda1ae726c94ab6346b0b4b2b3db1d7b..4a003c798e3c27b59c20b196b84= 147a32cd74c46 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2.c +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2.c @@ -937,7 +937,21 @@ static const struct platform_inst_fw_cap inst_fw_cap_s= m8550_enc[] =3D { .flags =3D CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, .set =3D iris_set_layer_bitrate, - } + }, + { + .cap_id =3D ROI_PARAMS, + .step_or_mask =3D 1, + .p_array =3D NULL, + .hfi_id =3D HFI_PROP_ROI_INFO, + .flags =3D CAP_FLAG_INPUT_PORT | CAP_FLAG_CUSTOM | + CAP_FLAG_DYNAMIC_ALLOWED, + .set =3D iris_set_roi_params, + }, + { + .cap_id =3D MB_SIZE, + .step_or_mask =3D 1, + .flags =3D CAP_FLAG_OUTPUT_PORT | CAP_FLAG_CUSTOM, + }, }; =20 static const u32 sm8550_vdec_input_config_params_default[] =3D { diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c b/dri= vers/media/platform/qcom/iris/iris_hfi_gen2_command.c index ca2954f8bd3ad539b057eb152d5ead9a6e421670..ecbc3c695a85f4a1b8b57061481= 8a223bfdd097e 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c @@ -134,6 +134,7 @@ static u32 iris_hfi_gen2_get_port_from_buf_type(struct = iris_inst *inst, switch (buffer_type) { case BUF_INPUT: case BUF_VPSS: + case BUF_ROIMB_DELTAQP: return HFI_PORT_RAW; case BUF_OUTPUT: case BUF_BIN: @@ -1268,6 +1269,8 @@ static u32 iris_hfi_gen2_buf_type_from_driver(u32 dom= ain, enum iris_buffer_type return HFI_BUFFER_VPSS; case BUF_PARTIAL: return HFI_BUFFER_PARTIAL_DATA; + case BUF_ROIMB_DELTAQP: + return HFI_BUFFER_METADATA; default: return 0; } @@ -1308,10 +1311,29 @@ static void iris_hfi_gen2_get_buffer(u32 domain, st= ruct iris_buffer *buffer, buf->timestamp =3D buffer->timestamp; } =20 +static struct iris_buffer *iris_queue_metadata_buffers(struct iris_inst *i= nst, + enum iris_buffer_type buffer_type, u32 index) +{ + struct iris_buffers *buffers =3D &inst->buffers[buffer_type]; + struct iris_buffer *buffer =3D NULL; + + if (list_empty(&buffers->list)) + return NULL; + + buffer =3D list_first_entry(&buffers->list, typeof(*buffer), list); + if ((buffer->attr & BUF_ATTR_QUEUED) || (buffer->attr & BUF_ATTR_DEQUEUED= )) + return NULL; + + buffer->index =3D index; + + return buffer; +} + static int iris_hfi_gen2_session_queue_buffer(struct iris_inst *inst, stru= ct iris_buffer *buffer) { struct iris_inst_hfi_gen2 *inst_hfi_gen2 =3D to_iris_inst_hfi_gen2(inst); struct iris_hfi_buffer hfi_buffer; + struct iris_hfi_buffer hfi_meta_buffer; u32 port; int ret; =20 @@ -1332,6 +1354,25 @@ static int iris_hfi_gen2_session_queue_buffer(struct= iris_inst *inst, struct iri &hfi_buffer, sizeof(hfi_buffer)); =20 + /* check if any metadata buffer is available not queued, queueit */ + if (port =3D=3D HFI_PORT_RAW) { + buffer =3D iris_queue_metadata_buffers(inst, BUF_ROIMB_DELTAQP, buffer->= index); + if (buffer) { + iris_hfi_gen2_get_buffer(inst->domain, buffer, &hfi_meta_buffer); + port =3D iris_hfi_gen2_get_port_from_buf_type(inst, buffer->type); + iris_hfi_gen2_create_packet(inst_hfi_gen2->packet, + HFI_CMD_BUFFER, + HFI_HOST_FLAGS_INTR_REQUIRED, + HFI_PAYLOAD_STRUCTURE, + port, + inst->core->packet_id++, + &hfi_meta_buffer, + sizeof(hfi_meta_buffer)); + + buffer->attr |=3D BUF_ATTR_QUEUED; + buffer->attr &=3D ~BUF_ATTR_DEQUEUED; + } + } return iris_hfi_queue_cmd_write(inst->core, inst_hfi_gen2->packet, inst_hfi_gen2->packet->size); } @@ -1360,6 +1401,26 @@ static int iris_hfi_gen2_session_release_buffer(stru= ct iris_inst *inst, struct i inst_hfi_gen2->packet->size); } =20 +static int iris_hfi_gen2_subscribe_metadata_delivery(struct iris_inst *ins= t, u32 plane) +{ + struct iris_inst_hfi_gen2 *inst_hfi_gen2 =3D to_iris_inst_hfi_gen2(inst); + u32 port =3D iris_hfi_gen2_get_port(inst, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLA= NE); + u32 payload[2] =3D {HFI_MODE_METADATA, HFI_PROP_ROI_INFO}; + + iris_hfi_gen2_packet_session_command(inst, + HFI_CMD_DELIVERY_MODE, + (HFI_HOST_FLAGS_RESPONSE_REQUIRED | + HFI_HOST_FLAGS_INTR_REQUIRED), + port, + inst->session_id, + HFI_PAYLOAD_U32_ARRAY, + &payload, + sizeof(u32) * 2); + + return iris_hfi_queue_cmd_write(inst->core, inst_hfi_gen2->packet, + inst_hfi_gen2->packet->size); +} + static const struct iris_hfi_session_ops iris_hfi_gen2_session_ops =3D { .session_open =3D iris_hfi_gen2_session_open, .session_set_config_params =3D iris_hfi_gen2_session_set_config_params, @@ -1373,6 +1434,7 @@ static const struct iris_hfi_session_ops iris_hfi_gen= 2_session_ops =3D { .session_drain =3D iris_hfi_gen2_session_drain, .session_resume_drain =3D iris_hfi_gen2_session_resume_drain, .session_close =3D iris_hfi_gen2_session_close, + .session_subscribe_metadata_delivery =3D iris_hfi_gen2_subscribe_metadata= _delivery, }; =20 static struct iris_inst *iris_hfi_gen2_get_instance(void) diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h b/dri= vers/media/platform/qcom/iris/iris_hfi_gen2_defines.h index 776b21cd11b2cd5555cbced8e438cb32e87a539c..0bfba8e8158f3800647bd0b2979= 207c601e495a5 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h @@ -20,6 +20,7 @@ #define HFI_CMD_DRAIN 0x01000007 #define HFI_CMD_RESUME 0x01000008 #define HFI_CMD_BUFFER 0x01000009 +#define HFI_CMD_DELIVERY_MODE 0x0100000A #define HFI_CMD_SUBSCRIBE_MODE 0x0100000B #define HFI_CMD_SETTINGS_CHANGE 0x0100000C #define HFI_CMD_PAUSE 0x01000011 @@ -125,6 +126,7 @@ enum hfi_flip { #define HFI_PROP_DEC_START_FROM_RAP_FRAME 0x03000169 #define HFI_PROP_NO_OUTPUT 0x0300016a #define HFI_PROP_BUFFER_MARK 0x0300016c +#define HFI_PROP_ROI_INFO 0x03000173 #define HFI_PROP_WORST_COMPRESSION_RATIO 0x03000174 #define HFI_PROP_WORST_COMPLEXITY_FACTOR 0x03000175 #define HFI_PROP_RAW_RESOLUTION 0x03000178 @@ -166,6 +168,7 @@ enum hfi_flip { enum hfi_property_mode_type { HFI_MODE_PORT_SETTINGS_CHANGE =3D 0x00000001, HFI_MODE_PROPERTY =3D 0x00000002, + HFI_MODE_METADATA =3D 0x00000004, }; =20 enum hfi_color_format { diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_packet.c b/driv= ers/media/platform/qcom/iris/iris_hfi_gen2_packet.c index 0d05dd2afc07d830cc8502ab5f28001312991ba8..aeb0426a05694f219f82145cd84= a28287ed3075e 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_packet.c +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_packet.c @@ -100,9 +100,9 @@ static void iris_hfi_gen2_create_header(struct iris_hfi= _header *hdr, hdr->num_packets =3D 0; } =20 -static void iris_hfi_gen2_create_packet(struct iris_hfi_header *hdr, u32 p= kt_type, - u32 pkt_flags, u32 payload_type, u32 port, - u32 packet_id, void *payload, u32 payload_size) +void iris_hfi_gen2_create_packet(struct iris_hfi_header *hdr, u32 pkt_type, + u32 pkt_flags, u32 payload_type, u32 port, + u32 packet_id, void *payload, u32 payload_size) { struct iris_hfi_packet *pkt =3D (struct iris_hfi_packet *)((u8 *)hdr + hd= r->size); u32 pkt_size =3D sizeof(*pkt) + payload_size; diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_packet.h b/driv= ers/media/platform/qcom/iris/iris_hfi_gen2_packet.h index 25b9582349ca1a0ce6efc0b146a3abb798485c45..613eb500609f745daebdcbdf9a2= 5b85cb9465a79 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_packet.h +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_packet.h @@ -121,5 +121,8 @@ void iris_hfi_gen2_packet_session_property(struct iris_= inst *inst, void iris_hfi_gen2_packet_sys_interframe_powercollapse(struct iris_core *c= ore, struct iris_hfi_header *hdr); void iris_hfi_gen2_packet_sys_pc_prep(struct iris_core *core, struct iris_= hfi_header *hdr); +void iris_hfi_gen2_create_packet(struct iris_hfi_header *hdr, u32 pkt_type, + u32 pkt_flags, u32 payload_type, u32 port, + u32 packet_id, void *payload, u32 payload_size); =20 #endif diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c b/dr= ivers/media/platform/qcom/iris/iris_hfi_gen2_response.c index 25162ae71357482b065fe8e3b0a0664138447c4c..0bbbeea809a79ea0377f12f948a= 0d98b97a06295 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c @@ -58,6 +58,8 @@ static u32 iris_hfi_gen2_buf_type_to_driver(struct iris_i= nst *inst, return BUF_PARTIAL; case HFI_BUFFER_VPSS: return BUF_VPSS; + case HFI_BUFFER_METADATA: + return BUF_ROIMB_DELTAQP; default: return 0; } @@ -77,6 +79,7 @@ static bool iris_hfi_gen2_is_valid_hfi_buffer_type(u32 bu= ffer_type) case HFI_BUFFER_PERSIST: case HFI_BUFFER_VPSS: case HFI_BUFFER_PARTIAL_DATA: + case HFI_BUFFER_METADATA: return true; default: return false; @@ -450,6 +453,30 @@ static int iris_hfi_gen2_handle_release_internal_buffe= r(struct iris_inst *inst, return iris_destroy_internal_buffer(inst, buf); } =20 +static int iris_hfi_gen2_handle_output_metadata_buffer(struct iris_inst *i= nst, + struct iris_hfi_buffer *buffer) +{ + u32 buf_type =3D iris_hfi_gen2_buf_type_to_driver(inst, HFI_BUFFER_METADA= TA); + struct iris_buffers *buffers =3D &inst->buffers[buf_type]; + struct iris_buffer *buf, *iter; + bool found =3D false; + + list_for_each_entry(iter, &buffers->list, list) { + if (iter->device_addr =3D=3D buffer->base_address) { + found =3D true; + buf =3D iter; + break; + } + } + if (!found) + return -EINVAL; + + buf->attr &=3D ~BUF_ATTR_QUEUED; + buf->attr |=3D BUF_ATTR_DEQUEUED; + + return 0; +} + static int iris_hfi_gen2_handle_session_stop(struct iris_inst *inst, struct iris_hfi_packet *pkt) { @@ -497,6 +524,8 @@ static int iris_hfi_gen2_handle_session_buffer(struct i= ris_inst *inst, return iris_hfi_gen2_handle_input_buffer(inst, buffer); else if (buffer->type =3D=3D HFI_BUFFER_BITSTREAM) return iris_hfi_gen2_handle_output_buffer(inst, buffer); + else if (buffer->type =3D=3D HFI_BUFFER_METADATA) + return iris_hfi_gen2_handle_output_metadata_buffer(inst, buffer); else return iris_hfi_gen2_handle_release_internal_buffer(inst, buffer); } diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/driv= ers/media/platform/qcom/iris/iris_platform_common.h index c9256f2323dc4521f9eacaeffb0fc08a180de3ff..9221cf3482299a0177b13443dff= 9df40a65d6724 100644 --- a/drivers/media/platform/qcom/iris/iris_platform_common.h +++ b/drivers/media/platform/qcom/iris/iris_platform_common.h @@ -183,6 +183,8 @@ enum platform_inst_fw_cap_type { LAYER3_BITRATE_HEVC, LAYER4_BITRATE_HEVC, LAYER5_BITRATE_HEVC, + ROI_PARAMS, + MB_SIZE, INST_FW_CAP_MAX, }; =20 @@ -194,6 +196,7 @@ enum platform_inst_fw_cap_flags { CAP_FLAG_CLIENT_SET =3D BIT(4), CAP_FLAG_BITMASK =3D BIT(5), CAP_FLAG_VOLATILE =3D BIT(6), + CAP_FLAG_CUSTOM =3D BIT(7), }; =20 struct platform_inst_fw_cap { @@ -203,6 +206,8 @@ struct platform_inst_fw_cap { s64 step_or_mask; s64 value; u32 hfi_id; + const void *p_array; + u32 elems; enum platform_inst_fw_cap_flags flags; int (*set)(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id); diff --git a/drivers/media/platform/qcom/iris/iris_venc.c b/drivers/media/p= latform/qcom/iris/iris_venc.c index a945992f63aa8a0c40b8d6bc473d0bc90270e6cd..21ba9639d17b2c64e8fa33b4aac= bd1946fc4dae2 100644 --- a/drivers/media/platform/qcom/iris/iris_venc.c +++ b/drivers/media/platform/qcom/iris/iris_venc.c @@ -498,6 +498,10 @@ int iris_venc_streamon_output(struct iris_inst *inst) if (ret) goto error; =20 + ret =3D iris_set_metadata_delivery(inst, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLA= NE); + if (ret) + goto error; + ret =3D iris_alloc_and_queue_persist_bufs(inst, BUF_ARP); if (ret) return ret; diff --git a/drivers/media/platform/qcom/iris/iris_venc.h b/drivers/media/p= latform/qcom/iris/iris_venc.h index 00c1716b2747c7e840c2a3317800d83663744bf0..df97011636740be6cdfe5867f27= 3c5f93408f570 100644 --- a/drivers/media/platform/qcom/iris/iris_venc.h +++ b/drivers/media/platform/qcom/iris/iris_venc.h @@ -22,5 +22,7 @@ int iris_venc_streamon_output(struct iris_inst *inst); int iris_venc_qbuf(struct iris_inst *inst, struct vb2_v4l2_buffer *vbuf); int iris_venc_start_cmd(struct iris_inst *inst); int iris_venc_stop_cmd(struct iris_inst *inst); +struct iris_buffer *iris_queue_metadata_buffers(struct iris_inst *inst, + enum iris_buffer_type buffer_type, u32 index); =20 #endif diff --git a/drivers/media/platform/qcom/iris/iris_vidc.c b/drivers/media/p= latform/qcom/iris/iris_vidc.c index 14d63dc76c9bacbed3533147cd5325410f9c94bd..0b0400ca8f88b05a3267be500e9= cd38cdc154991 100644 --- a/drivers/media/platform/qcom/iris/iris_vidc.c +++ b/drivers/media/platform/qcom/iris/iris_vidc.c @@ -179,6 +179,7 @@ int iris_open(struct file *filp) INIT_LIST_HEAD(&inst->buffers[BUF_SCRATCH_2].list); INIT_LIST_HEAD(&inst->buffers[BUF_VPSS].list); INIT_LIST_HEAD(&inst->buffers[BUF_PARTIAL].list); + INIT_LIST_HEAD(&inst->buffers[BUF_ROIMB_DELTAQP].list); init_completion(&inst->completion); init_completion(&inst->flush_completion); =20 @@ -296,6 +297,7 @@ int iris_close(struct file *filp) iris_destroy_all_internal_buffers(inst, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLAN= E); iris_check_num_queued_internal_buffers(inst, V4L2_BUF_TYPE_VIDEO_OUTPUT_M= PLANE); iris_check_num_queued_internal_buffers(inst, V4L2_BUF_TYPE_VIDEO_CAPTURE_= MPLANE); + iris_destroy_roi_metadata_buffers(inst); iris_remove_session(inst); mutex_unlock(&inst->lock); mutex_destroy(&inst->ctx_q_lock); --=20 2.34.1