I've just spent some time playing with the issue.
If I create a local media stream, I can close it and the camera resource is freed up properly (little light on my laptop shuts off).
If I use the local media stream in a call, end the call, and then close the local media stream, the camera resource is not freed up.
I've tried grabbing all the media streams from the peer connection, stopping their media tracks and stopping the media streams, but all that did was kill the locally display media stream sooner, the camera resource was not freed up.
My belief adding the media stream to the peer connection makes a clone that we can't access. In short, I think it's a webrtc bug and not something we can fix. I'm happy to be proven wrong though :-).