Present Perfect


Picture Gallery
Present Perfect


Filed under: General — Thomas @ 19:38


Went out to one of my favourite restaurants last friday with Kristien and Nat: Can Margarit. It's a restaurant where the menu hasn't changed for the last 25 years, and there's only a small menu. But the rabbit is *ek-sel-lent* there, completely different from how mom makes it - lots of garlic, rosemary, thyme, and salt.

After that, we went to a bar I had never been before which I thought was great - nice music, not too smoky, atmospheric, decent cocktails though a little expensive.

All in all, an uneventful evening, except for one little detail. Right before getting the rabbit, I got a little fishbone stuck in my throat. I got a little teary-eyed and went to the bathroom to try and get it out. That didn't work very well, although I felt it move a little until it got lodged into the back of my throat.

We got home around 2 and I was starting to get a little worried. Stuck my fingers down my throat to get it out, I managed to throw up just fine but no fishbone came out. Tried to look at the back of my mouth in the mirror, didn't work, too dark. Took a smaller mirror and stood opposite of a light, trying to find the correct angle at which I could illuminate the back of my throat - pretty tricky, but finally worked. There was a little blood down the back and something white sticking out of the flesh. Tried to reach it with my finger but couldn't reach it reliably because it triggered my gag reflex. Took a pair of tweezers and tried to maneuver it but it was too hard trying to hold two things at once and look in the mirror.

Dragged Kristien in the bathroom, who freaked out, but managed to convince her that she really needed to try and get that white thing out of my throat. We tried in various positions. She gave me a knife to push down my tongue because my reflexes were curling up my tongue each time she got to the back of my mouth with the tweezers. After that, the tweezers weren't long enough, but luckily we had longer in the first aid kit. Kristien tried again, and this time it felt like she dislodged something, though it was hard to tell. Looking at it again, there was a little more blood, and the white bit sticking out was hard to find, so we assumed it was gone. It still felt like something was stuck in my throat further down, though. At this point I was getting really desperate.

Google to the rescue ! Amazing how many dimwits like me write about their incredible adventures with the stuck fishbone. While taking medical advice from the internet might not be a good idea, it was 2.30 AM and I really wanted to try some new ideas and was hoping they'd make sense. The most common advice seemed to be to eat rice without chewing, so Kristien put on some rice. But my biggest worry was "how important is it to get this bit of fish out of my throat right now ?" I mean, would it get horribly infected if I left it where it was, or could I die in my sleep while it perforated my lung, killing me softly with each breath ?

So I tried to call my dad (who's a doctor), but he was probably asleep. I called my sister (who's studying to become a doctor) and she started laughing when I explained the situation. I told her about the throwing up - an "uh oh" escaped her lips. I told her about the tweezers - "are you crazy ???" was her reply. So if any of you ever have this problem, don't try this at home.

She agreed with the rice strategy, though. She also put my mind to rest saying that the worst that could happen would already have happened by now - that would be the case where the fishbone manages to get in your windpipe and wind up in your lungs.

So, there I was, 3.00 AM, swallowing gobs of rice without chewing, trying to relax and not think about imminent death. After I had all the rice I could eat, I still felt like something was there, but it might as well just be the wound I was feeling. I decided I had done all I could do, and after some reading went back to bed. And I'm still alive today.

It was an interesting experiment, but even on this very Talk Like A Pirate Day, I don't think I will be eating fish again soon.

In related news, Lunya was taken to the vet to be itted/spayed/deovarized. She now sulks around the house with a silly cone round her head and a stupid fish net over her body. We hope we're getting the feisty Lunya back soon.

The Execution Of All Things

Filed under: General — Thomas @ 19:36


Spent the last few days reworking my really hacky RTSP code into fairly nicely objectified RTSP code. I can create media providers given an RTP source class. The source class can be a test stream, a source coming from a file, whatever. The media provider decides how this class will be presented to clients - "live" for a source that's always running and every client gets added to it, "on demand" for when every client has its own streamer and source, and more complex scenarios.

The media provider can then be tied to the RTSP resource tree so that various URL's can cause the provider to, you know, provide.

It's starting to work very well - after rewriting everything so that I could have a Live provider running, doing an On Demand one took me thirty minutes. That tells me my classes are extracted more or less manageably from the heap of code I had.

