I'm an idiot.
I like to enclose my HTML attributes in double quotes. So I had the type attribute written out like so:
<source src="x.mp4" type="video/mp4; codecs='avc1.42E01E, mp4a.40.2'" />
It turns out FF and Opera don't like that. They refuse to acknowledge the existence of different video sources unless the types are written out like this:
<source src="x.mp4" type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"' />
You catch that? Single quotes around the whole type, double quotes around the codecs. Once I did that, everything started working fine.