Sure does Doug! Thanks for the tips.

I'm actually re-writing the corelib version now to make it more efficient for larger images. Right now encoding a 2k image takes much longer than I'm happy with. :)

I was doing a bit more research and will be breaking it up into 'chunks' with progress events, hopefully.

If I get a good result I'll post back the code to the corelib project.

peace,

jon


On Sep 22, 2007, at 1:38 PM, Doug McCune wrote:

This is doable, but requires a little more work than you probably think. To do this you would modify JPEGEncoder, if you're using Moxie take a look at the JPEGEncoder class around line 121. You'll see this double for loop:

for (var ypos:int = 0; ypos < height; ypos += 8)
        {
            for (var xpos:int = 0; xpos < width; xpos += 8)
            {
                RGB2YUV(source, xpos, ypos, width, height);
                DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT);
                DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT);
                DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT);
            }
        }

As far as I can tell that's where the bulk of the processing happens. What you're going to want to do is add progress events dispatching in there. But simply dispatching progress events isn't going to be enough. That would effectively give you notifications for progress of encoding, but since flash player is single threaded, your display won't ever have time to update while those for loops are running.

So you'll need to split the processing up into smaller tasks and insert idle times between them. You'll want to use the Timer class to make your code wait for a given period (I've found that even just a few milliseconds is enough for the display to update).

I would split up the algorithm to process one row at a time (so basically that inner for loop gets turned into its own function). Then have the function that processes a row start a timer once it's completed, and once that timer completes, then run the function for the next row and so on until you finish. That was you can dispatch a progress event for each row and the display will have time to update.

Hope some of that makes sense.

Doug

Reply via email to