2010-08-24
Experimental Playback Statistics for HTML Video and Audio
Now that HTML video is getting more usage there have been requests for statistics during playback so performance can be measured from JavaScript. This has come up a few times on the WHATWG mailing list.
I raised bug 580531 to add some additional data to media and video DOM elements to provide this information. The patch in that bug adds two attributes to the DOM HTMLVideoElement object, both prefixed by 'moz' to prevent name clashes as they are experimental:
interface nsIDOMHTMLVideoElement : nsIDOMHTMLMediaElement
{
...
// A count of the number of frames that have been decoded and ready
// to be displayed. This can be used for computing the decoding framerate
readonly attribute unsigned long mozDecodedFrames;
// A count of the number of frames that have been dropped for performance
// reasons during playback.
readonly attribute unsigned long mozDroppedFrames;
};
mozDecodedFrames is an incrementing count each time a frame is decoded and ready to be displayed. mozDroppedFrames is incremented each to a frame is dropped to keep playback going at the correct frame rate. These can be used to compute the current framerate that the video is being decoded at, and the framerate that it should be decoding at by combining the two counts. This will give client JavaScript code an indication if the hardware is able to play the video.
Another requested feature is information on the download rate. Currently the Firefox implementation of HTML video and audio uses a non-standard extension to 'progress' events. We provide information attached to the event that gives the current byte position in the media file as it downloads, and the total bytes available. This was actually required by the WHATWG spec at one point but it changed a while back and I don't think any other browser implements it.
This has been used in experimental pages to compute things like download rate and we use it in our own controls implementation to display a progress bar as we didn't implement the 'buffered' attribute. Support for 'buffered' has now landed so we want to remove the non-standard 'progress' information to be spec compliant.
To address the needs of those using the progress data for bandwidth calculation I've added two attributes to HTMLMediaElement:
interface nsIDOMHTMLMediaElement : nsIDOMHTMLElement
{
...
// The approximate rate at which the media resource is being downloaded in
// bytes per second. If the rate is not available (possibly due
// to not having downloaded enough data to compute a consistent value)
// this will be NaN.
readonly attribute float mozDownloadRate;
// The approximate rate at which the media resource is being decoded in
// bytes per second. If the rate is not available this will be
// NaN.
readonly attribute float mozDecodeRate;
};
mozDownloadRate is an estimate, in bytes per second, of the current download rate of the media. If not enough information has been downloaded for a reliable estimate this will be NaN. mozDecodeRate provides the rate at which decoding is occurring. In the patch this is the length of the video divided by the duration and remains constant.
Whether this gets landed is yet to be determined but I think the information is useful and I'd be interested in any feedback on the data I've decided to include. There is some feedback in the bug from the patch review already and there's plenty of time between now and when the Firefox 4 rush is over to look over ideas of what could be included, removed or changed. I posted about the proposed additions in the WHATWG mailing list and there are some responses in that thread.