Re: [RESEND PATCH v1 0/7] Performance improvement of decoder

From: Nicolas Dufresne
Date: Fri Apr 11 2025 - 13:02:40 EST


Hi Jackson,

Le jeudi 10 avril 2025 à 12:39 +0900, Jackson.lee a écrit :
> From: Jackson Lee <jackson.lee@xxxxxxxxxxxxxxx>
>
> v4l2-compliance results:
> ========================
>
> v4l2-compliance 1.28.1-5233, 64 bits, 64-bit time_t
>
> Buffer ioctls:
>                 warn: v4l2-test-buffers.cpp(693): VIDIOC_CREATE_BUFS
> not supported
>                 warn: v4l2-test-buffers.cpp(693): VIDIOC_CREATE_BUFS
> not supported
>         test VIDIOC_REQBUFS/CREATE_BUFS/QUERYBUF: OK
>         test CREATE_BUFS maximum buffers: OK
>         test VIDIOC_EXPBUF: OK
>         test Requests: OK (Not Supported)
>
> Total for wave5-dec device /dev/video0: 46, Succeeded: 46, Failed: 0,
> Warnings: 2
> Total for wave5-enc device /dev/video1: 46, Succeeded: 46, Failed: 0,
> Warnings: 0
>
> Fluster test results:
> =====================
>
> Running test suite JCT-VC-HEVC_V1 with decoder GStreamer-H.265-V4L2-
> Gst1.0
> Using 3 parallel job(s)
> Ran 133/147 tests successfully               in 41.629 secs

Same results here.

>
> (1 test fails because of not supporting to parse multi frames, 1 test
> fails because of a missing frame and slight corruption,
>  2 tests fail because of sizes which are incompatible with the IP, 11
> tests fail because of unsupported 10 bit format)
>
>
> Running test suite JVT-AVC_V1 with decoder GStreamer-H.264-V4L2-
> Gst1.0
> Using 3 parallel job(s)
> Ran 78/135 tests successfully               in 44.578 secs
>
> (57 fail because the hardware is unable to decode  MBAFF / FMO /
> Field / Extended profile streams.)

Same results here. There is also JVT-FR-EXT test suite now that you
should include. 23/69 here, without incident, but I did not analyze the
inner results, I'll leave that to you. Though, a quick looks shows that
YUV422 does not work anymore.

>
> Seek test
> =====================
> 1. gst-play-1.0 seek.264
> 2. this will use waylandsink since gst-play-1.0 uses playbin.
>    if you don't want to hook up display,
>    you can run gst-play-1.0 seek.264 --videosink=fakevideosink
> instead
> 3. Let pipeline run for 2-3 seconds
> 4. press SPACE key to pause
> 5. press 0 to reset
> press SPACE to start again
>
> gst-play-1.0 seek.264 --videosink=fakevideosink
> Press 'k' to see a list of keyboard shortcuts.
> Now playing /root/seek.264
> Redistribute latency...
> Redistribute latency...
> Redistribute latency...
> Redistribute latency...
> Redistribute latency...aused
> 0:00:09.9 / 0:00:09.7
> Reached end of play list.

So, I managed to resurrect my device. Once side effect of this series
is that the driver is no longer silent in normal cases. Pretty 'q'
while playing, or seeking seems to fill the kernel logs with these two
error.

[ 5037.457307] vdec 4210000.video-codec: wave5_vpu_dec_finish_decode:
could not get output info.
[ 5037.457436] vdec 4210000.video-codec:
wave5_vpu_firmware_command_queue_error_check: result not ready: 0x800

This needs fixing for the next version. The condition that makes these
non error needs to be tested so that we don't get spammed anymore. They
also occur while running fluster.

