On MPEG-4 patents, Google and VLC

Bored at ActewAGL, I dropped in to slashdot to see that apaprently Google has released a video service and DVD Jon (the DeCSS guy) has cracked the player. Since the player is based on the GPL’d VLC, and is distributed to the browser as an ActiveX control and therefore comes with source, the crack itself is trivial (No offence, Jon. I can’t believe you knocked up a binary patch in .NET!)

But a more interesting discussion about the patent impllications branched off instead.

The idea that using the google version of VLC means you are now licensed to use the MPEG-4 Visual and AVC patent suites depends entirely on the license that google has received from MPEG LA.

MPEG-4 Visual. Looking at: http://www.mpegla.com/m4v/m4vweb.ppt I suspect Google is not considered an encoder/decoder manufacturer but do fall under the category of “Free Internet Broadcast”, which covers the category of making money from the patent by means other than selling the video (eg. advertising). This happily has no patent fees until 2008 and after that will be no greater than “Free Television” which is currently US$2.5k per transmission encoder. (Not server. Encoder. I presume they mean that a machine encoding two channels at once is actually two encoders, although if not, there’s a nice use for a four-way super-machine. One $2.5k payment and you’ve got four channels encoding at a time, while if you buy an off-the-shelf MPEG-4 encoding box you pay $2.5k for the patent license _each_). Upshot: Google pays nothing for this license until 2008..

MPEG-4 AVC. Looking at http://www.mpegla.com/avc/AVC_TermsSummary.pdf the bottom of page 3 and top of page 4 shows that the same rules apply, but the free period is until end of 2010. Again, after that it’s capped at the television rates, which are this time defined per broadcast market (“geographic area within which an End User could use an AVC Decoder to view Free Television AVC Video sent by a single transmitter or transmitters simultaneously with repeaters by a single Legal Entity.”), annually at US$2.5k for 100k to <500k households, US$5k for 500k to <1000k, and US$10k for one million upwards. Easily Google is a single legal entity able to reach anyone over the world-wide web from the one server or set of repeaters, so after 2010 they’re looking at 10k per year for the AVC license. Upshot: Google pays nothing for this license until 2010.

In short, I don’t actually think Google’s _paying_ for anything, If they do have to pretend to be a manufacturer, then they’re paying less than US$0.50 per unit for both patents, but I doubt they are doing that. No company would willingly put a up a link that costs them US$0.50 per hit. If they could, the Internet Ad Banner bubble wouldn’t have burst. ^_^

Edit: Yes, I’m an idiot. I forgot to address the original point of the linked blog post. Anyway, the licenses I think Google are signed up to only affect Google’s ability to stream out the video, and turn out to be completely distinct from the player used to stream it. I didn’t see anything in the MPEG LA pages about free software encoders/decoders, since they all seem to talk about ‘sale’ and ‘manufacture’, neither of which is actually done for a software encoder/decoder. Mind you, I didn’t actually read the license text itself, since you have to ask for it. And this article about Nero Digital implies that there’s no fee for the codec itself now, but there might be soon. At which point, assuming Google pays the codec fee, then a google-branded player will come with a license for use which you wouldn’t get directly from VLC. And things get sticky.


Finally started the Debian New Maintainer process

Well, I finally started up the Debian New Maintainer process.

I originally started working on this around February 2002, by getting my key signed by a local
Debian Developer. However, my next step (adopt an orphaned package) failed miserably since the
only orphaned package I felt up to was awesfx, and I wasn’t really using it — I had an AWE64
in Keitarou at the time, but wasn’t using the wavetable. ^_^

Flash forward to early 2003, when we launched BU, and I
started using a Debian package of FreeRADIUS (then radiusd-freeradius) as the RADIUS server.
However, the maintainer at the time (Chad Miller) felt FreeRADIUS was too buggy to go into
Debian/stable (the just-released Woody) but the bug
used to keep it out of Woody
also caused it to be removed from the archive entirely in
a post-Woody archive purge.

Ever intrepid, I turned to the upstream, where I discovered a debian/ directory also existed,
had been maintained by Chad Miller, and produced (roughly) the same pacakges as the Debian
archive’s version. “Aha!” said I, now that I had a way of keeping up to date. However, at
this point I was not completely happy with the upstream Debian packages. For a start, they
had the wrong version number in them…

So I started sending in some patches
to the Debian build (as well as miscellaneous things I’d hit elsewhere in the system) and was
eventually granted CVS access to do my
own commits
. During this process, I renamed the package to

Eventually, I was happy enough with it that I decided to try and get it into the Debian archive.
Unlike many prospective maintainers who are not developers, I had no trouble finding a sponsor. (So much for that Debian myth…)
In fact, I had at least three offers, and one offer of co-maintainership. I ended up agreeing
to have Steve Langasek (also a Debian Release Manager) sponsor the package in, mainly because
I got his email first. ^_^

And so I had a package sponsored into the Debian archive on 11th November 2003 (after a query
from the ftp masters as to the number of binary packages produced. I stood my ground, and to
my surprise, won. That’s another Debian myth squashed. ^_^)

At the time, I intended to apply for Debian Developership soon after having the package enter
the archive, but elected to wait for the Sarge release, since Steve would be busy until then
Release-Managering. At the time, Sarge was slated for a December 2003 release. ^_^

Flash forward a year and a half. — In this time I discovered the #debian and #debian-devel
IRC channels, made a nuisance of myself on them and the Debian mailing lists and was accordingly
humbled, stayed the hell away from any DPL debates and the “documentation wants to be free” debate,
and generally enjoyed myself. ^_^

