SVC is the mobile-friendly alternative to simulcast: encode once, put several resolutions and frame rates in one bitstream, and let the server drop layers per viewer.
On Android hardware VP9, that contract does not hold.
Ask the encoder for L3T3 (three spatial layers × three temporal layers) and it will accept the mode. The bitstream you get back is one flat stream — usually the top resolution, with the lower spatial layers missing. The server expected three rungs and scored the stream as broken. The network was often fine.
This is not one chipset. We saw the same behavior on Samsung and Pixel, Qualcomm and Tensor. Hardware VP9 on Android does temporal SVC. Spatial layers are dropped, not degraded.
Software VP9 (libvpx) produces real spatial layers. The cost is CPU and battery, which is why you do not want it as the default on phones.
There is also no way to ask first. MediaCodec will tell you resolutions, bitrates, profiles, and temporal schemas. getSupportedLayeringSchemas() on Android 17 still returns temporal l1tN only. You find out from the bitstream.
If SVC quality on Android falls over only after a second viewer joins, check whether the hardware encoder actually emitted more than one spatial layer.
I wrote up the full debugging path here
Top comments (0)