| Message ID | 20260518102451.417971-11-paulk@sys-base.io (mailing list archive) |
|---|---|
| State | New |
| Headers |
Return-Path: <linux-sunxi+bounces-23461-sunxi=pue.re@lists.linux.dev> X-Original-To: noreply@patchwork.local Delivered-To: noreply@patchwork.local Received: from sea.lore.kernel.org (sea.lore.kernel.org [172.234.253.10]) by mxe881.netcup.net (Postfix) with ESMTPS id 86C621C00A5 for <noreply@patchwork.local>; Mon, 18 May 2026 12:38:21 +0200 (CEST) Authentication-Results: mxe881; spf=pass (sender IP is 172.234.253.10) smtp.mailfrom=linux-sunxi+bounces-23461-noreply=patchwork.local@lists.linux.dev smtp.helo=sea.lore.kernel.org Received-SPF: pass (mxe881: domain of lists.linux.dev designates 172.234.253.10 as permitted sender) client-ip=172.234.253.10; envelope-from=linux-sunxi+bounces-23461-noreply=patchwork.local@lists.linux.dev; helo=sea.lore.kernel.org; Received: from smtp.subspace.kernel.org (conduit.subspace.kernel.org [100.90.174.1]) by sea.lore.kernel.org (Postfix) with ESMTP id DD2F5305592B for <noreply@patchwork.local>; Mon, 18 May 2026 10:30:58 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 868B53ED124; Mon, 18 May 2026 10:30:55 +0000 (UTC) X-Original-To: linux-sunxi@lists.linux.dev Received: from leonov.paulk.fr (leonov.paulk.fr [185.233.101.22]) (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 738243E866F; Mon, 18 May 2026 10:30:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.233.101.22 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779100250; cv=none; b=qVtpkd5MrOlk1RUKmwwO4PS/59nLZ3SEZl2h8rwUEnvt0kVYTdV7UTVsIMVWKY9slmzF+70Bfj0Ytd1PLwvXBzyai3+fQXIfXgX4ug7Y0YEBFrNfPfziVSbQiuwJxnnB9hQdQhx7Jn4zFOhpr+PtNE8nors99OEJLo6YbkAmYLA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779100250; c=relaxed/simple; bh=a94F18r5g+FvBqZBmEeOdOnNuIqh/W6Oyf8UGJe6Jgw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=B/AeY9UDBocX+OUT3id3pnzmji2es0PZ8E3pRTuo9WvpKzQIfqx3emrqxcaW4ZGXHVbHDPkSY+jdhpLa5DY5HS/F8eQC0mNq+SZKSyTQNc8NhDtT8UDtKxq5zgJE+051KjubE1aZnXTcxSgLnLsoF+HXYoNTcgtvOFJb2SCVlXw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sys-base.io; spf=pass smtp.mailfrom=sys-base.io; arc=none smtp.client-ip=185.233.101.22 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sys-base.io Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=sys-base.io Received: from laika.paulk.fr (12.234.24.109.rev.sfr.net [109.24.234.12]) by leonov.paulk.fr (Postfix) with ESMTPS id 9E0A91F80041; Mon, 18 May 2026 10:30:18 +0000 (UTC) Received: by laika.paulk.fr (Postfix, from userid 65534) id 0D92FB40818; Mon, 18 May 2026 10:30:17 +0000 (UTC) X-Spam-Level: * Received: from collins (unknown [192.168.1.64]) by laika.paulk.fr (Postfix) with ESMTP id 5C629B407F7; Mon, 18 May 2026 10:25:00 +0000 (UTC) From: Paul Kocialkowski <paulk@sys-base.io> To: linux-media@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, linux-staging@lists.linux.dev Cc: Paul Kocialkowski <paulk@sys-base.io>, Mauro Carvalho Chehab <mchehab@kernel.org>, Chen-Yu Tsai <wens@kernel.org>, Jernej Skrabec <jernej.skrabec@gmail.com>, Samuel Holland <samuel@sholland.org>, Greg Kroah-Hartman <gregkh@linuxfoundation.org>, Arash Golgol <arash.golgol@gmail.com>, Laurent Pinchart <laurent.pinchart@ideasonboard.com>, Nicolas Dufresne <nicolas.dufresne@collabora.com> Subject: [PATCH 10/16] media: sun6i-csi: Add support for MC-centric format enumeration Date: Mon, 18 May 2026 12:24:45 +0200 Message-ID: <20260518102451.417971-11-paulk@sys-base.io> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260518102451.417971-1-paulk@sys-base.io> References: <20260518102451.417971-1-paulk@sys-base.io> Precedence: bulk X-Mailing-List: linux-sunxi@lists.linux.dev List-Id: <linux-sunxi.lists.linux.dev> List-Subscribe: <mailto:linux-sunxi+subscribe@lists.linux.dev> List-Unsubscribe: <mailto:linux-sunxi+unsubscribe@lists.linux.dev> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-MORS-Enabled: yes X-MORS-DOMAIN: patchwork.local X-MORS-HOSTING: hosting172546 X-MORS-USER: hosting172546 X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= |
| Series |
media: sun6i-csi/isp MC-centric support and cleanups
|
|
Commit Message
Paul Kocialkowski
May 18, 2026, 10:24 a.m. UTC
Use the dedicated helper to check possible pixelformats against the
provided mbus code in order to support MC-centric format enumeration.
Note that multiple pixelformats may be returned for a given mbus code.
Signed-off-by: Paul Kocialkowski <paulk@sys-base.io>
---
.../sunxi/sun6i-csi/sun6i_csi_capture.c | 38 +++++++++++++++++--
1 file changed, 34 insertions(+), 4 deletions(-)
Comments
Hi Paul, On Mon, May 18, 2026 at 2:00 PM Paul Kocialkowski <paulk@sys-base.io> wrote: > > Use the dedicated helper to check possible pixelformats against the > provided mbus code in order to support MC-centric format enumeration. > > Note that multiple pixelformats may be returned for a given mbus code. > > Signed-off-by: Paul Kocialkowski <paulk@sys-base.io> > --- > .../sunxi/sun6i-csi/sun6i_csi_capture.c | 38 +++++++++++++++++-- > 1 file changed, 34 insertions(+), 4 deletions(-) > > diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c > index a836fa7f081a..409c28621093 100644 > --- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c > +++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c > @@ -773,14 +773,43 @@ static int sun6i_csi_capture_querycap(struct file *file, void *priv, > static int sun6i_csi_capture_enum_fmt(struct file *file, void *priv, > struct v4l2_fmtdesc *fmtdesc) > { > + const struct sun6i_csi_capture_format *capture_format; > + const struct sun6i_csi_bridge_format *bridge_format; > + u32 mbus_code = fmtdesc->mbus_code; > u32 index = fmtdesc->index; > + unsigned int index_valid = 0; > + unsigned int i; > + > + /* Video-node-centric enumeration. */ > + if (!mbus_code) { > + if (index >= ARRAY_SIZE(sun6i_csi_capture_formats)) > + return -EINVAL; > + > + fmtdesc->pixelformat = > + sun6i_csi_capture_formats[index].pixelformat; > + return 0; > + } > > - if (index >= ARRAY_SIZE(sun6i_csi_capture_formats)) > + bridge_format = sun6i_csi_bridge_format_find(mbus_code); > + if (!bridge_format) > return -EINVAL; > > - fmtdesc->pixelformat = sun6i_csi_capture_formats[index].pixelformat; > + for (i = 0; i < ARRAY_SIZE(sun6i_csi_capture_formats); i++) { > + capture_format = &sun6i_csi_capture_formats[i]; > > - return 0; > + if (!sun6i_csi_capture_format_check(capture_format, > + bridge_format)) > + continue; > + > + if (index_valid == index) { > + fmtdesc->pixelformat = capture_format->pixelformat; > + return 0; > + } > + > + index_valid++; > + } > + > + return -EINVAL; > } > > static int sun6i_csi_capture_enum_framesize(struct file *file, void *fh, > @@ -1076,7 +1105,8 @@ int sun6i_csi_capture_setup(struct sun6i_csi_device *csi_dev) > > strscpy(video_dev->name, SUN6I_CSI_CAPTURE_NAME, > sizeof(video_dev->name)); > - video_dev->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; > + video_dev->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING | > + V4L2_CAP_IO_MC; > video_dev->vfl_dir = VFL_DIR_RX; > video_dev->release = video_device_release_empty; > video_dev->fops = &sun6i_csi_capture_fops; > -- > 2.54.0 > Tested on a LicheePi Zero Dock (V3s) with the following pipeline: ov7670 -> sun6i-csi-bridge -> sun6i-csi-capture I verified that mbus-code-based format enumeration works correctly from userspace and that the reported capture formats change according to the selected media bus format. I could also successfully start streaming with several of the enumerated capture formats (e.g. YUYV and BA81) However, I could not fully validate actual format conversion behavior (e.g. MEDIA_BUS_FMT_YUYV8_2X8 to NV12) because my OV7670 setup currently has non-functional test patterns except for 'shifting-1' mode. Tested-by: Arash Golgol <arash.golgol@gmail.com> PS: While testing this patch I also noticed that VIDIOC_SUBDEV_ENUM_MBUS_CODE reports duplicate entries for: - MEDIA_BUS_FMT_UYVY8_2X8 - MEDIA_BUS_FMT_UYVY8_1X16 on sun6i-csi-bridge. This appears to come from duplicate format entries being exposed by the bridge driver.
Hi Arash, On Wed 27 May 26, 09:20, arash golgol wrote: > On Mon, May 18, 2026 at 2:00 PM Paul Kocialkowski <paulk@sys-base.io> wrote: > > > > Use the dedicated helper to check possible pixelformats against the > > provided mbus code in order to support MC-centric format enumeration. > > > > Note that multiple pixelformats may be returned for a given mbus code. > > > > Signed-off-by: Paul Kocialkowski <paulk@sys-base.io> > > --- > > .../sunxi/sun6i-csi/sun6i_csi_capture.c | 38 +++++++++++++++++-- > > 1 file changed, 34 insertions(+), 4 deletions(-) > > > > diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c > > index a836fa7f081a..409c28621093 100644 > > --- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c > > +++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c > > @@ -773,14 +773,43 @@ static int sun6i_csi_capture_querycap(struct file *file, void *priv, > > static int sun6i_csi_capture_enum_fmt(struct file *file, void *priv, > > struct v4l2_fmtdesc *fmtdesc) > > { > > + const struct sun6i_csi_capture_format *capture_format; > > + const struct sun6i_csi_bridge_format *bridge_format; > > + u32 mbus_code = fmtdesc->mbus_code; > > u32 index = fmtdesc->index; > > + unsigned int index_valid = 0; > > + unsigned int i; > > + > > + /* Video-node-centric enumeration. */ > > + if (!mbus_code) { > > + if (index >= ARRAY_SIZE(sun6i_csi_capture_formats)) > > + return -EINVAL; > > + > > + fmtdesc->pixelformat = > > + sun6i_csi_capture_formats[index].pixelformat; > > + return 0; > > + } > > > > - if (index >= ARRAY_SIZE(sun6i_csi_capture_formats)) > > + bridge_format = sun6i_csi_bridge_format_find(mbus_code); > > + if (!bridge_format) > > return -EINVAL; > > > > - fmtdesc->pixelformat = sun6i_csi_capture_formats[index].pixelformat; > > + for (i = 0; i < ARRAY_SIZE(sun6i_csi_capture_formats); i++) { > > + capture_format = &sun6i_csi_capture_formats[i]; > > > > - return 0; > > + if (!sun6i_csi_capture_format_check(capture_format, > > + bridge_format)) > > + continue; > > + > > + if (index_valid == index) { > > + fmtdesc->pixelformat = capture_format->pixelformat; > > + return 0; > > + } > > + > > + index_valid++; > > + } > > + > > + return -EINVAL; > > } > > > > static int sun6i_csi_capture_enum_framesize(struct file *file, void *fh, > > @@ -1076,7 +1105,8 @@ int sun6i_csi_capture_setup(struct sun6i_csi_device *csi_dev) > > > > strscpy(video_dev->name, SUN6I_CSI_CAPTURE_NAME, > > sizeof(video_dev->name)); > > - video_dev->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; > > + video_dev->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING | > > + V4L2_CAP_IO_MC; > > video_dev->vfl_dir = VFL_DIR_RX; > > video_dev->release = video_device_release_empty; > > video_dev->fops = &sun6i_csi_capture_fops; > > -- > > 2.54.0 > > > > Tested on a LicheePi Zero Dock (V3s) with the following pipeline: > > ov7670 -> sun6i-csi-bridge -> sun6i-csi-capture > > I verified that mbus-code-based format enumeration works correctly > from userspace and that the reported capture formats change according > to the selected media bus format. > > I could also successfully start streaming with several of the > enumerated capture formats (e.g. YUYV and BA81) Excellent, thank-you very much for testing this! > However, I could not fully validate actual format conversion behavior > (e.g. MEDIA_BUS_FMT_YUYV8_2X8 to NV12) because my OV7670 setup > currently has non-functional test patterns except for 'shifting-1' > mode. That's fine. I don't think I have tested it recently either. > Tested-by: Arash Golgol <arash.golgol@gmail.com> > > PS: > > While testing this patch I also noticed that > VIDIOC_SUBDEV_ENUM_MBUS_CODE reports duplicate entries for: > - MEDIA_BUS_FMT_UYVY8_2X8 > - MEDIA_BUS_FMT_UYVY8_1X16 > on sun6i-csi-bridge. I just had a look and you are definitely right, the entries are clearly duplicates and at the same time all the relevant formats are included, so they are not taking the place of another format that was forgotten. You're welcome to submit a patch to remove these entries if you'd like, or I could do it otherwise. By the way would you be interested in testing the H.264 encoder support for V3/V3s once I send a first version for it? I had written initial support for it a while ago (did not send it to the list) and now that my work on the V4L2 stateless uAPI has reached a point of usability I will probably try to update my rework of the cedrus driver to use it. All the best, Paul > This appears to come from duplicate format entries being exposed by > the bridge driver. > > -- > Regards, > Arash Golgol
Hi Paul, On Wed, May 27, 2026 at 11:29 AM Paul Kocialkowski <paulk@sys-base.io> wrote: > > Hi Arash, > > On Wed 27 May 26, 09:20, arash golgol wrote: > > On Mon, May 18, 2026 at 2:00 PM Paul Kocialkowski <paulk@sys-base.io> wrote: > > > > > > Use the dedicated helper to check possible pixelformats against the > > > provided mbus code in order to support MC-centric format enumeration. > > > > > > Note that multiple pixelformats may be returned for a given mbus code. > > > > > > Signed-off-by: Paul Kocialkowski <paulk@sys-base.io> > > > --- > > > .../sunxi/sun6i-csi/sun6i_csi_capture.c | 38 +++++++++++++++++-- > > > 1 file changed, 34 insertions(+), 4 deletions(-) > > > > > > diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c > > > index a836fa7f081a..409c28621093 100644 > > > --- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c > > > +++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c > > > @@ -773,14 +773,43 @@ static int sun6i_csi_capture_querycap(struct file *file, void *priv, > > > static int sun6i_csi_capture_enum_fmt(struct file *file, void *priv, > > > struct v4l2_fmtdesc *fmtdesc) > > > { > > > + const struct sun6i_csi_capture_format *capture_format; > > > + const struct sun6i_csi_bridge_format *bridge_format; > > > + u32 mbus_code = fmtdesc->mbus_code; > > > u32 index = fmtdesc->index; > > > + unsigned int index_valid = 0; > > > + unsigned int i; > > > + > > > + /* Video-node-centric enumeration. */ > > > + if (!mbus_code) { > > > + if (index >= ARRAY_SIZE(sun6i_csi_capture_formats)) > > > + return -EINVAL; > > > + > > > + fmtdesc->pixelformat = > > > + sun6i_csi_capture_formats[index].pixelformat; > > > + return 0; > > > + } > > > > > > - if (index >= ARRAY_SIZE(sun6i_csi_capture_formats)) > > > + bridge_format = sun6i_csi_bridge_format_find(mbus_code); > > > + if (!bridge_format) > > > return -EINVAL; > > > > > > - fmtdesc->pixelformat = sun6i_csi_capture_formats[index].pixelformat; > > > + for (i = 0; i < ARRAY_SIZE(sun6i_csi_capture_formats); i++) { > > > + capture_format = &sun6i_csi_capture_formats[i]; > > > > > > - return 0; > > > + if (!sun6i_csi_capture_format_check(capture_format, > > > + bridge_format)) > > > + continue; > > > + > > > + if (index_valid == index) { > > > + fmtdesc->pixelformat = capture_format->pixelformat; > > > + return 0; > > > + } > > > + > > > + index_valid++; > > > + } > > > + > > > + return -EINVAL; > > > } > > > > > > static int sun6i_csi_capture_enum_framesize(struct file *file, void *fh, > > > @@ -1076,7 +1105,8 @@ int sun6i_csi_capture_setup(struct sun6i_csi_device *csi_dev) > > > > > > strscpy(video_dev->name, SUN6I_CSI_CAPTURE_NAME, > > > sizeof(video_dev->name)); > > > - video_dev->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; > > > + video_dev->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING | > > > + V4L2_CAP_IO_MC; > > > video_dev->vfl_dir = VFL_DIR_RX; > > > video_dev->release = video_device_release_empty; > > > video_dev->fops = &sun6i_csi_capture_fops; > > > -- > > > 2.54.0 > > > > > > > Tested on a LicheePi Zero Dock (V3s) with the following pipeline: > > > > ov7670 -> sun6i-csi-bridge -> sun6i-csi-capture > > > > I verified that mbus-code-based format enumeration works correctly > > from userspace and that the reported capture formats change according > > to the selected media bus format. > > > > I could also successfully start streaming with several of the > > enumerated capture formats (e.g. YUYV and BA81) > > Excellent, thank-you very much for testing this! > Happy to help. > > However, I could not fully validate actual format conversion behavior > > (e.g. MEDIA_BUS_FMT_YUYV8_2X8 to NV12) because my OV7670 setup > > currently has non-functional test patterns except for 'shifting-1' > > mode. > > That's fine. I don't think I have tested it recently either. > > > Tested-by: Arash Golgol <arash.golgol@gmail.com> > > > > PS: > > > > While testing this patch I also noticed that > > VIDIOC_SUBDEV_ENUM_MBUS_CODE reports duplicate entries for: > > - MEDIA_BUS_FMT_UYVY8_2X8 > > - MEDIA_BUS_FMT_UYVY8_1X16 > > on sun6i-csi-bridge. > > I just had a look and you are definitely right, the entries are clearly > duplicates and at the same time all the relevant formats are included, so they > are not taking the place of another format that was forgotten. > > You're welcome to submit a patch to remove these entries if you'd like, > or I could do it otherwise. > Thanks, I'll send a small patch to remove the duplicate mbus format entries. > By the way would you be interested in testing the H.264 encoder support for > V3/V3s once I send a first version for it? I had written initial support for > it a while ago (did not send it to the list) and now that my work on the V4L2 > stateless uAPI has reached a point of usability I will probably try to update > my rework of the cedrus driver to use it. > Yes, I would definitely be interested in testing the H.264 encoder support on V3s once you post it. I previously did some experiments with Cedrus on V3s (bootlin, cedrus/h264-encoding branch). Looking forward to it!
diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c index a836fa7f081a..409c28621093 100644 --- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c +++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c @@ -773,14 +773,43 @@ static int sun6i_csi_capture_querycap(struct file *file, void *priv, static int sun6i_csi_capture_enum_fmt(struct file *file, void *priv, struct v4l2_fmtdesc *fmtdesc) { + const struct sun6i_csi_capture_format *capture_format; + const struct sun6i_csi_bridge_format *bridge_format; + u32 mbus_code = fmtdesc->mbus_code; u32 index = fmtdesc->index; + unsigned int index_valid = 0; + unsigned int i; + + /* Video-node-centric enumeration. */ + if (!mbus_code) { + if (index >= ARRAY_SIZE(sun6i_csi_capture_formats)) + return -EINVAL; + + fmtdesc->pixelformat = + sun6i_csi_capture_formats[index].pixelformat; + return 0; + } - if (index >= ARRAY_SIZE(sun6i_csi_capture_formats)) + bridge_format = sun6i_csi_bridge_format_find(mbus_code); + if (!bridge_format) return -EINVAL; - fmtdesc->pixelformat = sun6i_csi_capture_formats[index].pixelformat; + for (i = 0; i < ARRAY_SIZE(sun6i_csi_capture_formats); i++) { + capture_format = &sun6i_csi_capture_formats[i]; - return 0; + if (!sun6i_csi_capture_format_check(capture_format, + bridge_format)) + continue; + + if (index_valid == index) { + fmtdesc->pixelformat = capture_format->pixelformat; + return 0; + } + + index_valid++; + } + + return -EINVAL; } static int sun6i_csi_capture_enum_framesize(struct file *file, void *fh, @@ -1076,7 +1105,8 @@ int sun6i_csi_capture_setup(struct sun6i_csi_device *csi_dev) strscpy(video_dev->name, SUN6I_CSI_CAPTURE_NAME, sizeof(video_dev->name)); - video_dev->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; + video_dev->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING | + V4L2_CAP_IO_MC; video_dev->vfl_dir = VFL_DIR_RX; video_dev->release = video_device_release_empty; video_dev->fops = &sun6i_csi_capture_fops;