Anyway, Sarge came out, but I was playing
Guildwars and so not watching my email too closely until about the 9th. ^_^ And so once again
visions of tbble@debian.org are dancing in my mind. Steve Langasek’s agreed to advocate
me, which is good since he’s no longer the sponsor of FreeRADIUS, due to RM commitments, but I
was a tad worried after someone at linux.conf.au.05
told me I was the ‘infamous’ TBBle from debian-devel. ^_^

I have a printer!

I bought a second-hand HP LaserJet 1200 series for $80 from an Internet cafe which was going out of business. An evening spent with cups, and I can print from windows, have driver auto-download going (for Win2K+ at least) and also got a PDF-output print which writes to /home/tbble/cups-pdf for output. ^_^

The hardest bit was the driver-upload. I had root disabled in samba (sensibly) but the samba drivers directory /var/lib/samba/printers/ is only writable by root, as you’d expect. I ended up enabling root for samba for the moment.

rpcclient -U root -c ‘adddriver “Windows NT x86” “CUPS-pdf:pscript5.dll:PostscriptColor.ppd:ps5ui.dll:pscript.hlp:NULL:RAW:pscript.ntf” 3’

rpcclient -U root -c ‘setdriver Keitarou CUPS-pdf’

And in a reversal, jobs are spooled in /tmp, since everyone can write there.

I’ll look forward to samba4 for slightly more sensibility. ^_^

In the old days, soap was what went into your mouth when bad words came out…

instead, SOAP (or at least SOAP::Lite, which is a Perl implementation of it) seems to have gone in and caused bad words to come out.

This all started because I wanted a programmatic web interface for BU’s database, rather than either knocking up PHP pages with mySQL commands, or giving people other than myself mySQL access (or exploring the horrors of SQL stored procedures!!). Having encountered both SOAP and XML-RPC during my travels at TransACT (they use SOAP for some things internally, but XML-RPC for the ISP policy-control interface. I think they’ve got distinct groups of programmers with similar ideas, but no way of talking to each other… This would explain a lot about the projects I end up doing — or more to the point not doing — for TransACT. ^_^) I decided I’d go with some kind of RPC interface where I could knock the back-end up in Perl, and the front end could be PHP or whatever the reseller wanted. I have some vision of a customer control applet regular customers could use at home, but I think that’s asking a little too much.

Anyway, after due and careful consideration of my database structure, it seemed obvious that an object encapsulation would be a good idea. So SOAP won out over XML-RPC. As far as interface goes, SOAP::Lite implements XML-RPC too. So this wasn’t a consideration. Sure enough, I’m hacking away, rereading my recent Perl-based object-oriented adventures in module creation (the aforementioned policy thingy) and rather quickly manage to produce a getCustomer() function in the BU module which returns a BU::Customer object. I happily assume that since SOAP is supposed to pass objects around, I’ll be able to call the functions of this new and wonderful object, and have the code on the server-side execute.

This of course does not happen. (Why “of course”? If it did happen, this post would be titled ‘The wonder and glory of SOAP’ or something. And have been done about 36 hours earlier. >_<)

Instead, I get an object back with no routines. “Ah!” I hear you cry. “A perl method call is simply a call to the function in the module for which the class was blessed, with the object itself as the first parameter!” (Others amongst you may cry “That’s not really object-oriented, it’s object-like!”. It’s a fair point, but somewhat irrelevant. I use perl because I think programmers don’t use enough punctuation, not because of any particular programming language construction leanings. I own the Eiffel book, but never read it. ^_^)

Now that that crying has died down, I did indeed try that. However, the SOAP::Lite instance I was using had ‘/BU’ at the end of its URI (which is now called a namespace, apparently) so it tried to call the non-existant function in the BU module. So I instantiated a new SOAP::Lite instance, looking at ‘/BU/Customer’. That didn’t work either, at which I point I realised this was excessive mucking about for what I wanted, and spent a day or two writing a procedural version instead.

I ended up with something like the following:

package BU;
# "field => value" is repeatable infinitely. Unknown fields will be silently
# dropped, if there's not enough to go on, we will abort before any database
# changes are made.
# Only admins may specify a different customer ID to their own
sub GetCustomer(optional CustomerID);
# Only admins may specify a different customer ID to their own
sub EditCustomer(optional CustomerID, field => value, field => value);
# Only admins may use this at all
sub NewCustomer(field => value, field => value);
# Only admins may specify a different customer ID to their own
sub GetAccountList(optional CustomerID);
# Only admins may specificy an account not owned by them.
sub GetAccount(AccountID);
# Only admins may specificy an account not owned by them.
sub EditCustomer(AccountID, field => value, field => value);
# Only admins may specify a different customer ID to their own
sub NewAccount(field => value, field => value);
# Only admins may specificy an account not owned by them.
sub GetLoginList(AccountID);
# Only admins may specificy a login not owned by them.
sub GetLogin(LoginID);
# Only admins may specificy a login not owned by them.
sub EditLogin(LoginID, field => value, field => value);
# Only admins may specificy an account not owned by them.
sub NewLogin(field => value, field => value);

on the plus side, it’s done.

Now I have to go learn perldoc, but that’s probably not as hard as I suspect it is. ^_^

Edit: I’m not sure what’s wrong with my linebreaks, but they’re being ignored. Also, the <code> element produces its own block, so I can’t use it inline. I may remove them from the paragraphs in future, in case that fixes the line breaks.

Edit 2: Looks like a wordpress upgrade or my screwing around with modules means I no longer get automatic <p> tags in my text. So I have to add them by hand. And <code> puts <pre/> around its contents, so I have replaced it with <em> inline. >_< Also, the layout here gets boned by the <pre/> and so my right-hand menu gets pushed down to the bottom.

Edit 3: Geshi’s breaking blank lines as </p><p> which would be OK if the code was in a <p/> rather than a <div/>…