Okay, I’m probably more excited than I should be, but hey, who really has the rights to any meter on excitement?
WARNING
Let me warn upfront that THIS IS STILL EXPERIMENTAL. Don’t take anything I say here as the Jitsi Dev Team’s official stance; this is just me sharing my finding from an experiment, using codes that have not been fully vetted yet, nor formally released.
Now I’ve gotten that out of the way, let’s look at the fun stuff. If you’re somewhat familiar with codecs, you know that VP9 offers improvements over VP8. Jitsi has never officially supported VP9 (as far as I know), but in previous versions, it was possible to enable it, with some limits and caveats. In my quest to get the best quality possible, I’ve been bugging the Dev team to point me in directions on how to enable it - understanding the many limitations that exist in its current state (won’t work on Safari on older macOS, ios and even some other mobile devices). Well, it finally paid off!
SUMMARY
I was able to enable VP9 with bridge support using @Jonathan_Lennox’s PR. This involved using code that’s not been officially released or committed. The results were unquestionably fantastic!
BRIEF OF STEPS
Again, this is not officially released yet, so I did so at my own risk. I downgraded to an older version of JM to skip enhancements made to the current versions (which are somewhat incompatible with the PR). Going with instructions from @Jonathan_Lennox and some help from @bbaldino, I built a new JVB as well as the Jitsi-media-transform jar it depends on (from @Jonathan_Lennox’s PR) and dropped those in my installation. I then made the time-tested changes to jicofo for force VP9 and disable VP8.
TEST ENVIRONMENT
Server (MyJitsi)
Bare metal server
CPU - 8 cores 2.33GHz
RAM - 16GB
HDD - 300GB RAID
Available bandwidth (ethernet) - 300Mbps up/down
Clients
Client1 – Mac, OSx 10.13.6, Quad Core, Inter i7 – 2.5GHz, 16GB RAM (Brave)
Client2 – Mac, OSx 10.13.6, Quad Core, Inter i7 – 2.5GHz, 16GB RAM (Chromium)
Client3 – Android Phone (Jitsi Android App)
Client4 – PC Laptop, Windows 10 Pro, Duo Core, Intel i3 - 2.53GHz, 4GB RAM (Jitsi Electron App)
Client5 – Mac, OSx 10.13.6, Quad Core, Inter i7 – 2.5GHz, 16GB RAM (Jitsi Electron App)
Client Camera Resolutions
Client1 - 1280x720 max
Client2 - 1280x720 max
Client3 - 640x480
Client4 - 640x480 max
Client5 - 1280x720 max
RESULTS
First, I confirmed it was actually using the VP9 codec by checking on webrtc internals.
Client Impact
I checked the impact on client machines using the weakest machine I have available (Client4). My findings with 4 clients (Client1, Client2, Client3 and Client4) were as follows:
In Tile View:
CPU - 25.7%
Upload - 456Kbps
Download - 4.1Mbps
In Stage View:
CPU - 19%
Upload - 224Kbps
Download - 1.9Mbps
Server Impact:
Absolutely minimal! Seemed even lighter than with VP8 (and VP8 is already VERY low)
CPU - 4%
RAM - 0.9%
Findings
With 5 clients connected (in Tile view), I noticed bandwidth usage went even lower, checking on Client4 [I forgot to take the actual bandwidth readings]:
CPU - 28.9%
Upload - 184Kbps
Download - 3.0Mbps
And to me, since no test is complete without getting Jibri’s blessing , I invited Jibri to join the meeting and recorded for a little over a half-hour. Alas, Jibri was happy too! No undue memory or CPU spikes.
Small concerning observation: At one point, Client3 lost connection and video froze. I simply turned off the camera on Client3 and turned it back on and everything went back to normal (in fact, it came back with a better resolution - 480/360). Not sure if this is at all related to my VP9 implementation because I think I remember having the same issue once or twice before this.
CONCLUSION
I am BEYOND excited at my findings! Like I mentioned in my previous post detailing my tests, VP9 on Jitsi is definitely the way to go. The difference is so glaring, once you experience it, you’ll never be satisfied with anything less!
Well, happy Jitsi-ing, my friends! Now, I must excuse myself because I need to get some friends on a Jitsi call to do our happy Jitsi dance.
UPDATE: Edited to add graphs from server monitoring