>
> Sequence Change test
> =====================
> gst-launch-1.0 filesrc location=./switch_1080p_720p_240frames.h264 !
> h264parse ! v4l2h264dec ! filesink location=./h264_output_420.yuv
> Setting pipeline to PAUSED ...
> Pipeline is PREROLLING ...
> Redistribute latency...
> Redistribute latency...
> Pipeline is PREROLLED ...
> Setting pipeline to PLAYING ...
> Redistribute latency...
> New clock: GstSystemClock
> Got EOS from element "pipeline0".
> Execution ended after 0:00:05.772414400
> Setting pipeline to NULL ...
> Freeing pipeline ...

I did a test of my own here, and did get kernel splat. The warning
indicate that the state machine is no longer respected. This needs to
be address in v2, we added these check, since the locking is bound to
legal use of the state machine.

[ 401.018648] Execution of a job in state STOP illegal.
[ 401.023761] WARNING: CPU: 0 PID: 635 at
drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c:1715
wave5_vpu_dec_device_run+0x448/0x83c [wave5]
[ 401.036890] Modules linked in: rfkill ip6table_filter ip6_tables
iptable_filter ip_tables x_tables rpmsg_ctrl rpmsg_char
phy_cadence_torrent rtc_tps6594 tps6594_esm tps6594_regulator
tps6594_pfsm pinctrl_tps6594 gpio_regmap ti_am335x_adc cdns3 kfifo_buf
cdns_usb_common qrtr mux_gpio omap_mailbox phy_j721e_wiz wave5
phy_can_transceiver ti_k3_r5_remoteproc v4l2_mem2mem
videobuf2_dma_contig videobuf2_memops tps6594_i2c videobuf2_v4l2
tps6594_core at24 k3_j72xx_bandgap sa2ul videodev m_can_platform
videobuf2_common authenc m_can ti_k3_dsp_remoteproc mc cdns3_ti
ti_am335x_tscadc can_dev rti_wdt fuse drm backlight dm_mod ipv6
[ 401.091795] CPU: 0 UID: 1000 PID: 635 Comm: h264parse0:sink Tainted:
G W 6.15.0-rc1-jacinto+ #1 PREEMPT
[ 401.102731] Tainted: [W]=WARN
[ 401.105687] Hardware name: Texas Instruments J721S2 EVM (DT)
[ 401.111330] pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS
BTYPE=--)
[ 401.118277] pc : wave5_vpu_dec_device_run+0x448/0x83c [wave5]
[ 401.124015] lr : wave5_vpu_dec_device_run+0x448/0x83c [wave5]
[ 401.129749] sp : ffff800084a0ba40
[ 401.133051] x29: ffff800084a0baf0 x28: ffff00080a64c130 x27:
ffff800084a0bc08
[ 401.140175] x26: 00000000c058560f x25: 0000000000000000 x24:
ffff00081331c000
[ 401.147297] x23: ffff00081331c010 x22: ffff00080ed059a8 x21:
ffff00081331dbc0
[ 401.154418] x20: ffff00081331d000 x19: 0000000000000000 x18:
0000000000000006
[ 401.161540] x17: 0000000000000000 x16: 0000000000000000 x15:
072e076c07610767
[ 401.168662] x14: ffff00080ee0b500 x13: 072e076c07610767 x12:
ffff800082107128
[ 401.175783] x11: 0000000000000058 x10: 0000000000000018 x9 :
ffff00080ee0b500
[ 401.182907] x8 : 00000000000004c7 x7 : ffff00080ee0b500 x6 :
ffff80008215f128
[ 401.190028] x5 : 0000000000000000 x4 : 0000000000000000 x3 :
0000000000000001
[ 401.197149] x2 : 0000000000000000 x1 : 0000000000000000 x0 :
ffff00080ee0b480
[ 401.204272] Call trace:
[ 401.206709] wave5_vpu_dec_device_run+0x448/0x83c [wave5] (P)
[ 401.212448] v4l2_m2m_try_run+0x84/0x134 [v4l2_mem2mem]
[ 401.217667] v4l2_m2m_qbuf+0x184/0x240 [v4l2_mem2mem]
[ 401.222709] v4l2_m2m_ioctl_qbuf+0x18/0x4e0 [v4l2_mem2mem]
[ 401.228184] v4l_qbuf+0x48/0x70 [videodev]
[ 401.232292] __video_do_ioctl+0x40c/0x4a0 [videodev]
[ 401.237260] video_usercopy+0x1e0/0x688 [videodev]
[ 401.242054] video_ioctl2+0x18/0x38 [videodev]
[ 401.246500] v4l2_ioctl+0x40/0x60 [videodev]
[ 401.250774] __arm64_sys_ioctl+0xb4/0xf4
[ 401.254690] invoke_syscall+0x48/0x104
[ 401.258433] el0_svc_common.constprop.0+0x40/0xe0
[ 401.263125] do_el0_svc+0x1c/0x28
[ 401.266431] el0_svc+0x30/0xcc
[ 401.269480] el0t_64_sync_handler+0x10c/0x138
[ 401.273827] el0t_64_sync+0x198/0x19c
[ 401.277480] ---[ end trace 0000000000000000 ]---
[ 401.316876] ------------[ cut here ]------------
[ 401.321523] Execution of a job in state STOP illegal.
[ 401.326992] WARNING: CPU: 0 PID: 635 at
drivers/media/platform/chips-media/wave5/wave5-vpu-dec.c:1715
wave5_vpu_dec_device_run+0x448/0x83c [wave5]


