Friday, August 26, 2016

TenFourFox 45.3 beta 2 is now available (downloads, hashes, release notes). The issue with video frame skipping gone awry seems to be due to Mozilla's MediaSource implementation, which is (charitably) somewhat incomplete on 45 and not well-tested on systems of our, uh, vintage. Because audio is easier to decode than video the audio decoder thread will already have a speed advantage, but in addition the video decoder thread appears to only adjust itself for the time spent in decoding, not the time spent pushing the frames to the compositor or blitting them to the screen (which are also fairly costly in our software-rendered world). A frame that's simple to decode but requires a lot of painting will cause the video thread to get further and further behind queueing frames that the compositor can't keep up with. Even if you keep skipping keyframes, you'll end up more than one keyframe behind and you'll never catch up, and when this occurs the threads irrevocably go out of sync. The point at which this happens for many videos is almost deterministic and correlates well with time spent in compositing and drawing; you can invariably trigger it by putting the video into full screen mode which dramatically increases the effort required to paint frames. In a few cases the system would just give up and refuse to play further (hitting an assertion in debug mode).

After a few days of screaming and angry hacking (backporting some future bug fixes, new code for dumping frames that can never be rendered, throwing out the entire queue if we get so far behind we'll never reasonably catch up) I finally got the G5 to be able to hold its own in Reduced Performance but it's just too far beyond the G4 systems to do so. That's a shame since when it does work it appears to work pretty well. Nevertheless, for release I've decided to turn MediaSource off entirely and it now renders mostly using the same pipeline as 38 (fortunately, the other improvements to pixel pushing do make this quicker than 38 was; my iBook G4/1.33 now maintains a decent frame rate for most standard definition videos in Automatic Performance mode). If the feature becomes necessary in the future I'm afraid it will only be a reasonable option for G5 machines in its current state, but at least right now disabling MediaSource is functional and sufficient for the time being to get video support back to where it was.

The issue with the Amazon Music player is not related to or fixed by this change, however. I'm thinking that I'll have to redo our minimp3 support as a platform MP3 decoder so that we use more of Mozilla's internal media machinery; that refactoring is not likely to occur by release, so we'll ship with the old decoder that works most other places and deal with it in a future update. I don't consider this a showstopper unless it's affecting other sites.

Other changes in 45.3 beta 2 are some additional performance improvements. Most of these are trivial (including some minor changes to branching and proper use of single-precision math in the JIT), but two are of note, one backport that reduces the amount of allocation with scrolling and improves overall scrolling performance as a result, and another one I backported that reduces the amount of scanning required for garbage collection (by making garbage collection only run in the "dirty" zones after cycle collection instead of effectively globally). You'll notice that RAM use is a bit higher at any given moment, but it does go back down, and the browser has many fewer random pauses now because much less work needs to be done. Additionally in this beta unsigned extensions should work again and the update source is now set to the XML for 45. One final issue I want to repair before launch is largely server-side, hooking up the TenFourFox help button redirector to use Mozilla's knowledge base articles where appropriate instead of simply redirecting to our admittedly very sparse set of help documents on Tenderapp. This work item won't need a browser update; it will "just work" when I finish the code on Floodgap's server.

At this point barring some other major crisis I consider the browser shippable as 45.4 on time on 13 September, with Amazon Music being the highest priority issue to fix, and then we can start talking about what features we will add while we remain on feature parity. There will also be a subsequent point release of TenFourFoxBox to update foxboxes for new features in 45; stay tuned for that. Meanwhile, we could sure use your help on a couple other things:

Right now, our localized languages for the 45 launch are German, Spanish, French and Japanese, with an Italian translation in progress. We can launch with that, but we're losing a few languages there we had with 38. You can help.

Even minor releases of the browser get a small bump in support tickets on Tenderapp; a major release (such as 31 to 38, and now 38 to 45) generally brings lots of things out of the woodwork that we've never seen during the beta cycle. Most of these reports are spurious, but sometimes serious bugs have been uncovered even though they looked obviously bogus at first glance, and all of them need to be triaged regardless. If you're a reasonably adept user and you've got a decent understanding of how the browser works, help us help your fellow users by being a volunteer on Tenderapp. There's no minimum time commitment required; any help you can offer is appreciated, even if just temporary. Right now it's just Chris Trusch and me trying to field these reports, which is unsatisfactory to cover all of them (Theo used to but we haven't seen him in awhile). If you'd like to help, post in the comments and we'll make you a "blue name" on Tenderapp too.

Friday, August 19, 2016

