Too much spin time for single process multi channel decoder.
- Dominant language
- C
- Stars
- 1.2k
- Forks
- 383
- Avg merge
- 8d 18h
- Merged PRs (30d)
- 4
Description
If you use vtune to profile following comand:
`gst-launch-1.0 tee name = t filesrc location=1920x1080_2700frames.264 ! t. t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false t. ! h264parse ! queue ! vaapih264dec ! "video/x-raw(memory:VASurface)" ! fpsdisplaysink video-sink=fakesink sync=false `
you will see the 16.8% cpu time used by spin.

most time used by DdiMedia_GetBufferFromVABufferID

the root cause of this issue is, we lock a global mutex(in VADisplay) for all VabufferID related operation:
https://github.com/intel/media-driver/blob/943e4f000022d678be89dee98c74affb708ced13/media_driver/linux/common/ddi/media_libva_common.cpp#L428
All threads will compete for this mutex
To reduce race condition, We'd better move this mutex to decoder context (this will save 16.8% cpu time)
Or even better, since the decoder context is not reenterable, we do not need to hold any lock. this may save all unlock time(other 10% cpu time)
Contributor guide
Assessment
This issue has not been assessed yet.