To test:
gst-launch-1.0 videotestsrc num-buffers=3 ! video/x-raw,format=NV12,width=320,height=240 ! v4l2h264enc ! filesink location=340x240.h264
gst-launch-1.0 videotestsrc num-buffers=3 ! video/x-raw,format=NV12,width=640,height=480 ! v4l2h264enc ! filesink location=640x480.h264
cat 340x240.h264 640x480.h264 340x240.h264 640x480.h264 > drc.h264
gst-launch-1.0 filesrc location=drc.h264 ! parsebin ! v4l2h264dec ! fakevideosink -v


>
> Change since v0:
> ===================
> * For [PATCH v1 2/7] media: chips-media: wave5: Improve performance
> of decoder
>  - separates the previous patch to a few patches
>
> * For [PATCH v1 3/7] media: chips-media: wave5: Fix not to be closed
>  - separated from the previous patch of performance improvement of
>    decoder
>
> * For [PATCH v1 4/7] media: chips-media: wave5: Use spinlock whenever
> state is changed
>  - separated from the previous patch of performance improvement of
>    decoder
>
> * For [PATCH v1 5/7] media: chips-media: wave5: Fix not to free
> resources normally when
>     instance was destroyed
>  - separated from the previous patch of performance improvement of
>    decoder
>
> * For [PATCH v1 7/7] media: chips-media: wave5: Fix SError of kernel
> panic when closed
>  - separated from the previous patch of performance improvement of
>    decoder
>
> Jackson Lee (7):
>   media: chips-media: wave5: Fix Null reference while testing fluster
>   media: chips-media: wave5: Improve performance of decoder
>   media: chips-media: wave5: Fix not to be closed
>   media: chips-media: wave5: Use spinlock whenever state is changed
>   media: chips-media: wave5: Fix not to free resources normally when
>     instance was destroyed
>   media: chips-media: wave5: Reduce high CPU load
>   media: chips-media: wave5: Fix SError of kernel panic when closed
>
>  .../platform/chips-media/wave5/wave5-helper.c |  10 +-
>  .../chips-media/wave5/wave5-vpu-dec.c         | 116 +++++++++++-----
> --
>  .../chips-media/wave5/wave5-vpu-enc.c         |   8 +-
>  .../platform/chips-media/wave5/wave5-vpu.c    |  70 +++++++++--
>  .../platform/chips-media/wave5/wave5-vpuapi.c |  36 +++---
>  .../platform/chips-media/wave5/wave5-vpuapi.h |  10 ++
>  .../chips-media/wave5/wave5-vpuconfig.h       |   1 +
>  7 files changed, 179 insertions(+), 72 deletions(-)

--
Nicolas Dufresne
Principal Engineer at Collabora