Files
haikuports/media-video/handbrake/state.md
Markus Himmel 0261320e86 HandBrake: Work on the Haiku GUI
Add a new file state.md to indicate what state the port is in.
This also marks HandBrake 0.10.2 as broken on x86_gcc2 as there is no version
of FFmpeg which works on x86_gcc2 that provides the library version required
by HandBrake.
2016-01-21 17:03:41 +01:00

10 KiB

HandBrake, the well-known DVD ripping and video transcoding tool, was initially developed for BeOS and had a fully featured BeOS GUI. However, support for Haiku is not as great as this suggests. BeOS support was dropped in early 2007 (commit c0b2eca), though the GUI was already considered deprecated at this point. The last HandBrake release which included the BeOS code was 0.7.1 (Feb 24, 2006).

What has been done

All versions of HandBrake currently on HaikuPorter are versions that do not include the BeOS GUI. The only way that HandBrake can be used on Haiku at the current moment is using the command line tool HandBrakeCLI.

HaikuBrake

Versioning

There has been an attempt to bring the BeOS GUI back to Haiku. @kallisti5's HaikuBrake is based on a commit with a commit message starting with "WinGui: Fix a number of potential...." (4eb9b19 on HaikuBrake and feb7340 in the offical HandBrake repo) from December 8, 2012. This commit was on master and descended from version 0.9.6 (it is 519 commits ahead, to be precise). Note that the commit acutally occurred after 0.9.8 in terms of time, but HandBrake branched right after 0.9.6 (at 78052b5) into a branch moving towards 0.10.0 and a 0.9.x branch. The 0.9.x branch was not merged, but I think that at least some fixes were cherry-picked from 0.9.x to 0.10. The commit HaikuBrake is based on is part of the branch for 0.10.0.

Fixes

All in all, the code in this repo is changed in the following way: It puts in the BeOS GUI code, adds a Makefile for that, removes the dependency on the contrib packages so that system versions of the libraries are used instead, and "fixes" the BeOS GUI so that it builds. One notable commit is 86e06dd. It makes the BeOS code compile again. However, this is mainly done by enclosing all code which does not interface in #if 0, disabling a lot of the functionality to the point of the GUI not being remotely useful anymore. For instance, audio support is simply dropped (e.g. here). Needless to say, even if the GUI built again with these changes, it basically was not usable. A checkout of HaikuBrake did not compile on my machine, apparently due to library version mismatches (though I did not try too hard to make it work, so it might be possible).

The HaikuPorts patches

The HaikuPorts patches for version 0.10.2 as of 005299 are a mixture of patches to fix the build of the main library and CLI, some commits from HaikuBrake, as well as some more patches which seem to address some additional issues which may have come up due to even more changes. As these patches run against version 0.10.2, there are a lot of additional incompatibilities due to API changes, which is why the build of the BeOS code is once again broken.

What I have done

Work off of 0.10.2