After that, the fun started. Trying to get various players to actually play stuff from the server. HelixPlayer/RealPlayer is proving to be the biggest pain in the ass. I've had to turn off all of Real's proprietary/extended network stuff to make it focus on doing RTSP/RTP only. Then I had to implement some non-required header fields because otherwise the player either does something silly (like, you know, no Content-base causes it to request relative URI's starting from / and not from the URI it was at), or complains that the server doesn't support the protocol.

Through the power of Open Source however I was able to unpack almost 14 MB of hxplay source code to search for the reason for this last error. Again, it was a header field that the code comments claim is required - though I haven't actually seen that in the spec yet. We'll see I guess.

At the end of the day, RealPlayer on Linux is continuously buffering/congesting on both the live and on-demand mp3 test stream. RealPlayer on Windows plays the latter fine, but not the former. Will take some time to figure out the differences.


Got bitten by one of my favourite Red Hat/Fedora rant topics - ext2 disk labels. I absolutely hate them, and Fedora tries to use them as much as possible, often with disastrous results on machines you try to maintain for longer times.

The issue this time was as follows. I had upgraded my dad's home machine last time I was in Belgium from Red Hat 9 to Fedora Core 4. While doing so, we also gave him a new harddisk to do a fresh install, and then put in the old hard disk so that he could clean up and keep files he wanted, and delete the ones he didn't. All of this could be further done remotely.
As usual I edited grub.conf to remove the stupid device labels and put in real partitions.

Now, recently I did a remote upgrade, and after a reboot, the machine didn't come up again. Called my father. It took some time to figure out, but he was claiming it was booting in Red Hat 9 and it was throwing lots of failures. So after some thinking, what happened was this:
- the kernel upgrade rewrote grub.conf
- it used LABEL=/ to define the root partition, as opposed to /dev/sda2 which the other kernel lines specified
- it boots up the RH9 partition from the OLD drive, which also has one partition labeled /
- after some time, it remounts / as read/write. At this point, it mounts the FC4 partition from the NEW drive. Because, you know, it's also labeled /
- the RH9 kernel barfs all over the place as pieces of FC4 try to start up, and nothing works. Not even the network, since, you know, apparently Red Hat did not have the hindsight to put kernel modules for all previous Red Hat kernels in their Fedora installs (for which I can't blame them).

Now, I'm usually pretty careful with the disk labels, making sure I remove them everywhere. But I could have sworn that before, kernel upgrades looked at your grub.conf and tried to copy settings from other lines. Every other line had the partition specified with the device name. Yet *this* kernel upgrade happily ignored that. Causing me to lose a few days trying to debug this problem remotely with my father as the serial console, which as people who have fathers know, is a lot more lossy than a 300 baud modem. It's the kind of serial link that executes random commands you didn't ask for and returns characters out-of-order and skipping a whole lot of them.

Disk labels - I hates them. I absolutely hates them. I have other reasons, but this one tops the list right now. They haven't ever solved a single problem for me.


Robert is a new pornographer.


Filed under: General — Thomas @ 15:42


Phew. Released new GStreamer 0.8 tarballs of core and plug-ins over the weekend. That's two. Today I released five GStreamer 0.9 tarballs. That's seven total. Release of both gst-pythons will follow soon, and possibly a Flumotion later on.

Because I'm sure we'll get a bunch of questions about the split-up of plug-ins (and just telling you what movies I watched this weekend without any further info would be rather boring) I'm copying the rationale here.

GStreamer 0.9 development series - Hung by a Thread



The core around which all other modules revolve. Base functionality and libraries, some essential elements, documentation, and testing.


A well-groomed and well-maintained collection of GStreamer plug-ins and elements, spanning the range of possible types of elements one would want to write for GStreamer.

And introducing, for the first time ever, on the development screen ...


Such ingratitude. After all the times I've saved your life.

A collection of plug-ins you'd want to have right next to you on the battlefield. Shooting sharp and making no mistakes, these plug-ins have it all: good looks, good code, and good licensing. Documented and dressed up in tests. If you're looking for a role model to base your own plug-in on, here it is.

If you find a plot hole or a badly lip-synced line of code in them, let us know - it is a matter of honour for us to ensure Blondie doesn't look like he's been walking 100 miles through the desert without water.


When you have to shoot, shoot. Don't talk.

There are times when the world needs a color between black and white. Quality code to match the good's, but two-timing, backstabbing and ready to sell your freedom down the river. These plug-ins might have a patent noose
around their neck, or a lock-up license, or any other problem that makes you think twice about shipping them.

We don't call them ugly because we like them less. Does a mother love her son less because he's not as pretty as the other ones ? No - she commends him on his great personality. These plug-ins are the life of the party. And we'll still step in and set them straight if you report any unacceptable behaviour - because there are two kinds of people in the world, my friend: those with a rope around their neck and the people who do the cutting.


That an accusation?

No perfectly groomed moustache or any amount of fine clothing is going to cover up the truth - these plug-ins are Bad with a capital B. They look fine on the outside, and might even appear to get the job done, but at the end of the day they're a black sheep. Without a golden-haired angel to watch over them, they'll probably land in an unmarked grave at the final showdown.

Don't bug us about their quality - exercise your Free Software rights, patch up the offender and send us the patch on the fastest steed you can steal from the Confederates. Because you see, in this world, there's two kinds of people, my friend: those with loaded guns and those who dig. You dig.

The Lowdown

I've never seen so many plug-ins wasted so badly.

GStreamer Plugins has grown so big that it's hard to separate the wheat from the chaff. Also, distributors have brought up issues about the legal status of some of the plug-ins we ship. To remedy this, we've divided the previous set of available plug-ins into four modules:

a small and fixed set of plug-ins, covering a wide range of possible types of elements; these are continuously kept up-to-date with any core changes during the development series.

  • We believe distributors can safely ship these plug-ins
  • People writing elements should base their code on these elements
  • These elements come with examples, documentation, and regression tests
a set of plug-ins that we consider to have good quality code, correct functionality, our preferred license (LGPL for the plug-in code, LGPL or LGPL-compatible for the supporting library).

  • We believe distributors can safely ship these plug-ins
  • People writing elements should base their code on these elements
a set of plug-ins that have good quality and correct functionality, but distributing them might pose problems. The license on either the plug-ins or the supporting libraries might not be how we'd like. The code might be widely known to present patent problems.

  • Distributors should check if they want/can ship these plug-ins
  • People writing elements should base their code on these elements
a set of plug-ins that aren't up to par compared to the rest. They might be close to being good quality, but they're missing something - be it a good code review, some documentation, a set of tests, a real live maintainer, or some actual wide use.
If the blanks are filled in they might be upgraded to become part of either gst-plugins-good or gst-plugins-ugly, depending on the other factors.

  • If the plug-ins break, you can't complain - instead, you can fix the problem and send us a patch, or bribe someone into fixing them for you
  • New contributors can start here for things to work on