[libcamera-devel] [RFC PATCH] utils: ipu3-process: Stream multiple frames using v4l2-ctl

Umang Jain umang.jain at ideasonboard.com
Tue Jul 12 09:51:24 CEST 2022


Hi Laurent,

On 7/12/22 03:45, Laurent Pinchart wrote:
> Hi Umang,
>
> Thank you for the patch.
>
> On Mon, Jul 11, 2022 at 10:14:13PM +0530, Umang Jain via libcamera-devel wrote:
>> 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 a input file can be created using the ipu3-pack utility.
> s/a input/an input/
>
>> This patch enables the IMGU's parameter node as well in
>> configure_pipeline() without which, the input node won't stream
> s/ without which,/, without which/
>
>> successive input frames.
>>
>> The viewfinder and output nodes will still stream using yavta, so
>> no changes required there.
> Would it be difficult to use v4l2-ctl everywhere ? It would be nice to
> avoid depending on multiple tools.


Ok, if you prefer not to use multiple tools, I can live with that. yavta 
seems to be more concise and clear to me so I preferred keeping those parts.

>
>> It's is quite tricky to stream input and parameters nodes synchronously
>> with v4l2-ctl commands for each. The patch overcomes this short-coming
>> by streaming both the nodes endlessly until both of them are killed.
>> A sleep of 1 second is introduced to make sure $frame_count buffers
>> are captured on the output and vf nodes.
> What's the issue, can't we get v4l2-ctl to stream a given number of
> frames ?


So the commands in the script runs sequentially so if you stream nodes 
one after the other for a given set of frame_count - only (frame_count - 
X) frames get captured on output / vf nodes. So for frame_count=20, I 
got somewhere between first 7-15 outputs only(this number various as 
well). We had a brief discussion on this on IRC - seems whichever node 
calls "stream-off" will make the entire script halt/waiting.

In my observation, the parameters node can stream independently. But the 
input node, waits for parameter node to start streaming.

I tried multiple combinations to capture frame_count deterministically 
but didn't get much success, except the approach I adopted in this patch.

I should have provided exact commands here with issues in each so I need 
to re-construct the scripts first and post the excerpts here. I'll play 
around with v4l2-ctl (since you prefer not having yavta+v4l2-ctl 
combination) and see if I can replicate the goal as achieved here.

>
>> Another short-coming of this patch is when specific parameter-buffer(s)
>> (from a file) are needed to streamed on the parameters node, this might
>> require some adjusting. For now, the parameters node streams with
>> un-assigned buffers. It depends on the decision how this script is
>> expanded further down the line.
> Any proposal ? :-)


Not yet. I need to design a test case to develop it. Would you like to 
suggest any?

>
>> Signed-off-by: Umang Jain <umang.jain at ideasonboard.com>
>> ---
>>   utils/ipu3/ipu3-process.sh | 29 ++++++++++++++++++++++++-----
>>   1 file changed, 24 insertions(+), 5 deletions(-)
>>
>> diff --git a/utils/ipu3/ipu3-process.sh b/utils/ipu3/ipu3-process.sh
>> index bb4abbe8..48466d70 100755
>> --- a/utils/ipu3/ipu3-process.sh
>> +++ b/utils/ipu3/ipu3-process.sh
>> @@ -37,11 +37,13 @@ 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]"
>> @@ -76,9 +78,26 @@ process_frames() {
>>   	$yavta $($mediactl -e "$imgu_entity 3a stat") &
>>   	sleep 0.5
>>   
>> -	# Feed the IMGU input.
>> -	$yavta -f $IMGU_IN_PIXELFORMAT -s $in_size "-F$in_file" \
>> -		$($mediactl -e "$imgu_entity input")
>> +	echo "Feeding IMGU $in_size"
>> +	# Start stream parameters node first
>> +	v4l2-ctl -d$($mediactl -e "$imgu_entity parameters") --stream-out-mmap &
>> +	local param_streaming=$!
>> +
>> +	# Start streaming on input node
>> +	local width=$(echo $in_size | awk -F 'x' '{print $1}')
>> +	local height=$(echo $in_size | awk -F 'x' '{print $2}')
>> +	v4l2-ctl -d $($mediactl -e "$imgu_entity input") \
>> +                --set-fmt-video-out=width=$width,height=$height,pixelformat=$IMGU_IN_PIXELFORMAT \
>> +                --stream-out-mmap --stream-from=$in_file --stream-loop &
>> +	local input_streaming=$!
>> +
>> +	# Sleep for 1 second and then kill the IMGU streaming. By then $frame_count output and vf
>> +	# buffers should have been captured.
>> +	sleep 1
>> +	kill $input_streaming
>> +	kill $param_streaming
>> +
>> +	echo "IMGU FED"
>>   }
>>   
>>   # Convert captured files to ppm
>> @@ -98,7 +117,7 @@ convert_files() {
>>   }
>>   
>>   run_test() {
>> -	IMGU_IN_PIXELFORMAT=IPU3_SGRBG10
>> +	IMGU_IN_PIXELFORMAT=ip3G
>>   	IMGU_OUT_PIXELFORMAT=NV12
>>   	IMGU_VF_PIXELFORMAT=NV12
>>   
>> @@ -193,6 +212,6 @@ mediactl="media-ctl -d $mdev"
>>   echo "Using device $mdev"
>>   
>>   output_dir="/tmp"
>> -frame_count=5
>> +frame_count=10
>>   nbufs=7
>>   run_test


More information about the libcamera-devel mailing list