{"id":3683,"date":"2012-01-04T23:39:57","date_gmt":"2012-01-05T07:39:57","guid":{"rendered":"http:\/\/multimedia.cx\/eggs\/?p=3683"},"modified":"2012-01-05T10:44:00","modified_gmt":"2012-01-05T18:44:00","slug":"2011-in-open-source-multimedia","status":"publish","type":"post","link":"https:\/\/multimedia.cx\/eggs\/2011-in-open-source-multimedia\/","title":{"rendered":"2011 In Open Source Multimedia"},"content":{"rendered":"<p>Sometimes I think that the pace of multimedia technology is slowing down. Obviously, I&#8217;m not paying close enough attention. I thought I would do a little 2011 year-end review of what happened in the world of open source multimedia, mainly for my own benefit. Let me know in the comments what I missed.<\/p>\n<p><strong>The Split<\/strong><br \/>\nThe biggest deal in open source multimedia was the matter of the project split. Where once stood one project (<a href=\"http:\/\/ffmpeg.org\/\">FFmpeg<\/a>) there now stands two (also <a href=\"http:\/\/libav.org\/\">Libav<\/a>). Where do things stand with the projects now? Still very separate but similar. Both projects obsessively monitor each other&#8217;s git commits and prodigiously poach each other&#8217;s work, both projects being LGPL and all. Most features that land in one code base end up in the other. Thus, I refer to FFmpeg and Libav collectively as &#8220;the projects&#8221;.<\/p>\n<p>Some philosophical reasons for the split included project stagnation and development process friction. Curiously, these problems are fond memories now and the spirit of competition has pushed development forward at a blinding pace.<\/p>\n<p>People inside the project have strong opinions about the split; that&#8217;s understandable. <a href=\"http:\/\/phoronix.com\/forums\/showthread.php?37331-A-Group-Of-FFmpeg-Developers-Just-Forked-As-Libav\">People outside the project<\/a> have <a href=\"http:\/\/news.ycombinator.com\/item?id=2325806\">strong opinions<\/a> about <a href=\"http:\/\/lwn.net\/Articles\/433347\/\">the split<\/a>; that&#8217;s somewhat less understandable, but whatever. After 5 years of working for Adobe on the Flash Player (a.k.a. the most hated software in all existence if internet nerds are to be believed on the matter), I&#8217;m <em>so over<\/em> internet nerd drama.<\/p>\n<p>For my part, I just try to maintain some appearance of neutrality since I manage some shared resources for the open source multimedia community (like <a href=\"http:\/\/wiki.multimedia.cx\/\">the wiki<\/a> and <a href=\"http:\/\/samples.mplayerhq.hu\/\">samples repo<\/a>) and am trying to keep them from fracturing as well.<\/p>\n<p><strong>Apple and Open Source<\/strong><br \/>\nIt was big news that <a href=\"http:\/\/multimedia.cx\/eggs\/alac-open-sourced\/\">Apple magnanimously open sourced their lossless audio codec<\/a>. That sets a great example and precedent.<\/p>\n<p><strong>New Features<\/strong><br \/>\nI mined the <code>'git log'<\/code> of the projects in order to pick out some features that were added during 2011.<\/p>\n<p>First off, <a href=\"http:\/\/wiki.multimedia.cx\/index.php?title=Apple_ProRes\">Apple&#8217;s ProRes video codec<\/a> was reverse engineered and incorporated into the multimedia libraries. And for some weird reason, <em>this<\/em> is an item that made the rounds in the geek press. I&#8217;m not entirely sure why, but it may have something to do with inter-project conflict. Anyway, here is the decoder in action, playing a video of some wild swine, one of the few samples we have:<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/multimedia.cx\/eggs\/wp-content\/uploads\/2012\/01\/apple-prores-boar-video.jpg\" alt=\"\" title=\"Apple ProRes screenshot -- the boar video\" width=\"400\" height=\"301\" class=\"aligncenter size-full wp-image-3684\" srcset=\"https:\/\/multimedia.cx\/eggs\/wp-content\/uploads\/2012\/01\/apple-prores-boar-video.jpg 400w, https:\/\/multimedia.cx\/eggs\/wp-content\/uploads\/2012\/01\/apple-prores-boar-video-300x225.jpg 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><br \/>\n<\/center><\/p>\n<p>Other new video codecs included a reverse engineered <a href=\"http:\/\/wiki.multimedia.cx\/index.php?title=Indeo_4\">Indeo 4<\/a> decoder. Gotta catch &#8217;em all! That completes our collection of Indeo codecs. But that wasn&#8217;t enough&#8211; this year, we got a completely revised <a href=\"http:\/\/wiki.multimedia.cx\/index.php?title=Indeo_3\">Indeo 3<\/a> decoder (the previous one, while functional, exhibited a lot of code artifacts betraying a direct ASM -&gt;C translation). Oh, and many thanks to <a href=\"http:\/\/codecs.multimedia.cx\/\">Kostya<\/a> for this gem:<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/multimedia.cx\/eggs\/wp-content\/uploads\/2012\/01\/wc4-trailer-screenshot.jpg\" alt=\"\" title=\"Wing Commander IV trailer playing with open source Xan codec\" width=\"336\" height=\"211\" class=\"aligncenter size-full wp-image-3685\" srcset=\"https:\/\/multimedia.cx\/eggs\/wp-content\/uploads\/2012\/01\/wc4-trailer-screenshot.jpg 336w, https:\/\/multimedia.cx\/eggs\/wp-content\/uploads\/2012\/01\/wc4-trailer-screenshot-300x188.jpg 300w\" sizes=\"auto, (max-width: 336px) 100vw, 336px\" \/><br \/>\n<\/center><\/p>\n<p>That&#8217;s the new <a href=\"http:\/\/wiki.multimedia.cx\/index.php?title=Origin_Xan_Codec\">Origin Xan decoder<\/a> (best known for <a href=\"http:\/\/www.mobygames.com\/game\/wing-commander-iv-the-price-of-freedom\">Wing Commander IV<\/a> cinematics) in action, something I first started reverse engineering back in 2002. Thanks to Kostya for picking up my slack yet again.<\/p>\n<p>Continuing with the codec section, <!--more-->there is a decoder for <a href=\"http:\/\/wiki.multimedia.cx\/index.php?title=Flash_screen_video\">Adobe Flash Screen Video 2<\/a> &#8212; big congrats on this! One of my jobs at Adobe was documenting this format to the outside world and I was afraid I could never quite make it clear enough to build a complete re-implementation. But the team came through.<\/p>\n<p>Let&#8217;s see, there are decoders for <a href=\"http:\/\/wiki.multimedia.cx\/index.php?title=VBLE\">VBLE video<\/a>, <a href=\"http:\/\/wiki.multimedia.cx\/index.php?title=Ut_Video\">Ut Video<\/a>, <a href=\"http:\/\/wiki.multimedia.cx\/index.php?title=VC-1\">Windows Media Image<\/a> (WMVP\/WMP2), <a href=\"http:\/\/wiki.multimedia.cx\/index.php?title=Bink_Audio\">Bink audio<\/a> version &#8216;b&#8217;, H.264 4:2:2 intra frames, and MxPEG video. There is a <a href=\"http:\/\/wiki.multimedia.cx\/index.php?title=DPX_\/_Cineon\">DPX image<\/a> encoder, a <a href=\"http:\/\/wiki.multimedia.cx\/index.php?title=Cirrus_Logic_AccuPak\">Cirrus Logic AccuPak<\/a> video encoder, and a v410 codec.<\/p>\n<p>How about some more game stuff? The projects saw &#8212; at long last &#8212; an <a href=\"http:\/\/wiki.multimedia.cx\/index.php?title=SMJPEG\">SMJPEG<\/a> demuxer. This will finally allow usage and testing of the SMJPEG IMA ADPCM audio decoder I added about a decade ago. Funny story behind that&#8211; I was porting all of my decoders from <a href=\"http:\/\/www.xine-project.org\/home\">xine<\/a> which included the SMJPEG ADPCM. I just never quite got around to writing a corresponding demuxer. Thanks to Paul Mahol for taking care of that.<\/p>\n<p>Here&#8217;s a <a href=\"http:\/\/wiki.multimedia.cx\/index.php?title=DFA\">DFA<\/a> playback system for a 1995 DOS CD-ROM title called <a href=\"http:\/\/www.mobygames.com\/game\/dos\/chronomaster\">Chronomaster<\/a>. No format is too obscure, nor its encoded contents too cheesy:<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/multimedia.cx\/eggs\/wp-content\/uploads\/2012\/01\/dfa-screenshot.jpg\" alt=\"\" title=\"Chronomaster DFA playback\" width=\"400\" height=\"321\" class=\"aligncenter size-full wp-image-3686\" srcset=\"https:\/\/multimedia.cx\/eggs\/wp-content\/uploads\/2012\/01\/dfa-screenshot.jpg 400w, https:\/\/multimedia.cx\/eggs\/wp-content\/uploads\/2012\/01\/dfa-screenshot-300x240.jpg 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><br \/>\n<\/center><\/p>\n<p>There&#8217;s now a demuxer for a format called <a href=\"http:\/\/wiki.multimedia.cx\/index.php?title=XMV\">XMV<\/a> that was (is?) prevalent on Xbox titles. Now the projects can handle FMV files from many Xbox games, such as <a href=\"http:\/\/www.mobygames.com\/game\/xbox\/thrillville\">Thrillville<\/a>.<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/multimedia.cx\/eggs\/wp-content\/uploads\/2012\/01\/thrillville-xmv-screenshot.jpg\" alt=\"\" title=\"XMV from the Xbox game Thrillville\" width=\"400\" height=\"321\" class=\"aligncenter size-full wp-image-3687\" srcset=\"https:\/\/multimedia.cx\/eggs\/wp-content\/uploads\/2012\/01\/thrillville-xmv-screenshot.jpg 400w, https:\/\/multimedia.cx\/eggs\/wp-content\/uploads\/2012\/01\/thrillville-xmv-screenshot-300x240.jpg 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><br \/>\n<\/center><\/p>\n<p>The projects also gained the ability to play BMV files. I think this surfing wizard comes from <a href=\"http:\/\/www.mobygames.com\/game\/discworld-ii-mortality-bytes\">Discworld II<\/a>. It&#8217;s non-computer-generated animation at a strange resolution.<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/multimedia.cx\/eggs\/wp-content\/uploads\/2012\/01\/surfing-bmv-screenshot.jpg\" alt=\"\" title=\"BMV playback system: Surfing wizard\" width=\"400\" height=\"290\" class=\"aligncenter size-full wp-image-3688\" srcset=\"https:\/\/multimedia.cx\/eggs\/wp-content\/uploads\/2012\/01\/surfing-bmv-screenshot.jpg 400w, https:\/\/multimedia.cx\/eggs\/wp-content\/uploads\/2012\/01\/surfing-bmv-screenshot-300x217.jpg 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><br \/>\n<\/center><\/p>\n<p>More demuxers: <a href=\"http:\/\/wiki.multimedia.cx\/index.php?title=Microsoft_xWMA\">xWMA<\/a>, PlayStation Portable PMP format, and <a href=\"http:\/\/wiki.multimedia.cx\/index.php?title=CRI_ADX_ADPCM\">CRI ADX format<\/a>; muxer for OpenMG audio and LATM muxer\/demuxer.<\/p>\n<p>One more thing: an <a href=\"http:\/\/en.wikipedia.org\/wiki\/Advanced_Vector_Extensions\">AVX<\/a>-optimized fast Fourier transform (FFT). If you have a machine that supports AVX, there&#8217;s no way you&#8217;ll even notice the speed increase of a few measly FFT calls for audio coding\/decoding, but that&#8217;s hardly the point. The projects always use everything on offer for any CPU.<\/p>\n<p><em>Please make me aware of features that I missed in the list!<\/em><\/p>\n<p><strong>Continuous Testing<\/strong><br \/>\nAs a result of the split, each project has its own FATE server, <a href=\"http:\/\/fate.ffmpeg.org\/\">one for FFmpeg<\/a> and <a href=\"http:\/\/fate.libav.org\/\">one for Libav<\/a>. As of the new year, FFmpeg has just over 1000 tests while Libav had 965. This is one area where I&#8217;m obviously ecstatic to see competition. Some ad-hoc measurements on my part indicate that the total code coverage via the FATEs has not appreciably increased. But that&#8217;s a total percentage. Both the test count and the code count have been steadily rising.<\/p>\n<p><strong>Google Summer of Code and Google Code-In<\/strong><br \/>\nOnce again, the projects were allowed to participate in the Google Summer of Code as well as Google Code-In. I confess that I didn&#8217;t keep up with these too carefully (and Code-In is still in progress as of this writing). I do know that the project split occurred after FFmpeg had already been accepted for GSoC season 2011 and the admins were gracious enough to allow FFmpeg and Libav to allow both projects to participate in the same slot as long as they could both be mature about it. <\/p>\n<p><strong>Happy New Year<\/strong><br \/>\nLet&#8217;s see what we can accomplish in 2012.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A look back at what transpired in open source multimedia during the calendar year of 2011; highlights include the notorious project split<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-3683","post","type-post","status-publish","format-standard","hentry","category-open-source-multimedia"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/multimedia.cx\/eggs\/wp-json\/wp\/v2\/posts\/3683","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/multimedia.cx\/eggs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/multimedia.cx\/eggs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/multimedia.cx\/eggs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/multimedia.cx\/eggs\/wp-json\/wp\/v2\/comments?post=3683"}],"version-history":[{"count":12,"href":"https:\/\/multimedia.cx\/eggs\/wp-json\/wp\/v2\/posts\/3683\/revisions"}],"predecessor-version":[{"id":3702,"href":"https:\/\/multimedia.cx\/eggs\/wp-json\/wp\/v2\/posts\/3683\/revisions\/3702"}],"wp:attachment":[{"href":"https:\/\/multimedia.cx\/eggs\/wp-json\/wp\/v2\/media?parent=3683"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/multimedia.cx\/eggs\/wp-json\/wp\/v2\/categories?post=3683"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/multimedia.cx\/eggs\/wp-json\/wp\/v2\/tags?post=3683"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}