From patchwork Fri Aug 5 18:18:46 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Umang Jain X-Patchwork-Id: 16988 X-Patchwork-Delegate: umang.jain@ideasonboard.com Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 756E0BE173 for ; Fri, 5 Aug 2022 18:19:02 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 2EFE86332F; Fri, 5 Aug 2022 20:19:02 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1659723542; bh=jUULhcV8lDdhRTK48rcn6x/3aLIjh+YoUlTmj2AV7DI=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=02u2k3SIjDOzBfQEkMEMJsxvPUUJE+HCNc1J7Zj4j8AAWa2RULQxFnMM0yXzN6oGB 0qjxXHby6WwGOnC8f49eq8FvjaAaUhj7nM6Yk4cTp88L9a5nVNoTZdRIwoUbkcxoSG cecSREUBnLK+HIfxSA2ZYLAAHW5da3El5/BvrJixVKJPO3UywfXw9JFtB0D1bIbKYf OHgADpPLpV6Gl6MlFsdshtKi6UMuHnl4XCeFya8q63uXCHaoxAECxsQDYDaK0W/qzo XM/bHqUGWZyWgYJdThzr5H5OppjQum4wMnRWAYs65SNHVxpX9sSiixOTJXfXK5GVZm Fpsk+tGaHds8A== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 5DFFC603F0 for ; Fri, 5 Aug 2022 20:18:59 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="ZIlBqN2m"; dkim-atps=neutral Received: from perceval.ideasonboard.com (unknown [IPv6:2401:4900:1f3e:69e0:a479:4ccc:ab2a:bf48]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 57AF0480; Fri, 5 Aug 2022 20:18:58 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1659723539; bh=jUULhcV8lDdhRTK48rcn6x/3aLIjh+YoUlTmj2AV7DI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ZIlBqN2mlARrcrZnbkHHYMugiYNhgxzcHCnA+rseitdux6/9Ph4s6WrgV3YU89CqU jEhZBp+3A76mJje47j9RP3igec851JgdBmjD3KyczF6QhU52AwCkH+KGkTqhHvZGui pi+YAep9sV4u11PKdpijEH76cVAVF0t8/Lo8aPjU= To: libcamera-devel@lists.libcamera.org Date: Fri, 5 Aug 2022 23:48:46 +0530 Message-Id: <20220805181850.848886-2-umang.jain@ideasonboard.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220805181850.848886-1-umang.jain@ideasonboard.com> References: <20220805181850.848886-1-umang.jain@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 1/5] utils: ipu3-process: Stream multiple frames using v4l2-ctl X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Umang Jain via libcamera-devel From: Umang Jain Reply-To: Umang Jain Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Stream IMGU using v4l2-ctl as it provides more granular controls on the video nodes. The goal here is to stream a single input file containing multiple frames in 10-bit IPU3 packed bayer format. Such an input file can be created using the ipu3-pack utility. This patch enables the IMGU's parameter node as well in configure_pipeline() without which the input node won't stream successive input frames. yavta commands have been replaced with equivalent v4l2-ctl commands. Also the v4l2-ctl outputs a single file(--stream-to=) as opposed to yavta's one frame per file, so the conversion via raw2pnm needed adjusting. raw2pnm will now read from a single input file (produced as a result of v4l2-ctl ... --stream-to) and use the bytes offset to output separate frames. Lastly, $nbufs have reduced to 4 and $frame_count has been increased to 10. Signed-off-by: Umang Jain --- utils/ipu3/ipu3-process.sh | 54 +++++++++++++++++++++++++++----------- 1 file changed, 38 insertions(+), 16 deletions(-) diff --git a/utils/ipu3/ipu3-process.sh b/utils/ipu3/ipu3-process.sh index bb4abbe8..828a72f8 100755 --- a/utils/ipu3/ipu3-process.sh +++ b/utils/ipu3/ipu3-process.sh @@ -11,7 +11,7 @@ # # - media-ctl (from v4l-utils git://linuxtv.org/v4l-utils.git) # - raw2pnm (from nvt https://github.com/intel/nvt.git) -# - yavta (from git://git.ideasonboard.org/yavta.git) +# - v4l2-ctl (from http://git.linuxtv.org/v4l-utils.git) imgu_entity="ipu3-imgu 0" @@ -37,17 +37,19 @@ configure_pipeline() { local enable_3a=1 local enable_out=1 local enable_vf=1 + local enable_param=1 local mode=0 # Configure the links $mediactl -r $mediactl -l "\"$imgu_entity input\":0 -> \"$imgu_entity\":0[1]" + $mediactl -l "\"$imgu_entity parameters\":0 -> \"$imgu_entity\":1[$enable_param]" $mediactl -l "\"$imgu_entity\":2 -> \"$imgu_entity output\":0[$enable_out]" $mediactl -l "\"$imgu_entity\":3 -> \"$imgu_entity viewfinder\":0[$enable_vf]" $mediactl -l "\"$imgu_entity\":4 -> \"$imgu_entity 3a stat\":0[$enable_3a]" # Select processing mode (0 for video, 1 for still image) - yavta --no-query -w "0x009819c1 $mode" $($mediactl -e "$imgu_entity") + v4l2-ctl -d $($mediactl -e "$imgu_entity") -c 0x009819c1=$mode # Set formats. The media bus code doesn't matter as it is ignored by the # driver. We should use the FIXED format, but media-ctl doesn't support @@ -62,23 +64,41 @@ configure_pipeline() { process_frames() { configure_pipeline - local yavta="yavta -n $nbufs -c$frame_count" + local stream_setting=" --stream-mmap $nbufs --stream-count=$frame_count" + local out_width=$(echo $out_size | awk -F 'x' '{print $1}') + local out_height=$(echo $out_size | awk -F 'x' '{print $2}') + local vf_width=$(echo $vf_size | awk -F 'x' '{print $1}') + local vf_height=$(echo $vf_size | awk -F 'x' '{print $2}') + local in_width=$(echo $in_size | awk -F 'x' '{print $1}') + local in_height=$(echo $in_size | awk -F 'x' '{print $2}') # Save the main and viewfinder outputs to disk, capture and drop 3A - # statistics. Sleep 500ms between each execution of yavta to keep the + # statistics. Sleep 500ms between each execution of v4l2-ctl to keep the # stdout messages readable. - $yavta -f $IMGU_OUT_PIXELFORMAT -s $out_size "-F$output_dir/frame-out-#.bin" \ - $($mediactl -e "$imgu_entity output") & + v4l2-ctl -d$($mediactl -e "$imgu_entity output") \ + --set-fmt-video=pixelformat=$IMGU_OUT_PIXELFORMAT,width=$out_width,height=$out_height \ + $stream_setting --stream-to=$output_dir/frames-out.bin & sleep 0.5 - $yavta -f $IMGU_VF_PIXELFORMAT -s $vf_size "-F$output_dir/frame-vf-#.bin" \ - $($mediactl -e "$imgu_entity viewfinder") & + v4l2-ctl -d$($mediactl -e "$imgu_entity viewfinder") \ + --set-fmt-video=pixelformat=$IMGU_OUT_PIXELFORMAT,width=$vf_width,height=$vf_height \ + $stream_setting --stream-to=$output_dir/frames-vf.bin & sleep 0.5 - $yavta $($mediactl -e "$imgu_entity 3a stat") & + v4l2-ctl -d $($mediactl -e "$imgu_entity 3a stat") $stream_setting & sleep 0.5 # Feed the IMGU input. - $yavta -f $IMGU_IN_PIXELFORMAT -s $in_size "-F$in_file" \ - $($mediactl -e "$imgu_entity input") + + # To stream out $frame_count on output and vf nodes, input and parameters nodes need to atleast + # stream ($frame_count + $nbufs) frames. + local in_stream_count=$(expr $nbufs + $frame_count) + v4l2-ctl -d $($mediactl -e "$imgu_entity input") \ + --set-fmt-video-out=width=$in_width\,height=$in_height\,pixelformat=$IMGU_IN_PIXELFORMAT \ + --stream-out-mmap $nbufs --stream-from=$in_file --stream-count=$in_stream_count \ + --stream-loop --stream-poll & + + # The input node would not stream until parameters start streaming. + v4l2-ctl -d$($mediactl -e "$imgu_entity parameters") --stream-out-mmap 1 \ + --stream-count=$in_stream_count --stream-poll } # Convert captured files to ppm @@ -92,13 +112,15 @@ convert_files() { local height=$(echo $size | awk -F 'x' '{print $2}') local padded_width=$(expr $(expr $width + 63) / 64 \* 64) - raw2pnm -x$padded_width -y$height -f$format \ - $output_dir/frame-$type-$index.bin \ + local bytes_offset=$(expr $index \* $(expr $padded_width \* $height \* 12) / 8) + echo $bytes_offset + raw2pnm -x$padded_width -y$height -f$format -b $bytes_offset \ + $output_dir/frames-$type.bin \ $output_dir/frame-$type-$index.ppm } run_test() { - IMGU_IN_PIXELFORMAT=IPU3_SGRBG10 + IMGU_IN_PIXELFORMAT=ip3G IMGU_OUT_PIXELFORMAT=NV12 IMGU_VF_PIXELFORMAT=NV12 @@ -193,6 +215,6 @@ mediactl="media-ctl -d $mdev" echo "Using device $mdev" output_dir="/tmp" -frame_count=5 -nbufs=7 +frame_count=10 +nbufs=4 run_test