intel / intel/media-driver

Too much spin time for single process multi channel decoder.

Open
#743 3 comments 0 reactions 1 assignee Assigned to @XinfengZhang View on GitHub
P3 PnP
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.
![image](https://user-images.githubusercontent.com/6667546/66546977-c37b1a00-eb70-11e9-9562-97cd0197d313.png)

most time used by DdiMedia_GetBufferFromVABufferID
![image](https://user-images.githubusercontent.com/6667546/66547032-eb6a7d80-eb70-11e9-9014-81b905c3db74.png)

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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.