So far the TenFourFox 45 beta is doing very well. There have been no major performance regressions overall (Amazon Music notwithstanding, which I'll get to presently) and actually overall opinion is that 45 seems much more responsive than 38. On that score, you'll like beta 2 even more when I get it out: I raided some more performance-related Firefox 46 and 47 patches and backported them too, further improving scrolling performance by reducing unnecessary memory allocation and also substantially reducing garbage collection overhead. There are also some minor tweaks to the JavaScript JIT, including a gimme I should have done long ago where we use single-precision FPU instructions instead of double-precision plus a rounding step. This doesn't make a big difference for most scripts, but a few, particularly those with floating point arrays, will benefit from the reduction in code size and slight improvement in speed.

Unfortunately, while this also makes Amazon Music's delay on starting and switching tracks better, it's still noticeably regressed compared to 38. In addition, I'm hitting an assertion with YouTube on certain, though not all, videos over a certain minimum length; in the release builds it just seizes up at that point and refuses to play the video further. Some fiddling in the debugger indicates it might be related to what Chris Trusch was reporting about frameskipping not working right in 45. If I'm really lucky all this is related and I can fix them all by fixing that root problem. None of these are showstoppers but that YouTube assertion is currently my highest priority to fix for the next beta; I have not solved it yet though I may be able to wallpaper it. I'm aiming for beta 2 this coming week.

On the localization front we have French, German and Japanese translations, the latter from the usual group that operates separately from Chris T's work in issue 42. I'd like to get a couple more in the can before our planned release on or about September 13. If you can help, please sign up.

Wednesday, August 3, 2016

Like pretty much every major ESR jump from before, some sites will be faster and some sites will be slower. The biggest new change is that we are now building the full Intl API with ICU support (issue 304). We were able to get away without it in 31 and 38 due to various hacked-in stubs but now too much in the browser (let alone add-ons) requires it. To avoid issue 266 we build a shared ICU and shared data file which will degrade startup time while they get searched and loaded along with all the others. There are also new UI features in the browser such as search suggestions (which you can disable) that add overhead, and certain layout and rendering operations are more heavyweight than they were in earlier releases. I've tried to load in some later performance updates to counter this last issue, but they don't erase the delta completely. On the plus side, however, as mentioned previously JavaScript JIT performance jumped 20% between 38 and 45, and low-level graphics performance and software pixel pushing is faster which manifests in better animation performance and smoother scrolling.

Remaining issues include Amazon Music failing to advance tracks in playlists (the JIT has been exonerated, so I'm still spinning my wheels here), disabling the last remnants of signed extensions (which I philosophically disagree with) and changing the update notification source. Otherwise it seems to function very well once it's loaded everything and got most of the browser chrome in the JIT. The browser is tested on my usual lab machines, the 16GB monster Quad G5, a 1.5GB 1.33GHz iBook G4, a 1.25GB 1GHz iMac G4 15" and a 2GB 450MHz Sawtooth G4, all running Tiger. TenFourFoxBox appears to work with no changes needed but you may want to keep 38.10 around for right now if you are using foxboxes heavily, just in case (please report issues as you find them).

On the build side, pretty much the process is the same as 38 except that gcc 4.8 is now required. The MacPorts build of gcc is what I use, and I'd like to hear if other builds from our other unofficial package maintainers also work. The hacked strip7 unfortunately is still needed for stripping release binaries to handle the variant N_SECTs in the object files. One irregularity is that gcc 4.8 can't distinguish Objective-C messages from C++11 lambdas, or rather, that Objective-C++ has priority over lambdas, so that you can't reliably use both language features in the same file. This occurs in exactly one place in the entire code base, in code we don't support anyway, so it's #ifdefed off. If your local changes run afoul of this, try adding #define GCC_SUCKS_MOOSE_WANG (yes, really, I was a bit peeved that day) and see if it builds with that, or put the C++11 lambdas into another file and have your Objective-C++ call it instead. The build instructions are updated and available now, and with luck our esteemed colleague in the Land of the Rising Sun will be able to build Tenfourbird on the 45 base as well. Also, as you will see, the G3 version built just fine and will still be supported in 45 and thereafter.

Localizers should be aware of two new files, TenFourFox.dtd and TenFourFox.properties, which will be the locale basis for features I am considering or planning to release. I'd rather have translations for features I decide against implementing than not having strings for features I do implement, so almost nothing in those two files (which are roughly the same strings in different places) is being used right this second; that said, however, the idea is to roll out features using these strings during 45's lifetime as we move from source parity to feature parity and this will enable me to do so more quickly. If you would like to contribute to the localization effort (we really appreciate it), Chris T wrangles the cats in issue 42. The aim is to have substantially the same languages available for 38 available for 45 at or near the time of release in about six weeks. Your help is invaluable in this effort.

Finally, let's give 38 a rousing round of applause for being a solid, long lived branch release as it rides off into the ESR sunset. Its end also means the end of one of the oddest chapters in Firefox history, Debian Iceweasel, which has now reverted to being "just" Firefox as of 45ESR. Although both we and they rebranded ourselves because of various changes to Firefox we were making, we'll still be keeping our name because we really do change the feature set and make various platform-specific changes Mozilla would probably find unacceptable otherwise. Plus it gives you guys something to still complain about, along with the icon. :)

Don't file Github tickets on beta issues; post them in the comments. Please be kind. This was literally months of work. Thanks and let's start banging the bugs out.