[whatwg] Proposal: downsample while decoding image blobs in createImageBitmap()

Rik Cabanier cabanier at gmail.com
Tue Dec 17 22:55:33 PST 2013

On Tue, Dec 17, 2013 at 9:36 PM, David Flanagan <dflanagan at mozilla.com>wrote:

>  On 12/17/13 8:36 PM, Rik Cabanier wrote:
> Hi David,
>  is there a reason why you are completely decoding the image when you
> create the imageBitmap? [1]
> I assume that that is the intent of calling createImageBitmap() on a blob.
> Since JPEG decoding probably takes significantly longer than blocking on
> memory access, I assume that lazy decoding is not really allowed.

No, nothing in the spec says that you *must* decode the bits:

The exact judgement of what is undue latency of this is left up to the
implementer, but in general if making use of the bitmap requires network
I/O, or even local disk I/O, then the latency is probably undue; whereas if
it only requires a blocking read from a GPU or system RAM, the latency is
probably acceptable.

In your case, things are reversed. Allocating system ram will kill
performance and cause undue latency. Reading the JPEG image on the fly from
a Flash disk will be less disruptive and faster.

> But that misses my point. On the devices I'm concerned with I can never
> completely decode the image whether it is deferred or not.  If I decode at
> full size, apps running in the background are likely to be killed because
> of low memory. I need the ability to do the downsampling during the
> decoding process, so that there is never the memory impact of holding the
> entire full-size image in memory.
>   If you detect a situation where this operation causes excessive memory
> consumption, you could hold on to the compressed data URL and defer
> decoding until the point where it is actually needed.
> Since exhausting VM will create "undue latency", this workaround follows
> the spirit of the spec.
>  If you really want to have the downsampled bits in memory, you could
> create a canvas and draw your image into it.
> I can't do that because I don't have (and cannot have) a full-size decoded
> image.  I've got a blob that is a JPEG encoded 5 megapixel image.  And I
> want to end up with a decoded 320x480 image.  And I want to get from A to B
> without ever allocating 20mb and decoding the image at full size

The downsampling happens *during* the drawimage of the imageBitmap into the
canvas. At no point do you have to allocate 20mb.

>  6) Finally, because image data can take up so much memory, I would
>> like to propose that ImageBitmap have a release() method to explicitly
>> free the memory that holds the decoded image when that decoded image
>> data is no longer needed. This gives web applications more precise
>> control over memory allocation without having to wait for garbage
>> collection.
>  There was an email thread on adding this to canvas [2], it seems
> reasonable to add it to imageBitmap as well.
>  1:
> http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-createimagebitmap
> 2:
> http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2013-July/040165.html
> Thanks for this link.  It looks like the January message quoted in this
> July message is requesting exactly the same feature as I am for discarding
> or releasing ImageBitmaps.
>   David

More information about the whatwg mailing list