<div dir="auto"><div><br><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Le mer. 4 janv. 2023, 06 h 01, James Linder via gstreamer-devel <<a href="mailto:gstreamer-devel@lists.freedesktop.org">gstreamer-devel@lists.freedesktop.org</a>> a écrit :<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
<br>
> On 4 Jan 2023, at 3:54 pm, James Linder via gstreamer-devel <<a href="mailto:gstreamer-devel@lists.freedesktop.org" target="_blank" rel="noreferrer">gstreamer-devel@lists.freedesktop.org</a>> wrote:<br>
> <br>
> <br>
> <br>
>> On 4 Jan 2023, at 1:52 pm, James via gstreamer-devel <<a href="mailto:gstreamer-devel@lists.freedesktop.org" target="_blank" rel="noreferrer">gstreamer-devel@lists.freedesktop.org</a>> wrote:<br>
>> <br>
>> <br>
>> <br>
>>> On 4 Jan 2023, at 7:29 am, Nicolas Dufresne via gstreamer-devel <<a href="mailto:gstreamer-devel@lists.freedesktop.org" target="_blank" rel="noreferrer">gstreamer-devel@lists.freedesktop.org</a>> wrote:<br>
>>> <br>
>>> Any chance you could share a trace with env GST_DEBUG="*v4l*:7,2" ?<br>
>>> <br>
>>> Le mar. 3 janv. 2023, 10 h 46, James via gstreamer-devel <<a href="mailto:gstreamer-devel@lists.freedesktop.org" target="_blank" rel="noreferrer">gstreamer-devel@lists.freedesktop.org</a>> a écrit :<br>
>>> I'm avoiding any reference to the rude rant a few days back.<br>
>>> <br>
>>> I tried/tested lots before writing code which has worked somewhere (ubuntu 22.04 with gst 18 that stutters audio, SUSE tumbleweed gst 20..latest.)<br>
>>> <br>
>>> All parcelled up and " Failed to allocate required memory" reared it's ugly head.<br>
>>> <br>
>>> Either branch runs perfectly on it's own, starting the other fails.<br>
>>> I run one channel from my code. Take one of my tests<br>
>>> <br>
>>> dvr@dvrTW:~> cat gst.try55<br>
>>> gst-launch-1.0 -v v4l2src device=/dev/video2 ! image/jpeg,framerate=30/1 \<br>
>>>        ! jpegdec ! \<br>
>>>       videoconvert ! \<br>
>>> queue max-size-buffers=0 max-size-bytes=0 max-size-time=1000000000 ! \<br>
>>> gdkpixbufoverlay location=rennisons.png alpha=0.5 offset-x=1800 offset-y=900 ! \<br>
>>> clockoverlay halignment=left valignment=top draw-outline=true font-desc="Sans, 12" time-format="%d %b %Y %H:%M:%S" ! \<br>
>>> textoverlay text="This is Line 1"               deltay=50  halignment=left valignment=top font-desc="Sans, 10"      draw-outline=true ! \<br>
>>> textoverlay text="Line 2"               deltay=100 halignment=left valignment=top font-desc="Sans, 10"              draw-outline=true ! \<br>
>>> textoverlay text="Look it works" deltax=50 deltay=150 halignment=left valignment=top font-desc="Cantarell Oblique Medium 20" draw-outline=true ! \<br>
>>> textoverlay                             deltay=200 halignment=left valignment=top font-desc="Sans, 10"              draw-outline=true ! \<br>
>>> textoverlay text="Line 5"               deltay=250 halignment=left valignment=top font-desc="Sans, 10"              draw-outline=true ! \<br>
>>> textoverlay                             deltay=300 halignment=left valignment=top font-desc="Sans, 10"              draw-outline=true ! \<br>
>>> textoverlay                             deltay=350 halignment=left valignment=top font-desc="Sans, 10"              draw-outline=true ! \<br>
>>> textoverlay                             deltay=400 halignment=left valignment=top font-desc="Sans, 10"              draw-outline=true ! \<br>
>>> textoverlay text="Why"                  deltay=450 halignment=left valignment=top font-desc="Sans, 10"              draw-outline=true ! \<br>
>>> textoverlay text="Line 10"              deltay=500 halignment=left valignment=top font-desc="AdobeTimes Bold 10"    draw-outline=true ! \<br>
>>>       tee name=t \<br>
>>>        t. ! queue ! xvimagesink sync=false \<br>
>>>       t. ! queue ! \<br>
>>>        x264enc speed-preset=ultrafast tune=zerolatency byte-stream=true bitrate=4000 ! \<br>
>>>        mpegtsmux name=mux ! \<br>
>>>        filesink location='try55.mp4'<br>
>>> <br>
>>> <br>
>>> and run it<br>
>>> <br>
>>> dvr@dvrTW:~> ./gst.try55<br>
>>> Setting pipeline to PAUSED ...<br>
>>> Pipeline is live and does not need PREROLL ...<br>
>>> Pipeline is PREROLLED ...<br>
>>> Setting pipeline to PLAYING ...<br>
>>> New clock: GstSystemClock<br>
>>> /GstPipeline:pipeline0/GstV4l2Src:v4l2src0.GstPad:src: caps = image/jpeg, framerate=(fraction)30/1, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, colorimetry=(string)2:4:5:1<br>
>>> /GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:src: caps = image/jpeg, framerate=(fraction)30/1, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, colorimetry=(string)2:4:5:1<br>
>>> /GstPipeline:pipeline0/GstJpegDec:jpegdec0.GstPad:sink: caps = image/jpeg, framerate=(fraction)30/1, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, colorimetry=(string)2:4:5:1<br>
>>> /GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:sink: caps = image/jpeg, framerate=(fraction)30/1, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, colorimetry=(string)2:4:5:1<br>
>>> ERROR: from element /GstPipeline:pipeline0/GstV4l2Src:v4l2src0: Failed to allocate required memory.<br>
>>> Additional debug info:<br>
>>> ../sys/v4l2/gstv4l2src.c(777): gst_v4l2src_decide_allocation (): /GstPipeline:pipeline0/GstV4l2Src:v4l2src0:<br>
>>> Buffer pool activation failed<br>
>>> Execution ended after 0:00:00.005402443<br>
>>> ERROR: from element /GstPipeline:pipeline0/GstV4l2Src:v4l2src0: Internal data stream error.<br>
>>> Setting pipeline to NULL ...<br>
>>> Additional debug info:<br>
>>> ../libs/gst/base/gstbasesrc.c(3127): gst_base_src_loop (): /GstPipeline:pipeline0/GstV4l2Src:v4l2src0:<br>
>>> streaming stopped, reason not-negotiated (-4)<br>
>>> Freeing pipeline ...<br>
>>> <br>
>>> Can anybody point me in a direction that solves it please.<br>
>>> <br>
>>> I emphasize that somewhere during testing I had 4 channels all running, every channel runs it's own copy of gstreamer and AFAICT each copy is totally independant. We *must* be looking at some resource<br>
>>> This is running on i7x4 and htop shows 50% cpu and memory used.<br>
>>> <br>
>>> The messing around with jpeg was a suggestion from Nicolas. Each capture card is USB3 in a USB3 port, but the system treated them as USB2 and limited resolution (1280x800 IIRC instead of 1080P)<br>
>>> <br>
>>> If it was still a lack of bandwidth, UVC driver should be messaging you through dmesg. <br>
>> <br>
>> I'll revert and look but the crux is solved!<br>
>> <br>
>> The jpeg fiddle was your suggestion to get 1080 on a usb-3 port. The error message was caused by having 2 capture cards on (a hub) a single usb-3 port even though that is quite legal (in terms of bandwidth).<br>
>> I will also try 2 cards on a usb-c.<br>
>> Then to find the culprit gstreamer or UVC driver.<br>
>> <br>
>> My m2 adapter is S-L-O-W but on a standard flash disk I can hold 500Mb/s on the usb-3 port.<br>
>> Someone pretends the usb-3 is a usb-2: who?<br>
>> <br>
> <br>
> How do I discover who, does gstreamer ever talk to dmesg?<br>
> <br>
> …<br>
> [16587.796310] usb 3-2.4.4: Found UVC 1.00 device USB Video (534d:2109)<br>
> [16587.798893] hid-generic 0003:534D:2109.0009: hiddev98,hidraw6: USB HID v1.10 Device [MACROSILICON USB Video] on usb-0000:00:14.0-2.4.4/input4<br>
> [16813.673158] usb 3-2.4.3: Not enough bandwidth for new device state.<br>
> [16813.673165] usb 3-2.4.3: Not enough bandwidth for altsetting 3<br>
<br>
A five year old kernel bug<br>
<br>
I know! I know! But still “dmesg saying Not enough bandwidth” would be much more enlightning than "Failed to allocate required memory”<br></blockquote></div></div><div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto">It's lack of time from all of us, but it should be easy to introduce a specific error code for this in V4L2 spec, and the implement it in GStreamer and UVC driver. For now, I think GStreamer is simply not aware of the difference between lack of bandwidth vs lack of memory. There is a great plane to move out the logic from the gst pool activation too, as that would help a lot not confusing allocation from streamon failures, but it will only work well after Linux has been improved. Time is a decisive factor for all of this refinement.</div><div dir="auto"><br></div><div dir="auto">Nicolas</div><div dir="auto"><br></div><div dir="auto">p.s. I volunteer my free time to support folks on this ML</div><div dir="auto"><br></div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
James<br>
<br>
</blockquote></div></div></div>