The Haiku API is mostly stable, but the libhandbrake API is not (this is no surprise. All software which officially targets libhandbrake is in the HandBrake repository itself. This includes the .NET bindings as well as the GUIs for the various platforms. When a breaking API change is made, the corresponding frontends can immediately be fixed. Unfortunately, right now, the Haiku code does not have this luxury and likely won't have it anytime soon). Off of the patchset for 0.10.2, getting the code to build is just a matter of replacing a handful of library calls with their respective updated versions. However, getting it to work is a different matter entirely: All calls have to be verified to work. You have to verify what exactly the replacement for a certain library call is and whether it does anything different or unexpected. Also, a lot of calls and functionality is currently put in #if 0. All of it has to be restored and updated calls have to be found. A section "Tools" below will go into detail on how I went about finding these sorts of replacements. I got the code to build and started fixing a few bugs. However, the library interaction is still broken. Currently, the most pressing problem is the fact that muxer and encoder are not set at all, resulting in an empty output. I will make a pull request with the handful of improvements I have made once I am done writing this.

Work off of 0.7.1

I have evaluated the feasibility of the approach of updating the GUI code off of this version. See below for results; if someone is interested in the changes that I made to the build system I can upload them here.

Tools

After fixing a few library calls and getting up to date on HandBrake history, here are a few techniques that have been successful for me when searching for things.

git

Git is an extremely useful tool for tracking down library changes. Your best friend is git bisect. This of course requires the actual HandBrake repository and not just the download in the haikuports work folder. If you know that a library call existed back in 0.7.1 but does not exist at master just bisect and look for the commit that removed it. To check whether it is still there in a specific revision use grep or even better ag. The commit that removes a specific library call will most likely also change its uses in the CLI and GUIs, so you know what to replace the call with.

To find out what time and version a revision belings to, use git show and git describe and possibly git merge-base.

Usage in the HandBrake repository

The HandBrake repository also contains HandBrakeCLI at test/test.c and also several GUIs. See how they implemented a certain functionality and adapt the code for the Haiku GUI.

What has to be done

Fix problems with HandBrake itself

There still seem to be bugs in HandBrake which are specific to Haiku but not related to the BeOS GUI. For example, I do testing with a .iso which works perfectly fine with HandBrake 0.10.2 on Windows, but crashes HandBrakeCLI on Haiku. These bugs have to be investigated.

Get the GUI to work, preferrably on a modern version

There are several ways to go about this.

Start with a modern version, put in the code, and fix stuff until it works

This is basically what happens in the 0.10.2 patchset. Library calls are replaced with their successors. However, this causes some problems which are hard to fix, as sometimes, non-obvious changes have to be reflected in the GUI. For example, 16deb21428 (June 3, 2013) introduced a function hb_global_init which has to be called before any other function in the library. If it is not called, the library starts segfaulting in unpredictable places. As libhandbrake is not intended to be used outside of its own repository, no documentation exists. At all. It is therefore impossible to be absolutely sure that you are driving the library correctly.

Start with a version which supported the GUI and incrementally work upwards from there

This is a multi-step approach: Get the code for version 0.7.1 to work on Haiku and then update it in rather small steps until it is up to date. The advantage of this approach is that "unannounced" breaking changes are more easily found.

However, there is an enormous drawback to this approach: Dependencies. On most platforms, HandBrake automatically pulls in and builds the exact versions of the libraries it needs. The libraries are built statically and therefore are put into the executable. However, on Haiku, this approach does not work, as many of these libraries need Haiku-spacific patches which would need to be mirrored into the HandBrake code. This is clearly a suboptimal solution, and instead Haiku opts to simply use the system versions of these libraries (in the process, all patches HandBrake wanted to make to these libraries are of course discarded. I wonder if the impact of this has been evaluated, as one would expect these patches to be somehow required for HandBrake to interact with the library properly). However, older versions of HandBrake require older versions of its dependencies. For each version of HandBrake which is built, a slightly different API for the libraries is used. For the build to succeed, compatible versions of the library have to be installed on the system. Here is the list of specific versions which have to be installed just to get HandBrake 0.7.1 up and running:

  library | version

--------------|--------- a52de | 0.7.4 faac | 1.24 ffmpeg | 20060201 lame | 3.96.1 libdvdcss | 1.2.9 libdvdread | 20050928 libogg | 1.1.2 libsamplerate | 0.1.2 libvorbis | 1.1.1 mpeg2dec | 20051112 mpeg4ip | 1.3 x264 | r401 xvidcore | 1.1.0

Here is another problem with starting from 0.7.1: It uses a different build system. Luckily, this looks like it is a minor problem, as it's based on jam. After telling it to disregard to contrib folder and link against system libraries, it didn't seem to pose much of a problem, although I never saw it finish a build due to the dependency problem described above.

Rewrite the GUI from scratch

Possibly check other GUIs for inspiration.

Enhance the GUI

The GUI essentially reflects the feature-set of HandBrake about ten years ago. The library has changed a lot since then, and accordingly, the well-supported GUIs have added a lot more controls and features. It is probably a good idea to get those controls into the BeOS GUI as well.

Additionally, the GUI should be updated to use the Layout API.

One could also consider restyling the code, as the current code style is inconsistent with the rest of HandBrake.