<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Breaking Eggs And Making Omelettes</title>
	<atom:link href="http://multimedia.cx/eggs/feed/" rel="self" type="application/rss+xml" />
	<link>http://multimedia.cx/eggs</link>
	<description>Topics On Multimedia Technology and Reverse Engineering</description>
	<lastBuildDate>Sun, 29 Apr 2012 05:01:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>How To Write An Oscilloscope</title>
		<link>http://multimedia.cx/eggs/how-to-write-an-oscilloscope/</link>
		<comments>http://multimedia.cx/eggs/how-to-write-an-oscilloscope/#comments</comments>
		<pubDate>Sun, 29 Apr 2012 05:01:32 +0000</pubDate>
		<dc:creator>Multimedia Mike</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[gme]]></category>
		<category><![CDATA[oscilloscope]]></category>
		<category><![CDATA[visualization]]></category>

		<guid isPermaLink="false">http://multimedia.cx/eggs/?p=3809</guid>
		<description><![CDATA[Writing a software oscilloscope doesn't seem like it would be so hard-- just graphing audio amplitude with respect to time; but there might be more to it]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m trying to figure out how to write a software oscilloscope audio visualization. It&#8217;s made more frustrating by the knowledge that I am certain that I have accomplished this task before.</p>
<p>In this context, the oscilloscope is used to draw the time-domain samples of an audio wave form. <a href="http://xine.cvs.sourceforge.net/viewvc/xine/xine-lib/src/post/visualizations/oscope.c?revision=HEAD&#038;view=markup">I have written such a plugin as part</a> of <a href="http://www.xine-project.org/home">the xine project</a>. However, for that project, I didn&#8217;t have to write the full playback pipeline&#8211; my plugin was just handed some PCM data and drew some graphical data in response. Now I&#8217;m trying to write the entire engine in a standalone program and I&#8217;m wondering how to get it just right.</p>
<p><center><br />
<img src="http://multimedia.cx/eggs/wp-content/uploads/2012/04/duck-tales-moon-game-music-emu.png" alt="" title="Game Music Emu oscilloscope playing Duck Tales moon song" width="514" height="286" class="aligncenter size-full wp-image-3810" /><br />
</center></p>
<p>This is an <a href="http://www.libsdl.org/">SDL-based</a> oscilloscope visualizer and audio player for <a href="http://code.google.com/p/game-music-emu/">Game Music Emu library</a>. My approach is to have an audio buffer that holds a second of audio (44100 stereo 16-bit samples). The player updates the visualization at 30 frames per second. The o-scope is 512 pixels wide. So, at every 1/30th second interval, the player dips into the audio buffer at position ((frame_number % 30) * 44100 / 30) and takes the first 512 stereo frames for plotting on the graph.</p>
<p>It seems to be working okay, I guess. The only problem is that the A/V sync seems to be slightly misaligned. I am just wondering if this is the correct approach. Perhaps the player should be performing some slightly more complicated calculation over those (44100/30) audio frames during each update in order to obtain a more accurate graph? I described my process to an electrical engineer friend of mine and he insisted that I needed to apply <a href="http://en.wikipedia.org/wiki/Hysteresis">something called hysteresis</a> to the output or I would never get accurate A/V sync in this scenario.</p>
<p>Further, I know that some schools of thought on these matters require that the dots in those graphs be connected, that the scattered points simply won&#8217;t do. I guess it&#8217;s a stylistic choice.</p>
<p>Still, I think I have a reasonable, workable approach here. I might just be starting the visualization 1/30th of a second too late.</p>
]]></content:encoded>
			<wfw:commentRss>http://multimedia.cx/eggs/how-to-write-an-oscilloscope/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Libav/FFmpeg and Google Summer of Code 2012</title>
		<link>http://multimedia.cx/eggs/gsoc-2012-multimedia/</link>
		<comments>http://multimedia.cx/eggs/gsoc-2012-multimedia/#comments</comments>
		<pubDate>Thu, 26 Apr 2012 06:27:52 +0000</pubDate>
		<dc:creator>Multimedia Mike</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[ffmpeg]]></category>
		<category><![CDATA[gsoc]]></category>
		<category><![CDATA[gsoc2012]]></category>
		<category><![CDATA[hevc]]></category>
		<category><![CDATA[libav]]></category>
		<category><![CDATA[opus]]></category>
		<category><![CDATA[rtmp]]></category>
		<category><![CDATA[ut video]]></category>

		<guid isPermaLink="false">http://multimedia.cx/eggs/?p=3801</guid>
		<description><![CDATA[Libav/FFmpeg are once again part of the Google Summer of Code program and our students have signed up for some rather ambitious projects]]></description>
			<content:encoded><![CDATA[<p>So, <em>the projects</em> are <a href="http://www.google-melange.com/gsoc/org/google/gsoc2012/libav">participating in the Google Summer of Code for the 2012</a> season. (While Libav is the project officially accepted to particular, I still refer to <em>the projects</em> because FFmpeg will also benefit).</p>
<p>Here are the students, projects, and mentors for this summer:</p>
<ol>
<li>Andrew D&#8217;Addesio is working on an <a href="http://www.google-melange.com/gsoc/project/google/gsoc2012/fatbag/5001">Opus Decoder</a>, mentored by Justin Ruggles</li>
<li>Guillaume Martres is working on an <a href="http://www.google-melange.com/gsoc/project/google/gsoc2012/smarter/8001">HEVC video decoder</a>, mentored by Mashiat Sarker Shakkhar</li>
<li>Jan Ekström is working on an <a href="http://www.google-melange.com/gsoc/project/google/gsoc2012/jeeb/6001">LGPL Ut Video encoder</a>, mentored by Kostya Shishkov</li>
<li>Jordi Ortiz is working to <a href="http://www.google-melange.com/gsoc/project/google/gsoc2012/nenjordi/37002">rewrite avserver</a>, mentored by Luca Barbato</li>
<li>Samuel Pitoiset is working on an <a href="http://www.google-melange.com/gsoc/project/google/gsoc2012/hakzsam66/63002">RTMP[E|S|T|TE] protocol implementation</a>, mentored by Martin Storsjö</li>
</ol>
<p>Wish them luck&#8211; these are some ambitious projects.</p>
]]></content:encoded>
			<wfw:commentRss>http://multimedia.cx/eggs/gsoc-2012-multimedia/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Solving The XVD Puzzle</title>
		<link>http://multimedia.cx/eggs/solving-the-xvd-puzzle/</link>
		<comments>http://multimedia.cx/eggs/solving-the-xvd-puzzle/#comments</comments>
		<pubDate>Sun, 15 Apr 2012 02:46:03 +0000</pubDate>
		<dc:creator>Multimedia Mike</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[multimedi archaeology]]></category>
		<category><![CDATA[silicon valley]]></category>
		<category><![CDATA[vg2]]></category>
		<category><![CDATA[xvd]]></category>
		<category><![CDATA[zygo]]></category>

		<guid isPermaLink="false">http://multimedia.cx/eggs/?p=3788</guid>
		<description><![CDATA[Exploring the background of a custom multimedia format called XVD]]></description>
			<content:encoded><![CDATA[<p>I downloaded a multimedia file a long time ago (at least, I strongly suspected it was a multimedia file which is why I downloaded it). It went by the name of &#8216;lamborghini_850kbps.vg2&#8242;. I have had it in my collection for at least 7 years. I couldn&#8217;t remember where I found it. I downloaded it before it occurred to me to take notes about this sort of stuff.</p>
<p>I found myself staring at the file again today and Googled the filename. This led me to a few Japanese sites which also contained working URLs for a few more .vg2 samples. Some other clues led me to a Russian language forum where someone had linked to a site that had Win32 codec modules that could process the files. The site was defunct but the <a href="http://archive.org/web/web.php">Internet Archive Wayback Machine</a> kept a copy for me, as well as copies of several more .vg2 samples from a defunct Japanese site previously involved with this codec.</p>
<p><em>Sometimes this internet technology works really well. But I digress.</em></p>
<p>Anyway, through all this, I finally found a clue: <strong>XVD</strong>. and wouldn&#8217;t you know, there is already <a href="http://wiki.multimedia.cx/index.php?title=XVD">a basic page on the MultimediaWiki</a> describing the technology. In fact, while VG2 is a custom container, the MultimediaWiki states that the video component has a FourCC of VGMV, and there is already a file named VGMV.avi in the root V-codecs/ samples directory, something I vow to correct (that&#8217;s a big pet peeve of mine&#8211; putting samples in the root V-codecs/ or A-codecs/ directories).</p>
<p><strong>XVD&#8230; XVD&#8230;</strong> <em>XVD&#8230;</em> why does that sound so familiar? Oh, of course; there is a company named <a href="http://www.xvdcorp.com/">XVD</a> and they have an office in the Bay Area which I have passed on numerous occasions, like this morning:</p>
<p><center><br />
<img src="http://multimedia.cx/eggs/wp-content/uploads/2012/04/xvd-office.jpg" alt="" title="XVD Office" width="400" height="246" class="aligncenter size-full wp-image-3790" />< </center></p>
<p>Someone originally connected with the multimedia technology in question operates a website which contains <a href="http://www.ila-ila.com/xvd-hist/">an unofficial history of the XVD tech</a>. At first, I was wondering if the technology was completely defunct (and should therefore be open sourced). But if <a href="http://www.xvdcorp.com/solutions.html">XVD&#8217;s solutions page (dated 2010)</a> is to be believed, the technology is still in service, and purported to be better than H.264 and VC-1: <em>&#8220;The current generation of XVD video compression technology provides better video quality at any given data rate than standards-based codecs (H.264 or VC-1) with four times lower encoding complexity (when compared with H.264 Main Profile).&#8221;</em></p>
<p>If they say so. For my part, I&#8217;m just happy that I have finally figured out what this lamborghini_850kbps.vg2 is so that I can properly catalog it on the samples site, <a href="http://samples.mplayerhq.hu/internets/bha-xvd-vg2/">which I have now done, along with other samples and various codecs modules</a>.</p>
<p>This episode reminds me that there&#8217;s a branch office of <a href="http://zygo.com/">Zygo Corporation</a> close to my home (though the headquarters are far, far away). The companies you see in Silicon Valley. Anyway, long-time open source multimedia hackers will no doubt recognize Zygo from the <a href="http://wiki.multimedia.cx/index.php?title=ZyGo_Video">ZyGo FourCC &#038; video codec</a> transported in QuickTime files that was almost decode-able using an H.263 decoder. </p>
<p></center><center><br />
<img src="http://multimedia.cx/eggs/wp-content/uploads/2012/04/zygo-office.jpg" alt="" title="Zygo Silicon Valley Office" width="400" height="187" class="aligncenter size-full wp-image-3792" /><br />
</center></p>
<p>I may never learn what Zygo&#8217;s core competency actually is, but I will always remember their multimedia tech every time I run past their office.</p>
]]></content:encoded>
			<wfw:commentRss>http://multimedia.cx/eggs/solving-the-xvd-puzzle/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>The 11th Hour RoQ Variation</title>
		<link>http://multimedia.cx/eggs/the-11th-hour-roq-variation/</link>
		<comments>http://multimedia.cx/eggs/the-11th-hour-roq-variation/#comments</comments>
		<pubDate>Thu, 12 Apr 2012 04:25:48 +0000</pubDate>
		<dc:creator>Multimedia Mike</dc:creator>
				<category><![CDATA[Game Hacking]]></category>
		<category><![CDATA[dreamroq]]></category>
		<category><![CDATA[Reverse Engineering]]></category>
		<category><![CDATA[roq]]></category>
		<category><![CDATA[Vector Quantization]]></category>

		<guid isPermaLink="false">http://multimedia.cx/eggs/?p=3766</guid>
		<description><![CDATA[Investigating how to play the RoQ multimedia files found on the 4-CD game The 11th Hour, the original game to use this file format]]></description>
			<content:encoded><![CDATA[<p>I have been looking at the <a href="http://wiki.multimedia.cx/index.php?title=RoQ">RoQ file format</a> almost as long as I have been doing practical multimedia hacking. However, I have never figured out how the RoQ format works on <a href="http://www.mobygames.com/game/dos/11th-hour">The 11th Hour</a>, which was the game for which the RoQ format was initially developed. When I <a href="http://multimedia.cx/mmentry-2003-03-24.html">procured the game years ago</a>, I remember finding what appeared to be RoQ files and shoving them through the open source decoders but not getting the right images out.</p>
<p>I decided to dust off that old copy of The 11th Hour and have another go at it.</p>
<p><center><br />
<a href="http://multimedia.cx/eggs/wp-content/uploads/2012/04/the-11th-hour-box-and-cdroms.jpg"><img src="http://multimedia.cx/eggs/wp-content/uploads/2012/04/the-11th-hour-box-and-cdroms.jpg" alt="" title="Photo of 11th hour box + CD-ROMs" width="400" height="263" class="aligncenter size-full wp-image-3769" /></a><br />
</center></p>
<p><strong>Baseline</strong><br />
The game consists of 4 CD-ROMs. Each disc has a media/ directory that has a series of files bearing the extension .gjd, likely the initials of one <a href="http://www.mobygames.com/developer/sheet/view/developerId,2913/">Graeme J. Devine</a>. These are resource files which are merely headerless concatenations of other files. Thus, at first glance, one file might appear to be a single RoQ file. So that&#8217;s the source of some of the difficulty: Sending an apparent RoQ .gjd file through a RoQ player will often cause the program to complain when it encounters the header of another RoQ file.</p>
<p><a href="http://samples.libav.org/game-formats/idroq/11th-hour/"><strong>I have uploaded some samples to the usual place.</strong></a></p>
<p>However, even the frames that a player can decode (before encountering a file boundary within the resource file) look wrong.</p>
<p><strong>Investigating Codebooks Using dreamroq</strong><br />
I wrote <a href="https://github.com/multimediamike/dreamroq">dreamroq</a> last year&#8211; an independent RoQ playback library targeted towards embedded systems. I aimed it at a gjd file and quickly hit a codebook error.</p>
<p>RoQ is a vector quantizer video codec that maintains a codebook of 256 2&#215;2 pixel vectors. In the Quake III and later RoQ files, these are transported using a YUV 4:2:0 colorspace&#8211; 4 Y samples, a U sample, and a V sample to represent 4 pixels. This totals 6 bytes per vector. A RoQ codebook chunk contains a field that indicates the number of 2&#215;2 vectors as well as the number of 4&#215;4 vectors. The latter vectors are each comprised of 4 2&#215;2 vectors.</p>
<p>Thus, the total size of a codebook chunk ought to be (# of 2&#215;2 vectors) * 6 + (# of 4&#215;4 vectors) * 4.</p>
<p><em>However, this is not the case with The 11th Hour RoQ files.</em></p>
<p><strong>Longer Codebooks And Mystery Colorspace</strong><br />
Juggling the numbers for a few of the codebook chunks, I empirically determined that the 2&#215;2 vectors are represented by <strong>10 bytes instead of 6</strong>. Now I need to determine what exactly these 10 bytes represent.</p>
<p>I should note that I suspect that everything else about these files lines up with successive generations of the format. For example if a file has 640&#215;320 resolution, that amounts to 40&#215;20 macroblocks. dreamroq iterates through 40&#215;20 8&#215;8 blocks and precisely exhausts the VQ bitstream. So that all looks valid. I&#8217;m just puzzled on the codebook format.</p>
<p>Here is an example codebook dump:<br />
<span id="more-3766"></span></p>
<pre>
ID 0x1002, len = 0x0000014C, args = 0x1C0D
  0: 00 00 00 00 00 00 00 00 80 80
  1: 08 07 00 00 1F 5B 00 00 7E 81
  2: 00 00 15 0F 00 00 40 3B 7F 84
  3: 00 00 00 00 3A 5F 18 13 7E 84
  4: 00 00 00 00 3B 63 1B 17 7E 85
  5: 18 13 00 00 3C 63 00 00 7E 88
  6: 00 00 00 00 00 00 59 3B 7F 81
  7: 00 00 56 23 00 00 61 2B 80 80
  8: 00 00 2F 13 00 00 79 63 81 83
  9: 00 00 00 00 5E 3F AC 9B 7E 81
  10: 1B 17 00 00 B6 EF 77 AB 7E 85
  11: 2E 43 00 00 C1 F7 75 AF 7D 88
  12: 6A AB 28 5F B6 B3 8C B3 80 8A
  13: 86 BF 0A 03 D5 FF 3A 5F 7C 8C
  14: 00 00 9E 6B AB 97 F5 EF 7F 80
  15: 86 73 C8 CB B6 B7 B7 B7 85 8B
  16: 31 17 84 6B E7 EF FF FF 7E 81
  17: 79 AF 3B 5F FC FF E2 FF 7D 87
  18: DC FF AE EF B3 B3 B8 B3 85 8B
  19: EF FF F5 FF BA B7 B6 B7 88 8B
  20: F8 FF F7 FF B3 B7 B7 B7 88 8B
  21: FB FF FB FF B8 B3 B4 B3 85 88
  22: F7 FF F7 FF B7 B7 B9 B7 87 8B
  23: FD FF FE FF B9 B7 BB B7 85 8A
  24: E4 FF B7 EF FF FF FF FF 7F 83
  25: FF FF AC EB FF FF FC FF 7F 83
  26: CC C7 F7 FF FF FF FF FF 7F 81
  27: FF FF FE FF FF FF FF FF 80 80
</pre>
<p>Note that 0x14C (the chunk size) = 332, 0x1C and 0x0D (the chunk arguments &#8212; count of 2&#215;2 and 4&#215;4 vectors, respectively) are 28 and 13. 28 * 10 + 13 * 4 = 332, so the numbers check out.</p>
<p>Do you see any patterns in the codebook? Here are some things I tried:</p>
<ul>
<li>Treating the last 2 bytes as U &#038; V and treating the first 4 as the 4 Y samples:<br />
<center><br />
<img src="http://multimedia.cx/eggs/wp-content/uploads/2012/04/roq-y8.png" alt="" title="RoQ, selected 8-bit Y samples" width="70" height="60" class="aligncenter size-full wp-image-3773" /><br />
</center>
</li>
<li>Treating the last 2 bytes as U &#038; V and treating the first 8 as 4 16-bit little-endian Y samples:<br />
<center><br />
<img src="http://multimedia.cx/eggs/wp-content/uploads/2012/04/roq-y16.png" alt="" title="RoQ, 16-bit Y samples" width="70" height="60" class="aligncenter size-full wp-image-3774" /><br />
</center>
</li>
<li>Disregarding the final 2 bytes and treating the first 8 bytes as 4 RGB565 pixels (both little- and big-endian, respectively, shown here):<br />
<center><br />
<img src="http://multimedia.cx/eggs/wp-content/uploads/2012/04/roq-rgb16le.png" alt="" title="RoQ, 16-bit little-endian RGB" width="70" height="60" class="aligncenter size-full wp-image-3775" /> <img src="http://multimedia.cx/eggs/wp-content/uploads/2012/04/roq-rgb16be.png" alt="" title="RoQ, 16-bit big-endian RGB" width="70" height="60" class="aligncenter size-full wp-image-3776" /><br />
</center>
</li>
<li>Based on the type of data I&#8217;m seeing in these movies (which appears to be intended as overlays), I figured that some of these bits might indicate transparency; here is 15-bit big-endian RGB which disregards the top bit of each pixel:<br />
<center><br />
<img src="http://multimedia.cx/eggs/wp-content/uploads/2012/04/roq-rgb15.png" alt="" title="RoQ, 15-bit RGB" width="70" height="60" class="aligncenter size-full wp-image-3777" /><br />
</center>
</li>
</ul>
<p>These images are taken from the uploaded sample bdpuz.gjd, apparently a component of <a href="http://www.mobygames.com/game/dos/11th-hour/screenshots/gameShotId,50221/">the puzzle represented in this screenshot</a>.</p>
<p><strong>Unseen Types</strong><br />
It has long been rumored that early RoQ files could contain JPEG images. I finally found one such specimen. One of the files bundled early in the uploaded fhpuz.gjd sample contains a JPEG frame. It&#8217;s a standard JFIF file and can easily be decoded after separating the bytes from the resource using &#8216;dd&#8217;. JPEGs serve as intraframes in the coding scheme, with successive RoQ frames moving objects on top.</p>
<p>However, a new chunk type showed up as well, one identified by 0&#215;1030. I have never encountered this type. Where could I possibly find data about this? Fortunately, <a href="https://github.com/id-Software/">iD Games recently posted all of their open sourced games at Github</a>. Reading through <a href="https://github.com/id-Software/Quake-III-Arena/blob/master/code/client/cl_cin.c">the code for their official RoQ decoder</a>, I see that this is called a RoQ_PACKET. The name and the code behind it are both supremely unhelpful. The code is basically a no-op. The payloads of the various RoQ_PACKETs from one sample are observed to be either 8784, 14752, or 14760 bytes in length. It&#8217;s very likely that this serves the same purpose as the JPEG intraframes.</p>
<p><strong>Other Tidbits</strong><br />
I read through the readme.txt on the first game disc and found this nugget:</p>
<pre>
        g)      Animations displayed normally or in SPOOKY MODE

                SPOOKY MODE is blue-tinted grayscale with color cursors, puzzle
                and game pieces.  It is the preferred display setting of the
                developers at Trilobyte.  Just for fun, try out the SPOOKY
                MODE.
</pre>
<p>The <a href="http://www.mobygames.com/game/dos/11th-hour/screenshots">MobyGames screenshot page</a> has a number of screenshots labeled as being captured in spooky mode. Color tricks?</p>
<p>Meanwhile, another twist arose as I kept tweaking dreamroq to deal with more RoQ weirdness: After modifying my dreamroq code to handle these 10-byte vectors, it eventually chokes on another codebook. These codebooks happen to have 6-byte vectors again! Fortunately, I was already working on a scheme to automatically detect which codebook is in play (plugging the numbers into a formula and seeing which vector size checks out).</p>
]]></content:encoded>
			<wfw:commentRss>http://multimedia.cx/eggs/the-11th-hour-roq-variation/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>G.I. Joe Custom Multimedia</title>
		<link>http://multimedia.cx/eggs/g-i-joe-custom-multimedia/</link>
		<comments>http://multimedia.cx/eggs/g-i-joe-custom-multimedia/#comments</comments>
		<pubDate>Fri, 30 Mar 2012 06:47:00 +0000</pubDate>
		<dc:creator>Multimedia Mike</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://multimedia.cx/eggs/?p=3755</guid>
		<description><![CDATA[I found a weird little multimedia format on a 3-disc set of G.I. Joe discs]]></description>
			<content:encoded><![CDATA[<p>I received this 3-disc set of G.I. Joe CD-ROMs today:</p>
<p><center><br />
<a href="http://multimedia.cx/eggs/wp-content/uploads/2012/03/gijoe-cdroms.jpg"><img src="http://multimedia.cx/eggs/wp-content/uploads/2012/03/gijoe-cdroms.jpg" alt="" title="G.I. Joe CD-ROMs" width="350" height="152" class="aligncenter size-full wp-image-3756" /></a><br />
</center></p>
<p>Copyright 2003, and labeled as PC ONLY. Each disc claims to have 2 episodes. So are these some sort of video discs? Any gaming elements? I dove in to investigate.</p>
<p>So, it turns out that there are some games on these discs, done in Flash Player (which tells me that these were probably available on the web at some point). Here&#8217;s a shooting gallery game from the first disc:</p>
<p><center><br />
<a href="http://multimedia.cx/eggs/wp-content/uploads/2012/03/gijoe-cdrom-sniper-game.jpg"><img src="http://multimedia.cx/eggs/wp-content/uploads/2012/03/gijoe-cdrom-sniper-game.jpg" alt="" title="G.I. Joe CD-ROM-- shooting gallery game" width="400" height="277" class="aligncenter size-full wp-image-3759" /></a><br />
</center></p>
<p>As promised by the CD-ROM copy, the menu does grant access to 2 classic G.I. Joe episodes. Selecting either one launches this:</p>
<p><center><br />
<a href="http://multimedia.cx/eggs/wp-content/uploads/2012/03/gijoe-movie-player-loading.jpg"><img src="http://multimedia.cx/eggs/wp-content/uploads/2012/03/gijoe-movie-player-loading.jpg" alt="" title="G.I. Joe Video Player Loading" width="300" height="322" class="aligncenter size-full wp-image-3761" /></a><br />
</center></p>
<p>Powered by C-ezy? Am I interpreting that correctly? Anyway, the video player goes fullscreen and looks fine (given the source material). I can&#8217;t capture screenshots and controls are limited to: space for pause, ESC to exit player, and up/down to control volume. No seeking and certainly no onscreen controls. Pretty awful player.</p>
<p>Studying the first disc, I find a 550 MB file with the name 5859Hasbro.egm. Coupled with ep58.cfg and ep59.cfg files in the same directory, I gather that the disc has G.I. Joe episodes 58 and 59 (though the exact episodes, &#8220;There&#8217;s No Place Like Springfield&#8221; parts 1 and 2, are <a href="http://en.wikipedia.org/wiki/List_of_G.I._Joe:_A_Real_American_Hero_episodes">listed on Wikipedia</a> as being episodes 154 and 155; but who&#8217;s counting?). The cfg files contain this text:</p>
<pre>
ep58.cfg:
EGM_GIJOE.exe
5859Hasbro.egm /noend /track:0 /singletrack 

ep59.cfg:
EGM_GIJOE.exe
5859Hasbro.egm /noend /track:1 /singletrack
</pre>
<p>The big EGM file starts with the string &#8220;Egenie Player&#8221;. After that, I see absolutely no clues. The supporting EGM_GIJOE.exe file has some interesting strings: &#8220;Decore Bits Per Pixel&#8221; (I know I have seen &#8220;Decore&#8221; used to mean &#8220;decoding core&#8221; in some libraries), &#8220;Egenie Player &#8211; %s, Version:%s&#8221;, &#8220;4th June 2002&#8243;, a list of common  FourCC tags seen in AVI files, &#8220;Brought to you by Martin, Patrick Bob and Bren&#8221; (do you suppose &#8220;Patrick Bob&#8221; is one person&#8217;s name?), a list of command line options&#8230;</p>
<p>Aha! A URL: http:\\www.e-genie.tv (yep, backslashes, not forward slashes). e-genie.tv seems to redirect to mygenie.tv, which&#8230; doesn&#8217;t appear to be strictly related to video technology these days.</p>
]]></content:encoded>
			<wfw:commentRss>http://multimedia.cx/eggs/g-i-joe-custom-multimedia/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ANSI Code Coverage Followup</title>
		<link>http://multimedia.cx/eggs/ansi-code-coverage-followup/</link>
		<comments>http://multimedia.cx/eggs/ansi-code-coverage-followup/#comments</comments>
		<pubDate>Fri, 09 Mar 2012 06:41:40 +0000</pubDate>
		<dc:creator>Multimedia Mike</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://multimedia.cx/eggs/?p=3748</guid>
		<description><![CDATA[Running a code coverage experiment on all known samples in the wild]]></description>
			<content:encoded><![CDATA[<p>The people behind <a href="http://sixteencolors.net/">sixteencolors.net</a> noticed <a href="http://multimedia.cx/eggs/finding-optimal-code-coverage/">my code coverage project concerning the ANSI video decoder</a> and asked what they could do to help. I had already downloaded 350 / 4000 of their artpacks but didn&#8217;t want to download the remainder if I could avoid it. They offered to run my tool against their local collection of files.</p>
<p><em>Aside: They have <a href="https://github.com/sixteencolors/sixteencolors-archive">all of the artpacks archived at Github</a>.</em></p>
<p>The full corpus of nearly 4000 artpacks contains over 146,000 files. Versus my sampling of 350 artpacks and 13,000 files that covered all but 45 lines of the ansi.c source file, the full corpus has files to exercise&#8230; <strong>6 more of those lines</strong>. Whee. This means that there are files which exercise the reverse and concealed attributes, all 3 &#8220;erase in line&#8221; modes, and one more error path (which probably wasn&#8217;t a valid file anyway).</p>
<p>Missing features mostly cluster around different video modes, including: 320&#215;200 (25 rows), 640&#215;200 (25 rows), 640&#215;350 (43 rows), and 640&#215;480 (60 rows); on the plus side, nothing tripped the &#8220;unsupported screen mode&#8221; case. There are no files that switch modes during playback.</p>
<p>I guess <a href="http://en.wikipedia.org/wiki/Sampling_%28statistics%29">statistical sampling theory</a> holds out here&#8211; a small set of randomly chosen files would do a fine job covering code. But this experiment is about finding the statistical outliers.</p>
]]></content:encoded>
			<wfw:commentRss>http://multimedia.cx/eggs/ansi-code-coverage-followup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Finding Optimal Code Coverage</title>
		<link>http://multimedia.cx/eggs/finding-optimal-code-coverage/</link>
		<comments>http://multimedia.cx/eggs/finding-optimal-code-coverage/#comments</comments>
		<pubDate>Wed, 07 Mar 2012 06:11:36 +0000</pubDate>
		<dc:creator>Multimedia Mike</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://multimedia.cx/eggs/?p=3740</guid>
		<description><![CDATA[Automatically working through a large corpus of data in order to find a small set that exercises the most code in a program]]></description>
			<content:encoded><![CDATA[<p>A few months ago, I published <a href="http://multimedia.cx/eggs/using-lcov-with-ffmpeg/">a procedure for analyzing code coverage of the test suites exercised in FFmpeg and Libav</a>. I used it to add some more tests and I have it on good authority that it has helped other developers fill in some gaps as well (beginning with students helping out with the projects as part of <a href="http://code.google.com/opensource/gci/2011-12/index.html">the Google Code-In program</a>). Now I&#8217;m wondering about ways to do better.</p>
<p><strong>Current Process</strong><br />
When adding a test that depends on a sample (like a demuxer or decoder test), it&#8217;s ideal to add a sample that&#8217;s A) small, and B) exercises as much of the codebase as possible. When I was studying code coverage statistics for the <a href="http://wiki.multimedia.cx/index.php?title=Xan">WC4-Xan video decoder</a>, I noticed that the sample didn&#8217;t exercise one of the 2 possible frame types. So I scouted samples until I found one that covered both types, trimmed the sample down, and updated the coverage suite.</p>
<p>I started wondering about a method for finding the optimal test sample for a given piece of code, one that exercises every code path in a module. Okay, so that&#8217;s foolhardy in the  vast majority of cases (although I was able to add one test spec that pushed a module&#8217;s code coverage from 0% all the way to 100% &#8212; but the module in question only had 2 exercisable lines). Still, given a large enough corpus of samples, how can I find the smallest set of samples that exercise the complete codebase?</p>
<p>This almost sounds like an NP-complete problem. But why should that stop me from trying to find a solution?</p>
<p><strong>Science Project</strong><br />
Here&#8217;s the pitch:</p>
<ul>
<li>Instrument FFmpeg with code coverage support</li>
<li>Download lots of media to exercise a particular module</li>
<li>Run FFmpeg against each sample and log code coverage statistics</li>
<li>Distill the resulting data in some meaningful way in order to obtain more optimal code coverage</li>
</ul>
<p>That first step sounds harsh&#8211; downloading lots and lots of media. Fortunately, there is at least one multimedia format in the projects that tends to be extremely small: ANSI. These are files that are designed to display elaborate scrolling graphics using text mode. Further, the FATE sample currently deployed for this test (TRE_IOM5.ANS) only exercises a little less than 50% of the code in libavcodec/ansi.c. I believe this makes the ANSI video decoder a good candidate for this experiment.</p>
<p><strong>Procedure</strong><br />
First, find a site that hosts a lot ANSI files. Hi, <a href="http://sixteencolors.net/">sixteencolors.net</a>. This site has lots (on the order of 4000) artpacks, which are ZIP archives that contain multiple ANSI files (and sometimes some other files). I scraped a list of all the artpack names.</p>
<p>In an effort to be responsible, I randomized the list of artpacks and downloaded periodically and with limited bandwidth (<code>'wget --limit-rate=20k'</code>).</p>
<p>Run &#8216;gcov&#8217; on ansi.c in order to gather the full set of line numbers to be covered.</p>
<p>For each artpack, unpack the contents, run the instrumented FFmpeg on each file inside, run &#8216;gcov&#8217; on ansi.c, and log statistics including the file&#8217;s size, the file&#8217;s location (artpack.zip:filename), and a comma-separated list of line numbers touched.</p>
<p><strong>Definition of &#8216;Optimal&#8217;</strong><br />
The foregoing procedure worked and yielded useful, raw data. Now I have to figure out how to analyze it.</p>
<p>I think it&#8217;s most desirable to have the smallest files (in terms of bytes) that exercise the most lines of code. To that end, I sorted the results by filesize, ascending. A Python script initializes a set of all exercisable line numbers in ansi.c, then iterates through each each file&#8217;s stats line, adding the file to the list of candidate samples if its set of exercised lines can remove any line numbers from the overall set of lines. Ideally, that set of lines should devolve to an empty set.</p>
<p>I think a second possible approach is to find the single sample that exercises the most code and then proceed with the previously described method.</p>
<p><strong>Initial Results</strong><br />
So far, I have analyzed 13324 samples from 357 different artpacks provided by sixteencolors.net.<span id="more-3740"></span></p>
<p>Using the first method, I can find a set of samples that covers nearly 80% of ansi.c:</p>
<p><code><br />
0 bytes: bad-0494.zip:5<br />
1 bytes: grip1293.zip:-ANSI---.---<br />
1 bytes: pur-0794.zip:.<br />
2 bytes: awe9706.zip:-ANSI───.───<br />
61 bytes: echo0197.zip:-(ART)-<br />
62 bytes: hx03.zip:HX005.DAT<br />
76 bytes: imp-0494.zip:IMPVIEW.CFG<br />
82 bytes: ice0010b.zip:_cont'd_.___<br />
101 bytes: bdp-0696.zip:BDP2.WAD<br />
112 bytes: plain12.zip:--------.---<br />
181 bytes: ins1295v.zip:-°VGA°-.  н<br />
219 bytes: purg-22.zip:NEM-SHIT.ASC<br />
289 bytes: srg1196.zip:HOWTOREQ.JNK<br />
315 bytes: karma-04.zip:FASHION.COM<br />
318 bytes: buzina9.zip:ox-rmzzy.ans<br />
411 bytes: solo1195.zip:FU-BLAH1.RIP<br />
621 bytes: ciapak14.zip:NA-APOC1.ASC<br />
951 bytes: lght9404.zip:AM-TDHO1.LIT<br />
1214 bytes: atb-1297.zip:TX-ROKL.ASC<br />
2332 bytes: imp-0494.zip:STATUS.ANS<br />
3218 bytes: acepak03.zip:TR-STAT5.ANS<br />
6068 bytes: lgc-0193.zip:LGC-0193.MEM<br />
16778 bytes: purg-20.zip:EZ-HIR~1.JPG<br />
20582 bytes: utd0495.zip:LT-CROW3.ANS<br />
26237 bytes: quad0597.zip:MR-QPWP.GIF<br />
29208 bytes: mx-pack17.zip:mx-mobile-source-logo.jpg<br />
----<br />
109440 bytes total<br />
</code></p>
<p>A few notes about that list: Some of those filenames are comprised primarily of control characters. <em>133t</em>, and all that. The first file is 0 bytes. I wondered if I should discard 0-length files but decided to keep those in, especially if they exercise lines that wouldn&#8217;t normally be activated. Also, there are a few JPEG and GIF files in the set. I should point out that I forced the tty demuxer using <code>-f tty</code> and there isn&#8217;t much in the way of signatures for this format. So, again, whatever exercises more lines is better.</p>
<p>Using this same corpus, I tried approach 2&#8211; which single sample exercises the most lines of the decoder? Answer: blde9502.zip:REQUEST.EXE. Huh. I checked it out and &#8216;file&#8217; ID&#8217;s it as a MS-DOS executable. So, that approach wasn&#8217;t fruitful, at least not for this corpus since I&#8217;m forcing everything through this narrow code path.</p>
<p><strong>Think About The Future</strong><br />
Where can I take this next? <strong>The cloud!</strong> I have <em>people</em> inside the search engine industry who have furnished me with extensive lists of specific types of multimedia files from around the internet. I also see that <a href="http://aws.amazon.com/ec2/">Amazon Web Services Elastic Compute Cloud (AWS EC2)</a> instances don&#8217;t charge for incoming bandwidth.</p>
<p>I think you can see where I&#8217;m going with this.</p>
<p><strong>See Also:</strong></p>
<ul>
<li><a href="http://multimedia.cx/eggs/ansi-code-coverage-followup/">Running this experiment on 4000 artpacks / 146,000 files</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://multimedia.cx/eggs/finding-optimal-code-coverage/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>WMA Lossless and ProRes Encoder</title>
		<link>http://multimedia.cx/eggs/wma-lossless-and-prores-encoder/</link>
		<comments>http://multimedia.cx/eggs/wma-lossless-and-prores-encoder/#comments</comments>
		<pubDate>Sun, 04 Mar 2012 22:38:46 +0000</pubDate>
		<dc:creator>Multimedia Mike</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://multimedia.cx/eggs/?p=3733</guid>
		<description><![CDATA[FFmpeg/Libav can now decode all Microsoft WMA formats; the projects have gained some other curious features as well such as ProRes encoding and a few new image formats]]></description>
			<content:encoded><![CDATA[<p>The projects (<a href="http://ffmpeg.org/">FFmpeg</a> / <a href="http://libav.org/">Libav</a>) just got a <a href="http://wiki.multimedia.cx/index.php?title=Windows_Media_Audio_9_Lossless">WMA lossless</a> decoder. For those keeping score, this means that there are open source methods for decoding every single one of Microsoft&#8217;s proprietary audio codecs (Windows Media Audio, or WMA): WMA v1, WMA v2, WMA9/Pro, WMA Voice, and now WMA lossless. Currently, it&#8217;s only advertised to decode 16-bit audio (no 24-bit). Also, when I first tried it a few days ago, it didn&#8217;t decode the very end of the single sample file I concocted many years ago (<a href="http://samples.mplayerhq.hu/A-codecs/lossless/">luckynight.wma</a>). But that might be cleared up by now.</p>
<p>Some other recent developments in the projects that I wanted to call out: An encoder for the <a href="http://wiki.multimedia.cx/index.php?title=Apple_ProRes">Apple ProRes</a> encoder from <a href="http://codecs.multimedia.cx/">Kostya</a>; <a href="http://wiki.multimedia.cx/index.php?title=XWD">XWD (X window dump) image</a> decoding and encoding from Paul B. Mahol; a <a href="http://wiki.multimedia.cx/index.php?title=Sun_rasterfile">Sun rasterfile</a> encoder from Aneesh Dogra.</p>
<p>And then there&#8217;s the new playback system for <a href="http://wiki.multimedia.cx/index.php?title=CDXL">CDXL files</a>, also courtesy of Paul B. Mahol. I wasn&#8217;t familiar with this format until I wrote this post, which is surprising, given the format&#8217;s vintage. This was a CD-ROM FMV format favored for Amiga computers. Here it is in all its 160x120x10fps glory:</p>
<p><center><br />
<img src="http://multimedia.cx/eggs/wp-content/uploads/2012/03/amigaball.cdxl-libavcodec.png" alt="" title="An Amiga CDXL file playing in FFmpeg/Libav" width="176" height="166" class="aligncenter size-full wp-image-3735" /><br />
</center></p>
<p>That&#8217;s the <a href="http://samples.mplayerhq.hu/game-formats/cdxl/">amigaball.cdxl sample available in the repository</a>. The sample is 3835910 bytes large and plays for about 24 seconds. This yields a data rate of about 159 kbytes/second. So, yeah, single-speed CD-ROM FMV.</p>
]]></content:encoded>
			<wfw:commentRss>http://multimedia.cx/eggs/wma-lossless-and-prores-encoder/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Pushing Projects to Github</title>
		<link>http://multimedia.cx/eggs/pushing-projects-to-github/</link>
		<comments>http://multimedia.cx/eggs/pushing-projects-to-github/#comments</comments>
		<pubDate>Fri, 17 Feb 2012 05:25:11 +0000</pubDate>
		<dc:creator>Multimedia Mike</dc:creator>
				<category><![CDATA[Game Hacking]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://multimedia.cx/eggs/?p=3722</guid>
		<description><![CDATA[I pushed some old projects up to Github: GhettoRSS, xbfuse, gcfuse]]></description>
			<content:encoded><![CDATA[<p>I finally got around to importing some old projects into <a href="https://github.com/multimediamike">my Github account</a>. I guess it&#8217;s good to have a backup out there in the cloud.</p>
<p><strong>GhettoRSS</strong><br />
<a href="https://github.com/multimediamike/GhettoRSS">https://github.com/multimediamike/GhettoRSS</a><br />
I describe this as a true offline RSS reader. Technically, it&#8217;s arguably not a true offline RSS reader. Rather, it does what most people <em>actually want</em> an offline RSS reader to do.</p>
<p>I wrote this about 2 years ago when I had a long daily train ride with a disconnected netbook. I quickly learned that I couldn&#8217;t count on offline RSS readers simply because most RSS feeds to not contain much meat. Thus, I created a program that follows URLs in RSS feeds, downloads web pages and supporting images and CSS files, and caches them in an offline database which can be read via a local web browser.</p>
<p>I wrote more information about this little project 2 years ago (<a href="http://multimedia.cx/eggs/my-own-offline-rss-reader/">here is part 1</a> and <a href="http://multimedia.cx/eggs/my-own-offline-rss-reader-part-2/">here is part 2</a>). I fixed a few bugs in preparation for posting it but I probably won&#8217;t work on this anymore since I don&#8217;t have any use for it (the commute is long gone, but I didn&#8217;t even use it when I was commuting because I decided I just didn&#8217;t care enough to read the feeds on the train).</p>
<p><strong>xbfuse</strong><br />
<a href="https://github.com/multimediamike/xbfuse">https://github.com/multimediamike/xbfuse</a><br />
This is a FUSE module for mounting Xbox/360 optical disc filesystems. <a href="http://multimedia.cx/eggs/xbfuse/">Here is when I first discussed it.</a> The tool has had <a href="http://multimedia.cx/xbfuse/">its own little homepage</a> for a long time. This tool has seen some development, as I learned from Googling for &#8220;xbfuse&#8221;. Regrettably, no one who has modified the tool has ever contacted me about it (at least, not that I can recall). This is unfortunate because the patches I have seen floating around which fix my xbfuse for various installations usually boil down replacing many occurrences of an include path in the autotool-generated build system. There is probably a simpler, cleaner fix.</p>
<p><strong>gcfuse</strong><br />
<a href="https://github.com/multimediamike/gcfuse">https://github.com/multimediamike/gcfuse</a><br />
Written prior to xbfuse, this is a FUSE module for mounting GameCube optical disc filesystems. I first discussed this <a href="http://multimedia.cx/eggs/gcfuse/">here</a> and <a href="http://multimedia.cx/eggs/gcfuse-exe/">here</a>. This tool has not seen too much direct development although someone eventually used it as the basis for <a href="http://wiibrew.org/wiki/Wiifuse">WiiFuse</a> which, as you can predict, mounts optical disc filesystems from Nintendo Wii games.</p>
]]></content:encoded>
			<wfw:commentRss>http://multimedia.cx/eggs/pushing-projects-to-github/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Origin Crusader Media</title>
		<link>http://multimedia.cx/eggs/origin-crusader-media/</link>
		<comments>http://multimedia.cx/eggs/origin-crusader-media/#comments</comments>
		<pubDate>Tue, 14 Feb 2012 06:45:19 +0000</pubDate>
		<dc:creator>Multimedia Mike</dc:creator>
				<category><![CDATA[Game Hacking]]></category>

		<guid isPermaLink="false">http://multimedia.cx/eggs/?p=3711</guid>
		<description><![CDATA[Crusader: No Remorse from Origin has some custom video files and music tracker format]]></description>
			<content:encoded><![CDATA[<p>A gleaming copy of the old Origin game <a href="http://www.mobygames.com/game/crusader-no-remorse">Crusader: No Remorse</a> showed up today:</p>
<p><center><br />
<a href="http://www.mobygames.com/game/crusader-no-remorse"><img src="http://multimedia.cx/eggs/wp-content/uploads/2012/02/crusader-no-remorse-cdrom-classics-gold-box.jpg" alt="" title="Crusader: No Remorse -- CD-ROM Classics Gold release" width="250" height="294" class="aligncenter size-full wp-image-3712" /></a><br />
</center></p>
<p>Immediately, I delved in expecting to find <a href="http://wiki.multimedia.cx/index.php?title=Origin_Xan_Codec">Xan-encoded AVI files</a> that would play perfectly using FFmpeg/Libav. Instead, I found a directory labeled flics/ that indeed has a lot of AVI files, but not in Xan. The programs attempt to interpret them as raw RGB. The strangest thing is the first frame often looks correct, if upside down:</p>
<p><center><br />
<img src="http://multimedia.cx/eggs/wp-content/uploads/2012/02/crusader-screenshot-001.png" alt="" title="Strange screenshot from Crusader: No Remorse" width="240" height="180" class="aligncenter size-full wp-image-3714" /><br />
</center></p>
<p>The first file I peered inside had the video FourCC &#8216;RRV1&#8242;. Searching for this led me to <a href="http://cyberionsystems.com/echosector/index.php?topic=537.0">this discussion forum</a> where people have already been hacking on this very format (Origin games invariably get a heap of lasting love). The forum participants have observed that 3 codecs are in play in this flics/ directory, including &#8216;RRV1&#8242;, &#8216;RRV2&#8242;, and &#8216;JYV1&#8242;, which apparently correspond to the initials of certain developers. The reason that the programs identify the files as raw RGB is because the FourCCs don&#8217;t appear everywhere that they&#8217;re supposed to. Additionally, there are several trailers for other Origin/EA games stored in Cinepak format elsewhere on the disc.</p>
<p>It seems that I&#8217;m the person who <a href="http://wiki.multimedia.cx/index.php?title=Origin_Xan_Codec&#038;diff=2881&#038;oldid=2841">added this title to the Xan wiki page</a>, obviously with no first-hand evidence to back it up. Meanwhile, the forum participants speculate that the files are descended from the old Autodesk FLIC format (which would explain why they live in a directory called flics/). Corroborating strings extracted from the CRUSADER.EXE file include &#8220;FlicWait&#8221;, &#8220;FlicPlayer&#8221;, &#8220;Flic %s not found.&#8221;, &#8220;flicpath&#8221;, and &#8220;FLICPLAY.C&#8221;.</p>
<p>The disc also features a sound/ directory which contains AMF files. Suxen Drol already documented these on the wiki as <a href="http://wiki.multimedia.cx/index.php?title=Asylum_Music_Format">Asylum Media Format files</a>. The disc contains an ASYLUM.DLL file as well as a utility called MOD2AMF.EXE. The latter works beautifully on a random MOD file I had laying around. The AMF file is a bit larger.</p>
<p><a href="http://samples.mplayerhq.hu/game-formats/crusader-no-remorse/">Samples for all 3 FourCCs can be found here</a>, while <a href="http://samples.mplayerhq.hu/game-formats/crusader-no-remorse/amf/">the AMF files and associated utilities are here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://multimedia.cx/eggs/origin-crusader-media/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 0.267 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2012-05-17 01:10:37 -->
<!-- Compression = gzip -->
