<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<feed xmlns="http://www.w3.org/2005/Atom">

	<title>Planet Xiph</title>
	<link rel="self" href="http://planet.xiph.org/atom.xml"/>
	<link href="http://planet.xiph.org/"/>
	<id>http://planet.xiph.org/atom.xml</id>
	<updated>2009-11-07T09:00:17+00:00</updated>
	<generator uri="http://www.planetplanet.org/">Planet/2.0 +http://www.planetplanet.org</generator>

	<entry xml:lang="en">
		<title type="html">Old bugs fixed</title>
		<link href="http://bemasc.net/wordpress/2009/11/06/old-bugs-fixed/"/>
		<id>http://bemasc.net/wordpress/?p=1445</id>
		<updated>2009-11-06T05:38:11+00:00</updated>
		<content type="html">&lt;p&gt;In the process of testing Cortado on old operating systems, we discovered that using a recent compiler produced bytecode that wouldn&amp;#8217;t run on Sun JDK 1.1.  Instead, we got IllegalMonitorState exceptions in an infinite loop.&lt;/p&gt;
&lt;p&gt;A little bit of searching made it clear that we weren&amp;#8217;t the only ones who&amp;#8217;d experienced this problem.  There were &lt;a href=&quot;http://forums.sun.com/thread.jspa?threadID=196703&amp;forumID=37&quot;&gt;reports&lt;/a&gt; going back to 2001 that Sun had introduced some sort of bug in their compiler in version 1.4.  We verified that going back to an old compiler produced code that worked for us, again.&lt;/p&gt;
&lt;p&gt;Today Greg Maxwell constructed a minimal test case and printed out the disassembled bytecode produced with old and new compilers.  One difference stood out: the new compiler introduced a circular exception handler at the end of a synchronized block.  I looked around, and sure enough, this behavior &lt;a href=&quot;http://bugs.sun.com/view_bug.do?bug_id=4414101&quot;&gt;drew complaints&lt;/a&gt; when it first appeared over eight years ago.&lt;/p&gt;
&lt;p&gt;Rather than attempt to convince the compiler authors that their code has a logical fallacy, or somehow fix ten-year-old versions of closed-source software, we instead decided to add &lt;a href=&quot;http://sourceforge.net/tracker/?func=detail&amp;aid=2893068&amp;group_id=54750&amp;atid=474704&quot;&gt;a workaround&lt;/a&gt; into &lt;a href=&quot;http://proguard.sourceforge.net/&quot;&gt;ProGuard&lt;/a&gt;, a bytecode post-processor that we are already using to shrink Cortado by 30% for faster downloads.&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s an interesting question here as to what, exactly, the bug is.  Is it a code generation bug, in which the compiler produces bytecode that will not run correctly on the Java 1.1 target?  Or is it a JVM bug, exposed by newer compilers that make use of previously untested edge cases?  This is a case of Software Development Relativity: the number of bugs is conserved, but their precise location depends on your reference frame.&lt;/p&gt;
&lt;p&gt;Anyway, I think this is a nice short story about the power of an open development model.  We found a bug somewhere in a complex system, and wound up putting a fix in the component whose maintainers, we hope, will be most receptive to it.  When one avenue is cut off, open source finds another route.&lt;/p&gt;</content>
		<author>
			<name>Ben Schwartz</name>
			<uri>http://bemasc.net/wordpress</uri>
		</author>
		<source>
			<title type="html">Digital Diary of Ben Schwartz » Xiph</title>
			<subtitle type="html">Like information, but less informative</subtitle>
			<link rel="self" href="http://bemasc.net/wordpress/category/general/projects/xiph/feed/"/>
			<id>http://bemasc.net/wordpress/category/general/projects/xiph/feed/</id>
			<updated>2009-11-06T06:00:09+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Cortado</title>
		<link href="http://bemasc.net/wordpress/2009/11/02/cortado/"/>
		<id>http://bemasc.net/wordpress/?p=1435</id>
		<updated>2009-11-03T03:57:32+00:00</updated>
		<content type="html">&lt;p&gt;A project I&amp;#8217;ve been playing with recently is Ogg Theora&amp;#8217;s &lt;a href=&quot;http://theora.org/cortado/&quot;&gt;Cortado&lt;/a&gt;, a free video player designed to be able to run on an extremely wide variety of computers, including old, obsolete systems.  How old, you ask?&lt;/p&gt;
&lt;p&gt;Really old:&lt;br /&gt;
&lt;div id=&quot;attachment_1436&quot; class=&quot;wp-caption alignnone&quot;&gt;&lt;a href=&quot;http://bemasc.net/wordpress/wp-content/uploads/2009/11/Screenshot-sheep.png&quot;&gt;&lt;img src=&quot;http://bemasc.net/wordpress/wp-content/uploads/2009/11/Screenshot-sheep-300x235.png&quot; alt=&quot;Screenshot of Cortado playing a video in SheepShaver&quot; title=&quot;Screenshot-sheep&quot; width=&quot;300&quot; height=&quot;235&quot; class=&quot;size-medium wp-image-1436&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Screenshot of Cortado playing a video in SheepShaver&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;This is a picture of Cortado running on Mac OS 7.5.5, in the Macintosh Runtime for Java 2.0, playing the video from the FSF&amp;#8217;s &lt;a href=&quot;http://www.fsf.org/news/video_testimonials_campaign/&quot;&gt;freedom testimonials campaign&lt;/a&gt;.  This operating system was released in 1996.  The system is emulated in &lt;a href=&quot;http://gwenole.beauchesne.info//en/projects/sheepshaver&quot;&gt;SheepShaver&lt;/a&gt;, which makes playback far too slow to be usable.  Someone will have to test on real hardware to see what happens.&lt;/p&gt;
&lt;p&gt;Nonetheless, I think this is strong evidence regarding how serious we are about backwards compatibility and inclusive software.  Serious, or at least, enthusiastic.&lt;/p&gt;</content>
		<author>
			<name>Ben Schwartz</name>
			<uri>http://bemasc.net/wordpress</uri>
		</author>
		<source>
			<title type="html">Digital Diary of Ben Schwartz » Xiph</title>
			<subtitle type="html">Like information, but less informative</subtitle>
			<link rel="self" href="http://bemasc.net/wordpress/category/general/projects/xiph/feed/"/>
			<id>http://bemasc.net/wordpress/category/general/projects/xiph/feed/</id>
			<updated>2009-11-06T06:00:09+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Best economy flight evva!</title>
		<link href="http://blog.gingertech.net/2009/11/01/best-economy-flight-evva/"/>
		<id>http://blog.gingertech.net/?p=668</id>
		<updated>2009-11-01T04:34:53+00:00</updated>
		<content type="html">&lt;p&gt;Over the years, I have flown a lot &amp;#8211; mainly between Sydney and Frankfurt or Sydney and San Francisco. Today, for the first time in a long time, I had a flight with Qantas from Sydney to San Francisco. And I must say: it was the most productive and most comfortable economy flight I had in a long time.&lt;/p&gt;
&lt;p&gt;This is gonna feel awkward, since it&amp;#8217;s not one of my usual technical posts. But I just have to say &amp;#8220;Thank you&amp;#8221; to Qantas. When I fly to the US, I tend to catch a US airline because they usually turn up as the cheapest. This time, Qantas was the second cheapest, so I decided to spend the extra hundred bucks on getting a modern airline. Yes, get that US airlines: no matter which of you I take, I always feel like I am thrown back into the last century. Legspace is rare, seats are uncomfortable, food is crap, service is poor, oh &amp;#8230; and have you ever heard of personal entertainment screens? Yes, I know, your planes are from the last century. But honestly: I had a personal entertainment screen on my Singapore Airlines flight when coming to Australia for the first time in 1998! Couldn&amp;#8217;t you at least upgrade the inside of your planes?&lt;/p&gt;
&lt;p&gt;Anyway, back to this flight. It all started with the question: would you like to sit in the centre isle in front of the baby bassinet? Oh, I usually take a window seat to get some peace and quiet &amp;#8211; but hey, I&amp;#8217;m not going to say &amp;#8220;no&amp;#8221; to space! And, man did I use it!&lt;/p&gt;
&lt;p&gt;I settled in with a good book and a little nap until the first meal and after that felt strengthened and awake enough to start hacking. With my new MacBook Pro, I was bound to get a few hours in before the battery would die on me. Not the 7 hours, that Apple claims, but that&amp;#8217;s because I was going to do lots of compiles of Firefox. Anyway &amp;#8211; without a seat in front of me, without the personal entertainment screen pulled out, and with the nice thick cushion that Qantas supply on my lap, protecting me from the laptop heat, I almost felt like I was back home in my living room.&lt;/p&gt;
&lt;p&gt;On top of that &amp;#8211; and unfortunately for Qantas, but fortunately for me &amp;#8211; the plane was only two thirds full, so I had the middle seat on my left empty, which I immediately used to extend my table space. I had continuing catering service for the next 4-5 hours of compiling, applying OggK patches to the new Chris Double Firefox codebase, and fixing compile errors (all configuration based &amp;#8211; I have yet to get to writing actual code). Ongoing catering service, no need to cook for myself, uninterrupted coding time, good music from the inflight entertainment service &amp;#8211; I think I&amp;#8217;ll move my office into a Qantas plane! Not been this productive in ages!&lt;/p&gt;
&lt;p&gt;Everywhere around me the lights were out, people were watching movies, but I was working and really enjoying it. And then, the battery was empty, half way into the flight. Bummer! But I didn&amp;#8217;t give up this easily. Thought it&amp;#8217;d be worth asking if there was a way to recharge without occupying a toilet for two hours. And as with everything else, Qantas inflight personnel made an extra effort to please: they found me a empty seat in business class and hooked up the laptop for an hour to recharge. Totally, utterly awesome! I got it back after another nice reading break &amp;#8211; cannot start watching movies, since that makes the brain go mash. I got another few hours of compiling in before my body forced me to catch a few hours of sleep.&lt;/p&gt;
&lt;p&gt;Now, I&amp;#8217;m about an hour away from San Fran and the laptop claims 40min of power left. Funnily, that number seems to go up rather than down, so I&amp;#8217;m sure it will last until arrival (uh! It&amp;#8217;s now at 1:24min &amp;#8211; oh, compilation just finished!). Hopefully I will be able to find out, why some of the Ogg Theora/Vorbis/Kate videos that I created using kateenc and oggz-merge don&amp;#8217;t play in the patched Firefox. After all, it would be awesome to be able to show it off in the upcoming HTML5 Video Accessibility workshop!&lt;/p&gt;</content>
		<author>
			<name>silvia</name>
			<uri>http://blog.gingertech.net</uri>
		</author>
		<source>
			<title type="html">ginger's thoughts</title>
			<subtitle type="html">Silvia's blog</subtitle>
			<link rel="self" href="http://blog.gingertech.net/feed/atom/"/>
			<id>http://blog.gingertech.net/feed/atom/</id>
			<updated>2009-11-01T05:00:09+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">New proposal for captions and other timed text for HTML5</title>
		<link href="http://blog.gingertech.net/2009/10/06/new-proposal-for-captions-and-other-timed-text-for-html5/"/>
		<id>http://blog.gingertech.net/?p=591</id>
		<updated>2009-10-29T13:27:52+00:00</updated>
		<content type="html">&lt;p&gt;&lt;a href=&quot;https://wiki.mozilla.org/Accessibility/HTML5_captions&quot;&gt;The first specification&lt;/a&gt; for how to include captions, subtitles, lyrics, and similar time-aligned text with HTML5 media elements has &lt;a href=&quot;https://wiki.mozilla.org/Accessibility/Experiment1_feedback&quot;&gt;received a lot of feedback&lt;/a&gt; &amp;#8211; probably because there are &lt;a href=&quot;http://www.annodex.net/~silvia/itext/&quot;&gt;several demos available&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The feedback has encouraged me to develop &lt;a href=&quot;https://wiki.mozilla.org/Accessibility/HTML5_captions_v2&quot;&gt;a new specification&lt;/a&gt; that includes the concerns and makes it easier to associate out-of-band time-aligned text (i.e. subtitles stored in separate files to the video/audio file). A simple example of the new specification using srt files is this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;video src=&quot;video.ogv&quot; controls&gt;
   &amp;lt;itextlist category=&quot;CC&quot;&gt;
     &amp;lt;itext src=&quot;caption_en.srt&quot; lang=&quot;en&quot;/&gt;
     &amp;lt;itext src=&quot;caption_de.srt&quot; lang=&quot;de&quot;/&gt;
     &amp;lt;itext src=&quot;caption_fr.srt&quot; lang=&quot;fr&quot;/&gt;
     &amp;lt;itext src=&quot;caption_jp.srt&quot; lang=&quot;jp&quot;/&gt;
   &amp;lt;/itextlist&gt;
 &amp;lt;/video&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;By default, the charset of the itext file is UTF-8, and the default format is text/srt (incidentally a mime type the still needs to be registered). Also by default the browser is expected to select for display the track that matches the set default language of the browser. This has been proven to work well in the previous experiments.&lt;/p&gt;
&lt;p&gt;Check out the &lt;a href=&quot;https://wiki.mozilla.org/Accessibility/HTML5_captions_v2&quot;&gt;new itext specification&lt;/a&gt;, read on to get an introduction to what has changed, and leave me your feedback if you can!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The itextlist element&lt;/strong&gt;&lt;br /&gt;
You will have noticed that in comparison to the previous specification, this specification contains a grouping element called &amp;#8220;itextlist&amp;#8221;. This is necessary because we have to distinguish between alternative time-aligned text tracks and ones that can be additional, i.e. displayed at the same time. In the first specification this was done by inspecting each itext element&amp;#8217;s category and grouping them together, but that resulted in much repetition and unreadable specifications.&lt;/p&gt;
&lt;p&gt;Also, it was not clear which itext elements were to be displayed in the same region and which in different ones. Now, their styling can be controlled uniformly.&lt;/p&gt;
&lt;p&gt;The final advantage is that association of callbacks for entering and leaving text segments as extracted from the itext elements can now be controlled from the itextlist element in a uniform manner.&lt;/p&gt;
&lt;p&gt;This change also makes it simple for a parser to determine the structure of the menu that is created and included in the controls element of the audio or video element.&lt;/p&gt;
&lt;p&gt;Incidentally, a patch for Firefox already exists that makes this part of the browser. It does not yet support this new itext specification, but here is a screenshot that Felipe Corrêa da Silva Sanches created to demonstrate it:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://bug515898.bugzilla.mozilla.org/attachment.cgi?id=399992&quot; alt=&quot;screenshot of subtitle menu included in Firefox&quot; width=&quot;480px&quot; /&gt;&lt;/p&gt;
&lt;p&gt;If several itextlist elements are specified, that menu will receive sub-menus &amp;#8211; one each for each itextlist. An example is the following:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;video src=&quot;video.ogv&quot; aria-label=&quot;test video&quot; controls&gt;
    &amp;lt;itextlist category=&quot;SUB&quot; name=&quot;subtitles&quot;&gt;
      &amp;lt;itext src=&quot;sub_en.srt&quot; lang=&quot;en&quot;/&gt;
      &amp;lt;itext src=&quot;sub_de.srt&quot; lang=&quot;de&quot;/&gt;
      &amp;lt;itext src=&quot;sub_fr.srt&quot; lang=&quot;fr&quot;/&gt;
      &amp;lt;itext src=&quot;sub_jp.srt&quot; lang=&quot;jp&quot;/&gt;
    &amp;lt;/itextlist&gt;
    &amp;lt;itextlist category=&quot;TAD&quot; name=&quot;spoken transcript&quot;&gt;
      &amp;lt;itext id=&quot;tad_en&quot; src=&quot;tad_en.srt&quot; lang=&quot;en&quot;/&gt;
      &amp;lt;itext id=&quot;tad_jp&quot; src=&quot;tad_jp.srt&quot; lang=&quot;jp&quot;/&gt;
    &amp;lt;/itextlist&gt;
  &amp;lt;/video&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;which will result in the following menu structure:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;text&lt;br /&gt;
- subtitles&lt;br /&gt;
-- English&lt;br /&gt;
-- German&lt;br /&gt;
-- French&lt;br /&gt;
-- Japanese&lt;br /&gt;
-- none&lt;br /&gt;
- spoken transcript&lt;br /&gt;
-- English&lt;br /&gt;
-- Japanese&lt;br /&gt;
-- none&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Similarly, a context menu would use the same structure.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Callbacks on timed text segments&lt;/strong&gt;&lt;br /&gt;
This specification further introduces callbacks on time-aligned text segments: &lt;em&gt;onenter&lt;/em&gt; and &lt;em&gt;onleave&lt;/em&gt;. At this stage this is an idea I am experimenting with, but I believe has lots of potential to allow people to do fancy things when subtitles appear or disappear. Some ideas are: to have a specific picture displayed that relates to the text segment, to have text in another area of the display change e.g. because we have moved into a different part of the full text transcript, or to display Google ads that relate to the text in that particular text segment.&lt;/p&gt;
&lt;p&gt;I am curious about feedback on this idea. It relates closely to the idea of cue ranges that was &lt;a href=&quot;http://www.w3.org/TR/2009/WD-html5-20090212/video.html#cue-ranges&quot;&gt;previously part of HTML5&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It is possible to achieve this effect simply through adding a timeupdate event listener, but proper callbacks like these are much more efficient.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Synchronisation adjustments&lt;/strong&gt;&lt;br /&gt;
Another addition to the itext element is the introduction of two attributes that together allow fixing synchronisation issues in the timing between the video (or audio) and the itext track. The two attributes are &amp;#8220;delay&amp;#8221; and &amp;#8220;stretch&amp;#8221;.&lt;/p&gt;
&lt;p&gt;&amp;#8220;delay&amp;#8221; allows specification of a negative or positive float value that represents the amount of seconds with which to delay the display of the itext text segments relative to the timing of the video (or audio) element.&lt;/p&gt;
&lt;p&gt;&amp;#8220;stretch&amp;#8221; allows fixing a constant drift that in timing differences between the video (or audio) element and the text segments. It is given in percent, where 100% means no time stretch, 97% means getting the text segments 3% faster than their actual timing, and 108% means 8% slower.&lt;/p&gt;
&lt;p&gt;These attributes are relevant since itext files are independent resources to the media resource and can therefore synchronise to a different clock than the media files. It happens frequently with srt files that are being used for differently encoded video files.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Further feedback&lt;/strong&gt;&lt;br /&gt;
I am currently experimenting with creating the same kind of JavaScript API for in-line annotation tracks through &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=481529&quot;&gt;extending some Firefox patches&lt;/a&gt;. It is exciting to see it all come together.&lt;/p&gt;
&lt;p&gt;At the same time, I am sure there is still feedback that will further improve the specification and I encourage you to contribute. I have set up a &lt;a href=&quot;https://wiki.mozilla.org/Accessibility/Experiment2_feedback&quot;&gt;wiki page where you can leave your feedback&lt;/a&gt;. Also feel free to drop me an email or leave a comment on this blog post. Thanks!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;UPDATE 30th Oct 2009:&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;
There is now also a working implementation that demonstrates the approach with itextlist. Check out &lt;a href=&quot;http://www.annodex.net/~silvia/itext/elephant_no_skin_v2.html&quot;&gt;http://www.annodex.net/~silvia/itext/elephant_no_skin_v2.html&lt;/a&gt;, which will not look much different to the previous version, but does indeed behave very differently.&lt;/p&gt;</content>
		<author>
			<name>silvia</name>
			<uri>http://blog.gingertech.net</uri>
		</author>
		<source>
			<title type="html">ginger's thoughts</title>
			<subtitle type="html">Silvia's blog</subtitle>
			<link rel="self" href="http://blog.gingertech.net/feed/atom/"/>
			<id>http://blog.gingertech.net/feed/atom/</id>
			<updated>2009-11-01T05:00:09+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Cortado 0.5.0 released</title>
		<link href="http://blog.gingertech.net/2009/10/28/cortado-0-5-0-released/"/>
		<id>http://blog.gingertech.net/?p=664</id>
		<updated>2009-10-28T08:04:53+00:00</updated>
		<content type="html">&lt;p&gt;Cortado is a java applet that provides support for Ogg Theora/Vorbis to Web publishers. It&amp;#8217;s particularly useful to publishers that want to use Ogg Theora/Vorbis in Browsers that do not yet support the HTML5 video element with Ogg.&lt;/p&gt;
&lt;p&gt;Cortado was originally developed by &lt;a href=&quot;http://www.flumotion.net/cortado/&quot;&gt;Fluendo SA&lt;/a&gt; under a LGPL license and contains a re-implementation of Theora and Vorbis in Java (jheora and jcraft). After a few years of low maintenance, the &lt;a href=&quot;http://svn.wikimedia.org/viewvc/mediawiki/trunk/cortado/&quot;&gt;Wikimedia Foundation&lt;/a&gt; took it in their hands to undust the code for their use in the &lt;a href=&quot;http://commons.wikimedia.org/wiki/Category:Video&quot;&gt;Wikimedia Commons&lt;/a&gt;, where only unencumberd open video format are acceptable.&lt;/p&gt;
&lt;p&gt;As &lt;a href=&quot;http://lists.xiph.org/pipermail/theora/2009-October/002976.html&quot;&gt;Ralph states in his announcement of the new release&lt;/a&gt;: earlier this year, Xiph.org took over maintenance of the Cortado java applet to help concentrate interest and expertise on this important component of the free media codec infrastructure. Therefore, the &lt;a href=&quot;http://www.theora.org/cortado/&quot;&gt;official website for Cortado&lt;/a&gt; is as now part of the Xiph. [If somebody could &lt;a href=&quot;http://en.wikipedia.org/wiki/Cortado_%28software%29&quot;&gt;update the Wikipedia article&lt;/a&gt; - that would be awesome!]&lt;/p&gt;
&lt;p&gt;So, I am very happy to point to the &lt;a href=&quot;http://lists.xiph.org/pipermail/theora/2009-October/002976.html&quot;&gt;first Cortado release in three years&lt;/a&gt;. Source and sample builds are available from the &lt;a href=&quot;http://downloads.xiph.org/releases/cortado/&quot;&gt;Xiph.org download site&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ralph writes further:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
The new version is tagged 0.5.0 to indicate both the change in hosting and the significant new support for files from the new libtheora encoder implementation and Kate embedded subtitles.&lt;/p&gt;
&lt;p&gt;In particular, 0.5.0 has:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Support for files encoded with Theora 1.1&lt;/li&gt;
&lt;li&gt;Faster YUV to RGB conversion with better results&lt;/li&gt;
&lt;li&gt;Basic support for embedded Ogg Kate streams&lt;/li&gt;
&lt;li&gt;Seeking fixed for files with an Ogg Skeleton track&lt;/li&gt;
&lt;li&gt;Maintained compatibility with the Microsoft VM&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is an awesome example of the power of open source and what a group of people can achieve. Congratulations to everyone at Xiph, Wikipedia, and anyone else who contributed to the release!&lt;/p&gt;</content>
		<author>
			<name>silvia</name>
			<uri>http://blog.gingertech.net</uri>
		</author>
		<source>
			<title type="html">ginger's thoughts</title>
			<subtitle type="html">Silvia's blog</subtitle>
			<link rel="self" href="http://blog.gingertech.net/feed/atom/"/>
			<id>http://blog.gingertech.net/feed/atom/</id>
			<updated>2009-11-01T05:00:09+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Dealing with multi-track video (and audio)</title>
		<link href="http://blog.gingertech.net/2009/10/17/dealing-with-multi-track-video-and-audio/"/>
		<id>http://blog.gingertech.net/?p=632</id>
		<updated>2009-10-17T12:15:08+00:00</updated>
		<content type="html">&lt;p&gt;We are slowly approaching the stage where we want to make multi-track video of the following type available and accessible:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;original video track&lt;/li&gt;
&lt;li&gt;original audio track&lt;/li&gt;
&lt;li&gt;dubbed audio tracks in n different languages&lt;/li&gt;
&lt;li&gt;audio description track in n different langauges&lt;/li&gt;
&lt;li&gt;sign language video tracks in n different sign langauges&lt;/li&gt;
&lt;li&gt;caption tracks in n different langauges&lt;/li&gt;
&lt;li&gt;multiple other time-aligned text tracks in different langauges&lt;/li&gt;
&lt;li&gt;audio and video track from different camera angles&lt;/li&gt;
&lt;li&gt;music and speech tracks can be separate&lt;/li&gt;
&lt;li&gt;different quality tracks are available&lt;/li&gt;
&lt;li&gt;accompanying images, e.g. slides for a presentation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One of the issues with such a sizeable number of tracks is how to display them. Some of them are alternatives, some of them additions. Sign language is typically presented in a PiP (picture-in-picture) approach. If we have a music and a speech (or singing) track, we may want to have control over removing certain tracks &amp;#8211; e.g. to be able to do karaoke. Caption and subtitle tracks in the same language are probably alternatives, while in different languages they could be additions. It is not a trivial challenge to handle such complex files in an application.&lt;/p&gt;
&lt;p&gt;At this point, I am only trying to solve a sub-challenge. As we talk about a particular track in a multi-track media file, we will want to identify it by name. Should there be a standard for naming the track, so that we can e.g. address them by a URL, e.g. with the intention of only delivering a subset of tracks from the larger file? We could introduce that for Ogg &amp;#8211; but maybe there is an opportunity to do this across file formats?&lt;/p&gt;
&lt;p&gt;To find some answers to these and related questions, I want to discuss two approaches.&lt;/p&gt;
&lt;p&gt;The first approach is a simple numbering approach. In it, the audio, video, and annotation tracks are all ordered and then numbered through. This will result in the following sets of track names: video[0] &amp;#8230; [n], audio[0] &amp;#8230; [n], timed text[0] &amp;#8230; [n], and possibly even timed images[0] &amp;#8230; [n]. This approach is simple, easy to understand, and only requires ordering the tracks within their types. It allows addressing of a particular track &amp;#8211; e.g. as required by the media fragment URI scheme for track addressing. However, it does not allow identification of alternatives, additions, or presentation styles.&lt;/p&gt;
&lt;p&gt;Should alternatives, additions, and presentation styles be encoded in the name of  track? Or should this information go into a meta description area of the multi-track video? Something like skeleton in Ogg? Or should it go a step further and be buried in an external information file such as an m3u file (or &lt;a href=&quot;http://wiki.xiph.org/ROE&quot;&gt;ROE&lt;/a&gt; for Ogg)?&lt;/p&gt;
&lt;p&gt;I want to experiment here with the naming scheme and what we would need to specify to be able to decide which tracks to ignore and which to combine for a presentation. And I want to ask for your comments and advice.&lt;/p&gt;
&lt;p&gt;This requires listing exactly what types of content tracks we may have to deal with.&lt;/p&gt;
&lt;p&gt;In the video space, we have at minimum the following track types:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;main video content &amp;#8211; with alternative camera angles&lt;/li&gt;
&lt;li&gt;subsidiary video content &amp;#8211; with alternative camera angles&lt;/li&gt;
&lt;li&gt;sign language videos &amp;#8211; in alternative languages&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Alternatives are defined by camera angle and language. Also, each track can be made available in a different quality. I&amp;#8217;d also regard additional image content, such as slides in a presentation, into subsidiary video content. So, here we could use a scheme such as &lt;em&gt;video_[main,side,sign]_language_angle&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;In the audio space, we have at minimum the following track types:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;main audio content &amp;#8211; in alternative languages&lt;/li&gt;
&lt;li&gt;background audio content &amp;#8211; e.g.music, SFX, noise&lt;/li&gt;
&lt;li&gt;foreground speech or singing content &amp;#8211; in alternative languages&lt;/li&gt;
&lt;li&gt;audio descriptions &amp;#8211; in alternative languages&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Alternatives are defined by language and content type. Again, each track can be made available in a different quality. Here we could use a scheme such as &lt;em&gt;audio_type_language&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;In the text space, we have at minimum the following track types:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;subtitles &amp;#8211; in different languages&lt;/li&gt;
&lt;li&gt;captions &amp;#8211; in different languages&lt;/li&gt;
&lt;li&gt;textual audio descriptions &amp;#8211; in different languages&lt;/li&gt;
&lt;li&gt;other time-aligned text &amp;#8211; in different languages&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Alternatives are defined by language and content type &amp;#8211; e.g. lyrics, captions and subtitles really compete for the same screen space. Here we could use a scheme such as &lt;em&gt;text_type_language&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;A generic track naming scheme&lt;/b&gt;&lt;br /&gt;
It seems, the generic naming scheme of&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
&lt;em&gt;&amp;lt;content_type&gt;_&amp;lt;track_type&gt;_&amp;lt;language&gt; [_&amp;lt;angle&gt;]&lt;/em&gt;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;can cover all cases.&lt;/p&gt;
&lt;p&gt;Are there further track types, further alternatives I have missed? What do you think?&lt;/p&gt;</content>
		<author>
			<name>silvia</name>
			<uri>http://blog.gingertech.net</uri>
		</author>
		<source>
			<title type="html">ginger's thoughts</title>
			<subtitle type="html">Silvia's blog</subtitle>
			<link rel="self" href="http://blog.gingertech.net/feed/atom/"/>
			<id>http://blog.gingertech.net/feed/atom/</id>
			<updated>2009-11-01T05:00:09+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">MySQL, Snow Leopard and ruby</title>
		<link href="http://blog.gingertech.net/2009/10/13/mysql-snow-leopard-and-ruby/"/>
		<id>http://blog.gingertech.net/?p=639</id>
		<updated>2009-10-13T13:33:26+00:00</updated>
		<content type="html">&lt;p&gt;I got a shiny new MacBook Pro on the weekend, yay! After months of complaining about the slowness and the heat evaporating from my old Macbook, I&amp;#8217;m finally off to better grounds.&lt;/p&gt;
&lt;p&gt;But then there was the annoying task of setting up the machine with all the software that I&amp;#8217;m using. MySQL and ruby turned out to be particular problems. I installed &lt;a href=&quot;http://dev.mysql.com/downloads/mysql/5.1.html#macosx-dmg&quot;&gt;MySQL for 10.5&lt;/a&gt;, since MySQL haven&amp;#8217;t published one for OS 10.6 yet. I ran &amp;#8220;gem install mysql&amp;#8221;. And then the pain started.&lt;/p&gt;
&lt;p&gt;I got all the errors that were reported elsewhere:&lt;br /&gt;
&amp;#8220;&lt;a href=&quot;http://www.ruby-forum.com/topic/192550&quot;&gt;uninitialized constant MysqlCompat::MysqlRes&lt;/a&gt;&amp;#8221; and &amp;#8220;&lt;a href=&quot;http://forums.mysql.com/read.php?116,257419,257419&quot;&gt;undefined method `real_connect&amp;#8217; for Mysql:Class (NoMethodError)&lt;/a&gt;&amp;#8220;. I tried all the suggestions &amp;#8211; including:&lt;br /&gt;
&lt;code&gt;&quot;sudo env ARCHFLAGS=&quot;-arch x86&quot; gem install mysql -- --with-mysql-config=/usr/local/mysql-5.1.39-osx10.5-x86/bin/mysql_config -V --debug&lt;/code&gt;, but just couldn&amp;#8217;t get there.&lt;/p&gt;
&lt;p&gt;My laptop reports in the System Software Overview: &amp;#8220;64-bit Kernel and Extensions:	No&amp;#8221;, so I assumed I had to use the 32 bit versions. However, that was a wrong assumption. Even though my kernel seems to be 32 bit, applications seem to be 64 bit.&lt;/p&gt;
&lt;p&gt;So, eventually I re-installed &lt;a href=&quot;http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.39-osx10.5-x86_64.dmg/from/http://mysql.mirrors.ilisys.com.au/&quot;&gt;MySQL for Mac OS X 10.5 (x86_64)&lt;/a&gt; and ran the correct gem install command:&lt;br /&gt;
&lt;code&gt;sudo env ARCHFLAGS=&quot;-arch x86_64&quot; gem install mysql -- --with-mysql-config=/usr/local/mysql-5.1.39-osx10.5-x86&lt;/code&gt; and things were fine.&lt;/p&gt;
&lt;p&gt;Additionally, there was some fighting with the PrefPane and re-starting mysql. I had to kill it manually and I had to install the updated &lt;a href=&quot;http://weblog.rubyonrails.org/2009/8/30/upgrading-to-snow-leopard#comment-25712&quot;&gt;PrefPane of Swoon dot net&lt;/a&gt; to make it work.&lt;/p&gt;
&lt;p&gt;Hope this helps somebody avoid the same pain!&lt;/p&gt;</content>
		<author>
			<name>silvia</name>
			<uri>http://blog.gingertech.net</uri>
		</author>
		<source>
			<title type="html">ginger's thoughts</title>
			<subtitle type="html">Silvia's blog</subtitle>
			<link rel="self" href="http://blog.gingertech.net/feed/atom/"/>
			<id>http://blog.gingertech.net/feed/atom/</id>
			<updated>2009-11-01T05:00:09+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">&amp;#8220;W3C acquired by Twitter&amp;#8221; fun at Web Directions South</title>
		<link href="http://blog.gingertech.net/2009/10/09/w3c-acquired-by-twitter-fun-at-web-directions-south/"/>
		<id>http://blog.gingertech.net/?p=634</id>
		<updated>2009-10-09T05:28:39+00:00</updated>
		<content type="html">&lt;p&gt;I had the great pleasure to be part of the W3C presentations at Web Directions South. But I had the even greater pleasure to upload part of Doug Schepers&amp;#8217; talk as recorded by Laurent Lefort. It contains the shocking news that the W3C got acquired by Twitter and how standards will change through that in the near future. Here&amp;#8217;s the video &amp;#8211; enjoy!&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;</content>
		<author>
			<name>silvia</name>
			<uri>http://blog.gingertech.net</uri>
		</author>
		<source>
			<title type="html">ginger's thoughts</title>
			<subtitle type="html">Silvia's blog</subtitle>
			<link rel="self" href="http://blog.gingertech.net/feed/atom/"/>
			<id>http://blog.gingertech.net/feed/atom/</id>
			<updated>2009-11-01T05:00:09+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">WebJam 2009 talk on video accessibility</title>
		<link href="http://blog.gingertech.net/2009/10/09/webjam-2009-talk-on-video-accessibility/"/>
		<id>http://blog.gingertech.net/?p=618</id>
		<updated>2009-10-09T04:25:47+00:00</updated>
		<content type="html">&lt;p&gt;On Wednesday evening I gave a 3 min presentation on video accessibility in HTML5 at the WebJam in Sydney. I used a video as my presentation means and explained things while playing it back. Here is the video, without my oral descriptions, but probably still useful to some. Note in particular how you can experience the issues of deaf (HoH), blind (VI) and foreign language users:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;http://www.annodex.net/~silvia/Webjam10.ogv&quot;&gt;Ogg version is here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;</content>
		<author>
			<name>silvia</name>
			<uri>http://blog.gingertech.net</uri>
		</author>
		<source>
			<title type="html">ginger's thoughts</title>
			<subtitle type="html">Silvia's blog</subtitle>
			<link rel="self" href="http://blog.gingertech.net/feed/atom/"/>
			<id>http://blog.gingertech.net/feed/atom/</id>
			<updated>2009-11-01T05:00:09+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Web Directions South 2009 talk on HTML5 video</title>
		<link href="http://blog.gingertech.net/2009/10/09/web-directions-south-2009-talk-on-html5-video/"/>
		<id>http://blog.gingertech.net/?p=621</id>
		<updated>2009-10-09T04:15:13+00:00</updated>
		<content type="html">&lt;p&gt;Yesterday, I gave  a talk on the &lt;a href=&quot;http://south09.webdirections.org/program/w3ctrack#taking-html5-video-a-step-further&quot;&gt;HTML5 video element at Web Directions South&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The title was &amp;#8220;Taking HTML5 &amp;lt;video&gt; a step further&amp;#8221; and the abstract was provided goes as follows:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This talk focuses on the efforts engaged by W3C  to improve the new HTML 5 media elements with mechanisms to allow people to access multimedia content, including audio and video. Such developments are also useful beyond accessibility needs and will lead to a general improvement of the usability of media, making media discoverable and generally a prime citizen on the Web.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Silvia will discuss what is currently technically possible with the HTML5 media elements, and what is still missing. She will describe a general framework of accessibility for HTML5 media elements and present her work for the Mozilla Corporation that includes captions, subtitles, textual audio annotations, timed metadata, and other time-aligned text with the HTML5 media elements. Silvia will also discuss work of the W3C Media Fragments group to further enhance video usability and accessibility by making it possible to directly address temporal offsets in video, as well as spatial areas and tracks.&lt;/p&gt;
&lt;p&gt;Here are my slides:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.slideshare.net/silviapfeiffer/taking-html5-video-a-step-further/download&quot;&gt;Download the pdf from here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There was also a video recording and I will add that here as soon as it is published.&lt;/p&gt;
&lt;p&gt;UPDATE:&lt;br /&gt;
&lt;a href=&quot;http://tinyvid.tv/show/25ily17irrch0&quot;&gt;The video is available on Tinyvid&lt;/a&gt;:&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m not going to try and upload this 50min long video to YouTube &amp;#8211; with it&amp;#8217;s 10 min limit, I won&amp;#8217;t get very far.&lt;/p&gt;</content>
		<author>
			<name>silvia</name>
			<uri>http://blog.gingertech.net</uri>
		</author>
		<source>
			<title type="html">ginger's thoughts</title>
			<subtitle type="html">Silvia's blog</subtitle>
			<link rel="self" href="http://blog.gingertech.net/feed/atom/"/>
			<id>http://blog.gingertech.net/feed/atom/</id>
			<updated>2009-11-01T05:00:09+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">YCbCr Gamut Checking</title>
		<link href="http://www.schleef.org/blog/2009/10/07/ycbcr-gamut-checking/"/>
		<id>http://www.schleef.org/blog/?p=36</id>
		<updated>2009-10-08T07:04:19+00:00</updated>
		<content type="html">&lt;p&gt;I recently added a pattern to GStreamer&amp;#8217;s videotestsrc that can be used to check YCbCr to RGB conversion is being done correctly as part of video output.  It is the result of a clever hack &amp;#8212; some YCbCr values, when converted to RGB, are out of range, so as part of the conversion process, they are clamped to the nearest RGB value.  The pattern generator creates a checkerboard pattern of a color (say, red) and a YCbCr value that upon correct conversion will result in the same color.  Thus the pattern should be invisible.  Usefully, these out-of-gamut YCbCr values are preserved by video codecs, so I can present to you a Theora video demonstrating this:&lt;/p&gt;
&lt;p&gt;your browser doesn&amp;#8217;t support the video tag.  Download Firefox&lt;/p&gt;
&lt;p&gt;Firefox does the conversion correctly, so it&amp;#8217;s unlikely you&amp;#8217;ll see the pattern.  However, some video display drivers still get this wrong, so you might see the pattern when playing the video in a standalone program that uses XV.  For those of you with working kit, I created a demonstration video that simulates a bad conversion:&lt;/p&gt;
&lt;p&gt;your browser doesn&amp;#8217;t support the video tag.  Download Firefox&lt;/p&gt;
&lt;p&gt;Sometimes it&amp;#8217;s possible to see the pattern very faintly due to rounding in even a correct conversion.  This is unavoidable because the RGB-&gt;YCbCr-&gt;RGB round trip is lossy.&lt;/p&gt;</content>
		<author>
			<name>David Schleef</name>
			<uri>http://www.schleef.org/blog</uri>
		</author>
		<source>
			<title type="html">Passing on the Left » video</title>
			<subtitle type="html">Just another WordPress weblog</subtitle>
			<link rel="self" href="http://www.schleef.org/blog/category/video/feed/"/>
			<id>http://www.schleef.org/blog/category/video/feed/</id>
			<updated>2009-11-07T09:00:14+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">W3C Workshop/Barcamp on HTML5 Video Accessibility</title>
		<link href="http://blog.gingertech.net/2009/09/22/w3c-workshopbarcamp-on-html5-video-accessibility/"/>
		<id>http://blog.gingertech.net/?p=572</id>
		<updated>2009-09-24T07:38:16+00:00</updated>
		<content type="html">&lt;p&gt;Web accessibility veteran &lt;a href=&quot;http://john.foliot.ca/&quot;&gt;John Foliot&lt;/a&gt; of Stanford University and Apple&amp;#8217;s QuickTime EcoSystem Manager &lt;a href=&quot;http://www.streamingmedia.com/bio.asp?id=33997&quot;&gt;Dave Singer&lt;/a&gt; are organising a W3C Workshop/Barcamp on Video Accessibility on the Sunday before the &lt;a href=&quot;http://www.w3.org/2009/11/TPAC/&quot;&gt;W3C&amp;#8217;s annual combined technical plenary meeting TPAC&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The workshop will take place on 1st November at Stanford University &amp;#8211; &lt;a href=&quot;http://www.mail-archive.com/public-webapps@w3.org/msg05276.html&quot;&gt;see details on the Workshop&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you read the announcement, you will see that this is about understanding all the issues around video (and audio) accessibility, understanding existing approaches, and trying to find solutions for HTML5 that all browser vendors will be able to support.&lt;/p&gt;
&lt;p&gt;The workshop is run under the &lt;a href=&quot;http://www.w3.org/2006/11/hypertext-cg-charter&quot;&gt;W3C Hypertext Coordination Group&lt;/a&gt; and &lt;a href=&quot;http://www.w3.org/2009/09/acc-media-html-gathering.html&quot;&gt;registration is required&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;W3C membership is not required in order to participate in the gathering. However, you are required to contribute your knowledge actively and constructively to the Workshop. You must come prepared to present on one of the questions in &lt;a href=&quot;http://www.w3.org/2009/09/acc-media-html-gathering.html&quot;&gt;this document&lt;/a&gt; to help inform the discussion and make progress on proposing solutions.&lt;/p&gt;
&lt;p&gt;I am very excited about this workshop because I think it is high time to move things forward.&lt;/p&gt;
&lt;p&gt;If I can get my travel sorted, I will present my results on the video accessibility work that I did for Mozilla. It will cover both: &lt;a href=&quot;https://wiki.mozilla.org/Accessibility/Video_a11y_Study08&quot;&gt;out-of-band accessibility data for video elements, as well as in-line accessibility data&lt;/a&gt; and how to expose a common API in the Web browser for them. I have recently experimented with encoding srt and lrc files in Ogg and displaying them in Firefox by using the patches that were &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=481529&quot;&gt;contributed by OggK and Felipe&lt;/a&gt; into Firefox. More about this soon.&lt;/p&gt;</content>
		<author>
			<name>silvia</name>
			<uri>http://blog.gingertech.net</uri>
		</author>
		<source>
			<title type="html">ginger's thoughts</title>
			<subtitle type="html">Silvia's blog</subtitle>
			<link rel="self" href="http://blog.gingertech.net/feed/atom/"/>
			<id>http://blog.gingertech.net/feed/atom/</id>
			<updated>2009-11-01T05:00:09+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Cog in gst-plugins-bad</title>
		<link href="http://www.schleef.org/blog/2009/09/19/cog-in-gst-plugins-bad/"/>
		<id>http://www.schleef.org/blog/?p=24</id>
		<updated>2009-09-19T20:05:30+00:00</updated>
		<content type="html">&lt;p&gt;I finally moved my collection of Orc-based GStreamer plugins (codename &amp;#8220;Cog&amp;#8221;) into gst-plugins-bad, since they&amp;#8217;re moved on from being an experiment.  &lt;a href=&quot;http://www.schleef.org/blog/2009/05/31/orc-040/&quot;&gt;Orc&lt;/a&gt; is a runtime compiler for a simple cross-platform assembly-like language that specifically targets SIMD instructions for several processors.  Orc is very effective inside it&amp;#8217;s domain, which is small but growing.&lt;/p&gt;
&lt;p&gt;One such application that is covered is chroma subsampling and color matrixing for video, semi-incorrectly referred to as &amp;#8220;colorspace conversion&amp;#8221; in GStreamer.  There has been a colorspace element in Cog (cogcolorspace) for some time, but I never really bothered to do any speed comparisons between it and the default GStreamer colorspace element (ffmpegcolorspace), which is based on code copied from FFMpeg.  However, recently I did, and was somewhat surprised (although I shouldn&amp;#8217;t have been) that cogcolorspace is the same speed as, or much faster than, ffmpegcolorspace for almost all operations.  (Please note that the FFMpeg code was forked a long time ago and heavily modified, so it does not reflect FFMpeg itself, only GStreamer&amp;#8217;s ffmpegcolorspace.)&lt;/p&gt;
&lt;p&gt;This is a scatter plot of the run time (in ms) for converting 1000 frames of 320&amp;#215;240 video between a variety of uncompressed video formats:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.schleef.org/blog/wp-content/uploads/2009/09/colorspace-time-scatterplot.png&quot;&gt;&lt;img class=&quot;alignnone size-full wp-image-25&quot; title=&quot;Colorspace element execution time scatter plot&quot; src=&quot;http://www.schleef.org/blog/wp-content/uploads/2009/09/colorspace-time-scatterplot.png&quot; alt=&quot;Colorspace element execution time scatter plot&quot; width=&quot;463&quot; height=&quot;288&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The axes are execution time (in ms), with cogcolorspace on the horizontal axis and ffmpegcolorspace on the vertical axis.  The green line represents same execution time, thus for points below the line, ffmpegcolorspace was faster, for those above, cogcolorspace was faster.  Most of the points clustered around the green line are statistically the same as the green line, since my timing method is quite crude.  Things to observe from this graph are that 1) many cases are very similar in speed, indicating that both ffmpegcolorspace and cogcolorspace are using similar code paths, 2) some cases, cogcolorspace is a &lt;em&gt;lot&lt;/em&gt; faster, probably indicating that there isn&amp;#8217;t an assembly fast path in ffmpegcolorspace for that conversion, and 3) a few cases (which, not coincidentally, are the most heavily used cases) ffmpegcolorspace is slightly faster than cogcolorspace.&lt;/p&gt;
&lt;p&gt;The conclusions to draw from this are that 1) by writing very generic code with Orc, you can get very similar results to hand-crafted assembly code, and 2) a developer can cover a lot more cases with a small amount of work, and 3) there are a few cases where special-case Orc code would be beneficial.&lt;/p&gt;
&lt;p&gt;This is only the low quality mode that cogcolorspace supports, which is similar or identical in quality to ffmpegcolorspace.  Higher-quality conversion is also implemented in most cases, and is only slightly slower in speed.  This is the real advantage of Orc &amp;#8212; Orc takes care of huge number of combinations of options, and produces good SIMD code for all of them.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;file://tmp/moz-screenshot.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;</content>
		<author>
			<name>David Schleef</name>
			<uri>http://www.schleef.org/blog</uri>
		</author>
		<source>
			<title type="html">Passing on the Left » video</title>
			<subtitle type="html">Just another WordPress weblog</subtitle>
			<link rel="self" href="http://www.schleef.org/blog/category/video/feed/"/>
			<id>http://www.schleef.org/blog/category/video/feed/</id>
			<updated>2009-11-07T09:00:14+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Tracking Status of Video Accessibility Work</title>
		<link href="http://blog.gingertech.net/2009/09/17/tracking-status-of-video-accessibility-work/"/>
		<id>http://blog.gingertech.net/2009/09/17/tracking-status-of-video-accessibility-work/</id>
		<updated>2009-09-16T23:43:56+00:00</updated>
		<content type="html">&lt;p&gt;Just a brief note to let everyone know about a new wikipage I created for my Mozilla work about video accessibility, where I want to track the status and outcomes of my work. You can find it at &lt;a href=&quot;https://wiki.mozilla.org/Accessibility/Video_a11y_Aug09&quot;&gt;https://wiki.mozilla.org/Accessibility/Video_a11y_Aug09&lt;/a&gt;. It lists the following sections: Test File Collection, Specifications, Demo implementations using JavaScript, Related open bugs in Mozilla, and Publications.&lt;/p&gt;</content>
		<author>
			<name>silvia</name>
			<uri>http://blog.gingertech.net</uri>
		</author>
		<source>
			<title type="html">ginger's thoughts</title>
			<subtitle type="html">Silvia's blog</subtitle>
			<link rel="self" href="http://blog.gingertech.net/feed/atom/"/>
			<id>http://blog.gingertech.net/feed/atom/</id>
			<updated>2009-11-01T05:00:09+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">HTML5 audio element accessibility</title>
		<link href="http://blog.gingertech.net/2009/09/16/html5-audio-element-accessibility/"/>
		<id>http://blog.gingertech.net/?p=567</id>
		<updated>2009-09-16T09:01:01+00:00</updated>
		<content type="html">&lt;p&gt;As part of my experiments in video accessibility I am also looking at the audio element. I have just finished a proof of concept for parsing Lyrics files for music in&lt;a href=&quot;http://en.wikipedia.org/wiki/LRC_%28file_format%29&quot;&gt; lrc format&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The demo uses &lt;a href=&quot;http://www.annodex.net/~silvia/itext/chocolate_rain.html&quot;&gt;Tay Zonday&amp;#8217;s &amp;#8220;Chocolate Rain&amp;#8221; song both as a video with subtitles and as an audio file with lyrics&lt;/a&gt;. Fortunately, he published these all under a creative commons license, so I was able to use this music file. BTW: I found it really difficult to find a openly licensed music file with lyrics.&lt;/p&gt;
&lt;p&gt;While I was at it, I also cleaned up all the old demos and now  have a nice &lt;a href=&quot;http://www.annodex.net/~silvia/itext/&quot;&gt;list of all demos in a central file&lt;/a&gt;.&lt;/p&gt;</content>
		<author>
			<name>silvia</name>
			<uri>http://blog.gingertech.net</uri>
		</author>
		<source>
			<title type="html">ginger's thoughts</title>
			<subtitle type="html">Silvia's blog</subtitle>
			<link rel="self" href="http://blog.gingertech.net/feed/atom/"/>
			<id>http://blog.gingertech.net/feed/atom/</id>
			<updated>2009-11-01T05:00:09+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Open Standards for Sign Languages</title>
		<link href="http://blog.gingertech.net/2009/09/16/open-standards-sign-language/"/>
		<id>http://blog.gingertech.net/?p=562</id>
		<updated>2009-09-15T14:53:13+00:00</updated>
		<content type="html">&lt;p&gt;Looking at accessibility for video includes sign language. It is a most fascinating area to get into and an area that still leaves a lot to formalise and standardise. A lot has happened in recent years and a lot still needs to be done.&lt;/p&gt;
&lt;p&gt;Sign languages are different languages to spoken languages: they emerged in parallel to spoken languages in communities whose boundaries may not overlap with the boundaries of spoken languages. However, most developed means to translate spoken language artifacts (i.e. letters) into sign language artifacts (i.e. signs). So, a typical signer will speak/write at least 3-4 &amp;#8220;languages&amp;#8221;: the spoken language of their hearing peers, lip reading of that spoken language, letter signs of the spoken language, and finally the native sign language of the community they live in.&lt;/p&gt;
&lt;p&gt;Encoding sign language in the computer is a real challenge. Firstly, there is the problem of enumerating all available languages. Then there is the challenge to find an alphabet to represent all &amp;#8220;characters&amp;#8221; that can be used in sign across many (preferably all) sign languages. Then there is the need to encode these characters in a way that computers can deal with. And finally, there is the need to find a screen representation of the characters. In this blog post, I want to describe the status for all of these.&lt;/p&gt;
&lt;p&gt;Currently, sign language can only be represented as a video track by recording sign speakers. Once a sign character list together with an encoding and representation means for them and a specification of the different sign languages is available, it is possible to encode sign sentences in computer-readable form. Further, programs can be written that can present sign sentences on screen, that translate between different sign languages, and between sign and spoken languages. Also, avatars can be programmed that actually present animated sign sentences.&lt;/p&gt;
&lt;p&gt;Imagine a computer that instead of presenting letters in your spoken language uses sign language characters and has keys with signs on them instead of letters. To a sign speaker this would be a lot more natural, since for most sign is their mother tongue.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Listing all existing sign languages&lt;/strong&gt;&lt;br /&gt;
 It was a challenge to create codes for all existing spoken languages &amp;#8211; the &lt;a href=&quot;http://www.loc.gov/standards/iso639-2/php/code_list.php&quot;&gt;current list of language codes&lt;/a&gt; has only been finalised in 1998.&lt;/p&gt;
&lt;p&gt;Until the 1980s, scientists assumed that it is impossible to develop as rich a language with signs as with writing and speaking. Thus, the native languages of deaf people were often regarded as inferior to spoken languages. In many countries it was even prohibited to teach the language in schools for the deaf and instead they were taught to speak an oral language and read lips. In France this prohibition was only lifted in 1991! Only in about 1985 was it proven that sign languages are indeed as rich as spoken languages and deserve the right to be called a &amp;#8220;language&amp;#8221; and be treated as a fully capable means of communication.&lt;/p&gt;
&lt;p&gt;So, there hasn&amp;#8217;t actually been much time to map out a list of all sign languages. The best list I was able to find is in &lt;a href=&quot;http://en.wikipedia.org/wiki/List_of_sign_languages&quot;&gt;Wikipedia&lt;/a&gt;. It lists 28 N/S American, 38 European, 34 Asia-Pacific-AU/NZ, 30 African, and 13 Middle Eastern sign languages &amp;#8211; in summary 143 sign languages. &lt;a href=&quot;http://www.zeichensprache.org/sign/listsignlanguages.asp&quot;&gt;This list&lt;/a&gt; contains 177 sign languages.&lt;/p&gt;
&lt;p&gt;Interestingly, there is also a new &lt;a href=&quot;http://en.wikipedia.org/wiki/International_Sign&quot;&gt;International Sign Language&lt;/a&gt; in development called Gestuno which is in use in international events (Olympics, conferences etc.) but has only a limited vocabulary.&lt;/p&gt;
&lt;p&gt;In 1999 the Irish National Body, Deaf Action Committee for SignWriting, proposed the &lt;a href=&quot;http://www.evertype.com/standards/iso639/sign-language.html&quot;&gt;addition of sign language codes to ISO-639-2&lt;/a&gt;. Instead, a single code entered the list: &lt;a href=&quot;http://www.loc.gov/standards/iso639-2/php/code_list.php&quot;&gt;sgn for sign language&lt;/a&gt;. In 2001, this led to the &lt;a href=&quot;http://www.evertype.com/standards/iso639/sgn.html&quot;&gt;development of IETF language extension codes&lt;/a&gt; in &lt;a href=&quot;ftp://ftp.rfc-editor.org/in-notes/rfc3066.txt&quot;&gt;RFC 3066&lt;/a&gt; for 22 sign languages. In September 2006, this standard was replaced by &lt;a href=&quot;http://www.ietf.org/rfc/rfc4646.txt&quot;&gt;RFC 4646&lt;/a&gt;, which defines &lt;a href=&quot;http://www.iana.org/assignments/language-subtag-registry&quot;&gt;135 subtags for sign languages&lt;/a&gt;, including one for the International Sign Language and a generic &amp;#8220;sgn&amp;#8221; one.&lt;/p&gt;
&lt;p&gt;While not complete, the current IANA subtag language registry now regards sign languages as valid derivatives of a country&amp;#8217;s languages and therefore handles them identically to spoken languages. It&amp;#8217;s also extensible such that any sign language not yet registered can still be specified.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Characters for sign languages&lt;/strong&gt;&lt;br /&gt;
The written word is very powerful for preserving and sharing information. For a very long time there has been no written representation of sign languages. This is not surprising considering that there are still indigenous spoken languages that have no written representation. Also, the written representation of the spoken language around the community of a sign language would have served the sign community sufficiently for most purposes &amp;#8211; except for the accurate capture of their thoughts and sign communications. It would always be a foreign language.&lt;/p&gt;
&lt;p&gt;To move sign languages into the 20th century, the invention of characters for signs was necessary.&lt;/p&gt;
&lt;p&gt;It is relatively easy to map the alphabets of spoken languages to signs (e.g. &lt;a href=&quot;http://en.wikipedia.org/wiki/American_manual_alphabet&quot;&gt;American (ASL) manual alphabet&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Two-handed_alphabet&quot;&gt;British, Australian and NZ (AUSLAN) manual alphabet&lt;/a&gt;,  or &lt;a href=&quot;http://www.deafblind.com/germama.html&quot;&gt;German manual finger alphabet&lt;/a&gt;, also see &lt;a href=&quot;http://en.wikipedia.org/wiki/Fingerspelling&quot;&gt;fingerspelling&lt;/a&gt;). Interesting the AUSLAN manual alphabet is a two-handed one while the ASL one is single-handed.&lt;/p&gt;
&lt;p&gt;Fonts are available for these alphabets, too, e.g. &lt;a href=&quot;http://www.xrmx.com/wisdom/signs-n-symbols/signing/&quot;&gt;British Sign Font&lt;/a&gt;, &lt;a href=&quot;http://deafness.about.com/gi/dynamic/offsite.htm?zi=1/XJ&amp;sdn=deafness&amp;cdn=health&amp;tm=7&amp;f=10&amp;su=p284.9.336.ip_p736.8.336.ip_&amp;tt=2&amp;bt=0&amp;bts=0&amp;zu=http%3A//www.lapiakdesign.com/lapiakasl.html&quot;&gt;American Sign Font&lt;/a&gt;, &lt;a href=&quot;http://deafness.about.com/gi/dynamic/offsite.htm?zi=1/XJ&amp;sdn=deafness&amp;cdn=health&amp;tm=4&amp;f=10&amp;su=p284.9.336.ip_p736.8.336.ip_&amp;tt=2&amp;bt=0&amp;bts=0&amp;zu=http%3A//pro.wanadoo.fr/dephitro/brail1f1.htm&quot;&gt;French Sign Font&lt;/a&gt; and &lt;a href=&quot;http://deafness.about.com/gi/dynamic/offsite.htm?zi=1/XJ&amp;sdn=deafness&amp;cdn=health&amp;tm=133&amp;f=10&amp;su=p284.9.336.ip_p736.8.336.ip_&amp;tt=2&amp;bt=0&amp;bts=0&amp;zu=http%3A//www.tsbvi.edu/Education/fonts.html&quot;&gt;more&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The real challenge lies in capturing the proper signs deaf people use to communicate amongst themselves.&lt;/p&gt;
&lt;p&gt;This is rather challenging, since sign languages uses the hands, head and body, with constantly changing movements and orientations for communication. Thus, while spoken language only has one dimension (sound) over time, sign languages have &amp;#8220;three dimensions&amp;#8221; and capturing this in characters is difficult. Many sign languages to this date don&amp;#8217;t have a widely used written form, e.g. &lt;a href=&quot;http://en.wikipedia.org/wiki/Auslan&quot;&gt;AUSLAN&lt;/a&gt;. Mostly in use nowadays are sequences of photos or videos &amp;#8211; which of course cannot be computer processed easily.&lt;/p&gt;
&lt;p&gt;Two main writing systems have been developed: the &lt;a href=&quot;http://en.wikipedia.org/wiki/Stokoe_notation&quot;&gt;phonemic Stokoe notation&lt;/a&gt; and the iconic SignWriting.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Stokoe_notation&quot;&gt;Stokoe notation&lt;/a&gt; was created by William Stokoe for ASL in 1960, with Latin letters and numbers used for the shapes they have in fingerspelling, and iconic glyphs to transcribe the position, movement, and orientation of the hands. Adaptations were made to other sign languages to include further phonemes not found in ASL. Stokoe notation is written left-to-right on a page and can be typed with the proper font installed. It has a &lt;a href=&quot;http://www.speakeasy.org/~mamandel/ASCII-Stokoe.html&quot;&gt;Unicode/ASCII mapping&lt;/a&gt;, but does not easily apply to other sign languages than ASL since it does not capture all possible signs. It has no representation for facial and body expressions and is therefore a relatively poor representation for sign.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.signwriting.org/&quot;&gt;SignWriting&lt;/a&gt; was created by Valerie Sutton in 1974, a dancer who had two years earlier developed &lt;a href=&quot;http://en.wikipedia.org/wiki/DanceWriting&quot;&gt;DanceWriting&lt;/a&gt; and later developed &lt;a href=&quot;http://www.signwriting.org/library/history/hist001.html&quot;&gt;MimeWriting, SportsWriting, and ScienceWriting&lt;/a&gt;. SignWriting is a writing system which uses visual symbols to represent the handshapes, movements, and facial expressions of sign languages. It is a generic sign alphabet with a list of symbols that can be used to write any sign language in the world.&lt;/p&gt;
&lt;p&gt;SignWriting can be easily learnt by signers and is more popular now than Stokoe. Signers compose the symbols together in a spatial way to represent their signs. They then write the composed symbols from top to bottom on a page, similar to other iconic character sets. SignWriting currently supports 73 different sign languages, whose dictionaries and encyclopedias are captured in &lt;a href=&quot;http://www.signbank.org/signpuddle/index.html#SignPuddle15&quot;&gt;SignPuddle&lt;/a&gt;. This will eventually allow the creation of complete corpora for all sign languages.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Unicode encoding of SignWriting and visual representation&lt;/strong&gt;&lt;br /&gt;
Because of its unique challenges of having to cover the spatial combination of symbols as a new symbol rather than just the sequential combination of symbols, it took a while to get a Unicode representation of SignWriting. &lt;/p&gt;
&lt;p&gt;About a year ago, on 19th September 2008, &lt;a href=&quot;http://majordomo.valenciacc.edu/pipermail/slling-l/2008-September/000634.html&quot;&gt;Valerie Sutton released the International SignWriting Alphabet (ISWA 2008)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;http://www.signbank.org/swis/&quot;&gt;binary representation of SignWriting is defined in ISWA 2008&lt;/a&gt;. It is based on a representing 639 base symbols and their potential 6 fill and 16 rotation variants in 61,343 code points, that completely cover the subset of &lt;a href=&quot;http://www.signbank.org/swis/data.php?subset=&amp;sg_code=*&quot;&gt;35023 valid symbol codes&lt;/a&gt;. The spatial aspect of SignWriting are encoded in a 2-dimensional coordinate system. The dimensions go from -1919 through 1919 to place the top left corner of the symbol.&lt;/p&gt;
&lt;p&gt;SignWriting base symbols are encoded in plane 4 of &lt;a href=&quot;http://www.signpuddle.net/mediawiki/index.php/Unicode&quot;&gt;Unicode&lt;/a&gt;, which provides 65,536 code points, easily covering the defined 61,343 Binary SignWriting code points. Further special control and number characters are used to &lt;a href=&quot;http://www.signpuddle.net/mediawiki/index.php/Binary_SignWriting&quot;&gt;encode the spatial layout&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Visual Representation of SignWriting&lt;/strong&gt;&lt;br /&gt;
Valerie Sutton created over 35k individual PNG images for ISWA 2008, which have been reformatted for standard color &amp;#038; reduced file size, and renamed to the character code. They are a font used to represent the signs. &lt;a href=&quot;http://www.signbank.org/swis/iswa/&quot;&gt;The images can be accessed on Valerie&amp;#8217;s server&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Closing&lt;/strong&gt;&lt;br /&gt;
After learning all this today, I have to say that Valerie Sutton has just turned into a new idol of mine. The achievements with SignWriting and the possibilities it will enable are massive.&lt;/p&gt;
&lt;p&gt;Now I just have to figure out what to do when we hit on a sign language track that has been encoded in SignWriting and it represents captions. Maybe it is possible to display sign as overlay but on the left side of the video. This would be similar to some other languages that go from top to bottom rather than left to right.&lt;/p&gt;</content>
		<author>
			<name>silvia</name>
			<uri>http://blog.gingertech.net</uri>
		</author>
		<source>
			<title type="html">ginger's thoughts</title>
			<subtitle type="html">Silvia's blog</subtitle>
			<link rel="self" href="http://blog.gingertech.net/feed/atom/"/>
			<id>http://blog.gingertech.net/feed/atom/</id>
			<updated>2009-11-01T05:00:09+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Server maintenance</title>
		<link href="http://metavid.org/blog/2009/09/14/server-maintenance/"/>
		<id>http://metavid.org/blog/?p=382</id>
		<updated>2009-09-14T18:09:31+00:00</updated>
		<content type="html">&lt;p&gt;Our media servers that stores oggs for content prior to ~June 09~ is currently down for maintenance.  We hope to have it back up shortly.  Recent content is working, such as Obama&amp;#8217;s &lt;a href=&quot;http://metavid.org/wiki/Stream:House_proceeding_09-09-09_01/0:23:40/1:10:45&quot;&gt;speech last week&lt;/a&gt; before a rare joint session of Congress.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;</content>
		<author>
			<name>Metavid Project</name>
			<uri>http://metavid.org/blog</uri>
		</author>
		<source>
			<title type="html">Metavid Blog</title>
			<subtitle type="html">This Blog covers the metavid project and related politics.</subtitle>
			<link rel="self" href="http://metavid.org/blog/feed/"/>
			<id>http://metavid.org/blog/feed/</id>
			<updated>2009-09-14T19:00:15+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Updated video accessibility demo</title>
		<link href="http://blog.gingertech.net/2009/09/14/updated-video-accessibility-demo/"/>
		<id>http://blog.gingertech.net/?p=558</id>
		<updated>2009-09-14T03:58:26+00:00</updated>
		<content type="html">&lt;p&gt;Just a brief note to share that I have updated the video accessibility demo at &lt;a href=&quot;http://www.annodex.net/~silvia/itext/elephant_no_skin.html&quot;&gt;http://www.annodex.net/~silvia/itext/elephant_no_skin.html&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It should now support ARIA and tab access to the menu, which I have simply put next to the video. I implemented the menu by learning from &lt;a href=&quot;http://developer.yahoo.com/yui/3/examples/node-focusmanager/node-focusmanager-3.html&quot;&gt;YUI&lt;/a&gt;. My Firefox 3.5.3 actually doesn&amp;#8217;t tab through it, but then it also doesn&amp;#8217;t tab through the YUI example, which I think is correct. Go figure.&lt;/p&gt;
&lt;p&gt;Also, the textual audio descriptions are improved and should now work better with screenreaders.&lt;/p&gt;
&lt;p&gt;I have also just prepared a &lt;a href=&quot;http://www.annodex.net/~silvia/itext/elephants_dream/elephant.audio_description.ogg&quot;&gt;recorded audio description of &amp;#8220;Elephants Dreams&amp;#8221;&lt;/a&gt; (German accent warning).&lt;/p&gt;
&lt;p&gt;You can also &lt;a href=&quot;http://www.annodex.net/~silvia/itext/elephants_dream/elephant.multitracktest.ogv&quot;&gt;download the multitrack Ogg Theora video file&lt;/a&gt; that contains the original audio and video track plus the audio description as an extra track, created using oggz-merge.&lt;/p&gt;
&lt;p&gt;As soon as some kind soul donates a sign language track for &amp;#8220;Elephants Dream&amp;#8221;, I will have a pretty complete set of video accessibility tracks for that video. This will certainly become the basis for more video a11y work!&lt;/p&gt;</content>
		<author>
			<name>silvia</name>
			<uri>http://blog.gingertech.net</uri>
		</author>
		<source>
			<title type="html">ginger's thoughts</title>
			<subtitle type="html">Silvia's blog</subtitle>
			<link rel="self" href="http://blog.gingertech.net/feed/atom/"/>
			<id>http://blog.gingertech.net/feed/atom/</id>
			<updated>2009-11-01T05:00:09+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry>
		<title type="html">In lieu of more official subjects...</title>
		<link href="http://xiphmont.livejournal.com/43141.html"/>
		<id>http://xiphmont.livejournal.com/43141.html</id>
		<updated>2009-09-06T05:02:48+00:00</updated>
		<content type="html">&lt;p&gt;I owe a whole bunch of blog posts on more official Xiph topics, but tonight I present silliness.

&lt;p&gt;&lt;img src=&quot;http://web.mit.edu/xiphmont/Public/motherfishIV.jpg&quot; /&gt;

&lt;p&gt;I suppose it was unhealthy to even try to resist painting the newest server.  Now off it goes to Oregon.&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;</content>
		<author>
			<name>Monty</name>
			<uri>http://xiphmont.livejournal.com/</uri>
		</author>
		<source>
			<title type="html">Monty</title>
			<subtitle type="html">Monty - LiveJournal.com</subtitle>
			<link rel="self" href="http://xiphmont.livejournal.com/data/rss?tag=xiph"/>
			<id>http://xiphmont.livejournal.com/data/rss?tag=xiph</id>
			<updated>2009-10-02T05:00:25+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Demo of deep hyperlinking into HTML5 video</title>
		<link href="http://blog.gingertech.net/2009/09/02/demo-of-deep-hyperlinking-into-html5-video/"/>
		<id>http://blog.gingertech.net/?p=526</id>
		<updated>2009-09-02T11:55:01+00:00</updated>
		<content type="html">&lt;p&gt;In an effort to give a demo of some of the W3C Media Fragment WG specification capabilities, I implemented a HTML5 page with a video element that reacts to fragment offset changes to the URL bar and the &amp;lt;video&gt; element.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Demo Features&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The demo can be found &lt;a href=&quot;http://new.annodex.net/~silvia/itext/mediafrag.html&quot;&gt;on the Annodex Web server&lt;/a&gt;. It has the following features:&lt;/p&gt;
&lt;p&gt;If you simply load that Web page, you will &lt;strong&gt;see the video jump to an offset&lt;/strong&gt; because it is referred to as &amp;#8220;elephants_dream/elephant.ogv#t=20&amp;#8243;.&lt;/p&gt;
&lt;p&gt;If you &lt;strong&gt;change or add a temporal fragment in the URL bar&lt;/strong&gt;, the video jumps to this time offset and overrules the video&amp;#8217;s fragment addressing. (This only works in Firefox 3.6, see below &amp;#8211; in older Firefoxes you actually have to reload the page for this to happen.) This functionality is &lt;a href=&quot;http://ccnmtl.columbia.edu/enhanced/noted/youtube_hd.html&quot;&gt;similar to a time linking functionality that YouTube also provides&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When you hit the &amp;#8220;play&amp;#8221; button on the video and let it play a bit before hitting &amp;#8220;pause&amp;#8221; again &amp;#8211; the &lt;strong&gt;second at which you hit &amp;#8220;pause&amp;#8221; is displayed in the page&amp;#8217;s URL bar &lt;/strong&gt;. In Firefox, this even leads to an addition to the browser&amp;#8217;s history, so you can jump back to the previous pause position.&lt;/p&gt;
&lt;p&gt;Three input boxes allow for experimentation with different functionality.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The first one contains a &lt;strong&gt;link to the current Web page with the media fragment&lt;/strong&gt; for the current video playback position. This text is displayed for cut-and-paste purposes, e.g. to send it in an email to friends.&lt;/li&gt;
&lt;li&gt;The second one is an entry box which accepts float values as time offsets. Once entered, the &lt;strong&gt;video will jump to the given time offset&lt;/strong&gt;. The URL of the video and the page URL will be updated.&lt;/li&gt;
&lt;li&gt;The third one is an entry box which &lt;strong&gt;accepts a video URL that replaces the &amp;lt;video&gt; element&amp;#8217;s @src attribute value&lt;/strong&gt;. It is meant for experimentation with different temporal media fragment URLs as they get loaded into the &amp;lt;video&gt; element.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Javascript Hacks&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You can look at the source code of the page &amp;#8211; all the javascript in use is actually at the bottom of the page. Here are some of the juicy bits of what I&amp;#8217;ve done:&lt;/p&gt;
&lt;p&gt;Since Web browsers do not support the parsing and reaction to media fragment URIs, I implemented this in javascript. Once the video is loaded, i.e. the &lt;strong&gt;&amp;#8220;loadedmetadata&amp;#8221; event&lt;/strong&gt; is called on the video, I parse the video&amp;#8217;s @currentSrc attribute and jump to a time offset if given. I use the @currentSrc, because it will be the URL that the video element is using after having parsed the @src attribute and all the containing &amp;lt;source&gt; elements (if they exist). This function is also called when the video&amp;#8217;s @src attribute is changed through javascript.&lt;/p&gt;
&lt;p&gt;This is the only bit from the demo that the browsers should do natively. The remaining functionality hooks up the temporal addressing for the video with the browser&amp;#8217;s URL bar.&lt;/p&gt;
&lt;p&gt;To display a URL in the URL bar that people can cut and paste to send to their friends, I hooked up the video&amp;#8217;s &lt;strong&gt;&amp;#8220;pause&amp;#8221; event&lt;/strong&gt; with an update to the URL bar. If you are jumping around through javascript calls to video.currentTime, you will also have to make these changes to the URL bar.&lt;/p&gt;
&lt;p&gt;Finally, I am capturing the window&amp;#8217;s &lt;strong&gt;&amp;#8220;hashchange&amp;#8221; event&lt;/strong&gt;, which is new in HTML5 and only implemented in &lt;a href=&quot;https://developer.mozilla.org/en/DOM/window.onhashchange&quot;&gt;Firefox 3.6&lt;/a&gt;. This means that if you change the temporal offset on the page&amp;#8217;s URL, the browser will parse it and jump the video to the offset time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Optimisation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Doing these kinds of jumps around on video can be very slow when the seeking is happening on the remote server. Firefox actually implements seeking over the network, which in the case of Ogg can require multiple jumps back and forth on the remote video file with byte range requests to locate the correct offset location.&lt;/p&gt;
&lt;p&gt;To reduce as much as possible the effort that Firefox has to make with seeking, I referred to &lt;a href=&quot;https://developer.mozilla.org/en/Configuring_servers_for_Ogg_media&quot;&gt;Mozilla&amp;#8217;s very useful help page to speed up video&lt;/a&gt;. It is recommended to deliver the X-Content-Duration HTTP header from your Web server. For Ogg media, this can be provided through the oggz-chop CGI. Since I didn&amp;#8217;t want to install it on my Apache server, I hard coded X-Content-Duration in a .htaccess file in the directory that serves the media file. The .htaccess file looks as follows:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;Files &quot;elephant.ogv&quot;&gt;&lt;br /&gt;
Header set X-Content-Duration &quot;653.791&quot;&lt;br /&gt;
&amp;lt;/Files&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This should now help Firefox to avoid the extra seek necessary to determine the video&amp;#8217;s duration and display the transport bar faster.&lt;/p&gt;
&lt;p&gt;I also added the @autobuffer attribute to the &amp;lt;video&gt; element, which should make the complete video file available to the browser and thus speed up seeking enormously since it will not need to do any network requests and can just do it on the local file.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ToDos&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is only a first and very simple demo of media fragments and video. I have not made an effort to capture any errors or to parse a URL that is more complicated than simply containing &amp;#8220;#t=&amp;#8221;. Feel free to report any bugs to me in the comments or send me patches.&lt;/p&gt;
&lt;p&gt;Also, I have not made an effort to use time ranges, which is part of the &lt;a href=&quot;http://www.w3.org/2008/WebVideo/Fragments/WD-media-fragments-spec/#fragment-dimensions&quot;&gt;W3C Media Fragment spec&lt;/a&gt;. This should be simple to add, since it just requires to stop the video playback at the given end time.&lt;/p&gt;
&lt;p&gt;Also, I have only implemented parsing of the most simple default time spec in seconds and fragments. None of the more complicated npt, smpte, or clock specifications have been implemented yet.&lt;/p&gt;
&lt;p&gt;The possibilities for deeper access to video and for improved video accessibility with these URLs are vast. Just imagine hooking up the caption elements of e.g. an srt file with temporal hyperlinks and you can provide deep interaction between the video content and the captions. You could even drive this to the extreme and jump between single words if you mark up each with its time relationship. Happy experimenting!&lt;/p&gt;
&lt;p&gt;UPDATE: I forgot to mention that it is really annoying that the video has to be re-loaded when the @src attribute is changed, even if only the hash changes. As support for media fragments is implemented in &amp;lt;video&gt; and &amp;lt;audio&gt; elements, it would be advantageous if the &amp;#8220;load()&amp;#8221; function checked whether only the hash changed and does not re-load the full resource in these cases.&lt;/p&gt;
&lt;p&gt;Thanks go to Chris Double and Chris Pearce from Mozilla for their feedback and suggestions for improvement on an early version of this.&lt;/p&gt;</content>
		<author>
			<name>silvia</name>
			<uri>http://blog.gingertech.net</uri>
		</author>
		<source>
			<title type="html">ginger's thoughts</title>
			<subtitle type="html">Silvia's blog</subtitle>
			<link rel="self" href="http://blog.gingertech.net/feed/atom/"/>
			<id>http://blog.gingertech.net/feed/atom/</id>
			<updated>2009-11-01T05:00:09+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Media Fragment addressing into a live stream</title>
		<link href="http://blog.gingertech.net/2009/08/26/media-fragment-addressing-into-a-live-stream/"/>
		<id>http://blog.gingertech.net/?p=523</id>
		<updated>2009-08-26T02:56:44+00:00</updated>
		<content type="html">&lt;p&gt;A few months back, Thomas reported on a cool flumotion experiment that he hacked together which allows &lt;a href=&quot;http://thomas.apestaart.org/log/?p=881&quot;&gt;jumping back in time on a live video stream&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Thomas used a URI scheme with a negative offset to do the jumping back on the http stream:&lt;br /&gt;
&lt;code&gt;http://localhost:8800?offset=-120&lt;/code&gt;&lt;/p&gt;
&lt;p&gt; John left a comment pointing to current work being done in the W3C on Media Fragment addressing, but had to notice that despite &lt;a href=&quot;http://www.annodex.net/TR/draft-pfeiffer-temporal-fragments-03.txt&quot;&gt;Annodex&amp;#8217;s temporal URIs having a live stream addressing feature&lt;/a&gt;, the new W3C draft didn&amp;#8217;t accommodate such a use case.&lt;/p&gt;
&lt;p&gt;We got to work in the working group and I am very happy to announce that as of today there is now a d&lt;a href=&quot;http://www.w3.org/2008/WebVideo/Fragments/WD-media-fragments-spec/#clock-time&quot;&gt;raft specification for addressing time offsets by wall-clock time&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Say, you are watching Thomas&amp;#8217; live stream from above at &lt;code&gt;http://localhost:8800&lt;/code&gt; and you want to jump back by 2 min. Your player would grab the current streaming time, e.g. &lt;em&gt;2009-08-26T12:34:04Z&lt;/em&gt; and subtract the two minutes, giving &lt;em&gt;2009-08-26T12:32:04Z&lt;/em&gt;. Then the player would use this to tell your streaming server to jump back by two minutes using this URL:&lt;br /&gt;
&lt;code&gt;http://localhost:8800#t=clock:2009-08-26T12:32:04Z&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Or another example would be: you had a stream running all day from a conference and you want to go back to a particular session. You know that it was between 10am and 11am German time (UTC+2 right now). Then your URL would be as follows:&lt;br /&gt;
&lt;code&gt;http://conference:8800#t=clock:2009-08-26T10:00+02:00,2009-08-26T11:00+02:00&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Now if only there was an implementation&amp;#8230; &lt;img src=&quot;http://blog.gingertech.net/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;</content>
		<author>
			<name>silvia</name>
			<uri>http://blog.gingertech.net</uri>
		</author>
		<source>
			<title type="html">ginger's thoughts</title>
			<subtitle type="html">Silvia's blog</subtitle>
			<link rel="self" href="http://blog.gingertech.net/feed/atom/"/>
			<id>http://blog.gingertech.net/feed/atom/</id>
			<updated>2009-11-01T05:00:09+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">24 Aug 2009</title>
		<link href="http://www.advogato.org/person/rillian/diary.html?start=110"/>
		<id>http://www.advogato.org/person/rillian/diary.html?start=110</id>
		<updated>2009-08-24T20:40:29+00:00</updated>
		<content type="html">Cute demonstration of &lt;a href=&quot;http://math.berkeley.edu/~ilya/photo/random-noise/&quot;&gt;chrominance
vs luminance&lt;/a&gt; sensitivity in the human visual system.
With source code!</content>
		<author>
			<name>Ralph Giles</name>
			<uri>http://www.advogato.org/person/rillian/</uri>
		</author>
		<source>
			<title type="html">Advogato blog for rillian</title>
			<subtitle type="html">Advogato blog for rillian</subtitle>
			<link rel="self" href="http://advogato.org/person/rillian/rss.xml"/>
			<id>http://advogato.org/person/rillian/rss.xml</id>
			<updated>2009-11-07T09:00:04+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Technology Review on Open Video</title>
		<link href="http://metavid.org/blog/2009/08/21/technology-review-on-open-video/"/>
		<id>http://metavid.org/blog/?p=371</id>
		<updated>2009-08-21T21:45:26+00:00</updated>
		<content type="html">&lt;div class=&quot;wp-caption alignleft&quot;&gt;&lt;img title=&quot;technology reivew icon&quot; src=&quot;http://www.technologyreview.com/images/wheader/trlogo.jpg&quot; alt=&quot;technology review icon&quot; width=&quot;224&quot; height=&quot;66&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Technology Review on Open Video&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;David Talbot from Technology Review has put together a &lt;a title=&quot;tech review article&quot; href=&quot;http://www.technologyreview.com/web/23173/&quot; target=&quot;_blank&quot;&gt;good article on Open Video&lt;/a&gt;. Building off of the &lt;a title=&quot;OVA event&quot; href=&quot;http://metavid.org/blog/2009/07/07/help-build-a-better-internet-with-open-video/&quot; target=&quot;_blank&quot;&gt;Open Video Alliance event&lt;/a&gt; he pieces together a lot of threads of the open video movement. The article opens with &lt;a title=&quot;metavid first blog post&quot; href=&quot;http://metavid.org/blog/2006/01/13/making-progress/&quot; target=&quot;_blank&quot;&gt;early work&lt;/a&gt; that we did on metavid project and goes on to highlight the efforts of Mozilla, Xiph, Wikimeida, Kaltura and others in promoting open video on the web.&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-371&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I recommend people check out the &lt;a title=&quot;video talk about open formats&quot; href=&quot;http://www.technologyreview.com/video/?vid=420&quot;&gt;video discussion&lt;/a&gt; by Jonathan McIntosh and Julie Levin Russo on the difficulties of working with proprietary formats when the system for media distribution is designed for &amp;#8220;consuming&amp;#8221;. Open video has the potential to disrupt this &lt;em&gt;view only&lt;/em&gt; or &lt;em&gt;walled garden with some embedding windows&lt;/em&gt; structure of web video and open it up for new interesting forms of participation.&lt;/p&gt;
&lt;div class=&quot;wp-caption alignright&quot;&gt;&lt;a href=&quot;http://wikimania2009.wikimedia.org/wiki/Portal&quot;&gt;&lt;img title=&quot;wiki-logo&quot; src=&quot;http://upload.wikimedia.org/wikipedia/wikimania2009/thumb/e/ea/Wikiman%C3%ADa-2009-Logo-A.svg/181px-Wikiman%C3%ADa-2009-Logo-A.svg.png&quot; alt=&quot;&quot; width=&quot;126&quot; height=&quot;143&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;wikimania 2009&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;On that note back to preparing the talk ( &amp;amp; ..cough.. cough .. software) for this years &lt;a title=&quot;wikimanai 2009&quot; href=&quot;http://wikimania2009.wikimedia.org/wiki/Portal&quot; target=&quot;_blank&quot;&gt;Wikimania&lt;/a&gt; event happening this week in Buenos Aires. &lt;a href=&quot;http://metavid.org/blog/2006/07/27/wikimania-2006/&quot;&gt;Similarly to&lt;/a&gt; &lt;a title=&quot;previus&quot; href=&quot;http://metavid.org/blog/2007/07/23/wikimania-07/&quot; target=&quot;_blank&quot;&gt;previous&lt;/a&gt; &lt;a title=&quot;years&quot; href=&quot;http://metavid.org/blog/2008/07/17/wikimania-2008/&quot;&gt;years&lt;/a&gt;, I look forward towards engaging with participants around the potential of open video in the worlds premier collaborative authoring environment &lt;img src=&quot;http://metavid.org/blog/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt; With the difference being this year we are getting really close to to starting to deploy these components.&lt;/p&gt;</content>
		<author>
			<name>Metavid Project</name>
			<uri>http://metavid.org/blog</uri>
		</author>
		<source>
			<title type="html">Metavid Blog</title>
			<subtitle type="html">This Blog covers the metavid project and related politics.</subtitle>
			<link rel="self" href="http://metavid.org/blog/feed/"/>
			<id>http://metavid.org/blog/feed/</id>
			<updated>2009-09-14T19:00:15+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">ARIA &amp;#8211; A Brief Introduction</title>
		<link href="http://blog.gingertech.net/2009/08/21/aria-a-brief-introduction/"/>
		<id>http://blog.gingertech.net/?p=509</id>
		<updated>2009-08-21T12:51:16+00:00</updated>
		<content type="html">&lt;p&gt;Since working on video accessibility, I have felt rather inadequate not knowing exactly how general Web accessibility works, in particular ARIA. I have been pointed at the W3C WAI-ARIA &lt;a href=&quot;http://www.w3.org/TR/wai-aria-primer/&quot;&gt;primer&lt;/a&gt;, &lt;a href=&quot;http://www.w3.org/TR/wai-aria-practices/&quot;&gt;best practices&lt;/a&gt;, and &lt;a href=&quot;http://www.w3.org/TR/wai-aria/&quot;&gt;WD specification&lt;/a&gt;, but found them almost impossible to read.&lt;/p&gt;
&lt;p&gt;If you are looking for a document that gets right to the point, I can recommend &lt;a href=&quot;http://dev.opera.com/articles/view/introduction-to-wai-aria/&quot;&gt;Opera&amp;#8217;s Introduction to WAI ARIA&lt;/a&gt;. It tells you what attributes there are and how to use them. More in-depth information is available in the W3C &lt;a href=&quot;http://www.w3.org/TR/wai-aria-practices/&quot;&gt;WAI-ARIA best practices&lt;/a&gt;. Here&amp;#8217;s my little summary of what I learnt.&lt;/p&gt;
&lt;p&gt;Getting straight to the point: ARIA mostly cares about giving screen control to the keyboard (away from the mouse) and about exposing semantic information, such that vision-impaired people have a way to interact with Web content and screen readers can read out useful information.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Basic keys&lt;/strong&gt;&lt;br /&gt;
The basic keys in use for accessibility are the tab/shift+tab, arrow, enter, space and escape keys.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Keyboard Focus: tabbing&lt;/strong&gt;&lt;br /&gt;
Normal tabbing includes form controls and anchors. This can be overruled with the &lt;em&gt;tabindex&lt;/em&gt; attribute.&lt;/p&gt;
&lt;p&gt;Adding a tabindex=0 to an element adds the element to the tab order in which it appears in the document. Adding a tabindex out of [1;32767] you can place any element into a desired order &amp;#8211; lowest numbers first.&lt;/p&gt;
&lt;p&gt;Adding a tabindex=-1 to an element removes it from tabbing order, but you can still get keyboard focus onto it through javascript, e.g. for the subelements of a menu. The aria-activedescendant attribute can tell which is active in a list of descendants.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Navigation Landmarks: roles&lt;/strong&gt;&lt;br /&gt;
Screenreaders have a problem with expressing what the functionality of elements is &amp;#8211; normally they can only read out the name of the element.&lt;/p&gt;
&lt;p&gt;This is where the &lt;em&gt;role&lt;/em&gt; attribute comes in. It provides semantic meaning, e.g. &amp;#8220;slider&amp;#8221; instead of &amp;#8220;input&amp;#8221; element.&lt;/p&gt;
&lt;p&gt;ARIA has a large number of pre-defined roles. They are &lt;a href=&quot;http://www.w3.org/TR/wai-aria/#roles&quot;&gt;listed in the spec&lt;/a&gt; &amp;#8211; each role has additional attributes to provide more assistive information &amp;#8211; mostly state information on the particular element.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Live updated content: aria-live&lt;/strong&gt;&lt;br /&gt;
When data is updated somewhere on screen, often assistive technology doesn&amp;#8217;t get to know about it.&lt;/p&gt;
&lt;p&gt;Regions that are marked with the aria-live attribute will be read out even if the user is focused on another part of the screen at that point.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Form input: aria-reqired&lt;/strong&gt;&lt;br /&gt;
For screen readers it is not obvious if a form element&amp;#8217;s entry is a required or optional entry. Add an aria-required attribute to the form entry element and your screen reader will tell you.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Labels and descriptions: aria-labelledby / aria-describedby&lt;/strong&gt;&lt;br /&gt;
Most often the description or label for a page area sits already elsewhere on screen, but with no obivous relationship to an element other than visible neighbourship.&lt;/p&gt;
&lt;p&gt;A screenreader can be told about the relationship by using the aria-labelledby / aria-describedby attributes, which allow to link to such an area through that area&amp;#8217;s id attribute.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Is that all?&lt;/strong&gt;&lt;br /&gt;
Yes, I think that&amp;#8217;s essentially all. It&amp;#8217;s not particularly difficult, but it has a high impact on accessibility. I hope your take-away is as big as mine!&lt;/p&gt;
&lt;p&gt;BTW: WAI ARIA is written for good old HTML4,  not HTML5. However, there are synchronisation activities under way and WAI ARIA attributes will still be relevant to HTML5. Some of the roles will become unnecessary with the new elements available in HTML5 &amp;#8211; see a &lt;a href=&quot;http://hsivonen.iki.fi/aria-html5/&quot;&gt;draft mapping of HTML5 elements to ARIA implicit roles in Henry&amp;#8217;s excellent document&lt;/a&gt;, but it seems the tabbing order, live regions, and the role attribute are here to stay.&lt;/p&gt;</content>
		<author>
			<name>silvia</name>
			<uri>http://blog.gingertech.net</uri>
		</author>
		<source>
			<title type="html">ginger's thoughts</title>
			<subtitle type="html">Silvia's blog</subtitle>
			<link rel="self" href="http://blog.gingertech.net/feed/atom/"/>
			<id>http://blog.gingertech.net/feed/atom/</id>
			<updated>2009-11-01T05:00:09+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">21 Aug 2009</title>
		<link href="http://www.advogato.org/person/rillian/diary.html?start=109"/>
		<id>http://www.advogato.org/person/rillian/diary.html?start=109</id>
		<updated>2009-08-21T07:21:31+00:00</updated>
		<content type="html">&lt;p&gt;&lt;strong&gt;State of theora&lt;/strong&gt;

&lt;p&gt; &lt;p&gt;Monty has posted another of his excellent &lt;a href=&quot;http://web.mit.edu/xiphmont/Public/theora/demo8.html&quot;&gt;technical
updates&lt;/a&gt; on the &lt;a href=&quot;http://theora.org/&quot;&gt;theora&lt;/a&gt;
encoder rewrite which has been ongoing for more than a year
now. It's a good
summary of what went into the recent beta releases.

&lt;p&gt; &lt;p&gt;We still have a bit to go before the final 1.1 though;
the new rate control still behaves badly on a some clips.

&lt;p&gt; &lt;p&gt; &lt;p&gt;The complete set of status reports:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://web.mit.edu/xiphmont/Public/theora/demo.html&quot;&gt;Part
1&lt;/a&gt; early 2008
&lt;li&gt;&lt;a href=&quot;http://web.mit.edu/xiphmont/Public/theora/demo2.html&quot;&gt;Part
2&lt;/a&gt; 2008 March 20
&lt;li&gt;&lt;a href=&quot;http://web.mit.edu/xiphmont/Public/theora/demo3.html&quot;&gt;Part
3&lt;/a&gt; 2008 June 5
&lt;li&gt;&lt;a href=&quot;http://web.mit.edu/xiphmont/Public/theora/demo4.html&quot;&gt;Part
4&lt;/a&gt; 2008 July 3
&lt;li&gt;&lt;a href=&quot;http://web.mit.edu/xiphmont/Public/theora/demo5.html&quot;&gt;Part
5&lt;/a&gt; 2008 July 24
&lt;li&gt;&lt;a href=&quot;http://web.mit.edu/xiphmont/Public/theora/demo6.html&quot;&gt;Part
6&lt;/a&gt; 2009 April 2
&lt;li&gt;&lt;a href=&quot;http://web.mit.edu/xiphmont/Public/theora/demo7.html&quot;&gt;Part
7&lt;/a&gt; 2009 May 7
&lt;li&gt;&lt;a href=&quot;http://web.mit.edu/xiphmont/Public/theora/demo8.html&quot;&gt;Part
8&lt;/a&gt; 2009 August 20
&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;</content>
		<author>
			<name>Ralph Giles</name>
			<uri>http://www.advogato.org/person/rillian/</uri>
		</author>
		<source>
			<title type="html">Advogato blog for rillian</title>
			<subtitle type="html">Advogato blog for rillian</subtitle>
			<link rel="self" href="http://advogato.org/person/rillian/rss.xml"/>
			<id>http://advogato.org/person/rillian/rss.xml</id>
			<updated>2009-11-07T09:00:04+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Amusement at WHATWG</title>
		<link href="http://blog.gingertech.net/2009/08/05/amusement-at-whatwg/"/>
		<id>http://blog.gingertech.net/?p=489</id>
		<updated>2009-08-05T00:23:04+00:00</updated>
		<content type="html">&lt;p&gt;This is not a technical post, but it made my day, so I thought I should share it.&lt;/p&gt;
&lt;p&gt;For two years, the WHATWG has had an open twitter account: anyone who wanted to post a status message on WHATWG could just got to &lt;a href=&quot;http://www.whatwg.org/#updater&quot;&gt;http://www.whatwg.org/#updater&lt;/a&gt; and update the twitter status.&lt;/p&gt;
&lt;p&gt;For two years, the script kiddies didn&amp;#8217;t find the account.&lt;/p&gt;
&lt;p&gt;They discovered it about 12 hours ago. Check it out at &lt;a href=&quot;http://twitter.com/WHATWG&quot;&gt;http://twitter.com/WHATWG&lt;/a&gt; before twitter&amp;#8217;s history eliminates the posts again.&lt;/p&gt;
&lt;p&gt;Here are some of the &amp;#8220;jewels&amp;#8221; posted:&lt;/p&gt;
&lt;p&gt;&amp;#8220;WHATWG: We&amp;#8217;re only half as evil as we seem.&amp;#8221;&lt;/p&gt;
&lt;p&gt;&amp;#8220;The HXTML 2.0 spec has been finalized with only one tag which is &amp;lt;text&gt;.&amp;#8221;&lt;/p&gt;
&lt;p&gt;&amp;#8220;W3C issues announcement: Internet Explorer to be made obsolete. From fall onwards, IE6 and IE7 will be blocked from browsing the internet&amp;#8221;&lt;/p&gt;
&lt;p&gt;&amp;#8220;I hope the script kiddies realizes that no one cares what is posted to the WHATWG twitter account&amp;#8221;&lt;/p&gt;
&lt;p&gt;&amp;#8220;&amp;lt;audio&gt;&amp;lt;video&gt;&amp;lt;disco&gt;&amp;#8221;&lt;/p&gt;
&lt;p&gt;&amp;#8220;Our whole team of security experts was just fired.&amp;#8221;&lt;/p&gt;
&lt;p&gt;&amp;#8220;i want &amp;lt;isitfriday&gt; tag&amp;#8230;&amp;#8221; (me too!!)&lt;/p&gt;
&lt;p&gt;&amp;#8220;XHTML 2.0 FOREVER!&amp;#8221;&lt;/p&gt;
&lt;p&gt;&amp;#8220;WHATWG announce working group on emoticons. Homer says (_8(|) ~doh!&amp;#8221;&lt;/p&gt;
&lt;p&gt;&amp;#8220;WHATWG to start work on &amp;#8220;Bible5&amp;#8243; http://bit.ly/TwZcX&amp;#8221; (this is actually old, but still golden)&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;</content>
		<author>
			<name>silvia</name>
			<uri>http://blog.gingertech.net</uri>
		</author>
		<source>
			<title type="html">ginger's thoughts</title>
			<subtitle type="html">Silvia's blog</subtitle>
			<link rel="self" href="http://blog.gingertech.net/feed/atom/"/>
			<id>http://blog.gingertech.net/feed/atom/</id>
			<updated>2009-11-01T05:00:09+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">The different aspects of video accessibility</title>
		<link href="http://blog.gingertech.net/2009/08/03/aspects-of-video-accessibility/"/>
		<id>http://blog.gingertech.net/?p=484</id>
		<updated>2009-08-03T11:42:04+00:00</updated>
		<content type="html">&lt;p&gt;In the last week, I have received many emails replying to my request for feedback on the video accessibility demo. Thanks very much to everyone who took the time.&lt;/p&gt;
&lt;p&gt;Interestingly, I got very little feedback on the subtitles and textual audio annotation aspects of my demo, actually, even though that was the key aspect of my analysis. It&amp;#8217;s my own fault, however, because I chose a good looking video player skin over an accessible one.&lt;/p&gt;
&lt;p&gt;This is where I need to take a step back and explain about the status of HTML5 video and its general accessibility aspects. Some of this is a repetition of an &lt;a href=&quot;http://lists.w3.org/Archives/Public/wai-xtech/2009Aug/0005.html&quot;&gt;email that I sent to the W3C WAI-XTECH mailing list&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Browser support of HTML5 video&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The HTML5 video tag is still a rather new tag that has not been implemented in all browsers yet &amp;#8211; and not all browsers support the Ogg Theora/Video codec that my demo uses. Only the latest Firefox 3.5 release will support my demo out of the box. For Chrome and Opera you will have to use the latest nightly build (which I am not even sure are publicly available). IE does not support it at all. For Safari/Webkit you will need the latest release and install the XiphQT quicktime component to provide support for the codec.&lt;/p&gt;
&lt;p&gt;My recommendation is clearly to use Firefox 3.5 to try this demo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Standardisation status of HTML5 video&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The standardisation of the HTML5 video tag is still in process. Some of the attributes have not been validated through implementations, some of the use cases have not been turned into specifications, and most importantly to the topic of interest here, there have been very little experiments with accessibility around the HTML5 video tag.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Accessibility of video controls&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Most of the comments that I received on my demo were concerned with the accessibility of the video controls.&lt;/p&gt;
&lt;p&gt;In HTML5 video, there is a attribute called @controls. If it is available, the browser is expected to display default controls on top of the video. Here is what the current specification says:&lt;/p&gt;
&lt;p&gt;&amp;#8220;This user interface should include features to begin playback, pause playback, seek to an arbitrary position in the content (if the content supports arbitrary seeking), change the volume, and show the media content in manners more suitable to the user (e.g. full-screen video or in an independent resizable window).&amp;#8221;&lt;/p&gt;
&lt;p&gt;In Firefox 3.5, the controls attribute currently creates the following controls:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;play/pause button (toggles between the two)&lt;/li&gt;
&lt;li&gt;slider for current playback position and seeking (also displays how much of the video has currently been downloaded)&lt;/li&gt;
&lt;li&gt;duration display&lt;/li&gt;
&lt;li&gt;roll-over button for volume on/off and to display slider for volume&lt;/li&gt;
&lt;li&gt;FAIK fullscreen is not currently implemented&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Further, the HTML5 specification prescribes that if the @controls attribute is not available, &amp;#8220;user agents may provide controls to affect playback of the media resource (e.g. play, pause, seeking, and volume controls), but such features should not interfere with the page&amp;#8217;s normal rendering. For example, such features could be exposed in the media element&amp;#8217;s context menu.&amp;#8221;&lt;/p&gt;
&lt;p&gt;In Firefox 3.5, this has been implemented with a right-click context menu, which contains:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;play/pause toggle&lt;/li&gt;
&lt;li&gt;mute/unmute toggle&lt;/li&gt;
&lt;li&gt;show/hide controls toggle&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When the controls are being displayed, there are keyboard shortcuts to control them:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;space bar toggles between play and pause&lt;/li&gt;
&lt;li&gt;left/right arrow winds video forward/back by 5 sec&lt;/li&gt;
&lt;li&gt;CTRL+left/right arrow winds video forward/back by 60sec&lt;/li&gt;
&lt;li&gt;HOME+left/right jumps to beginning/end of video&lt;/li&gt;
&lt;li&gt;when focused on the volume button, up/down arrow increases/decreases volume&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As for exposure of these controls to screen readers, Mozilla implemented this in June, see &lt;a href=&quot;http://blog.gingertech.net/2009/08/03/aspects-of-video-accessibility/ http://www.marcozehe.de/2009/06/11/exposure-of-audio-and-video-elements-to-assistive-technologies/&quot;&gt;Marco Zehe&amp;#8217;s blog post on it&lt;/a&gt;. It implies having to use focus mode for now, so if you haven&amp;#8217;t been able to use keyboard for controlling the video element yet, that may be the reason.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;New video accessibility work&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;My work is actually meant to take video accessibility a step further and explore how to deal with what I call time-aligned text files for video and audio. For the purposes of accessibility, I am mainly concerned with subtitles, captions, and audio descriptions that come in textual form and should be read out by a screen reader or made available to braille devices.&lt;/p&gt;
&lt;p&gt;I am exploring both, time-aligned text that comes within a video file, but also those that are available as external Web resources and are just associated to the video through HTML. It is this latter use case that my demo explored.&lt;/p&gt;
&lt;p&gt;To create a nice looking demo, I used a skin for the video player that was developed by somebody else. Now, I didn&amp;#8217;t pay attention to whether that skin was actually accessible and this is the source of most of the problems that have been mentioned to me thus far.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A new, simpler demo&lt;br /&gt;
&lt;/strong&gt;&lt;br /&gt;
I have now developed &lt;a href=&quot;http://www.annodex.net/~silvia/itext/elephant_no_skin.html&quot;&gt;a new demo&lt;/a&gt; that uses the default player controls which should be accessible as described above. I&lt;br /&gt;
hope that the extra button that I implemented for the menu with all the text tracks is now accessible through a screen reader, too.&lt;/p&gt;
&lt;p&gt;UPDATE: Note that there is currently&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=494175&quot;&gt; a bug in Firefox that prevents tabbing to the video element from working&lt;/a&gt;. This will be possible in future.&lt;/p&gt;</content>
		<author>
			<name>silvia</name>
			<uri>http://blog.gingertech.net</uri>
		</author>
		<source>
			<title type="html">ginger's thoughts</title>
			<subtitle type="html">Silvia's blog</subtitle>
			<link rel="self" href="http://blog.gingertech.net/feed/atom/"/>
			<id>http://blog.gingertech.net/feed/atom/</id>
			<updated>2009-11-01T05:00:09+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry>
		<title type="html">H.264 isn't so bad, is it?</title>
		<link href="http://maikmerten.livejournal.com/3568.html"/>
		<id>http://maikmerten.livejournal.com/3568.html</id>
		<updated>2009-08-01T08:10:39+00:00</updated>
		<content type="html">This is mostly a quick response to &lt;a href=&quot;http://www.kenpardue.com/blog/2009/07/25/back-on-open-video/&quot;&gt;http://www.kenpardue.com/blog/2009/07/25/back-on-open-video/&lt;/a&gt; which e.g. reads &amp;quot;What I don&amp;rsquo;t understand, and what irks me so badly, is why H.264 is demonized so badly by the FLOSS community.&amp;quot; Well, I'll try to shed some light on this.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The problem with H.264 is much more severe than just the costs of the licensing fees. The exact pricing for 2011 and onwards may not yet be decided upon, but its absolutely problematic that there's a single entity (MPEG-LA) with the power to enforce licensing terms and prices. Even if the licensing fees in 2011 happen to be &amp;quot;cheap&amp;quot; there's zero guarantee it'll stay &amp;quot;cheap&amp;quot;. When reading the currently available documents on H.264 licensing it appears clear that the overall strategy is to &amp;quot;be cheap now, then get more expensive over time&amp;quot; and while the milking part may be pushed to a later date it'll eventually happen.&lt;/li&gt;&lt;li&gt;On the internet 100000 free-units is a joke. Every download counts, most downloads don't actually generate a new &amp;quot;customer&amp;quot; and a mildly interesting software will easily hit the 100000 downloads limit.&amp;nbsp; To make matters worse:&amp;nbsp;How to count downloads if you don't restrict distribution of your software to your own sites?&lt;/li&gt;&lt;li&gt;H.264 licensing terms are unfair to small players. There's a cap for annual licensing fees ($5 million) that big companies will easily hit, meaning each product shipping after the cap is basically free, while small companies not hitting the cap will bleed for every product delivered. This shifts market balance in favor of big players, hindering competition and innovation. The cap was $3.5 million in 2005-2006 and $4.25 million in 2007-2008 - so over time it got harder for small players to hit the maximum annual royality, not easier.&lt;/li&gt;&lt;li&gt;The licensing terms are absolutely incompatible with free (speech) software. There are open-source implementation of MPEG formats, meaning you can download, alter and redistribute the source-code - but without a license from MPEG-LA you're &lt;em&gt;not allowed to actually use&lt;/em&gt; that software, so you're denied a very essential FOSS right. Even if you had the right to use the open-source MPEG-compliant code you cannot transfer this right to somebody downloading your open-sourced code. You're always dependent on MPEG-LA licensing usage rights. Being at the mercy of a monopolistic 3rd party isn't exactly what FOSS is about.&lt;/li&gt;&lt;li&gt;Given that that MPEG licensing is incompatible with FOSS the widespread use of such encumbered formats questions the viability of FOSS on the desktop. Surfing the internet and watching embedded videos isn't possible within an intact FOSS environment in an MPEG-dominated world, users always would depend on proprietary and non-open components components like Flash carrying a MPEG license.&lt;/li&gt;&lt;li&gt;Currently everything hints at per-content licensing fees being considered at MPEG-LA. This means not only technology providers are at the mercy of MPEG-LA but also content producers and providers.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;For me that's enough to answer the question of why we need to push free-for-all-under-all-circumstances-without-paperwork media&amp;nbsp; formats - and the list above most likely isn't even complete.&lt;br /&gt;&lt;br /&gt;</content>
		<author>
			<name>Maik Merten</name>
			<uri>http://maikmerten.livejournal.com/</uri>
		</author>
		<source>
			<title type="html">maikmerten</title>
			<subtitle type="html">maikmerten - LiveJournal.com</subtitle>
			<link rel="self" href="http://maikmerten.livejournal.com/data/rss?tag=xiph"/>
			<id>http://maikmerten.livejournal.com/data/rss?tag=xiph</id>
			<updated>2009-10-02T05:00:22+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">IETF name tag</title>
		<link href="http://jmspeex.livejournal.com/4820.html"/>
		<id>urn:lj:livejournal.com:atom1:jmspeex:4820</id>
		<updated>2009-08-01T01:15:36+00:00</updated>
		<content type="html">&lt;a href=&quot;http://pics.livejournal.com/jmspeex/pic/000076ct/&quot;&gt;&lt;img src=&quot;http://pics.livejournal.com/jmspeex/pic/000076ct/s320x240&quot; width=&quot;304&quot; height=&quot;240&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;For those who are not familiar with the IETF, the blue dot means WG/BoF chair. In this case, the &lt;a href=&quot;http://xiph.org/press/2009/ietf75-bof/&quot;&gt;BoF&lt;/a&gt; also happened to be one of the most controversial in recent history. That was an interesting experience, to say the least.</content>
		<author>
			<name>jmspeex</name>
			<uri>http://jmspeex.livejournal.com/</uri>
		</author>
		<source>
			<title type="html">Jean-Marc Valin's random rants on DSP, Speex, open-source</title>
			<subtitle type="html">jmspeex</subtitle>
			<link rel="self" href="http://jmspeex.livejournal.com/data/atom"/>
			<id>urn:lj:livejournal.com:atom1:jmspeex</id>
			<updated>2009-10-02T05:00:13+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">&quot;Now would be a good time, Scotty&quot;</title>
		<link href="http://xiphmont.livejournal.com/42656.html"/>
		<id>http://xiphmont.livejournal.com/42656.html</id>
		<updated>2009-07-29T17:45:04+00:00</updated>
		<content type="html">&lt;p&gt;Coming up tomorrow, we have an IETF BoF on a proposed Working Group for FOSS audio codecs.  It is one of the more... controversial BoFs in recent memory.  Something of a main event...

&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;

&lt;p&gt;This is from our press release, but I hope it's not too press releasey.

&lt;p&gt;For some years now, Xiph.Org has been gently advocating royalty
free codecs within the IETF as
a viable and preferred alternative to patent-controlled
technologies. Recently more groups within the IETF have also come
forward to support free codec standardization work with in the
IETF. On July 30th at the &lt;a href=&quot;http://www.ietf.org/meeting/75/&quot;&gt;current IETF meeting in Stockholm&lt;/a&gt;,
the IETF will hold a codecs BoF to take input on
whether or not to form a standards Working Group for royalty free
audio codecs. The creation of such a Working Group would have a
major impact, opening the door to a Voice over IP stack
completely free of licensing and royalty constraints. We're
seeking to set up the same kind of open competition and
cooperation we've seen on the web that's given rise to tons of
investment and improvement in a very short period of time.

&lt;p&gt;Giving input on the Working Group proposal does not require being in
Sweden for the IETF meeting; Those who cannot attend in person can
have their voice heard via the codec@jabber.ietf.org chat room or by
posting to the &lt;a href=&quot;https://www.ietf.org/mailman/listinfo/codec&quot;&gt;codec mailing list&lt;/a&gt;. We encourage people to attend,
comment and discuss in person, via Jabber and on the mailing lists as
opponents of the WG proposal are expected to be well-organized and out
in force. The important thing is to clearly demonstrate that there is
a large number of people in favor of creating the new Working Group.

&lt;p&gt;There are currently two draft submissions to be discussed at the
BoF. &lt;a href=&quot;http://tools.ietf.org/html/draft-valin-celt-codec-01&quot;&gt;The first draft&lt;/a&gt; describes the new Xiph.Org &lt;a href=&quot;http://www.celt-codec.org/&quot;&gt;CELT codec&lt;/a&gt; and
the second describes the Skype &lt;a href=&quot;http://tools.ietf.org/html/draft-vos-silk-00&quot;&gt;SILK codec&lt;/a&gt;. These two draft
proposals complement each other nicely. There is also declared intent
to submit the SPIRIT &lt;a href=&quot;http://www.ietf.org/mail-archive/web/codec/current/msg00431.html&quot;&gt;IPMR wideband codec&lt;/a&gt;.

&lt;p&gt;This Working Group proposal faces stiff opposition from current codec
patent holders who benefit from the status quo that allows them to
control competition from organizations whose business models cannot
support per-channel royalties. Now is a very good time to speak up on
this issue.

&lt;p&gt;We hope to see you (physically or virtually) in large numbers for the
BoF. Xiph.Org will be represented in person at the meeting by
Christopher (Monty) Montgomery [Director] and Jean-Marc Valin [CELT
Project Lead]. The BoF will be at &lt;a href=&quot;http://tinyurl.com/stockholm-codec-bof&quot;&gt;13:00 Stockholm time&lt;/a&gt;. The IETF will stream &lt;a href=&quot;http://feed.verilan.com/ietf/stream02.m3u&quot;&gt;an mp3 audio feed&lt;/a&gt; of the BoF (and yes, we'll be setting up an &lt;a href=&quot;http://people.xiph.org/~jm/bof_details.html&quot;&gt;Ogg feed of the
audio as well as up-to-date information on the
BoF&lt;/a&gt;).

&lt;p&gt;(this effort is targeted at real-time audio codecs and is
independent from the HTML5 effort involving Vorbis and Theora at the
W3C)&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;</content>
		<author>
			<name>Monty</name>
			<uri>http://xiphmont.livejournal.com/</uri>
		</author>
		<source>
			<title type="html">Monty</title>
			<subtitle type="html">Monty - LiveJournal.com</subtitle>
			<link rel="self" href="http://xiphmont.livejournal.com/data/rss?tag=xiph"/>
			<id>http://xiphmont.livejournal.com/data/rss?tag=xiph</id>
			<updated>2009-10-02T05:00:25+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">First experiments with itext</title>
		<link href="http://blog.gingertech.net/2009/07/29/first-experiments-with-itext/"/>
		<id>http://blog.gingertech.net/?p=478</id>
		<updated>2009-07-28T21:29:43+00:00</updated>
		<content type="html">&lt;p&gt;My accessibility work for Mozilla is showing first results.&lt;/p&gt;
&lt;p&gt;I have now implemented a demo for the previously proposed &lt;a href=&quot;http://wiki.xiph.org/index.php/Timed_Divs_HTML#Direct_linking_on_a_HTML5_page&quot;&gt;&amp;lt;itext&gt; element&lt;/a&gt;. During the development process, &lt;a href=&quot;https://wiki.mozilla.org/Accessibility/HTML5_captions&quot;&gt;the specification became more concrete&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m sure you&amp;#8217;re keen to &lt;a href=&quot;http://www.annodex.net/~silvia/itext/&quot;&gt;check out the demo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Please note the following features of the demo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It experiments with four different types of time-aligned text: subtitles, captions, chapters, and textual audio annotations.&lt;/li&gt;
&lt;li&gt;It extends the video controls by a menu button for the time-aligned text tracks. This enables the user to switch between different languages for the different tracks.&lt;/li&gt;
&lt;li&gt;The textual audio annotations are mapped into an aria-live activated div element, such that they are indeed read out by screen-readers; this div sits behind the video, invisible to everyone else.&lt;/li&gt;
&lt;li&gt;The chapters are displayed as text on top of the video.&lt;/li&gt;
&lt;li&gt;The subtitles and captions are displayed as overlays at the bottom of the video.&lt;/li&gt;
&lt;li&gt;The display styles and positions are supposed to be default display mechanisms for these kinds of tracks, that could be overwritten by the stylesheet of a Web developer, who intends to place the text elsewhere on screen.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In order to &amp;#8220;hear&amp;#8221; the textual audio annotations work, you will need to install a screen reader such as JAWS, NVDA, or the firevox plugin on the Mac.&lt;/p&gt;
&lt;p&gt;As far as I am aware, this is the first demo of HTML5 video accessibility that includes support for the vision-impaired, hearing-impaired, and also for foreign language speakers.&lt;/p&gt;
&lt;p&gt;There have been &lt;a href=&quot;https://wiki.mozilla.org/Accessibility/Experiment1_feedback#Thoughts_.2F_Feedback&quot;&gt;initial discussions&lt;/a&gt; about this proposal, the results of which are captured &lt;a href=&quot;https://wiki.mozilla.org/Accessibility/Experiment1_feedback#Thoughts_.2F_Feedback&quot;&gt;in the wiki page&lt;/a&gt;.  I expect a lot more heated discussion will happen on the WHATWG mailing list when I post it soon. I am well aware that probably most of the javascript API will need to be changed, and also some of the HTML.&lt;/p&gt;
&lt;p&gt;Also please note that there are &lt;a href=&quot;https://wiki.mozilla.org/Accessibility/Experiment1_feedback#Features_of_the_Implementation&quot;&gt;some bugs&lt;/a&gt; still left on the software, which should not inhibit the discussion at this stage. We will definitely develop a newer and better version.&lt;/p&gt;
&lt;p&gt;I am particularly proud that I was able to make this work in the experimental builds of Opera and Chrome, as well as in Safari with XiphQT installed, and of course in Firefox 3.5.&lt;/p&gt;
&lt;div id=&quot;attachment_480&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;a href=&quot;http://blog.gingertech.net/wp-content/uploads/2009/07/screenshot3.png&quot;&gt;&lt;img src=&quot;http://blog.gingertech.net/wp-content/uploads/2009/07/screenshot3-300x227.png&quot; alt=&quot;Screenshot of first itext video player&quot; title=&quot;First experiment with itext&quot; width=&quot;300&quot; height=&quot;227&quot; class=&quot;size-medium wp-image-480&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Screenshot of first itext video player experiment&lt;/p&gt;&lt;/div&gt;</content>
		<author>
			<name>silvia</name>
			<uri>http://blog.gingertech.net</uri>
		</author>
		<source>
			<title type="html">ginger's thoughts</title>
			<subtitle type="html">Silvia's blog</subtitle>
			<link rel="self" href="http://blog.gingertech.net/feed/atom/"/>
			<id>http://blog.gingertech.net/feed/atom/</id>
			<updated>2009-11-01T05:00:09+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry>
		<title type="html">Displaying images with Self</title>
		<link href="http://www.bluishcoder.co.nz/2009/07/displaying-images-with-self.html"/>
		<id>tag:blogger.com,1999:blog-18561009.post-7506329736191504343</id>
		<updated>2009-07-28T00:32:08+00:00</updated>
		<content type="html">&lt;p&gt;The &lt;a href=&quot;http://www.selflanguage.org&quot;&gt;Self&lt;/a&gt; source code has some example programs, one of which is a web browser. This was developed quite a long time ago and is unable to nicely display most pages on the modern web but it does a reasonable job of basic pages. On the Linux port there were some problems with displaying images however. I tracked this down to two issues:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;It only natively decoded image formats that aren't really used on the web (Sun Raster format for example). The GIF and JPG handling code spawned external programs, which I didn't have on my Linux install, to convert to a format it could handle before displaying.&lt;/li&gt;&lt;li&gt;There was a bug in the color management code on X11 for displays greater than 8 bit.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The first was a quick fix by changing the programs that it used to do the conversion to one readily available on Linux. I changed it to use the &lt;a href=&quot;http://www.imagemagick.org/&quot;&gt;Image Magick&lt;/a&gt; '&lt;a href=&quot;http://www.imagemagick.org/script/convert.php&quot;&gt;convert&lt;/a&gt;' program. This enabled displaying code in an imageMorph by setting the image for the morph:&lt;/p&gt;&lt;pre&gt;setImage: ui2Image copyFromGIFFile: 'test.gif'&lt;/pre&gt;&lt;p&gt;I tracked the second issue down to code that was sending a message to an object that didn't understand that message (Static typing fans can say 'I told you so' here). Self has a 'paintManager' which handles color mapping for displays that can't display a large number of colors. On 8 bit displays this is a 'paintManager'. On displays with more colors it's a 'unmappedPaintManager'. The latter doesn't have some of the slots of the former and there was code trying to do this. I changed this to check if the paintManager instance can do color mapping before sending the messages.&lt;/p&gt;&lt;p&gt;With that change the web browser could display images. An example page that works with the browser (one of the few...), and code to display it:&lt;/p&gt;&lt;pre&gt;'http://www.bluishcoder.co.nz/self/imagetest.html' asURL getPageForUser&lt;/pre&gt;&lt;p&gt;The patches with these fixes is available from the &lt;a href=&quot;http://github.com/doublec/self/tree/webbrowser&quot;&gt;webbrowser branch&lt;/a&gt; of my fork of the Self git repostory on github. The fixes were only a few lines of code.&lt;/p&gt;&lt;p&gt;I did a &lt;a href=&quot;http://www.bluishcoder.co.nz/self/selfimage.ogg&quot;&gt;short screencast&lt;/a&gt; showing loading image morph's and displaying the web page in the browser. And before you say, &quot;wow, that GUI looks so 90's&quot;, don't forget - it was.&lt;/p&gt;&lt;br /&gt;&lt;span class=&quot;technoratitag&quot;&gt;Categories: &lt;a href=&quot;http://del.icio.us/bluishcoder/self&quot; rel=&quot;tag&quot;&gt;self&lt;/a&gt;&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/18561009-7506329736191504343?l=www.bluishcoder.co.nz%2Findex.html&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Chris Double</name>
			<email>noreply@blogger.com</email>
			<uri>http://www.bluishcoder.co.nz/</uri>
		</author>
		<source>
			<title type="html">Bluish Coder</title>
			<subtitle type="html">Programming Languages, Martial Arts and Computers. The Weblog of Chris Double.</subtitle>
			<link rel="self" href="http://www.bluishcoder.co.nz/atom.xml"/>
			<id>tag:blogger.com,1999:blog-18561009</id>
			<updated>2009-10-27T13:00:44+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Building and using Self on Linux</title>
		<link href="http://www.bluishcoder.co.nz/2009/07/building-and-using-self-on-linux.html"/>
		<id>tag:blogger.com,1999:blog-18561009.post-6138669222816188430</id>
		<updated>2009-07-27T01:02:55+00:00</updated>
		<content type="html">&lt;p&gt;The original implementation of the &lt;a href=&quot;http://selflanguage.org/&quot;&gt;Self programming language&lt;/a&gt; is easy to build from source. Russell Allen maintains a &lt;a href=&quot;http://github.com/russellallen/self/tree/master&quot;&gt;git repository on github&lt;/a&gt; containing the source.&lt;/p&gt;&lt;p&gt;I use &lt;a href=&quot;http://www.archlinux.org/&quot;&gt;Arch Linux&lt;/a&gt; with 'flex' and 'tcsh' packages installed for various parts of the build process. To build a Self binary:&lt;/p&gt;&lt;pre&gt;$ &lt;strong&gt;git clone git://github.com/russellallen/self.git&lt;/strong&gt;&lt;br /&gt;$ &lt;strong&gt;cd self/release&lt;/strong&gt;&lt;br /&gt;$ &lt;strong&gt;sh buildLinuxVM&lt;/strong&gt;&lt;br /&gt;$ &lt;strong&gt;cd ..&lt;/strong&gt;&lt;br /&gt;$ &lt;strong&gt;./Self&lt;/strong&gt;&lt;/pre&gt;&lt;p&gt;The build takes about 30 minutes on my laptop. There will be many compilation warnings but these can be safely ignored. The result of the build is a 'Self' executable in the root directory of the cloned source. The executable can be run but most of the Self library is not loaded. You need to create an image to run or use an existing one. About the only thing you can do with the Self VM without an image is use primitives.&lt;/p&gt;&lt;p&gt;The 'objects' directory contains the source for the core Self library, the User Inteface, as well as other applications and interesting stuff. These can be used to build an image to run Self. The file 'all2.self' can be used to create an image including the graphical user interface. 'small.self' can be used to build an image without the user interface. The primitive '_RunScript' is used to load these files. Once loaded you can save a 'snapshot' (this is the term Self uses for images) which can be resumed in later sessions.&lt;/p&gt;&lt;pre&gt;$ &lt;strong&gt;cd objects&lt;/strong&gt;&lt;br /&gt;$ &lt;strong&gt;../Self&lt;/strong&gt;&lt;br /&gt;Self Virtual Machine Version 4.1.13, Sun 26 Jul 09 16:59:28 Linux&lt;br /&gt;Copyright 1989-2003: The Self Group (type _Credits for credits)&lt;br /&gt;&lt;br /&gt;for I386:  LogVMMessages = true&lt;br /&gt;for I386:  PrintScriptName  = true&lt;br /&gt;for I386:  Inline = true&lt;br /&gt;for I386:  SICDeferUncommonBranches = false (not implemented)&lt;br /&gt;for I386:  SICReplaceOnStack = false (not implemented)&lt;br /&gt;for I386:  SaveOutgoingArgumentsOfPatchedFrames = true&lt;br /&gt;VM # &lt;strong&gt;'all2.self' _RunScript&lt;/strong&gt;&lt;br /&gt;reading all2.self...&lt;br /&gt;reading ./core/init.self...&lt;br /&gt;reading ./core/allCore.self...&lt;br /&gt;reading ./core/systemStructure.self...&lt;br /&gt;reading ./core/defaultBehavior.self...&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;reading ./ui2/outliner/profileSliceGrpMod.self...&lt;br /&gt;reading ./ui2/outliner/profileSelfSlotMdl.self...&lt;br /&gt;reading ./ui2/outliner/powerOperations.self...&lt;br /&gt;verifying newgen: eden from to oldgen: old0 old1 z p r S v O m N M i  done&lt;br /&gt;Starting: Collecting Garbage...&lt;br /&gt;Finished: Collecting Garbage&lt;br /&gt;Starting: Refilling module cache...&lt;br /&gt;Finished: Refilling module cache&lt;br /&gt;&quot;Self 0&quot; &lt;strong&gt;saveAs: 'ui.snap'&lt;/strong&gt;&lt;br /&gt;Starting: Writing snapshot to ui.snap...&lt;br /&gt;Finished: Writing snapshot to ui.snap&lt;br /&gt;shell&lt;br /&gt;&quot;Self 1&quot; &lt;strong&gt;quit&lt;/strong&gt;&lt;br /&gt;Save to ui.snap before quitting? &lt;br /&gt;  y =&gt; save, then quit&lt;br /&gt;  n =&gt; quit without saving&lt;br /&gt;  RET =&gt; cancel&lt;br /&gt;Response: &lt;strong&gt;n&lt;/strong&gt;&lt;/pre&gt;&lt;p&gt;Notice the call to 'saveAs:' to save the image snapshot. 'quit' is used to exit the running Self session. This image can now be resumed using the '-s' argument to 'Self' whenever you want to run Self:&lt;/p&gt;&lt;pre&gt;$ &lt;strong&gt;cd objects&lt;/strong&gt;&lt;br /&gt;$ &lt;strong&gt;../Self -s ui.snap&lt;/strong&gt;&lt;br /&gt;for I386:  LogVMMessages = true&lt;br /&gt;for I386:  PrintScriptName  = true&lt;br /&gt;for I386:  Inline = true&lt;br /&gt;for I386:  SICDeferUncommonBranches = false (not implemented)&lt;br /&gt;for I386:  SICReplaceOnStack = false (not implemented)&lt;br /&gt;for I386:  SaveOutgoingArgumentsOfPatchedFrames = true&lt;br /&gt;&lt;br /&gt; Welcome to the Self system!  (Version 4.4)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Copyright 1992-2009 AUTHORS, Sun Microsystems, Inc. and Stanford University.&lt;br /&gt;See the LICENSE file for license information.&lt;br /&gt;&lt;br /&gt;Type _Credits for full credits.&lt;br /&gt;&lt;br /&gt;VM version: 4.1.13&lt;br /&gt;&lt;br /&gt;  &quot;Self 1&quot; &lt;/pre&gt;&lt;p&gt;At this point you can now use any Self expressions. All code is run in the contents of an object called 'shell'. You can start the graphical user interface by passing the 'open' message to the 'desktop' object:&lt;/p&gt;&lt;pre&gt;&quot;Self 1&quot; &lt;strong&gt;desktop open&lt;/strong&gt;&lt;/pre&gt;&lt;p&gt;The desktop will appear with a 'trash can' object and an outliner for the 'shell' object. Left clicking on the middle button labelled 'E' in the group of three buttons on the right of the shell will open an expression evaluator allowing you to enter Self expressions. Middle click on objects to get an object specific menu. On the desktop this provides a menu item to quit when you want to leave the session.&lt;/p&gt;&lt;p&gt;There are some interesting applications in the 'objects' directory. For example, there is a Smalltalk implementation written in Self. This can be loaded at the shell with the command:&lt;/p&gt;&lt;pre&gt;&quot;Self 1&quot; &lt;strong&gt;bootstrap read: 'smalltalk' From: 'applications/smalltalk'&lt;/strong&gt;&lt;/pre&gt;&lt;p&gt;When it completes loading you can find a 'smalltalk' item on the desktop's right click menu. Choosing that provides a menu to load a standard Smalltalk browser, workspace and inspector, allowing you to write Smalltalk code. There's a document that &lt;a href=&quot;http://selflanguage.org/_static/manuals/smalltalk.ps.gz&quot;&gt;describes the Smalltalk emulator&lt;/a&gt; for more information about it. There are other interesting applications in the objects directory including a web browser, Java emulator, a C preprocessor, &lt;a href=&quot;http://www.cs.washington.edu/research/projects/cecil/&quot;&gt;Cecil&lt;/a&gt; implementation and a parser/lexer generator. Most of this code is old and in various states of usability but it provides some interesting examples of Self code to look at and play with.&lt;/p&gt;&lt;p&gt;The &lt;a href=&quot;http://selflanguage.org/_static/tutorial/Tutorial/index.html&quot;&gt;Self tutorial&lt;/a&gt; provides a good introduction to using the Self user interface.&lt;/p&gt;&lt;br /&gt;&lt;span class=&quot;technoratitag&quot;&gt;Categories: &lt;a href=&quot;http://del.icio.us/bluishcoder/self&quot; rel=&quot;tag&quot;&gt;self&lt;/a&gt;&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/18561009-6138669222816188430?l=www.bluishcoder.co.nz%2Findex.html&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Chris Double</name>
			<email>noreply@blogger.com</email>
			<uri>http://www.bluishcoder.co.nz/</uri>
		</author>
		<source>
			<title type="html">Bluish Coder</title>
			<subtitle type="html">Programming Languages, Martial Arts and Computers. The Weblog of Chris Double.</subtitle>
			<link rel="self" href="http://www.bluishcoder.co.nz/atom.xml"/>
			<id>tag:blogger.com,1999:blog-18561009</id>
			<updated>2009-10-27T13:00:44+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Open Source Development Contests</title>
		<link href="http://metavid.org/blog/2009/07/24/open-source-development-contests/"/>
		<id>http://metavid.org/blog/?p=363</id>
		<updated>2009-07-24T21:27:30+00:00</updated>
		<content type="html">&lt;p&gt;Just want to quickly remind people about the Apps for &lt;a title=&quot;apps for america&quot; href=&quot;http://sunlightlabs.com/contests/appsforamerica2/&quot; target=&quot;_blank&quot;&gt;America v2.0 contest&lt;/a&gt;. Would be really nifty try and do something with the &lt;a href=&quot;http://metavid.org/wiki/Help:Advanced#APIs&quot;&gt;metavid apis&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Apps for America is a special contest we&amp;#8217;re putting on this year to celebrate the release of &lt;a href=&quot;http://data.gov/&quot;&gt;Data.gov&lt;/a&gt;! We&amp;#8217;re doing it alongside &lt;a href=&quot;http://google.com/&quot;&gt;Google&lt;/a&gt;, &lt;a href=&quot;http://oreilly.com/&quot;&gt;O&amp;#8217;Reilly Media&lt;/a&gt;, and &lt;a href=&quot;http://techweb.com/&quot;&gt;TechWeb&lt;/a&gt; and the winners will be announced at the &lt;a href=&quot;http://gov2expo.com/&quot;&gt;Gov 2.0 Expo Showcase&lt;/a&gt; in Washington, DC at the end of the Summer.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Also wanted to mention &lt;a title=&quot;kaltura app dev contest&quot; href=&quot;http://corp.kaltura.com/&quot; target=&quot;_blank&quot;&gt;Kaltura&lt;/a&gt; ( the company that I am working with on wikimedia on open video stuff ) has a &lt;a title=&quot;kaltura dev frenzy&quot; href=&quot;http://www.kaltura.org/frenzy&quot; target=&quot;_blank&quot;&gt;contest too&lt;/a&gt;. As part of their community edition launch they are giving away a few prizes for developers using the kaltura open video platform:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;As part of the public launch of &lt;a class=&quot;bb-url&quot; href=&quot;http://www.kaltura.org/project/kalturaCE&quot;&gt;Kaltura Community Edition&lt;/a&gt; and the Kaltura.org community website, we’re calling existing members of the community and new developers to take part in a cool contest and win some fun prizes!&lt;/p&gt;&lt;/blockquote&gt;</content>
		<author>
			<name>Metavid Project</name>
			<uri>http://metavid.org/blog</uri>
		</author>
		<source>
			<title type="html">Metavid Blog</title>
			<subtitle type="html">This Blog covers the metavid project and related politics.</subtitle>
			<link rel="self" href="http://metavid.org/blog/feed/"/>
			<id>http://metavid.org/blog/feed/</id>
			<updated>2009-09-14T19:00:15+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Prototype Based Programming Languages</title>
		<link href="http://www.bluishcoder.co.nz/2009/07/prototype-based-programming-languages.html"/>
		<id>tag:blogger.com,1999:blog-18561009.post-6365521314596965711</id>
		<updated>2009-07-16T21:13:11+00:00</updated>
		<content type="html">&lt;p&gt;I've been reading up on &lt;a href=&quot;http://en.wikipedia.org/wiki/Prototype-based_programming&quot;&gt;protoype based&lt;/a&gt; programming languages recently. Mainly using the &lt;a href=&quot;http://iolanguage.com/&quot;&gt;Io Programming Language&lt;/a&gt; and &lt;a href=&quot;http://selflanguage.org/&quot;&gt;Self&lt;/a&gt; but also looking at &lt;a href=&quot;http://www.ccs.neu.edu/home/ivan/moo/lm_toc.html&quot;&gt;LambdaMOO&lt;/a&gt; and similar languages. A good overview of using the prototype based approach to building programs is &lt;a href=&quot;http://research.sun.com/self/papers/organizing-programs.html&quot;&gt;Organizing Programs without Classes&lt;/a&gt;. This post is based on examples from that paper and from &lt;a href=&quot;http://crpit.com/abstracts/CRPITV13Noble.html&quot;&gt;Attack of the Clones&lt;/a&gt; which covers design patterns using Self.&lt;/p&gt;&lt;h2&gt;Self&lt;/h2&gt;&lt;p&gt;In the Self programming language objects are created using a literal object syntax. This syntax defines code and slots within the &lt;code&gt;(|&lt;/code&gt; and &lt;code&gt;|)&lt;/code&gt; delimiters. An example object looks like:&lt;/p&gt;&lt;pre&gt;point = (|&lt;br /&gt;  parent* = traits point.&lt;br /&gt;  x.&lt;br /&gt;  y.&lt;br /&gt;|)&lt;/pre&gt;&lt;p&gt;This creates an object with 3 slots. The slots are 'parent', 'x' and 'y'. The 'parent' slot is assigned an inital value of 'traits point' which is the traits object for points (more on what this is later). The '*' that is suffixed to the 'parent' slot means it is a prototype slot and used in the prototype slot lookup chain.&lt;/p&gt;&lt;p&gt;This means when a message is sent to the 'point' object the lookup starts with the 'point' object. If a slot with the messages name is not found in that object then each prototype slot (those suffixed with '*') are searched looking for a slot with that name.&lt;/p&gt;&lt;p&gt;So in the 'point' case, looking for 'x' will find it immediately in the point object. Looking for 'print' will not so it will look for it in the 'traits point' object. If it's not there it will look in that objects prototype slots and so on until it is found or the search is exhausted.&lt;/p&gt;&lt;p&gt;The idiom in Self (and other prototype based languages) is to create global objects like these and use 'clone' to create copies of it. So creating two different points would look like:&lt;/p&gt;&lt;pre&gt;a = point clone.&lt;br /&gt;b = point clone.&lt;/pre&gt;&lt;p&gt;Notice that 'point' has no method slots. Only the 'x' and 'y' which contain data. The methods are defined in the 'traits point' object. The definition of that could look something like:&lt;/p&gt;&lt;pre&gt;traits point = (|&lt;br /&gt;  parent* = traits clonable.&lt;br /&gt;  print = x println y println.&lt;br /&gt;|)&lt;/pre&gt;&lt;p&gt;This provides a method to print the 'x' and 'y' values of the object and another parent that provides other basic functionality lie the ability to clone. The 'traits point' object doesn't define any data slots. It defines only methods. However it uses 'x' and 'y' messages that aren't defined. It expects to be used in a prototype slot of another object that defines the 'x' and 'y' slots (like ur 'point' example earlier.&lt;/p&gt;&lt;p&gt;Separating the code out into data objects and trait objects allows the trait object to be reused in other objects. For example, an object that computes the 'x' and 'y' values rather than storing them can re-use the traits object:&lt;/p&gt;&lt;pre&gt;computed_point = (|&lt;br /&gt;  parent* = traits point.&lt;br /&gt;  x = ..compute x..&lt;br /&gt;  y = ..compute y..&lt;br /&gt;|)&lt;/pre&gt;&lt;p&gt;This 'computed_point' can be used anywhere a point is expected. The traits object sends the 'x' and 'y' messages when it needs their value and it doesn't matter if there stored as data as in the 'point' object, or as methods that calculate the value as in the 'computed_point' object. Each 'point' and 'computed_point' object shares a single trait object instance. This avoids the need to have multiple copies of the methods in each point object instance.&lt;/p&gt;&lt;p&gt;The prototype slots of an object effectively form an inheritance relationship. The way to subclass objects in Self is to create a new object and set a prototype slot to an instance of the parent object. Usually it's the trait objects that map the subclass relationship since it is those objects that contain the object behaviour (ie. the methods and no data). An example follows in Self of how a 'polygon' and 'filled_polygon' object can be modelled (this is from the 'Organizing Programs without Classes' paper):&lt;/p&gt;&lt;pre&gt;polygon_traits = (|&lt;br /&gt;  draw = ...draw using 'vertices' slot to get points...&lt;br /&gt;|)&lt;br /&gt;&lt;br /&gt;polygon = (|&lt;br /&gt;  parent* = polygon_traits.&lt;br /&gt;  vertices.&lt;br /&gt;|)&lt;br /&gt;&lt;br /&gt;filled_polygon_traits = (|&lt;br /&gt;  parent* = polygon_traits.&lt;br /&gt;  draw = ...draw using 'vertices' and 'fillPattern'...&lt;br /&gt;|)&lt;br /&gt;&lt;br /&gt;filled_polygon = (|&lt;br /&gt;  parent* = filled_polygon_traits.&lt;br /&gt;  vertices.&lt;br /&gt;  fillPattern;&lt;br /&gt;|)&lt;/pre&gt;&lt;p&gt;Cloning the 'polygon' object and sending the 'draw' message will draw the polygon using the list of points held in the 'vertices' slot. Cloning the 'filled_polygon' object and sending the 'draw' message will draw using the specialized 'draw' method that also uses the 'fillPattern' slot to fill the polygon when drawing. This can re-use the 'draw' method in the 'polygon_traits' object if needed.&lt;/p&gt;&lt;p&gt;The new 'filled_polygon' object did require defining a new 'vertices' slot. Self allows multiple prototype slots, each of which is involved in the lookup for slot names. We can share the 'vertices' from the 'polygon' object by making that an additional prototype slot in 'filled_polygon'. This is often termed a 'data parent':&lt;/p&gt;&lt;pre&gt;filled_polygon = (|&lt;br /&gt;  parent* = filled_polygon_traits.&lt;br /&gt;  dataParent* = polygon clone.&lt;br /&gt;  fillPattern;&lt;br /&gt;|)&lt;/pre&gt;&lt;p&gt;Notice the 'dataParent' slot is a prototype slot (suffixed with a '*'). This means it participates in the slot lookup process. The data parent approach has an advantage over the previous example in that if we change the representation of the 'polygon' object then all new 'filled_polygon' instances will get this new representation. We don't need to edit the 'filled_polygon' definition for the modified or additional slots.&lt;/p&gt;&lt;p&gt;In the 'filled_polygon' example we re-used the 'vertices' slot from 'polygon'. We can also define subclasses that implement 'vertices' differently than 'polygon'. For example, a rectangle that stores the four corners and computes the vertices from this. Due to the seperation of state and behaviour this can be modelled easily:&lt;/p&gt;&lt;pre&gt;rectangle_traits = (|&lt;br /&gt;  parent* = polygon_traits.&lt;br /&gt;  draw = ...draw rectangle using left, right, top, bottom...&lt;br /&gt;  vertices = ...compute vertices list using left, right, etc...&lt;br /&gt;|)&lt;br /&gt;&lt;br /&gt;rectangle = (|&lt;br /&gt;  parent* = rectangle_traits.&lt;br /&gt;  left.&lt;br /&gt;  right.&lt;br /&gt;  top.&lt;br /&gt;  bottom.&lt;br /&gt;|)&lt;/pre&gt;&lt;p&gt;Inheritance in Self can be dynamic if the prototype slots are made assignable. This means, at runtime, we can change the value of the slot used during message lookup, resulting in different behaviour. This can be used for objects that can be in different states.&lt;/p&gt;&lt;p&gt;An example is a 'file' object. It can be opened or closed. Some methods in 'file' can only be used when the file is open, and some only when it is closed. This could be managed by conditional checks in each method. Or the parent of the object could be changed to a different traits object depending on the state - this avoids the need for each method to check if the file is in the open or closed state:&lt;/p&gt;&lt;pre&gt;open_file_traits = (|&lt;br /&gt;  read = ...&lt;br /&gt;  close = setParent: close_file_traits.&lt;br /&gt;|)&lt;br /&gt;&lt;br /&gt;closed_file_traits = (|&lt;br /&gt;  open = setParent: open_file_traits.&lt;br /&gt;|)&lt;br /&gt;&lt;br /&gt;file = (|&lt;br /&gt;  parent* = closed_file_traits.&lt;br /&gt;|)&lt;/pre&gt;&lt;p&gt;Methods like 'open' are only available on closed files. 'read' can only be called on opened files. This is basically the &lt;a href=&quot;http://en.wikipedia.org/wiki/Strategy_pattern&quot;&gt;Strategy pattern&lt;/a&gt; made easy using Self's dynamic inheritance.&lt;/p&gt;&lt;h2&gt;Io&lt;/h2&gt;&lt;p&gt;Whereas Self defines the prototype lookup chain to be that of the prototype slots in an object, Io instead has a slot called 'protos' which is a list of all objects in the prototype chain. Instead of creating slots with a name suffixed with '*' you append to the existing 'protos' list.&lt;/p&gt;&lt;p&gt;The 'protos' list is initially populated when you clone an object with the object that you cloned. This is unlike Self where copying an object does a shallow copy of all the slots of that object. In Io you get a 'differential inheritance' model where your newly created object has no slots, just a 'protos' field that contains the original object that was cloned. The Self 'point' example I used earlier looks like:&lt;/p&gt;&lt;pre&gt;Point := Object clone do(&lt;br /&gt;  x := 0&lt;br /&gt;  y := 0&lt;br /&gt;)&lt;/pre&gt;&lt;p&gt;Calling 'clone' on this new 'Point' object results in a new object that does not contain it's own 'x' and 'y' values. Instead its 'protos' field points to the 'Point' object which contains the values. When you set the 'x' value on the clone it will then create its own 'x' slot rather than changing the prototypes. In this way clones of big objects where relatively few slots are changed will save some memory:&lt;/p&gt;&lt;pre&gt;a := Point clone&lt;br /&gt;b := Point clone&lt;br /&gt;a x = 5&lt;br /&gt;a x println&lt;br /&gt; =&gt; 5&lt;br /&gt;b x println&lt;br /&gt; =&gt; 0&lt;br /&gt;a protos first == Point&lt;br /&gt; =&gt; true&lt;br /&gt;b protos first == Point&lt;br /&gt; =&gt; true&lt;/pre&gt;&lt;p&gt;This does have an interesting side effect in that if you clone a clone then you can end up with a longish prototype chain for the method lookup:&lt;/p&gt;&lt;pre&gt;a := Point clone&lt;br /&gt;b := a clone&lt;br /&gt;c := b clone&lt;br /&gt;c protos first == b&lt;br /&gt; =&gt; true&lt;br /&gt;c protos first protos first == a&lt;br /&gt; =&gt; true&lt;br /&gt;c protos first protos first protos first == Point&lt;br /&gt; =&gt; true&lt;/pre&gt;&lt;p&gt;Inheritance is handled in much the same manner as Self but you need to manipulate the 'protos' slot instead of having multiple prototype slots. The filled polygon example looks like:&lt;/p&gt;&lt;pre&gt;PolygonTraits = Object clone do(&lt;br /&gt;  draw := method(vertices foreach(v, v println))&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;Polygon := PolygonTraits clone do(&lt;br /&gt;  vertices := list(1,2,3,4)&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;FilledPolygonTraits := PolygonTraits clone do(&lt;br /&gt;  draw := method(resend; fillPattern println)&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;FilledPolygon := FilledPolygonTraits clone do(&lt;br /&gt;  appendProto(Polygon clone)&lt;br /&gt;  fillPattern := &quot;solid&quot;&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;Polygon clone draw&lt;br /&gt;  =&gt; 1&lt;br /&gt;     2&lt;br /&gt;     3&lt;br /&gt;FilledPolygon clone draw&lt;br /&gt;  =&gt; 1&lt;br /&gt;     2&lt;br /&gt;     3&lt;br /&gt;     &quot;solid&quot;&lt;/pre&gt;&lt;p&gt;'appendProto' appends an object to the prototype chain which is initially 'FilledPolygonTraits' in this examples as that was the initial object we cloned. The dynamic inheritance example can also be done in Io:&lt;/p&gt;&lt;pre&gt;OpenFileTraits := Object clone do(&lt;br /&gt;  read := method(n, &quot;Reading #{n} bytes&quot; interpolate println)&lt;br /&gt;  close := method(&lt;br /&gt;    self removeProto(OpenFileTraits)&lt;br /&gt;    self appendProto(ClosedFileTraits)&lt;br /&gt;  )&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;ClosedFileTraits := Object clone do(&lt;br /&gt;  open := method(&lt;br /&gt;    self removeProto(ClosedFileTraits)&lt;br /&gt;    self appendProto(OpenFileTraits)&lt;br /&gt;  )&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;File := Object clone do(&lt;br /&gt;  init := method(self appendProto(ClosedFileTraits))&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;f := File clone&lt;br /&gt;f read(255)&lt;br /&gt;  =&gt; Exception: File does not respond to 'read'&lt;br /&gt;f open&lt;br /&gt;f read(255)&lt;br /&gt;  =&gt; reading 255 bytes&lt;br /&gt;f open&lt;br /&gt;  =&gt; Exception: File does not respond to 'open'&lt;br /&gt;f close&lt;/pre&gt;&lt;p&gt;It's a bit more work than in Self to manually manage the prototype chain but does work.&lt;/p&gt;&lt;h2&gt;JavaScript&lt;/h2&gt;&lt;p&gt;JavaScript is also a prototype based programming language. Unlike Self or Io it only allows one object to be used as the prototype in any given object. This is stored in a hidden '__proto__' member and cannot be updated once set on construction (some implementations allow changing it however). Objects are created by using the 'new' keyword on a constructor function that initializes the object. For now I'll leave it as an exercise for the reader to implement the examples above in JavaScript. I'd be interested in the approaches people take.&lt;/p&gt;&lt;br /&gt;&lt;span class=&quot;technoratitag&quot;&gt;Categories: &lt;a href=&quot;http://del.icio.us/bluishcoder/self&quot; rel=&quot;tag&quot;&gt;self&lt;/a&gt;, &lt;a href=&quot;http://del.icio.us/bluishcoder/io&quot; rel=&quot;tag&quot;&gt;io&lt;/a&gt;, &lt;a href=&quot;http://del.icio.us/bluishcoder/javascript&quot; rel=&quot;tag&quot;&gt;javascript&lt;/a&gt;&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/18561009-6365521314596965711?l=www.bluishcoder.co.nz%2Findex.html&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Chris Double</name>
			<email>noreply@blogger.com</email>
			<uri>http://www.bluishcoder.co.nz/</uri>
		</author>
		<source>
			<title type="html">Bluish Coder</title>
			<subtitle type="html">Programming Languages, Martial Arts and Computers. The Weblog of Chris Double.</subtitle>
			<link rel="self" href="http://www.bluishcoder.co.nz/atom.xml"/>
			<id>tag:blogger.com,1999:blog-18561009</id>
			<updated>2009-10-27T13:00:44+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">CFFPP: linux.conf.au 2010</title>
		<link href="http://blog.kfish.org/2009/07/cffpp-linuxconfau-2010.html"/>
		<id>tag:blogger.com,1999:blog-9101292118679422945.post-2496842291455876554</id>
		<updated>2009-07-15T03:53:00+00:00</updated>
		<content type="html">&lt;p&gt;
The &lt;a href=&quot;http://www.lca2010.org.nz/programme/papers_info&quot;&gt;call for
papers for linux.conf.au 2010&lt;/a&gt; has been open for a few
weeks, and closes soon (July 24).
&lt;/p&gt;
&lt;p&gt;
I really want to encourage some talks about functional programming!
The conference has a pretty strong developer focus, and most talks are
about a practical topic. More importantly, we're looking for talks
that inspire people to try new techniques, to approach design and
troubleshooting with clarity and vigor (yarr!), to boldly consider
that they should perhaps spend some time honing their craft before
writing yet another application that inexplicably fails at runtime --
all in a friendly and entirely non-condescending environment of
hackers having fun hacking.
&lt;/p&gt;
&lt;p&gt;
Here's some suggestions for the kind of talks that I think could be interesting:
&lt;ul&gt;
&lt;li&gt;systems programming in Haskell/OCaml/whatever: how you wrote an
interface to some hardware, handled lots of IO, controlled a robot,
whatever&lt;/li&gt;
&lt;li&gt;functional programming for kernel development: verification, security etc.&lt;/li&gt;
&lt;li&gt;game programming: higher order design for 3D, AI etc.&lt;/li&gt;
&lt;li&gt;proof vs. testing: (can anyone do a tutorial on proof without
greek letters? not that
&lt;a href=&quot;http://lca2007.linux.org.au/talk/215.html&quot;&gt;Patryk Zadarnowski's talk about the Curry-Howard
Isomorphism&lt;/a&gt; a few years ago wasn't *awesome*, but as a result of that
people are clamoring (clamoring!) for some advice about how to prove
their programs have no bugs).&lt;/li&gt;
&lt;li&gt;some ... other ... practical benefit of functional programming!&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;
The conference is in Wellington in January. January! it'll be windy,
and it's in New Zealand!
&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9101292118679422945-2496842291455876554?l=blog.kfish.org&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Conrad Parker</name>
			<email>noreply@blogger.com</email>
			<uri>http://blog.kfish.org/</uri>
		</author>
		<source>
			<title type="html">blog.kfish.org</title>
			<link rel="self" href="http://blog.kfish.org/rss.xml"/>
			<id>tag:blogger.com,1999:blog-9101292118679422945</id>
			<updated>2009-10-14T22:00:23+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">More video accessibility work</title>
		<link href="http://blog.gingertech.net/2009/07/14/more-video-accessibility-work/"/>
		<id>http://blog.gingertech.net/?p=476</id>
		<updated>2009-07-13T15:59:56+00:00</updated>
		<content type="html">&lt;p&gt;It&amp;#8217;s already &lt;a href=&quot;http://blog.hecker.org/2009/06/30/new-mozilla-accessibility-projects/&quot;&gt;old news&lt;/a&gt;, but I am really excited about having started a new part-time contract with Mozilla to continue pushing the HTML5 video and audio elements towards accessibility.&lt;/p&gt;
&lt;p&gt;My aim is two-fold: firstly to improve the HTML5 audio and video tags with textual representations, and secondly to hook up the Ogg file format with these accessibility features through an Ogg-internal text codec.&lt;/p&gt;
&lt;p&gt;The textual representation that I am after is closely based on the &lt;a href=&quot;http://wiki.xiph.org/index.php/Timed_Divs_HTML#Direct_linking_on_a_HTML5_page&quot;&gt;itext&lt;/a&gt; elements I have been proposing for a while. They are meant to be a simple way to associate external subtitle/caption files with the HTML5 video and audio tags. I am initially looking at srt and DFXP formats, because I think they are extremes of a spectrum of time-aligned text formats from simple to complex. I am preparing a specification and javascript demonstration of the itext feature and will then be looking for constructive criticism from accessibility, captioning, Web, video and any other expert who cares to provide input. My hope is to move the caption discussion forward on the WHATWG and ultimately achieve a cross-browser standard means for associating time-aligned text with media streams.&lt;/p&gt;
&lt;p&gt;The Ogg-internal solution for subtitles &amp;#8211; and more generally for time-aligned text &amp;#8211; is then a logical next step towards solving accessibility. From the many discussions I have had on the topic of how best to associate subtitles with video I have learnt that &lt;a href=&quot;https://wiki.mozilla.org/Accessibility/Video_a11y_Study08&quot;&gt;there is a need for both&lt;/a&gt;: external text files with subtitles, as well as subtitles that are multiplexed with the media into a single binary fie. Here, I am particularly looking at the Kate codec as a means of multiplexing srt and DFXP into Ogg.&lt;/p&gt;
&lt;p&gt;Eventually, the idea is to have a seamless interface in the Web Browser for dealing with subtitles, captions, karaoke, timed metadata, and similar time-aligned text. The user interaction should be identical no matter whether the text comes from within a binary media file or from a secondary Web resource. Once this seamless interface exists, hooking up accessibility tools such as screen readers or braille devices to the data should in theory be simple.&lt;/p&gt;</content>
		<author>
			<name>silvia</name>
			<uri>http://blog.gingertech.net</uri>
		</author>
		<source>
			<title type="html">ginger's thoughts</title>
			<subtitle type="html">Silvia's blog</subtitle>
			<link rel="self" href="http://blog.gingertech.net/feed/atom/"/>
			<id>http://blog.gingertech.net/feed/atom/</id>
			<updated>2009-11-01T05:00:09+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Javascript libraries for &amp;lt;video&amp;gt; support</title>
		<link href="http://blog.gingertech.net/2009/07/08/javascript-libraries-for-support/"/>
		<id>http://blog.gingertech.net/?p=468</id>
		<updated>2009-07-09T01:58:58+00:00</updated>
		<content type="html">&lt;p&gt;Now that Firefox 3.5 is released with native HTML5 &amp;lt;video&gt; tag support, it seems that there is a new javascript library every day that provides fallback mechanisms for older browsers or those that do not support Ogg Theora.&lt;/p&gt;
&lt;p&gt;This blog post collects the javascript libraries that I have found thus far and that are for different purposes, so you can pick the one most appropriate for you. Be aware that the list is probably already outdated when I post the article, so if you could help me keeping it up-to-date with comments, that would be great. &lt;img src=&quot;http://blog.gingertech.net/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Before I dig into the libraries, let me explain how fallback works with &amp;lt;video&gt;.&lt;/p&gt;
&lt;p&gt;Generally, if you&amp;#8217;re using the HTML5 &amp;lt;video&gt; element, your fallback mechanism for browsers that do not support &amp;lt;video&gt; is the HTML code your write inside the &amp;lt;video&gt; element. A browser that supports the &amp;lt;video&gt; element will not interpret the content, while all other browsers will:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;br /&gt;
   &amp;lt;video src=&quot;video.ogv&quot; controls&gt;&lt;br /&gt;
       Your browser does not support the HTML5 video element.&lt;br /&gt;
   &amp;lt;/video&gt;&lt;br /&gt;
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;To do more than just text, you could provide a video fallback option. There are basically two options: you can fall back to a Flash solution:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;br /&gt;
   &amp;lt;video src=&quot;video.ogv&quot; controls&gt;&lt;br /&gt;
      &amp;lt;object width=&quot;320&quot; height=&quot;240&quot;&gt;&lt;br /&gt;
         &amp;lt;param name=&quot;movie&quot; value=&quot;video.swf&quot;&gt;&lt;br /&gt;
         &amp;lt;embed src=&quot;video.swf&quot; width=&quot;320&quot; height=&quot;240&quot;&gt;&lt;br /&gt;
         &amp;lt;/embed&gt;&lt;br /&gt;
      &amp;lt;/object&gt;&lt;br /&gt;
   &amp;lt;/video&gt;&lt;br /&gt;
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;or if you are using Ogg Theora and don&amp;#8217;t want to create a video in a different format, you can fall back to using the java player called cortado:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;br /&gt;
  &amp;lt;video src=&quot;video.ogv&quot; controls width=&quot;320&quot; height=&quot;240&quot;&gt;&lt;br /&gt;
     &amp;lt;applet code=&quot;com.fluendo.player.Cortado.class&quot; archive=&quot;http://theora.org/cortado.jar&quot; width=&quot;320&quot; height=&quot;240&quot;&gt;&lt;br /&gt;
       &amp;lt;param name=&quot;url&quot; value=&quot;video.ogv&quot;/&gt;&lt;br /&gt;
    &amp;lt;/applet&gt;&lt;br /&gt;
  &amp;lt;/video&gt;&lt;br /&gt;
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Now, even if your browser support&amp;#8217;s the &amp;lt;video&gt; element, it may not be able to play the video format of your choice. For example, Firefox and Opera only support Ogg Theora, while Safari/Webkit supports MPEG4 and other codecs that the QuickTime framework supports, and Chrome supports both Ogg Theora and MPEG4. For this situation, the &amp;lt;video&gt; element has an in-built selection mechanism: you do not put a &amp;#8220;src&amp;#8221; attribute onto the &amp;lt;video&gt; element, but rather include &amp;lt;source&gt; elements inside &amp;lt;video&gt; which the browser will try one after the other until it finds one it plays:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;br /&gt;
  &amp;lt;video controls width=&quot;320&quot; height=&quot;240&quot;&gt;&lt;br /&gt;
     &amp;lt;source src=&quot;video.ogv&quot;  type=&quot;video/ogg&quot; /&gt;&lt;br /&gt;
     &amp;lt;source src=&quot;video.mp4&quot;  type=&quot;video/mp4&quot; /&gt;&lt;br /&gt;
  &amp;lt;/video&gt;&lt;br /&gt;
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;You can of course combine all the methods above to optimise the experience for your users, which is what has been done in &lt;a href=&quot;http://reports.graymattergravy.com/2009/06/02/video-tag-embed-with-fallbacks/&quot;&gt;this&lt;/a&gt; and &lt;a href=&quot;http://camendesign.com/code/video_for_everybody&quot;&gt;this (Video For Everybody)&lt;/a&gt; example without the use of javascript. I actually like these approaches best and you may want to check them out before you consider using a javascript library.&lt;/p&gt;
&lt;p&gt;But now, let&amp;#8217;s look at the promised list of javascript libraries.&lt;/p&gt;
&lt;p&gt;Firstly, let&amp;#8217;s look at some libraries that let you support more than just one codec format. These allow you to provide video in the format most preferable by the given browser-mediaframework-OS combination. Note that you will need to encode and provide your videos in multiple formats for these to work.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://metavid.org/w/index.php/Mv_embed&quot;&gt;mv_embed&lt;/a&gt;: this is probably the library that has been around the longest to provide &amp;amp;letvideo&gt; fallback mechanisms. It has evolved heaps over the last years and now supports Ogg Theora and Flash fallbacks.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.mikechambers.com/blog/2008/05/27/poc-implementing-html-5-video-element-using-javascript-and-flash/&quot;&gt;several&lt;/a&gt; &lt;a href=&quot;http://henriksjokvist.net/archive/2009/2/using-the-html5-video-tag-with-a-flash-fallback&quot;&gt;posts&lt;/a&gt; &lt;a href=&quot;http://code.google.com/p/video4all/&quot;&gt;that&lt;/a&gt; &lt;a href=&quot;http://hacks.mozilla.org/2009/06/html5-video-fallbacks/&quot;&gt;demonstrate&lt;/a&gt; how to play flv files in a &amp;lt;video&gt; tag.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://gettingsoftware.posterous.com/html5flash-using-html5-video-and-audio-right&quot;&gt;html5flash&lt;/a&gt;: provides on top of the Ogg Theora and MPEG4 codec support also Flash support in the HTML5 video element through a chromeless Flash video player. It also exposes the &amp;lt;video&gt; element&amp;#8217;s javascript API to Flash content.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://braydon.com/blog/tags/video&quot;&gt;foxyvideo&lt;/a&gt;: provides a fallback flash player and a JavaScript library for HTML5 video controls that also includes a nearly identical ActionScript implementation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Finally, let&amp;#8217;s look at some libraries that are only focused around Ogg Theora support in browsers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.celt-codec.org/presentations/video.js&quot;&gt;Celt&amp;#8217;s javascript&lt;/a&gt;: a minimal javascript that checks for native Ogg Theora &amp;lt;video&gt; support and the VLC plugin, and falls back to Cortado if nothing else works.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://footage.stealthisfilm.com/static/javascript/player.js&quot;&gt;stealthisfilm&amp;#8217;s javascript&lt;/a&gt;: checks for native support, VLC, liboggplay, Totem, any other Ogg Theora player, and cortado as fallback.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://commons.wikimedia.org/w/extensions/OggHandler/OggPlayer.js&quot;&gt;Wikimedia&amp;#8217;s javascript&lt;/a&gt;: checks for QuickTime, VLC, native, Totem, KMPlayer, Kaffeine and Mplayer support before falling back to Cortado support.&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;&lt;/ul&gt;</content>
		<author>
			<name>silvia</name>
			<uri>http://blog.gingertech.net</uri>
		</author>
		<source>
			<title type="html">ginger's thoughts</title>
			<subtitle type="html">Silvia's blog</subtitle>
			<link rel="self" href="http://blog.gingertech.net/feed/atom/"/>
			<id>http://blog.gingertech.net/feed/atom/</id>
			<updated>2009-11-01T05:00:09+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Help build a better Internet with Open Video</title>
		<link href="http://metavid.org/blog/2009/07/07/help-build-a-better-internet-with-open-video/"/>
		<id>http://metavid.org/blog/?p=338</id>
		<updated>2009-07-08T02:52:16+00:00</updated>
		<content type="html">&lt;div class=&quot;wp-caption alignleft&quot;&gt;&lt;a href=&quot;http://openvideoalliance.org&quot;&gt;&lt;img title=&quot;ova image&quot; src=&quot;http://openvideoalliance.org/i/ovc.png&quot; alt=&quot;open video alliance log&quot; width=&quot;257&quot; height=&quot;259&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;open video alliance logo&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;The &lt;a title=&quot;open video confrence&quot; href=&quot;http://openvideoconference.org/&quot;&gt;Open Video Alliance&lt;/a&gt; conference put on by the &lt;a title=&quot;participatoryculture.org&quot; href=&quot;http://www.participatoryculture.org/&quot; target=&quot;_blank&quot;&gt;Participatory Culture Foundation&lt;/a&gt; and &lt;a title=&quot;kaltura open source video&quot; href=&quot;http://corp.kaltura.com/&quot;&gt;Kaltura&lt;/a&gt; that took place recently in New York was a great success! One of the central themes was how we can build a better web with open video technologies.&lt;/p&gt;
&lt;p&gt;Mozilla made a call to action to the web video community and has since launched the latest version of their open source browser &lt;a title=&quot;upgrade the web&quot; href=&quot;http://www.mozilla.com/en-US/firefox/upgrade.html&quot; target=&quot;_blank&quot;&gt;Firefox 3.5&lt;/a&gt;. With this launch the percentage of the web that has integrated native support for ogg video has been &lt;a title=&quot;firefox 3.5 market share&quot; href=&quot;http://whos.amung.us/firefox&quot; target=&quot;_blank&quot;&gt;steady increasing&lt;/a&gt;. As the &lt;a title=&quot;format choices&quot; href=&quot;http://arstechnica.com/open-source/news/2009/07/decoding-the-html-5-video-codec-debate.ars&quot; target=&quot;_blank&quot;&gt;free format vs proprietary format&lt;/a&gt; wars start heating up I wanted to highlight some tools and recent updated features that can &lt;em&gt;help you&lt;/em&gt; help the Internet.&lt;/p&gt;
&lt;p&gt;These tools are principally possible because of the hard work  &lt;a title=&quot;xiph.org&quot; href=&quot;http://xiph.org/&quot;&gt;xiph.org&lt;/a&gt; hackers who very early on saw the need for an open media formats. These web open video tools are part of our open video efforts at &lt;a title=&quot;wikimedia home&quot; href=&quot;http://wikimediafoundation.org/wiki/Home&quot;&gt;wikimedia&lt;/a&gt; in collaboration with &lt;a title=&quot;kaltura.com&quot; href=&quot;http://corp.kaltura.com/&quot; target=&quot;_blank&quot;&gt;Kaltura&lt;/a&gt;, &lt;a title=&quot;mozilla.org&quot; href=&quot;http://www.mozilla.com/&quot; target=&quot;_blank&quot;&gt;Mozilla&lt;/a&gt; and other people just like you ;). And of-course we use these tools here on metavid.org &lt;img src=&quot;http://metavid.org/blog/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-338&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I will quickly cover solutions for easy &lt;em&gt;encoding, embedding &amp;amp; &lt;/em&gt;&lt;em&gt;hosing&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Update: Also see the xiph.org page on &lt;a title=&quot;html5 video&quot; href=&quot;http://wiki.xiph.org/Html5&quot; target=&quot;_blank&quot;&gt;html5 video&lt;/a&gt;&lt;br /&gt;
Also see&lt;em&gt; Silvia&amp;#8217;s&lt;/em&gt; round up of javascript libraries for &lt;a title=&quot;libs for embeding video&quot; href=&quot;http://blog.gingertech.net/2009/07/08/javascript-libraries-for-support/&quot; target=&quot;_blank&quot;&gt;embedding &amp;lt;video&amp;gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Encoding:&lt;/strong&gt; As mentioned earlier &lt;a title=&quot;firefogg.org&quot; href=&quot;http://www.firefogg.org&quot;&gt;Firefogg&lt;/a&gt; is in-browser extension to let you encode to ogg theora with the latest and greatest theora encoder. It features an easy to use api to&lt;a title=&quot;firefogg dev&quot; href=&quot;http://www.firefogg.org/dev/index.html&quot; target=&quot;_blank&quot;&gt; integrate it into your site&lt;/a&gt;. You can also encode to a local file. Simply point your browser at firefogg.org grab the extension and start &lt;a title=&quot;make ogg video now&quot; href=&quot;http://www.firefogg.org/make/index.html&quot; target=&quot;_blank&quot;&gt;making ogg video today!&lt;/a&gt;&lt;strong&gt; &lt;/strong&gt;&lt;em&gt;If you prefer to have your video transcoded by some &lt;/em&gt;&lt;em&gt;hosting &lt;/em&gt;&lt;em&gt;service see below&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Embedding: &lt;/strong&gt;The problem with using the video tag with free formats has always been browser adoption. You want to create &lt;em&gt;a better Internet&lt;/em&gt; but don&amp;#8217;t want to lose visitors or get complaints about not being able to play the video on your site. Fortunately many people have come up many &lt;a title=&quot;video4all&quot; href=&quot;http://code.google.com/p/video4all/&quot;&gt;excellent&lt;/a&gt; &lt;a title=&quot;itheora&quot; href=&quot;http://itheora.org/&quot; target=&quot;_blank&quot;&gt;solutions&lt;/a&gt; &lt;a title=&quot;oggHandler&quot; href=&quot;http://www.mediawiki.org/wiki/Extension:OggHandler&quot; target=&quot;_blank&quot;&gt;to&lt;/a&gt; &lt;a title=&quot;cortado&quot; href=&quot;http://theora.org/cortado/&quot; target=&quot;_blank&quot;&gt;the&lt;/a&gt; &lt;a title=&quot;problem&quot; href=&quot;http://camendesign.com/code/video_for_everybody&quot; target=&quot;_blank&quot;&gt;problem&lt;/a&gt;. I will quickly highlight the &lt;a title=&quot;mv_embed&quot; href=&quot;http://metavid.org/wiki/Mv_Embed&quot; target=&quot;_blank&quot;&gt;mv_embed&lt;/a&gt; solution. The idea is simple:&lt;/p&gt;
&lt;div id=&quot;attachment_343&quot; class=&quot;wp-caption alignleft&quot;&gt;&lt;a href=&quot;http://metavid.org/blog/wp-content/uploads/2009/07/upgrade_to_firefox.png&quot;&gt;&lt;img class=&quot;size-full wp-image-343&quot; title=&quot;upgrade_to_firefox&quot; src=&quot;http://metavid.org/blog/wp-content/uploads/2009/07/upgrade_to_firefox.png&quot; alt=&quot;&quot; width=&quot;281&quot; height=&quot;229&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Browsers without native ogg support now get a link to download browser with native support. (basic playback is supported via cortado or a plugin if they don't have Firefox) &lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Add the following javascript (or copy it to your server its all &lt;em&gt;open source code&lt;/em&gt;)&lt;/p&gt;
&lt;pre&gt;&amp;lt;script type=&quot;text/javascript&quot; src=&quot;http://metavid.org/w/js2/mwEmbed/mv_embed.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;p&gt;then in your page freely use the video tag.&lt;/p&gt;
&lt;pre&gt;&amp;lt;video src=&quot;mymovie.ogg&quot; poster=&quot;myposter.jpg&quot; &amp;gt;&lt;/pre&gt;
&lt;p&gt;Pretty simple &lt;img src=&quot;http://metavid.org/blog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; The video is rewritten and it support playback in IE6-8, old version of firefox and safari (if the users has java or some video plugin like VLC) You can also use it with &lt;a title=&quot;mp4 fallback&quot; href=&quot;http://metavid.org/w/index.php/Mv_embed#Multiple_sources.2C_Multiple_timed_text_tracks_and_Simple_remote_Embedding&quot; target=&quot;_blank&quot;&gt;flash video fallback&lt;/a&gt; if you want to minimally inconvenience your user, but I recommend sticking to &lt;strong&gt;only ogg formats&lt;/strong&gt; now that Firefox 3.5 is out.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;But wait.. thats not all&amp;#8230; &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;It lets you build a consistent interface across underlining plugins and is &lt;a title=&quot;themable&quot; href=&quot;http://metavid.org/w/js2/mwEmbed/example_usage/Player_Themable.html&quot;&gt;themeable&lt;/a&gt; using &lt;a title=&quot;jquery ui&quot; href=&quot;http://jqueryui.com/&quot; target=&quot;_blank&quot;&gt;jquery ui&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It also supports exposing &lt;a title=&quot;remote embeding&quot; href=&quot;http://metavid-mike.blogspot.com/&quot; target=&quot;_blank&quot;&gt;remote embedding&lt;/a&gt;, download links and linkbacks making it easy to share the video.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hosting&lt;/strong&gt; The neat thing about  open video is its much easier to host it yourself. The other neat thing about open video is it can be transparently hosted anywhere by someone else. This is different from most flash video sites where the hosting system provides the flash &lt;em&gt;player application&lt;/em&gt; and it &lt;em&gt;encapsulates&lt;/em&gt; your video content. This make sites ugly with lots of different player skins as you mix and match videos from the web. With open video you just reference the video &lt;em&gt;file directly&lt;/em&gt; and &lt;em&gt;you control its representation&lt;/em&gt;. This also makes things like cross site in-browser video editing possible (see below). (Keep in mind just like images some site may prefer you don&amp;#8217;t &lt;a title=&quot;inline link&quot; href=&quot;http://en.wikipedia.org/wiki/Inline_linking&quot; target=&quot;_blank&quot;&gt;hot-link&lt;/a&gt; to the content)&lt;/p&gt;
&lt;p&gt;But other sites encourage remote inline display like &lt;a title=&quot;archive.org&quot; href=&quot;http://archive.org&quot; target=&quot;_blank&quot;&gt;Archive.org&lt;/a&gt;. This means if your running tight on bandwidth there is no shortage of options and you don&amp;#8217;t have to sacrifice your site theme, branding, or your visitors. For example simply upload your video to Archive.org and now plop it in a video tag and party with open video &lt;img src=&quot;http://metavid.org/blog/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt; Other Ogg hosting sites include &lt;a title=&quot;tinyvid.tv&quot; href=&quot;http://tinyvid.tv/&quot;&gt;tinyVid.tv&lt;/a&gt;, &lt;a title=&quot;videobin&quot; href=&quot;http://videobin.org/&quot; target=&quot;_blank&quot;&gt;videobin.org&lt;/a&gt; and most recently &lt;a title=&quot;dailymotion&quot; href=&quot;http://dailymotion.com&quot; target=&quot;_blank&quot;&gt;dailymotion.&lt;/a&gt; And if your video would be a good fit for a encyclopedia article some day then check out the long time free format supporter &lt;a title=&quot;commons&quot; href=&quot;http://commons.wikimedia.org/wiki/Main_Page&quot; target=&quot;_blank&quot;&gt;wikimedia commons&lt;/a&gt; &lt;img src=&quot;http://metavid.org/blog/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Editing&lt;/strong&gt; One of the hardest pieces of the puzzle. First off you should know that iMovie and Final Cut Pro support ogg theora today with the installation of &lt;a title=&quot;ogg component&quot; href=&quot;http://www.xiph.org/quicktime/&quot; target=&quot;_blank&quot;&gt;ogg quicktime component&lt;/a&gt;. Free software desktop editors are not always as mature as their proprietary counterparts &lt;img src=&quot;http://metavid.org/blog/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt; But that is quickly changing with projects like &lt;a title=&quot;pitivi.org&quot; href=&quot;http://www.pitivi.org/wiki/Main_Page&quot; target=&quot;_blank&quot;&gt;PiTiVi&lt;/a&gt; and the blender&lt;a title=&quot;blender&quot; href=&quot;http://www.blender.org/&quot; target=&quot;_blank&quot;&gt; video editor&lt;/a&gt;.&lt;/p&gt;
&lt;div id=&quot;attachment_349&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;a href=&quot;http://metavid.org/blog/wp-content/uploads/2009/07/editor-screen.png&quot;&gt;&lt;img class=&quot;size-full wp-image-349&quot; title=&quot;editor-screen&quot; src=&quot;http://metavid.org/blog/wp-content/uploads/2009/07/editor-screen.png&quot; alt=&quot;&quot; width=&quot;500&quot; height=&quot;258&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;in browser video editing ... coming to a html5 browser near you ;)&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;We are also working on an in-browser video editor with Kaltura as demoed at the Open Video Conference. &lt;em&gt;(screen shot above)&lt;/em&gt; Its still relatively early but our ultimate goal is to bring the power of the open web platform (svg, canvas effects &amp;amp; css styled html) and the power of collaborative authoring (wikitext, wiki-templates) to rich media editing. If you running Firefox 3.5 and like &lt;strong&gt;&lt;em&gt;checking out half working projects&lt;/em&gt;&lt;/strong&gt; you can check out the &lt;a title=&quot;sequence editor&quot; href=&quot;http://sandbox.kaltura.com/testwiki/js2/mwEmbed/example_usage/Sequence_Editor.html&quot; target=&quot;_blank&quot;&gt;editor here&lt;/a&gt;. You can report &lt;a title=&quot;extension sequencer&quot; href=&quot;http://www.mediawiki.org/wiki/Extension:Sequencer&quot; target=&quot;_blank&quot;&gt;ideas to the talk page&lt;/a&gt; and if your a coder feel free to &lt;a title=&quot;snv access&quot; href=&quot;http://metavid.org/wiki/Mv_embed#SVN_access&quot; target=&quot;_blank&quot;&gt;check out the source&lt;/a&gt;, (its of course all open source)&lt;/p&gt;</content>
		<author>
			<name>Metavid Project</name>
			<uri>http://metavid.org/blog</uri>
		</author>
		<source>
			<title type="html">Metavid Blog</title>
			<subtitle type="html">This Blog covers the metavid project and related politics.</subtitle>
			<link rel="self" href="http://metavid.org/blog/feed/"/>
			<id>http://metavid.org/blog/feed/</id>
			<updated>2009-09-14T19:00:15+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Small note on current Wikipedia article on Theora</title>
		<link href="http://maikmerten.livejournal.com/3322.html"/>
		<id>http://maikmerten.livejournal.com/3322.html</id>
		<updated>2009-07-06T10:09:21+00:00</updated>
		<content type="html">The current state of the &lt;a href=&quot;http://en.wikipedia.org/wiki/Theora&quot;&gt;Wikipedia article on Theora&lt;/a&gt; states:&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Playback performance&lt;br /&gt;&lt;br /&gt;  Currently, there is no mainstream hardware acceleration support for Theora. Consequently, playback performance, especially on lower-end systems (such as netbooks) lacks in comparison to competing formats, such as MPEG-4.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/div&gt;  I'd like to point out that&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Theora has lower computational complexity than H.264, thus the need for hardware acceleration may not be as dire&lt;/li&gt;&lt;li&gt;Current netbooks usually have no H.264 acceleration at all due to Intel's choice of hardware components, meaning the computational complexity of H.264 directly impacts on those poor little machines&lt;/li&gt;&lt;li&gt;Many software players don't use hardware acceleration even where available&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&amp;quot;Hardware&amp;quot; acceleration is a much hotter topic in the realm of digital media players or mobile phones than it is in the &amp;quot;usual&amp;quot; computing environment. From what I understand work to optimize Theora for mobile applications has begun.&lt;br /&gt;</content>
		<author>
			<name>Maik Merten</name>
			<uri>http://maikmerten.livejournal.com/</uri>
		</author>
		<source>
			<title type="html">maikmerten</title>
			<subtitle type="html">maikmerten - LiveJournal.com</subtitle>
			<link rel="self" href="http://maikmerten.livejournal.com/data/rss?tag=xiph"/>
			<id>http://maikmerten.livejournal.com/data/rss?tag=xiph</id>
			<updated>2009-10-02T05:00:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Open Video Conference Working Group: HTML5 and &amp;lt;video&amp;gt;</title>
		<link href="http://blog.gingertech.net/2009/07/01/open-video-conference-working-group-html5-and-video/"/>
		<id>http://blog.gingertech.net/?p=458</id>
		<updated>2009-07-01T07:49:46+00:00</updated>
		<content type="html">&lt;p&gt;At the recent &lt;a href=&quot;http://openvideoconference.org/&quot;&gt;Open Video Conference&lt;/a&gt;, I was asked to chair a working group on HTML5 and the &amp;lt;video&gt; tag. Since the conference had attracted a large number of open media software developers as well as HTML5 &amp;lt;video&gt; tag developers, it was a great group of people that were on the panel with me: Philip Jagenstedt from Opera, Jan Gerber from Xiph, Viktor Gal from Annodex, Michael Dale from Metavid, and Eric Carlson from Apple. This meant we had three browser vendors and their &amp;lt;video&gt; tag developers present as well as two javascript library developers representing some of the largest content sites that are already using Ogg Theora/Vorbis with the &amp;lt;video&gt; tag, plus myself looking into accessiblity for &amp;lt;video&gt;.&lt;/p&gt;
&lt;p&gt;The biggest topic around the &amp;lt;video&gt; tag is of course the question of baseline codec: which codec can and should become the required codec for anyone implementing &amp;lt;video&gt; tag support. Fortunately, this discussion was held during the panel just ahead of ours. Thus, our panel was able to focus on the achievements of the HTML5 video tag and implementations of it, as well as the challenges still ahead.&lt;/p&gt;
&lt;p&gt;Unfortunately, the panel was cut short at the conference to only 30 min, so we ended up doing mostly demos of HTML5 video working in different browsers and doing cool things such as working with SVG.&lt;/p&gt;
&lt;p&gt;The challenges that we identified and that are still ahead to solve are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;annotation support: closed captions, subtitles, time-aligned metadata, and their DOM exposure&lt;/li&gt;
&lt;li&gt;track selection: how to select between alternate audio tracks, alternate annotation tracks, based on e.g. language, or accessibility requirements; what would the content negotiation protocol look like&lt;/li&gt;
&lt;li&gt;how to support live streaming&lt;/li&gt;
&lt;li&gt;how to support in-browser a/v capture&lt;/li&gt;
&lt;li&gt;how to support live video communication (skype-style)&lt;/li&gt;
&lt;li&gt;how to support video playlists&lt;/li&gt;
&lt;li&gt;how to support basic video editing functionality&lt;/li&gt;
&lt;li&gt;what would a decent media server for html5 video look like; what capabilities would it have&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here are the slides we made for the working group. &lt;/p&gt;
&lt;div id=&quot;__ss_1665590&quot;&gt;&lt;a href=&quot;http://www.slideshare.net/silviapfeiffer/open-video-conference-html-and-ltvideo?type=powerpoint&quot; title=&quot;Open Video Conference: HTML and the video tag&quot;&gt;Open Video Conference: HTML and the video tag&lt;/a&gt;
&lt;div&gt;View more &lt;a href=&quot;http://www.slideshare.net/&quot;&gt;presentations&lt;/a&gt; from &lt;a href=&quot;http://www.slideshare.net/silviapfeiffer&quot;&gt;Silvia Pfeiffer&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Download PDF: &lt;a href=&quot;http://blog.gingertech.net/wp-content/uploads/2009/07/OpenVideoConf.pdf&quot;&gt;Open Video Conference: HML5 and video Panel&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>silvia</name>
			<uri>http://blog.gingertech.net</uri>
		</author>
		<source>
			<title type="html">ginger's thoughts</title>
			<subtitle type="html">Silvia's blog</subtitle>
			<link rel="self" href="http://blog.gingertech.net/feed/atom/"/>
			<id>http://blog.gingertech.net/feed/atom/</id>
			<updated>2009-11-01T05:00:09+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Mario is dead and dismantled</title>
		<link href="http://blog.gingertech.net/2009/06/29/mario-is-dead-and-dismantled/"/>
		<id>http://blog.gingertech.net/?p=397</id>
		<updated>2009-06-29T01:25:32+00:00</updated>
		<content type="html">&lt;div id=&quot;attachment_398&quot; class=&quot;wp-caption alignleft&quot;&gt;&lt;a href=&quot;http://blog.gingertech.net/wp-content/uploads/2009/05/150520091210.jpg&quot;&gt;&lt;img src=&quot;http://blog.gingertech.net/wp-content/uploads/2009/05/150520091210-300x225.jpg&quot; alt=&quot;Beloved Shuttle Box&quot; title=&quot;Dead Mario&quot; width=&quot;300&quot; height=&quot;225&quot; class=&quot;size-medium wp-image-398&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Beloved Shuttle Box&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Six weeks ago, on a fatal Saturday, both my washing machine and cute little Mario died in one day. The washing machine was quickly repaired, but there was no hope for Mario, as the burnt smell of electronics indicated. It wasn&amp;#8217;t going to start up again.&lt;/p&gt;
&lt;p&gt;Mario had been the first server to run the code developed at Vquence. It was our development and testing server for more than 8 months until we moved to a server at The Planet &amp;#8211; later to Voxel and now ultimately to Amazon.&lt;/p&gt;
&lt;p&gt;After it was relieved off Vquence duty, Mario became what it was originally bought to become: a media server. Running Linux and MythTV, it was the beloved center of our living room for the last 2 years. But it seems the heavy duty VCR work as well as running Linux exhausted him.&lt;/p&gt;
&lt;p&gt;Well, it is now replaced by an ordinary HP machine &amp;#8211; I will miss the cute little shuttle.&lt;/p&gt;
&lt;p&gt;If anyone wants the remains, let me know.&lt;/p&gt;</content>
		<author>
			<name>silvia</name>
			<uri>http://blog.gingertech.net</uri>
		</author>
		<source>
			<title type="html">ginger's thoughts</title>
			<subtitle type="html">Silvia's blog</subtitle>
			<link rel="self" href="http://blog.gingertech.net/feed/atom/"/>
			<id>http://blog.gingertech.net/feed/atom/</id>
			<updated>2009-11-01T05:00:09+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">A review of the W3C Timed Text Authoring Format</title>
		<link href="http://blog.gingertech.net/2009/06/28/a-review-of-the-w3c-timed-text-authoring-format/"/>
		<id>http://blog.gingertech.net/?p=428</id>
		<updated>2009-06-28T16:11:01+00:00</updated>
		<content type="html">&lt;p&gt;The W3C has published a &lt;a href=&quot;http://www.w3.org/News/2009#item90&quot;&gt;third last call&lt;/a&gt; for the draft specification of DFXP, the Distribution Format Exchange Profile for the Timed Text Authoring Format &amp;#8211; or short: for their new standard format for captions. Comments are due by the 30th June, so rush if you want to give any feedback. Here is what came to my mind as I was reading the 183 pages long document.&lt;/p&gt;
&lt;p&gt;Please note: This review looks at DFXP from a Web view, i.e. how compatible is it with existing Web technologies, since my main use case will be on the Web, even if advocates will say that that&amp;#8217;s not it&amp;#8217;s main purpose, strangely enough, for a standard coming out of the W3C.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The state of affairs with caption formats&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When it comes to caption and subtitles, there is no lack of formats. It seems, because it is an easy challenge to define a data format for something as simple as a piece of text and some timing information, every new project that wanted to deal with captions &amp;#8211; or more generally timed text &amp;#8211; created their own format. I am no exception to the rule. &lt;img src=&quot;http://blog.gingertech.net/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Thus, the current state of affairs wrt timed text is that there are many different textual file formats to store such data, there are also many different video container formats each with their own data format (or even formats) for embedding timed text into them, and there is a lot of software that will deal with many input, output and encapsulation formats.&lt;/p&gt;
&lt;p&gt;The problem with this situation is that the formats are all different in their complexity. The simple &amp;#8220;piece of text and timing information&amp;#8221; problem can be turned into as complex a problem as you desire. By adding layout information, styling information, animation functionality, metadata about the video and about the content, and possibly hyperlinks, we have ended up in a large mess of incompatible formats.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The aim of W3C Timed Text&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The W3C Timed Text working group was &lt;a href=&quot;http://www.w3.org/AudioVideo/TT/ttcharter20020901.html&quot;&gt;chartered in January 2003&lt;/a&gt; to attack this issue. It was supposed to become the super-format of all possible functionalities for timed text formats and therefore a perfect interchange format between applications (&lt;a href=&quot;http://www.w3.org/TR/2006/NOTE-ttaf1-req-20060427/&quot;&gt;see requirements document&lt;/a&gt;). Its focus was for use on the Web and with SMIL and to make use of existing W3C technologies where possible&lt;/p&gt;
&lt;p&gt;However, the history of captioning is TV and the scope of Timed Text is beyond mere use on the Web, so while W3C Timed Text took a lot of inspiration from other Web standards, it has become a stand-alone standard that does not rely on, e.g. the availability of a CSS engine, and it has no in-built hyperlinking functionality (&lt;a href=&quot;http://www.w3.org/TR/2009/WD-ttaf1-dfxp-20090602/#requirements&quot;&gt;see what requirements it fulfills&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dissecting DFXP&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So. let&amp;#8217;s look into some of what DFXP provides.&lt;/p&gt;
&lt;p&gt;Here is an example file taken straight from the draft &amp;#8211; &lt;a href=&quot;http://www.w3.org/TR/2009/WD-ttaf1-dfxp-20090602/#dfxp-example-subtitle-1&quot;&gt;check the presentation here&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;tt xml:lang=&quot;&quot; xmlns=&quot;http://www.w3.org/2006/10/ttaf1&quot;&gt;
  &amp;lt;head&gt;
    &amp;lt;metadata xmlns:ttm=&quot;http://www.w3.org/2006/10/ttaf1#metadata&quot;&gt;
      &amp;lt;ttm:title&gt;Timed Text DFXP Example&amp;lt;/ttm:title&gt;
      &amp;lt;ttm:copyright&gt;The Authors (c) 2006&amp;lt;/ttm:copyright&gt;
    &amp;lt;/metadata&gt;

    &amp;lt;styling xmlns:tts=&quot;http://www.w3.org/2006/10/ttaf1#styling&quot;&gt;
      &amp;lt;!-- s1 specifies default color, font, and text alignment --&gt;
      &amp;lt;style xml:id=&quot;s1&quot;
                 tts:color=&quot;white&quot;
                 tts:fontFamily=&quot;proportionalSansSerif&quot;
                 tts:fontSize=&quot;22px&quot;
                 tts:textAlign=&quot;center&quot; /&gt;
      &amp;lt;!-- alternative using yellow text but otherwise the same as style s1 --&gt;
      &amp;lt;style xml:id=&quot;s2&quot; style=&quot;s1&quot; tts:color=&quot;yellow&quot;/&gt;
      &amp;lt;!-- a style based on s1 but justified to the right --&gt;
      &amp;lt;style xml:id=&quot;s1Right&quot; style=&quot;s1&quot; tts:textAlign=&quot;end&quot; /&gt;
      &amp;lt;!-- a style based on s2 but justified to the left --&gt;
      &amp;lt;style xml:id=&quot;s2Left&quot; style=&quot;s2&quot; tts:textAlign=&quot;start&quot; /&gt;
    &amp;lt;/styling&gt;

    &amp;lt;layout xmlns:tts=&quot;http://www.w3.org/2006/10/ttaf1#styling&quot;&gt;
      &amp;lt;region xml:id=&quot;subtitleArea&quot;
                   style=&quot;s1&quot;
                   tts:extent=&quot;560px 62px&quot;
                   tts:padding=&quot;5px 3px&quot;
                   tts:backgroundColor=&quot;black&quot;
                   tts:displayAlign=&quot;after&quot; /&gt;
    &amp;lt;/layout&gt;
  &amp;lt;/head&gt;
  &amp;lt;body region=&quot;subtitleArea&quot;&gt;
    &amp;lt;div&gt;
      &amp;lt;p xml:id=&quot;subtitle1&quot; begin=&quot;0.76s&quot; end=&quot;3.45s&quot;&gt;
        It seems a paradox, does it not,
      &amp;lt;/p&gt;
      &amp;lt;p xml:id=&quot;subtitle2&quot; begin=&quot;5.0s&quot; end=&quot;10.0s&quot;&gt;
        that the image formed on&amp;lt;br/&gt;
        the Retina should be inverted?
      &amp;lt;/p&gt;
      &amp;lt;p xml:id=&quot;subtitle3&quot; begin=&quot;10.0s&quot; end=&quot;16.0s&quot; style=&quot;s2&quot;&gt;
        It is puzzling, why is it&amp;lt;br/&gt;
        we do not see things upside-down?
      &amp;lt;/p&gt;
      &amp;lt;p xml:id=&quot;subtitle4&quot; begin=&quot;17.2s&quot; end=&quot;23.0s&quot;&gt;
        You have never heard the Theory,&amp;lt;br/&gt;
        then, that the Brain also is inverted?
      &amp;lt;/p&gt;
      &amp;lt;p xml:id=&quot;subtitle5&quot; begin=&quot;23.0s&quot; end=&quot;27.0s&quot; style=&quot;s2&quot;&gt;
        No indeed! What a beautiful fact!
      &amp;lt;/p&gt;
      &amp;lt;p xml:id=&quot;subtitle6a&quot; begin=&quot;28.0s&quot; end=&quot;34.6s&quot; style=&quot;s2Left&quot;&gt;
        But how is it proved?
      &amp;lt;/p&gt;
      &amp;lt;p xml:id=&quot;subtitle6b&quot; begin=&quot;28.0s&quot; end=&quot;34.6s&quot; style=&quot;s1Right&quot;&gt;
        Thus: what we call
      &amp;lt;/p&gt;
      &amp;lt;p xml:id=&quot;subtitle7&quot; begin=&quot;34.6s&quot; end=&quot;45.0s&quot; style=&quot;s1Right&quot;&gt;
        the vertex of the Brain&amp;lt;br/&gt;
        is really its base
      &amp;lt;/p&gt;
      &amp;lt;p xml:id=&quot;subtitle8&quot; begin=&quot;45.0s&quot; end=&quot;52.0s&quot; style=&quot;s1Right&quot;&gt;
        and what we call its base&amp;lt;br/&gt;
        is really its vertex,
      &amp;lt;/p&gt;
      &amp;lt;p xml:id=&quot;subtitle9a&quot; begin=&quot;53.5s&quot; end=&quot;58.7s&quot;&gt;
        it is simply a question of nomenclature.
      &amp;lt;/p&gt;
      &amp;lt;p xml:id=&quot;subtitle9b&quot; begin=&quot;53.5s&quot; end=&quot;58.7s&quot; style=&quot;s2&quot;&gt;
        How truly delightful!
      &amp;lt;/p&gt;
    &amp;lt;/div&gt;
  &amp;lt;/body&gt;
&amp;lt;/tt&gt;
&lt;/pre&gt;
&lt;p&gt;I&amp;#8217;m going to look at each of the different functionalities separately and discuss their strengths and weaknesses. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Content&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s begin with the body of the DFXP document and what elements are defined for this area.&lt;/p&gt;
&lt;p&gt;Firstly, &lt;a href=&quot;http://www.w3.org/TR/2009/WD-ttaf1-dfxp-20090602/#document-structure-vocabulary-body&quot;&gt;&amp;lt;body&gt;&lt;/a&gt; comes with optional begin, end, and dur attributes. As is the case for all time specifications in DFXP, there are both &amp;#8220;end&amp;#8221; and &amp;#8220;dur&amp;#8221; attributes. Why this over-specification? There is not even an explanation which of the two has higher priority when in conflict. This is plainly asking for trouble &amp;#8211; why not simplify the spec?&lt;/p&gt;
&lt;p&gt;The &amp;#8220;region&amp;#8221; and &amp;#8220;style&amp;#8221; attributes refer to a previously defined region and styles that are applied to the body. &amp;#8220;id&amp;#8221; and &amp;#8220;lang&amp;#8221; attributes allow to associate a name and a language with the body.&lt;/p&gt;
&lt;p&gt;The &amp;#8220;timeContainer&amp;#8221; attribute enables the author to specify whether the elements in the body are all to be regarded as temporally parallel or in sequence, the default being parallel. This means that all text elements specified inside the body can render over the top of each other &amp;#8211; a situation that is solved by giving them specific start and end times.&lt;/p&gt;
&lt;p&gt;The containing elements of body are a &lt;a href=&quot;http://www.w3.org/TR/2009/WD-ttaf1-dfxp-20090602/#content-vocabulary-div&quot;&gt;sequence of &amp;lt;div&gt; tags&lt;/a&gt;. The div element functions as a logical container and a temporal structuring element for a sequence of textual content units. div elements like body elements are allowed a &amp;#8220;start&amp;#8221;, &amp;#8220;end&amp;#8221; and &amp;#8220;dur&amp;#8221; attribute and generally everything that the body element also has, except that their children can be more div or p. Again, the children of the div element are all regarded as being temporally parallel.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;http://www.w3.org/TR/2009/WD-ttaf1-dfxp-20090602/#content-vocabulary-p&quot;&gt;p element&lt;/a&gt; is basically the inner-most element that contains the actual text, including new-lines (br) and spans to associate further styling, metadata, or animations. The children of the p or span element are also all regarded as being temporally parallel, unless otherwise specified.&lt;/p&gt;
&lt;p&gt;The structuring of text into div, p, and span elements seems to make sense and provide sufficient (if not even excessive) flexibility for any required timed text needs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Layout&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Once the text is specified and structured, the next question is where it should be positioned.&lt;/p&gt;
&lt;p&gt;The extent attribute of the &lt;a href=&quot;http://www.w3.org/TR/2009/WD-ttaf1-dfxp-20090602/#document-structure-vocabulary-tt&quot;&gt;&amp;lt;tt&gt; root element&lt;/a&gt; specifies the width and height of the root container, if not specified by the external authoring context.&lt;/p&gt;
&lt;p&gt;Inside the root container, regions are defined through explicit &lt;a href=&quot;http://www.w3.org/TR/2009/WD-ttaf1-dfxp-20090602/#document-structure-vocabulary-tt&quot;&gt;&amp;lt;region&gt; elements&lt;/a&gt;. The origin of placement for a region is the top left corner. Regions can define their &amp;#8220;origin&amp;#8221; offset, their &amp;#8220;width&amp;#8221; and &amp;#8220;height&amp;#8221;, the alignment of text within them through the &amp;#8220;textAlign&amp;#8221; and &amp;#8220;displayAlign&amp;#8221; styles, and whether text that &amp;#8220;overflows&amp;#8221; a region should be visible or hidden.&lt;/p&gt;
&lt;p&gt;The way in which DFXP defines regions and placement of text within regions is very different to the way in which HTML and CSS work. By default, elements in HTML flow one after another in the same order as they appear in the source. CSS attributes applied to the elements can control their positioning through giving coordinates, or relative placements in relation to other elements. In DFXP elements are placed inside regions that are styled, making it incompatible with HTML.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Styling&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;http://www.w3.org/TR/2009/WD-ttaf1-dfxp-20090602/#styling-attribute-vocabulary&quot;&gt;styling attributes&lt;/a&gt; available for DFXP are limited, but sufficient for timed text purposes. The way in which &lt;a href=&quot;http://www.w3.org/TR/2009/WD-ttaf1-dfxp-20090602/#semantics-style-resolution&quot;&gt;style associations to elements are resolved&lt;/a&gt; is quite diverse. Styles can be associated with regions, with individual elements, individually and as a group, through layouts and through parent elements. Compared to CSS, it feels complicated and potentially full of contradictions. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Animation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Further to styling, DFXP defines &lt;a href=&quot;http://www.w3.org/TR/2009/WD-ttaf1-dfxp-20090602/#animation&quot;&gt;animations&lt;/a&gt;, which are discrete changes to some style parameter value that applies over some time interval. This is relevant for example to implement karaoke style colouring of text over time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Metadata&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;http://www.w3.org/TR/2009/WD-ttaf1-dfxp-20090602/#metadata&quot;&gt;&amp;lt;metadata&gt; element&lt;/a&gt; serves as a generic container for grouping metadata information. It can be associated virtually with any element &amp;#8211; which seems somewhat over-flexible, but provides for interesting meta data information such as meta data for styles or for a &amp;lt;br&gt;.&lt;/p&gt;
&lt;p&gt;In addition, metadata is actually limited to a set number of elements: title, desc, copyright, agent, name, and actor. These are strange fields &amp;#8211; in particular if you compare them to the flexibility of HTML meta data, which consists of free-form name-value pairs, bringing us domain-specific schemes such as the Dublin Core. This is not easily possible here, but instead one has to define extensions to allow for such flexible meta data.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Other features&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;DFXP provides other features such as information that describes the related video file, e.g. frameRate, subFrameRate, frameRateMultiplier, pixelAspectRatio, smpteMode, timeBase, and tickRate. Such information will help at the point in time when DFXP is supposed to be multiplexed into a binary media file together with audio and video tracks. These attributes can provide information required for the multiplexing process. I am not sure that justifies their existence though.&lt;/p&gt;
&lt;p&gt;Other, minor features are available too. Check out the &lt;a href=&quot;http://www.w3.org/TR/2009/WD-ttaf1-dfxp-20090602/&quot;&gt;full specification&lt;/a&gt; to get a complete picture.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Examples&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Part of the publication of this draft is also a &lt;a href=&quot;http://www.w3.org/2008/12/dfxp-testsuite/web-framework/START.html&quot;&gt;test suite&lt;/a&gt;. Several of the defined features are still not represented in the test suite, which to me raises the question if they are really required. It might do wonders to the draft size to remove them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;DFXP is a standard for timed text that is firmly grounded in past captioning specifications, but written in XML, and borrowing ideas from Web technologies. It is unfortunately not re-using existing Web infrastructure to implement its more complex features: no use of CSS for styling and layout, no use of hyperlinks. Also, the use of namespaces seems excessive and won&amp;#8217;t make it easy to author this format, in particular since the defined namespaces do not map into the defined profiles.&lt;/p&gt;
&lt;p&gt;DFXP is, however, simple to transcode to something that a Web Browser can deal with through its existing engines, because it has borrowed from other Web standards. It is thus easier to work with on the Web than most other formats. It should be relatively easy to map to HTML, CSS and javascript, as already started in the &lt;a href=&quot;http://www.w3.org/2008/12/dfxp-testsuite/web-framework/START.html&quot;&gt;test suite&lt;/a&gt; with the HTML5 video element.&lt;/p&gt;
&lt;p&gt;DFXP is witten in such a way that it is possible to put together a new profile with extensions that are more appropriate for specific needs, e.g. that fit better into existing Web infrastructure. Currently, DFXP has &lt;a href=&quot;http://www.w3.org/TR/2009/WD-ttaf1-dfxp-20090602/#vocabulary-profiles&quot;&gt;three defined profiles&lt;/a&gt;: one focused on transformation, one focused on presentation, and one that contains everything.&lt;/p&gt;
&lt;p&gt;I think it&amp;#8217;s time for a html5 profile of DFXP that at minimum extends DFXP with hyperlinks, making it a real timed text Web format.&lt;/p&gt;</content>
		<author>
			<name>silvia</name>
			<uri>http://blog.gingertech.net</uri>
		</author>
		<source>
			<title type="html">ginger's thoughts</title>
			<subtitle type="html">Silvia's blog</subtitle>
			<link rel="self" href="http://blog.gingertech.net/feed/atom/"/>
			<id>http://blog.gingertech.net/feed/atom/</id>
			<updated>2009-11-01T05:00:09+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry>
		<title type="html">Playing Ogg files with audio and video in sync</title>
		<link href="http://www.bluishcoder.co.nz/2009/06/playing-ogg-files-with-audio-and-video.html"/>
		<id>tag:blogger.com,1999:blog-18561009.post-6897339688065370851</id>
		<updated>2009-06-27T23:07:53+00:00</updated>
		<content type="html">&lt;p&gt;&lt;a href=&quot;http://www.bluishcoder.co.nz/2009/06/decoding-vorbis-files-with-libvorbis.html&quot;&gt;My last post in this series&lt;/a&gt; had Vorbis audio playing but with Theora video out of sync. This post will go through an approach to keeping the video in sync with the audio.&lt;/p&gt;&lt;p&gt;To get video in sync with the audio we need a timer incrementing from when we start playback. We can't use the system clock for this as it is not necessarily keeping the same time as the audio or video being played. The system clock can drift slightly and over time this audio and video to get out of sync.&lt;/p&gt; &lt;p&gt;The audio library I'm using, libsydneyaudio, has an API call that allows getting the playback position of the sound sample being played by the audio system. This is a value in bytes. Since we know the sample rate and number of channels of the audio stream we can compute a time value from this. Synchronisation becomes a matter of continuously feeding the audio to libsydneybackend, querying the current position, converting it to a time value, and displaying the frame for that time.&lt;/p&gt;&lt;p&gt;The time for a particular frame is returned by the call to &lt;a href=&quot;http://theora.org/doc/libtheora-1.0/group__decfuncs.html#g31c814bf09b2232aff69c57ae20f04eb&quot;&gt;th_decode_packetin&lt;/a&gt;. The last parameter is a pointer to hold the 'granulepos' of the decoded frame. The Theora spec explains that the granulepos can be used to compute the time that this frame should be displayed up to. That is, when this time is exceeded this frame should no longer be displayed. It also enables computing the location of the keyframe that this frame depends on - I'll cover what this means when I write about how to do seeking.&lt;/p&gt;&lt;p&gt;The libtheora API &lt;a href=&quot;http://theora.org/doc/libtheora-1.0/group__basefuncs.html#g707e1e281de788af0df39ef00f3fb432&quot;&gt;th_granule_time&lt;/a&gt; converts a 'granulepos' to an absolute time in seconds. So decoding a frame gives us 'granulepos'. We store this so we know when to stop displaying the frame. We track the audio position, convert it to a time. If it exceeds this value we decode the next frame and display that. Here's a breakdown of the steps:&lt;/p&gt;&lt;ol&gt;  &lt;li&gt;Read the headers from the Ogg file. Stop when we hit the first data packet.&lt;/li&gt;  &lt;li&gt;Read packets from the audio stream in the Ogg file. For each audio packet:    &lt;ol&gt;      &lt;li&gt;Decode the audio data and write it to the audio hardware.&lt;/li&gt;      &lt;li&gt;Get the current playback position of the audio and convert it to an absolute time value.&lt;/li&gt;      &lt;li&gt;Convert the last granulepos read (defaulting to zero if none have been read) to an absolute time value using the libtheora API.&lt;/li&gt;      &lt;li&gt;If the audio time is greater than the video time:    &lt;ol&gt;      &lt;li&gt;Read a packet from the Theora stream.&lt;/li&gt;      &lt;li&gt;Decode that packet and display it&lt;/li&gt;      &lt;li&gt;Store the granulepos from that decoded frame so we know when to display the next frame.&lt;/li&gt;    &lt;/ol&gt;      &lt;/li&gt;    &lt;/ol&gt;  &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Notice that the structure of the program is different to the last few articles. We no longer read all packets from the stream, processing them as we get them. Instead we specifically process the audio packets and only handle the video when it's time to display them. Since we are driving our a/v sync off the audio clock we must continously feed the audio data. I think it tends to be a better user experience to have flawless audio with video frame skipping rather than skipping audio but smooth video. Worse is to have both skipping of course.&lt;/p&gt;&lt;p&gt;The example code for this article is in the '&lt;a href=&quot;http://github.com/doublec/plogg/tree/part4_avsync&quot;&gt;part4_avsync&lt;/a&gt;' branch on github.&lt;/p&gt;&lt;p&gt;This example takes a slightly different approach to reading headers. I use &lt;a href=&quot;http://www.xiph.org/ogg/doc/libogg/ogg_stream_packetpeek.html&quot;&gt;ogg_stream_packetpeek&lt;/a&gt; to peek ahead in the bitstream for a packet and do the header processing on the peeked packet. If it is a header I then consume the packet. This is done so I don't consume the first data packet when reading the headers. I want the data packets to be consumed in a particular order (audio, followed by video when needed).&lt;/p&gt;&lt;pre&gt;// Process all available header packets in the stream. When we hit&lt;br /&gt;// the first data stream we don't decode it, instead we&lt;br /&gt;// return. The caller can then choose to process whatever data&lt;br /&gt;// streams it wants to deal with.&lt;br /&gt;ogg_packet packet;&lt;br /&gt;while (!headersDone &amp;amp;&amp;amp;&lt;br /&gt;       (ret = ogg_stream_packetpeek(&amp;amp;stream-&gt;mState, &amp;amp;packet)) != 0) {&lt;br /&gt;assert(ret == 1);&lt;br /&gt;&lt;br /&gt;// A packet is available. If it is not a header packet we exit.&lt;br /&gt;// If it is a header packet, process it as normal.&lt;br /&gt;headersDone = headersDone || handle_theora_header(stream, &amp;amp;packet);&lt;br /&gt;headersDone = headersDone || handle_vorbis_header(stream, &amp;amp;packet);&lt;br /&gt;if (!headersDone) {&lt;br /&gt;  // Consume the packet&lt;br /&gt;  ret = ogg_stream_packetout(&amp;amp;stream-&gt;mState, &amp;amp;packet);&lt;br /&gt;  assert(ret == 1);&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;To read packets for a particular stream I use a 'read_packet' function that operates on a stream passed as a parameter:&lt;/p&gt;&lt;pre&gt;bool OggDecoder::read_packet(istream&amp;amp; is, &lt;br /&gt;                             ogg_sync_state* state, &lt;br /&gt;                             OggStream* stream, &lt;br /&gt;                             ogg_packet* packet) {&lt;br /&gt;  int ret = 0;&lt;br /&gt;&lt;br /&gt;  while ((ret = ogg_stream_packetout(&amp;amp;stream-&gt;mState, packet)) != 1) {&lt;br /&gt;    ogg_page page;&lt;br /&gt;    if (!read_page(is, state, &amp;amp;page))&lt;br /&gt;      return false;&lt;br /&gt;&lt;br /&gt;    int serial = ogg_page_serialno(&amp;amp;page);&lt;br /&gt;    assert(mStreams.find(serial) != mStreams.end());&lt;br /&gt;    OggStream* pageStream = mStreams[serial];&lt;br /&gt;    &lt;br /&gt;    // Drop data for streams we're not interested in.&lt;br /&gt;    if (stream-&gt;mActive) {&lt;br /&gt;      ret = ogg_stream_pagein(&amp;amp;pageStream-&gt;mState, &amp;amp;page);&lt;br /&gt;      assert(ret == 0);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  return true;&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;If we need to read a new page (to be able to get more packets) we check the stream for the read page and if it is not for the stream we want we store the packet in the bitstream for that page so it can be retrieved later. I've added an 'active' flag to the streams so we can ignore streams that we aren't intersted in. We don't want to continuously buffer data for alternative audio tracks we aren't playing for example. The streams are marked inactive when the headers are finished reading.&lt;/p&gt;&lt;p&gt;The code that does the checking to see if it's time to display a frame is:&lt;/p&gt;&lt;pre&gt;&lt;br /&gt;// At this point we've written some audio data to the sound&lt;br /&gt;// system. Now we check to see if it's time to display a video&lt;br /&gt;// frame.&lt;br /&gt;//&lt;br /&gt;// The granule position of a video frame represents the time&lt;br /&gt;// that that frame should be displayed up to. So we get the&lt;br /&gt;// current time, compare it to the last granule position read.&lt;br /&gt;// If the time is greater than that it's time to display a new&lt;br /&gt;// video frame.&lt;br /&gt;//&lt;br /&gt;// The time is obtained from the audio system - this represents&lt;br /&gt;// the time of the audio data that the user is currently&lt;br /&gt;// listening to. In this way the video frame should be synced up&lt;br /&gt;// to the audio the user is hearing.&lt;br /&gt;//&lt;br /&gt;ogg_int64_t position = 0;&lt;br /&gt;int ret = sa_stream_get_position(mAudio, SA_POSITION_WRITE_SOFTWARE, &amp;amp;position);&lt;br /&gt;assert(ret == SA_SUCCESS);&lt;br /&gt;float audio_time = &lt;br /&gt;  float(position) /&lt;br /&gt;  float(audio-&gt;mVorbis.mInfo.rate) /&lt;br /&gt;  float(audio-&gt;mVorbis.mInfo.channels) /&lt;br /&gt;  sizeof(short);&lt;br /&gt;&lt;br /&gt;float video_time = th_granule_time(video-&gt;mTheora.mCtx, mGranulepos);&lt;br /&gt;if (audio_time &gt; video_time) {&lt;br /&gt;  // Decode one frame and display it. If no frame is available we&lt;br /&gt;  // don't do anything.&lt;br /&gt;  ogg_packet packet;&lt;br /&gt;  if (read_packet(is, &amp;amp;state, video, &amp;amp;packet)) {&lt;br /&gt;    handle_theora_data(video, &amp;amp;packet); &lt;br /&gt;    video_time = th_granule_time(video-&gt;mTheora.mCtx, mGranulepos);&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;The code for decoding and display the Theora video is similar to the &lt;a href=&quot;http://www.bluishcoder.co.nz/2009/06/decoding-theora-files-using-libtheora.html&quot;&gt;Theora decoding article&lt;/a&gt;. The main difference is we store the granulepos in mGranulepos so we know when to stop displaying the frame.&lt;/p&gt;&lt;p&gt;This version of 'plogg' should play Ogg files with a Theora and Vorbis track in sync. You can test it on &lt;a href=&quot;http://www.double.co.nz/video_test/transformers320.ogg&quot;&gt;the transformers trailer&lt;/a&gt; for example. It does not play Theora files with no audio track - we can't synchronise to the audio clock if there is no audio. This can be worked around by falling back to delaying for the required framerate as the previous Theora example did.&lt;/p&gt;&lt;p&gt;The a/v sync is not perfect however. If the video is large and decoding keyframes takes a while then we can fall behind in displaying the video and go out of sync. This is because we only play one frame when we check the time. One approach to fixing this is to decode, but not display, all frames up until the audio time rather than just the next time.&lt;/p&gt;&lt;p&gt;The other issue is that the API call we are using to write to the audio hardware is blocking. This is using up valuable time that we could be using to decode a frame. When the write to the sound hardware returns we have very little time to decode a frame before glitches start appearing in the audio due to buffer underruns. Try playing a larger video (like &lt;a href=&quot;http://tinyvid.tv/file/ah2ebubqurvy.ogg&quot;&gt;the Ghostbusters HD Trailer&lt;/a&gt; and the audio and video will skip (depending on the speed of your hardware). This isn't a pleasant experience. Because of the blocking audio writes we can't skip more than one frame due to the frame decoding time taking too long causing audio skip.&lt;/p&gt;&lt;p&gt;The fixes for these aren't too complex and I'll go through it in my next article. The basic approach is to move to an asynchronous method of writing the audio, skip displaying frames when needed (to reduce the cost of the YUV decoding), skip decoding frames if possible (depending on location of keyframes we can do this), and to check how much audio data we have queued before decoding to always ensure we won't drop audio while decoding.&lt;/p&gt;&lt;p&gt;With these fixes in place I can play the 1080p Ogg version of &lt;a href=&quot;http://www.bigbuckbunny.org/index.php/download/&quot;&gt;Big Buck Bunny&lt;/a&gt; on a Macbook laptop (running Arch Linux) with no audio interruption  and with a/v syncing correctly. There is a fair amount of frame skipping however but it's a lot more watchable than if you try playing it without these modifications in place. And better than watching with the video lagging further and further behind the longer you watch it. Further improvements can be made to reduce the frame skipping by utilising threads to take advantage of extra core's on the PC.&lt;/p&gt;&lt;p&gt;After the followup article on improving the a/v sync I'll look at covering seeking.&lt;/p&gt;&lt;br /&gt;&lt;span class=&quot;technoratitag&quot;&gt;Categories: &lt;a href=&quot;http://del.icio.us/bluishcoder/ogg&quot; rel=&quot;tag&quot;&gt;ogg&lt;/a&gt;, &lt;a href=&quot;http://del.icio.us/bluishcoder/theora&quot; rel=&quot;tag&quot;&gt;theora&lt;/a&gt;, &lt;a href=&quot;http://del.icio.us/bluishcoder/vorbis&quot; rel=&quot;tag&quot;&gt;vorbis&lt;/a&gt;, &lt;a href=&quot;http://del.icio.us/bluishcoder/firefox&quot; rel=&quot;tag&quot;&gt;firefox&lt;/a&gt;&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/18561009-6897339688065370851?l=www.bluishcoder.co.nz%2Findex.html&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Chris Double</name>
			<email>noreply@blogger.com</email>
			<uri>http://www.bluishcoder.co.nz/</uri>
		</author>
		<source>
			<title type="html">Bluish Coder</title>
			<subtitle type="html">Programming Languages, Martial Arts and Computers. The Weblog of Chris Double.</subtitle>
			<link rel="self" href="http://www.bluishcoder.co.nz/atom.xml"/>
			<id>tag:blogger.com,1999:blog-18561009</id>
			<updated>2009-10-27T13:00:44+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Decoding Theora files using libtheora</title>
		<link href="http://www.bluishcoder.co.nz/2009/06/decoding-theora-files-using-libtheora.html"/>
		<id>tag:blogger.com,1999:blog-18561009.post-793270184265149370</id>
		<updated>2009-06-26T15:08:59+00:00</updated>
		<content type="html">&lt;p&gt;My last post covered &lt;a href=&quot;http://www.bluishcoder.co.nz/2009/06/reading-ogg-files-using-libogg.html&quot;&gt;read Ogg files using libogg&lt;/a&gt;. The resulting program didn't do much but it covered the basic steps needed to get an &lt;a href=&quot;http://www.xiph.org/ogg/doc/libogg/ogg_packet.html&quot;&gt;ogg_packet&lt;/a&gt; which we need to decode the data in the stream. The thing step I want to cover is decoding Theora streams using &lt;a href=&quot;http://theora.org/doc/libtheora-1.0/&quot;&gt;libtheora&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;In the previous post I stored a count of the number of packets in the OggStream object. For theora decoding we need a number of different objects to be stored. I encapsulate this in a TheoraDecode structure:&lt;/p&gt;&lt;pre&gt;class TheoraDecode { &lt;br /&gt;  ...&lt;br /&gt;  th_info mInfo;&lt;br /&gt;  th_comment mComment;&lt;br /&gt;  th_setup_info *mSetup;&lt;br /&gt;  th_dec_ctx* mCtx;&lt;br /&gt;  ...&lt;br /&gt;};&lt;/pre&gt;&lt;p&gt;&lt;a href=&quot;http://theora.org/doc/libtheora-1.0/structth__info.html&quot;&gt;th_info&lt;/a&gt;, &lt;a href=&quot;http://theora.org/doc/libtheora-1.0/structth__comment.html&quot;&gt;th_comment&lt;/a&gt; and &lt;a href=&quot;http://theora.org/doc/libtheora-1.0/theoradec_8h.html#b71cd2657455cc27d6c0127c66a89f28&quot;&gt;th_setup_info&lt;/a&gt; contain data read from the Theora headers. The Theora stream contains three headers packets. These are the info, comment and setup headers. There is one object for holding each of these as we read the headers. The &lt;a href=&quot;http://theora.org/doc/libtheora-1.0/theoradec_8h.html#843d70bb02563885a8d54b9c1a781729&quot;&gt;th_dec_ctx&lt;/a&gt; object holds information that the decoder requires to keep track of the decoding process.&lt;/p&gt;&lt;p&gt;th_info and th_comment need to be initialized using &lt;a href=&quot;http://theora.org/doc/libtheora-1.0/group__basefuncs.html#g430d9c605816a6ca0bdce3a0b965b926&quot;&gt;th_info_init&lt;/a&gt; and &lt;a href=&quot;http://theora.org/doc/libtheora-1.0/group__basefuncs.html#g6c8ab25988e7ea9d7b1e31a54cf58f09&quot;&gt;th_comment_init&lt;/a&gt;. Notice that th_setup_info is a pointer. This needs to be free'd when we're finished with it using &lt;a href=&quot;http://theora.org/doc/libtheora-1.0/group__decfuncs.html#gdef55431b68aaa59d0d7b32b2f118f27&quot;&gt;th_setup_free&lt;/a&gt;. The decoder context object also needs to be free'd. Use &lt;a href=&quot;http://theora.org/doc/libtheora-1.0/group__decfuncs.html#gfb6684ad8ba507b71112bc9de148e7d0&quot;&gt;th_decode_free&lt;/a&gt;. A convenient place to do this is in the TheoraDecode constructor and destructor:&lt;/p&gt;&lt;pre&gt;class TheoraDecode {&lt;br /&gt;  ...&lt;br /&gt;  TheoraDecode() :&lt;br /&gt;    mSetup(0),&lt;br /&gt;    mCtx(0)&lt;br /&gt;  {&lt;br /&gt;    th_info_init(&amp;amp;mInfo);&lt;br /&gt;    th_comment_init(&amp;amp;mComment);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  ~TheoraDecode() {&lt;br /&gt;    th_setup_free(mSetup);&lt;br /&gt;    th_decode_free(mCtx);&lt;br /&gt;  }   &lt;br /&gt;  ...&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;The TheoraDecode object is stored in the OggStream structure. The OggStream stucture also gets a field holding the type of the stream (Theora, Vorbis, Unknown, etc) and a boolean indicating whether the headers have been read:&lt;/p&gt;&lt;pre&gt;class OggStream&lt;br /&gt;{&lt;br /&gt;  ...&lt;br /&gt;  int mSerial;&lt;br /&gt;  ogg_stream_state mState;&lt;br /&gt;  StreamType mType;&lt;br /&gt;  bool mHeadersRead;&lt;br /&gt;  TheoraDecode mTheora;&lt;br /&gt;  ...&lt;br /&gt;};&lt;/pre&gt;&lt;p&gt;Once we get the ogg_packet from an Ogg stream we need to find out if it is a Theora stream. The approach I'm using to do this is to attempt to extract a Theora header from it. If this succeeds, it's a Theora stream. &lt;a href=&quot;http://theora.org/doc/libtheora-1.0/group__decfuncs.html#g006d01d36fbe64768c571e6a12b7fc50&quot;&gt;th_decode_headerin&lt;/a&gt; will attempt to decode a header packet. A return value of '0' indicates that we got a Theora data packet (presumably the headers have been read already). This function gets passed the info, comment, and setup objects and it will populate them with data as it reads the headers:&lt;/p&gt;&lt;pre&gt;ogg_packet* packet = ...got this previously...;&lt;br /&gt;int ret = th_decode_headerin(&amp;amp;stream-&gt;mTheora.mInfo,&lt;br /&gt;                             &amp;amp;stream-&gt;mTheora.mComment,&lt;br /&gt;                             &amp;amp;stream-&gt;mTheora.mSetup,&lt;br /&gt;                             packet);&lt;br /&gt;if (ret == TH_ENOTFORMAT)&lt;br /&gt;  return; // Not a theora header&lt;br /&gt;&lt;br /&gt;if (ret &gt; 0) {&lt;br /&gt;  // This is a theora header packet&lt;br /&gt;  stream-&gt;mType = TYPE_THEORA;&lt;br /&gt;  return;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;assert(ret == 0);&lt;br /&gt;// This is not a header packet. It is the first &lt;br /&gt;// video data packet.&lt;br /&gt;stream-&gt;mTheora.mCtx = &lt;br /&gt;  th_decode_alloc(&amp;amp;stream-&gt;mTheora.mInfo, &lt;br /&gt;                  stream-&gt;mTheora.mSetup);&lt;br /&gt;assert(stream-&gt;mTheora.mCtx != NULL);&lt;br /&gt;stream-&gt;mHeadersRead = true;&lt;br /&gt;...decode data packet...&lt;/pre&gt;&lt;p&gt;In this example code we attempt to decode the header. If it fails it bails out, possibly to try decoding the packet using libvorbis or some other means. If it succeeds the stream is marked as type TYPE_THEORA so we can handle it specially later.&lt;/p&gt;&lt;p&gt;If all headers packets are read and we got the first data packet then we call &lt;a href=&quot;http://theora.org/doc/libtheora-1.0/group__decfuncs.html#g0ef07a9a97849054aa606c595a2d807e&quot;&gt;th_decode_alloc&lt;/a&gt; to get a decode context to decode the data.&lt;/p&gt;&lt;p&gt;Once the headers are all read, the next step is to decode each Theora data packet. To do this we first call &lt;a href=&quot;http://theora.org/doc/libtheora-1.0/group__decfuncs.html#g31c814bf09b2232aff69c57ae20f04eb&quot;&gt;th_decode_packetin&lt;/a&gt;. This adds the packet to the decoder. A return value of '0' means we can get a decoded frame as a result of adding the packet. A call to &lt;a href=&quot;http://theora.org/doc/libtheora-1.0/group__decfuncs.html#ga9cc8af63fa8540e0fc95572f259cdcb&quot;&gt;th_decode_ycbcr_out&lt;/a&gt; gets the decoded YUV data, stored in a &lt;a href=&quot;http://theora.org/doc/libtheora-1.0/codec_8h.html#343f7cfabad179cc4fe527cf06873f45&quot;&gt;th_ycbcr_buffer&lt;/a&gt; object. This is basically an array of the YUV data.&lt;/p&gt;&lt;pre&gt;ogg_int64_t granulepos = -1;&lt;br /&gt;int ret = th_decode_packetin(stream-&gt;mTheora.mCtx,&lt;br /&gt;                             packet,&lt;br /&gt;                             &amp;amp;granulepos);&lt;br /&gt;assert(ret == 0);&lt;br /&gt;&lt;br /&gt;th_ycbcr_buffer buffer;&lt;br /&gt;ret = th_decode_ycbcr_out(stream-&gt;mTheora.mCtx, buffer);&lt;br /&gt;assert(ret == 0);&lt;br /&gt;...copy yuv data to SDL YUV overlay...&lt;br /&gt;...display overlay...&lt;br /&gt;...sleep for 1 frame...&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;The 'granulepos' returned by the th_decode_packetin call holds information regarding the presentation time of this frame, and what frame contains the keyframe that is needed for this frame if it is not a keyframe. I'll write more about this in a future post when I cover synchronising the audio and video. For now it's going to be ignored.&lt;/p&gt;&lt;p&gt;Once we have the YUV data I use SDL to create a surface, and a YUV overlay. This allows SDL to do the YUV to RGB conversion for me. I won't copy the code for this since it's not particularly relevant to using the libtheora API - you can see it in the &lt;a href=&quot;http://github.com/doublec/plogg/&quot;&gt;github repository&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Once the YUV data is blit to the screen the final step is to sleep for the period of one frame so the video can playback at approximately the right framerate. The framerate of the video is stored in the th_info object that we got from the headers. It is represented as the fraction of two numbers:&lt;/p&gt;&lt;pre&gt;float framerate = &lt;br /&gt;  float(stream-&gt;mTheora.mInfo.fps_numerator) / &lt;br /&gt;  float(stream-&gt;mTheora.mInfo.fps_denominator);&lt;br /&gt;SDL_Delay((1.0/framerate)*1000);&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;With all that in place, running the program with an Ogg file containing a Theora stream should play the video at the right framerate. Adding Vorbis playback is almost as easy - the main difficulty is synchronising the audio and video. I'll cover these topics in a later post.&lt;/p&gt;&lt;br /&gt;&lt;span class=&quot;technoratitag&quot;&gt;Categories: &lt;a href=&quot;http://del.icio.us/bluishcoder/firefox&quot; rel=&quot;tag&quot;&gt;firefox&lt;/a&gt;, &lt;a href=&quot;http://del.icio.us/bluishcoder/theora&quot; rel=&quot;tag&quot;&gt;theora&lt;/a&gt;, &lt;a href=&quot;http://del.icio.us/bluishcoder/ogg&quot; rel=&quot;tag&quot;&gt;ogg&lt;/a&gt;&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/18561009-793270184265149370?l=www.bluishcoder.co.nz%2Findex.html&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Chris Double</name>
			<email>noreply@blogger.com</email>
			<uri>http://www.bluishcoder.co.nz/</uri>
		</author>
		<source>
			<title type="html">Bluish Coder</title>
			<subtitle type="html">Programming Languages, Martial Arts and Computers. The Weblog of Chris Double.</subtitle>
			<link rel="self" href="http://www.bluishcoder.co.nz/atom.xml"/>
			<id>tag:blogger.com,1999:blog-18561009</id>
			<updated>2009-10-27T13:00:44+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Decoding Vorbis files with libvorbis</title>
		<link href="http://www.bluishcoder.co.nz/2009/06/decoding-vorbis-files-with-libvorbis.html"/>
		<id>tag:blogger.com,1999:blog-18561009.post-7137821059910630367</id>
		<updated>2009-06-25T21:33:07+00:00</updated>
		<content type="html">&lt;p&gt;Decoding Vorbis streams require a very similar approach to that used when &lt;a href=&quot;http://www.bluishcoder.co.nz/2009/06/decoding-theora-files-using-libtheora.html&quot;&gt;decoding Theora streams&lt;/a&gt;. The public interface to the libvorbis library is very similar to that used by libtheora. Unfortunately the &lt;a href=&quot;http://www.xiph.org/vorbis/doc/&quot;&gt;libvorbis documentation&lt;/a&gt; doesn't contain an API reference that I could find so I'm following the approached used by the example programs.&lt;/p&gt;&lt;p&gt;Assuming we have already obtained an &lt;a href=&quot;http://www.xiph.org/ogg/doc/libogg/ogg_packet.html&quot;&gt;ogg_packet&lt;/a&gt;, the general steps to follow to decode and play Vorbis streams are:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Call vorbis_synthesis_headerin to see if the packet is a Vorbis header packet. This is passed a vorbis_info and vorbis_comment object to hold the information read from those header packets. The return value of this function is zero if the packet is a Vorbis header packet. Unfortunately it doesn't return a value to see that it's a Vorbis data packet. To check for this you need to check if the stream is a Vorbis stream (by knowing you've previously read Vorbis headers from it) and the return value is OV_ENOTVORBIS.&lt;/li&gt;&lt;li&gt;Once all the header packets are read create a vorbis_dsp_state and vorbis_block object. Initialize these with vorbis_synthesis_init and vorbis_block_init respectively. These objects hold the state of the Vorbis decoding. vorbis_synthesis_init is passed the vorbis_info object that was filled in during the reading of the header packets.&lt;/li&gt;&lt;li&gt;For each data packet:&lt;ol&gt;&lt;li&gt;Call vorbis_synthesis passing it the vorbis_block created above and the ogg_packet containing the packet data. If this succeeds (by returning zero), call vorbis_synthesis_blockin passing it the vorbis_dsp_state and vorbis_block objects. This call copies the data from the packet into the Vorbis objects ready for decoding.&lt;/li&gt;&lt;li&gt;Call vorbis_synthesis_pcmout to get an pointer to an array of floating point values for the sound samples. This will return the number of samples in the array. The array is indexed by channel number, followed by sample number. Once obtained this sound data can be sent to the sound hardware to play the audio.&lt;/li&gt;&lt;li&gt;Call vorbis_synthesis_read, passing it the vorbis_dsp_state object and the number of sound samples consumed. This allows you to consume less data than vorbis_synthesis_pcmout returned. This is useful if you can't write all the data to the sound hardware without blocking.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;In the example code in the &lt;a href=&quot;http://github.com/doublec/plogg/tree/master&quot;&gt;github repository&lt;/a&gt; I create a VorbisDecode object that holds the objects needed for decoding. This is similar to the TheoraDecode object mentioned in my &lt;a href=&quot;http://www.bluishcoder.co.nz/2009/06/decoding-theora-files-using-libtheora.html&quot;&gt;Theora post&lt;/a&gt;:&lt;/p&gt;&lt;pre&gt;class VorbisDecode {&lt;br /&gt;  ...&lt;br /&gt;  vorbis_info mInfo;&lt;br /&gt;  vorbis_comment mComment;&lt;br /&gt;  vorbis_dsp_state mDsp;&lt;br /&gt;  vorbis_block mBlock;&lt;br /&gt;  ...&lt;br /&gt;&lt;br /&gt;  VorbisDecode()&lt;br /&gt;  {&lt;br /&gt;    vorbis_info_init(&amp;amp;mInfo);&lt;br /&gt;    vorbis_comment_init(&amp;amp;mComment);    &lt;br /&gt;  }&lt;br /&gt;};&lt;/pre&gt;    &lt;p&gt;I added a TYPE_VORBIS value to the StreamType enum and the stream is set to this type when a Vorbis header is successfully decoded:&lt;/p&gt;&lt;pre&gt;  int ret = vorbis_synthesis_headerin(&amp;amp;stream-&gt;mVorbis.mInfo,&lt;br /&gt;                      &amp;amp;stream-&gt;mVorbis.mComment,&lt;br /&gt;                      packet);&lt;br /&gt;  if (stream-&gt;mType == TYPE_VORBIS &amp;amp;&amp;amp; ret == OV_ENOTVORBIS) {&lt;br /&gt;    // First data packet&lt;br /&gt;    ret = vorbis_synthesis_init(&amp;amp;stream-&gt;mVorbis.mDsp, &amp;amp;stream-&gt;mVorbis.mInfo);&lt;br /&gt;    assert(ret == 0);&lt;br /&gt;    ret = vorbis_block_init(&amp;amp;stream-&gt;mVorbis.mDsp, &amp;amp;stream-&gt;mVorbis.mBlock);&lt;br /&gt;    assert(ret == 0);&lt;br /&gt;    stream-&gt;mHeadersRead = true;&lt;br /&gt;    handle_vorbis_data(stream, packet);&lt;br /&gt;  }&lt;br /&gt;  else if (ret == 0) {&lt;br /&gt;    stream-&gt;mType = TYPE_VORBIS;&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;The example program uses libsydneyaudio for audio output. This requires sound samples to be written as signed short values. When I get the floating point data from Vorbis I convert this to signed short and send it to libsydneyaudio:&lt;/p&gt;&lt;pre&gt;  int ret = 0;&lt;br /&gt;    &lt;br /&gt;  if (vorbis_synthesis(&amp;amp;stream-&gt;mVorbis.mBlock, packet) == 0) {&lt;br /&gt;    ret = vorbis_synthesis_blockin(&amp;amp;stream-&gt;mVorbis.mDsp, &amp;amp;stream-&gt;mVorbis.mBlock);&lt;br /&gt;    assert(ret == 0);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  float** pcm = 0;&lt;br /&gt;  int samples = 0;&lt;br /&gt;  while ((samples = vorbis_synthesis_pcmout(&amp;amp;stream-&gt;mVorbis.mDsp, &amp;amp;pcm)) &gt; 0) {&lt;br /&gt;    if (!mAudio) {&lt;br /&gt;      ret = sa_stream_create_pcm(&amp;amp;mAudio,&lt;br /&gt;                 NULL,&lt;br /&gt;                 SA_MODE_WRONLY,&lt;br /&gt;                 SA_PCM_FORMAT_S16_NE,&lt;br /&gt;                 stream-&gt;mVorbis.mInfo.rate,&lt;br /&gt;                 stream-&gt;mVorbis.mInfo.channels);&lt;br /&gt;      assert(ret == SA_SUCCESS);&lt;br /&gt;&lt;br /&gt;      ret = sa_stream_open(mAudio);&lt;br /&gt;      assert(ret == SA_SUCCESS);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if (mAudio) {&lt;br /&gt;      short buffer[samples * stream-&gt;mVorbis.mInfo.channels];&lt;br /&gt;      short* p = buffer;&lt;br /&gt;      for (int i=0;i &amp;lt; samples; ++i) {&lt;br /&gt;    for(int j=0; j &amp;lt; stream-&gt;mVorbis.mInfo.channels; ++j) {&lt;br /&gt;      int v = static_cast&amp;lt;int&amp;lt;(floorf(0.5 + pcm[j][i]*32767.0));&lt;br /&gt;      if (v &gt; 32767) v = 32767;&lt;br /&gt;      if (v &amp;lt;-32768) v = -32768;&lt;br /&gt;      *p++ = v;&lt;br /&gt;    }&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      ret = sa_stream_write(mAudio, buffer, sizeof(buffer));&lt;br /&gt;      assert(ret == SA_SUCCESS);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    ret = vorbis_synthesis_read(&amp;amp;stream-&gt;mVorbis.mDsp, samples);&lt;br /&gt;    assert(ret == 0);&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;A couple of minor changes were also made to the example program:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Continue processing pages and packets when the 'end of file' is reached. Otherwise a few packets that are buffered after we've reached the end of the file will be missed.&lt;/li&gt;&lt;li&gt;After reading a page don't just try to read one packet, call &lt;a href=&quot;http://www.xiph.org/ogg/doc/libogg/ogg_stream_packetout.html&quot;&gt;ogg_stream_packetout&lt;/a&gt; until it returns a result saying there are no more packets. This means we process all the packets from the page immediately and prevents a build up of buffered data.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The code for this example is in the 'part3_vorbis' branch of the github repository. This also includes the Theora code but does not do any a/v synchronisation.  Files containing Theora streams will show the video data but it will not play smoothly and will not be synchronised with the audio. Fixing that is the topic of the next post in this series.&lt;/p&gt;&lt;br /&gt;&lt;span class=&quot;technoratitag&quot;&gt;Categories: &lt;a href=&quot;http://del.icio.us/bluishcoder/firefox&quot; rel=&quot;tag&quot;&gt;firefox&lt;/a&gt;, &lt;a href=&quot;http://del.icio.us/bluishcoder/ogg&quot; rel=&quot;tag&quot;&gt;ogg&lt;/a&gt;, &lt;a href=&quot;http://del.icio.us/bluishcoder/theora&quot; rel=&quot;tag&quot;&gt;theora&lt;/a&gt;, &lt;a href=&quot;http://del.icio.us/bluishcoder/vorbis&quot; rel=&quot;tag&quot;&gt;vorbis&lt;/a&gt;&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/18561009-7137821059910630367?l=www.bluishcoder.co.nz%2Findex.html&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Chris Double</name>
			<email>noreply@blogger.com</email>
			<uri>http://www.bluishcoder.co.nz/</uri>
		</author>
		<source>
			<title type="html">Bluish Coder</title>
			<subtitle type="html">Programming Languages, Martial Arts and Computers. The Weblog of Chris Double.</subtitle>
			<link rel="self" href="http://www.bluishcoder.co.nz/atom.xml"/>
			<id>tag:blogger.com,1999:blog-18561009</id>
			<updated>2009-10-27T13:00:44+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Reading Ogg files using libogg</title>
		<link href="http://www.bluishcoder.co.nz/2009/06/reading-ogg-files-using-libogg.html"/>
		<id>tag:blogger.com,1999:blog-18561009.post-3906412136752836119</id>
		<updated>2009-06-25T00:49:44+00:00</updated>
		<content type="html">&lt;p&gt;Reading data from an Ogg file is relatively simple. The file format is well documented in &lt;a href=&quot;http://www.ietf.org/rfc/rfc3533.txt&quot;&gt;RFC 3533&lt;/a&gt;. I showed how to read the format using JavaScript &lt;a href=&quot;http://www.bluishcoder.co.nz/2009/06/reading-ogg-files-with-javascript.html&quot;&gt;in a previous post&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;For C and C++ programs it's easier to use the &lt;a href=&quot;http://xiph.org&quot;&gt;xiph.org&lt;/a&gt; libraries. There are libraries for decoding specific formats (libvorbis, libtheora) and there is a library for reading data from Ogg files (libogg).&lt;/p&gt;&lt;p&gt;I'm prototyping some approaches to improve the performance of the Firefox Ogg video playback and while I'm at it I'll write some posts on using these libraries to decode/play Ogg files. Hopefully it'll prove useful to others using them and I can get some feedback on usage.&lt;/p&gt;&lt;p&gt;All the code for this is in the &lt;a href=&quot;http://github.com/doublec/plogg/tree&quot;&gt;plogg&lt;/a&gt; git repository on github. The 'master' branch contains the work in progress player that I'll describe in a series of posts, and there are branches specific to the examples in each post.&lt;/p&gt;&lt;p&gt;The &lt;a href=&quot;http://www.xiph.org/ogg/doc/libogg/&quot;&gt;libogg documentation&lt;/a&gt; describes the API that I'll be using in this post. All that this example will do is read an Ogg file, read each stream in the file and count the number of packets for that stream. It prints the number of packets. It doesn't decode the data or do anything really useful. That'll come later.&lt;/p&gt;&lt;p&gt;You can think of an Ogg file as containing logical streams of data. Each stream has a serial number that is unique within the file to identify it. A file containing Vorbis and Theora data will have two streams. A Vorbis stream and a Theora stream.&lt;/p&gt;&lt;p&gt;Each stream is split up into packets. The packets contain the raw data for the stream. The process of decoding a stream involves getting a packet from it, decoding that data, doing something with it, and repeating.&lt;/p&gt;&lt;p&gt;That describes the logical format. The physical format of the Ogg file is split into pages of data. Each physical page contains some part of the data for one stream. &lt;/p&gt;&lt;p&gt;The process of reading and decoding an Ogg file is to read pages from the file, associating them with the streams they belong to. At some point we then go through the pages held in the stream and obtain the packets from it. This is the process the code in this example follows.&lt;/p&gt;&lt;p&gt;The first thing we need to do when reading an Ogg file is find the first page of data. We use a &lt;a href=&quot;http://www.xiph.org/ogg/doc/libogg/ogg_sync_state.html&quot;&gt;ogg_sync_state&lt;/a&gt; structure to keep track of search for the page data. This needs to be initialized with &lt;a href=&quot;http://www.xiph.org/ogg/doc/libogg/ogg_sync_init.html&quot;&gt;ogg_sync_init&lt;/a&gt; and later cleaned up with &lt;a href=&quot;http://www.xiph.org/ogg/doc/libogg/ogg_sync_clear.html&quot;&gt;ogg_sync_clear&lt;/a&gt;:&lt;pre&gt;ifstream file(&quot;foo.ogg&quot;, ios::in | ios::binary);&lt;br /&gt;ogg_sync_state state;&lt;br /&gt;int ret = ogg_sync_init(&amp;amp;state);&lt;br /&gt;assert(ret==0);&lt;br /&gt;...look for page...&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Note that the libogg functions return an error code which should be checked, A result of '0' generally indicates success. We want to obtain a complete page of Ogg data. This is held in an &lt;a href=&quot;http://www.xiph.org/ogg/doc/libogg/ogg_page.html&quot;&gt;ogg_page&lt;/a&gt; structure. The process of obtaining this structure is to do the following steps:&lt;ol&gt;&lt;li&gt;Call &lt;a href=&quot;http://www.xiph.org/ogg/doc/libogg/ogg_sync_pageout.html&quot;&gt;ogg_sync_pageout&lt;/a&gt;. This will take any data current stored in the ogg_sync_state object and store it in the ogg_page. It will return a result indicating when the entire pages data has been read and the ogg_page can be used. It needs to be called first to initialize buffers. It gets called repeatedly as we read data from the file.&lt;/li&gt;&lt;li&gt;Call &lt;a href=&quot;http://www.xiph.org/ogg/doc/libogg/ogg_sync_buffer.html&quot;&gt;ogg_sync_buffer&lt;/a&gt; to obtain an area of memory we can reading data from the file into. We pass the size of the buffer. This buffer is reused on each call and will be resized if needed if a larger buffer size is asked for later.&lt;/li&gt;&lt;li&gt;Read data from the file into the buffer obtained above.&lt;/li&gt;&lt;li&gt;Call &lt;a href=&quot;http://www.xiph.org/ogg/doc/libogg/ogg_sync_wrote.html&quot;&gt;ogg_sync_wrote&lt;/a&gt; to tell libogg how much data we copied into the buffer.&lt;/li&gt;&lt;li&gt;Resume from the first step, calling ogg_sync_buffer. This will copy the data from the buffer into the page, and return '1' if a full page of data is available.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Here's the code to do this:&lt;/p&gt;&lt;pre&gt;ogg_page page;&lt;br /&gt;while(ogg_sync_pageout(&amp;amp;state, &amp;amp;page) != 1) {&lt;br /&gt;  char* buffer = ogg_sync_buffer(oy, 4096);&lt;br /&gt;  assert(buffer);&lt;br /&gt;&lt;br /&gt;  file.read(buffer, 4096);&lt;br /&gt;  int bytes = stream.gcount();&lt;br /&gt;  if (bytes == 0) {&lt;br /&gt;    // End of file&lt;br /&gt;    break;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  int ret = ogg_sync_wrote(&amp;amp;state, bytes);&lt;br /&gt;  assert(ret == 0);&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;We need to keep track of the logical streams within the file. These are identified by serial number and this number is obtained from the page. I create a C++ map to associate the serial number with an OggStream object which holds information I want associated with the stream. In later examples this will hold data needed for the Theora and Vorbis decoding process.&lt;/p&gt;&lt;pre&gt;class OggStream&lt;br /&gt;{&lt;br /&gt;  ...&lt;br /&gt;  int mSerial;&lt;br /&gt;  ogg_stream_state mState;&lt;br /&gt;  int mPacketCount;&lt;br /&gt;  ...&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;typedef map StreamMap; &lt;/pre&gt;&lt;p&gt;Each stream has an &lt;a href=&quot;http://www.xiph.org/ogg/doc/libogg/ogg_stream_state.html&quot;&gt;ogg_stream_state&lt;/a&gt; object that is used to keep track of the data read that belongs to the stream. We're storing this in the OggStream object that we associated with the stream serial number. Once we've read a page as described above we need to tell libogg to add this page of data to the stream.&lt;/p&gt;&lt;pre&gt;StreamMap streams;&lt;br /&gt;ogg_page page = ...obtained previously...;&lt;br /&gt;int serial = ogg_page_serialno(&amp;amp;page);&lt;br /&gt;OggStream* stream = 0;&lt;br /&gt;if (ogg_page_bos(&amp;amp;page) {&lt;br /&gt;  stream = new OggStream(serial);&lt;br /&gt;  int ret = ogg_stream_init(&amp;amp;stream-&gt;mState, serial);&lt;br /&gt;  assert(ret == 0);&lt;br /&gt;  streams[serial] = stream;&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;  stream = streams[serial];&lt;br /&gt;&lt;br /&gt;int ret = ogg_stream_pagein(&amp;amp;stream-&gt;mState, &amp;amp;page);&lt;br /&gt;assert(ret == 0);&lt;/pre&gt;&lt;p&gt;This code uses &lt;a href=&quot;http://www.xiph.org/ogg/doc/libogg/ogg_page_serialno.html&quot;&gt;ogg_page_serialno&lt;/a&gt;to get the serial number of the page we just read. If it is the beginning of the stream (&lt;a href=&quot;http://www.xiph.org/ogg/doc/libogg/ogg_page_bos.html&quot;&gt;ogg_page_bos&lt;/a&gt;) then we create a new OggStream object, initialize the stream's state with &lt;a href=&quot;http://www.xiph.org/ogg/doc/libogg/ogg_stream_init.html&quot;&gt;ogg_stream_init&lt;/a&gt;, and store it in out streams map. If it's not the beginning of the stream we just get our existing entry in the map. The final call to &lt;a href=&quot;http://www.xiph.org/ogg/doc/libogg/ogg_stream_pagein.html&quot;&gt;ogg_stream_pagein&lt;/a&gt; inserts the page of data into the streams state object. Once this is done we can start looking for completed packets of data and decode them.&lt;/p&gt;&lt;p&gt;To decode the data from a stream we need to retrieve a packet from it. The steps for doing this are:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Call &lt;a href=&quot;http://www.xiph.org/ogg/doc/libogg/ogg_stream_packetout.html&quot;&gt;ogg_stream_packetout&lt;/a&gt;. This will return a value indicating if a packet of data is available in the stream. If it is not then we need to read another page (following the same steps previously) and add it to the stream, calling ogg_stream_packetout again until it tells us a packet is available. The packet's data is stored in an &lt;a href=&quot;http://www.xiph.org/ogg/doc/libogg/ogg_packet.html&quot;&gt;ogg_packet&lt;/a&gt; object.&lt;/li&gt;&lt;li&gt;Do something with the packet data. This usually involves calling libvorbis or libtheora routines to decode the data. In this example we're just counting the packets.&lt;/li&gt;&lt;li&gt;Repeat until all packets in all streams are consumed.&lt;/li&gt;&lt;/ol&gt;&lt;pre&gt;while (..read a page...) {&lt;br /&gt;  ...put page in stream...  &lt;br /&gt;  ogg_packet packet;&lt;br /&gt;  int ret = ogg_stream_packetout(&amp;amp;stream-&gt;mState, &amp;amp;packet);    &lt;br /&gt;  if (ret == 0) {&lt;br /&gt;    // Need more data to be able to complete the packet&lt;br /&gt;    continue;&lt;br /&gt;  }&lt;br /&gt;  else if (ret == -1) {&lt;br /&gt;    // We are out of sync and there is a gap in the data.&lt;br /&gt;    // We lost a page somewhere.&lt;br /&gt;    break;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  // A packet is available, this is what we pass to the vorbis or&lt;br /&gt;  // theora libraries to decode.&lt;br /&gt;  stream-&gt;mPacketCount++;&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;That's all there is to reading an Ogg file. There are more libogg functions to get data out of the stream, identify end of stream, and various other useful functions but this covers the basics. Try out the example program in the github repository for more information.&lt;/p&gt;&lt;p&gt;Note that the libogg functions don't require reading from a file. You can use these routines with any data you've obtained. From a socket, from memory, etc.&lt;/p&gt;&lt;p&gt;In the next post about reading Ogg files I'll go through using libtheora to decode the video data and display it.&lt;/p&gt; &lt;br /&gt;&lt;span class=&quot;technoratitag&quot;&gt;Categories: &lt;a href=&quot;http://del.icio.us/bluishcoder/theora&quot; rel=&quot;tag&quot;&gt;theora&lt;/a&gt;, &lt;a href=&quot;http://del.icio.us/bluishcoder/ogg&quot; rel=&quot;tag&quot;&gt;ogg&lt;/a&gt;, &lt;a href=&quot;http://del.icio.us/bluishcoder/firefox&quot; rel=&quot;tag&quot;&gt;firefox&lt;/a&gt;&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/18561009-3906412136752836119?l=www.bluishcoder.co.nz%2Findex.html&quot; /&gt;&lt;/div&gt;&lt;/p&gt;&lt;/p&gt;</content>
		<author>
			<name>Chris Double</name>
			<email>noreply@blogger.com</email>
			<uri>http://www.bluishcoder.co.nz/</uri>
		</author>
		<source>
			<title type="html">Bluish Coder</title>
			<subtitle type="html">Programming Languages, Martial Arts and Computers. The Weblog of Chris Double.</subtitle>
			<link rel="self" href="http://www.bluishcoder.co.nz/atom.xml"/>
			<id>tag:blogger.com,1999:blog-18561009</id>
			<updated>2009-10-27T13:00:44+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">The history of Ogg on the Web</title>
		<link href="http://blog.gingertech.net/2009/06/21/the-history-of-ogg-on-the-web/"/>
		<id>http://blog.gingertech.net/?p=423</id>
		<updated>2009-06-21T14:11:40+00:00</updated>
		<content type="html">&lt;p&gt;In the year 2000, while working at CSIRO as a research scientist, I had the idea that video (and audio) should be hyperlinked content on the Web just like any Web page. Conrad Parker and I developed the vision of a &amp;#8220;Continuous Media Web&amp;#8221; and called the technology that was necessary to develop &amp;#8220;Annodex&amp;#8221; for &amp;#8220;annotated and indexed media&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Not many people now know that this was really the beginning of Ogg on the Web. Until then, Ogg Vorbis and the emerging Ogg Theora were only targeted at desktop applications in competition to MP3 and MPEG-2.&lt;/p&gt;
&lt;p&gt;Within a few years, we developed the specifications for a markup language for video called CMML that would provide the annotations, anchor points, and hyperlinks for video to make it possible to search and index video, hyperlink into video section, and hyperlink out of video sections.&lt;/p&gt;
&lt;p&gt;We further developed the specification of temporal URIs to actually address to temporal offsets or segments in video.&lt;/p&gt;
&lt;p&gt;And finally, we developed extensions to the Xiph Ogg framework to allow it to carry CMML, and more generally multi-track codecs. The resulting files were originally called &amp;#8220;Annodex files&amp;#8221;, but through increasing collaboration with Xiph, the specifications were simplified and included natively into Ogg and are now known as &amp;#8220;Ogg Skeleton&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Apart from specifications, we also developed lots of software to make the vision actually come true. Conrad, in particular, developed many libraries that helped develop software on top of the raw Xiph codecs, which include liboggz and libfishsound. Libraries were developed to deal with CMML and with embedding CMML into Ogg. Apache modules were developed to deal with segmenting sections from Ogg files and deliver them as a reply to a temporal URI request. And finally we actually developed a Firefox extension that would allow us to display the Ogg Theora/Vorbis videos inside a Web Browser.&lt;/p&gt;
&lt;p&gt;Over time, a lot more sofware was developed, amongst them: php, perl and python bindings for Annodex, DirectShow filters to have Ogg Theora/Vorbis support on Windows, an ActiveX control for Windows, an authoring tool for CMML on Windows, Ogg format validation software, mobile phone support for Ogg Theora/Vorbis, and a video wiki for CMML and Ogg Theora called cmmlwiki. Several students and Annodex team members at CSIRO helped develop these, including Andre Pang (who now works for Pixar), Zen Kavanagh (who now works for Microsoft), and Colin Ward (who now works for Symbian). Most of the software was released as open source software by CSIRO and is available now either in the &lt;a href=&quot;http://svn.annodex.net/&quot;&gt;Annodex repository&lt;/a&gt; or the &lt;a href=&quot;http://svn.xiph.org/&quot;&gt;Xiph&lt;/a&gt; &lt;a href=&quot;http://git.xiph.org/&quot;&gt;repositories&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Annodex technology became increasingly part of Xiph technology as team members also became increasingly part of the Xiph community, such as by now it&amp;#8217;s rather difficult to separate out the Annodex people from the Xiph people.&lt;/p&gt;
&lt;p&gt;Over time, other projects picked up on the Annodex technology. The first were in fact ethnographic researchers, who wanted their audio-visual ethnographic recordings usable in deeply. Also, other multimedia scientists experimented with Annodex. The first actual content site to publish a large collection of Ogg Theora video with annotations was OpenRoadTrip by Scott Shawcroft and Brandon Hines in 2006. Soon after, Michael Dale and Aphid from Metavid started really using the Annodex set of technologies and contributing to harden the technology. Michael was also a big advocate for helping Wikimedia and Archive.org move to using Ogg Theora.&lt;/p&gt;
&lt;p&gt;By 2006, the team at CSIRO decided that it was necessary to develop a simple, cross-platform Ogg decoding and playback library that would allow easy development of applications that need deep control of Ogg audio and video content. Shane Stephens was the key developer of that. By the time that Chris Double from Firefox picked up liboggplay to include Ogg support into Firefox natively, CSIRO had stopped working on Annodex, Shane had left the project to work for Google on Wave, and we eventually found Viktor Gal as the new maintainer for liboggplay. We also found Cristian Adam as the new maintainer for the DirectShow filters (oggcodecs).&lt;/p&gt;
&lt;p&gt;Now that the basic Ogg Theora/Vorbis support for the HTML5 &amp;lt;video&gt; element is starting to be available in all major browsers (well, as soon as an ActiveX control is implemented for IE), we can finally move on to develop the bigger vision. This is why I am an invited expert on the W3C media fragments working group and why I am working with Mozilla on sorting out accessibility for &amp;lt;video&gt;. Accessibility is an inherent part of making video searchable. So, if we can find a way to extend the annotations with hyperlinks, we will also be able to build Webs of videos and completely new experiences on the Web. Think about mashing up simply by creating a list of URLs. Think about tweeting video segments. Think about threaded video email discussions (Shane should totally include that into Google Wave!). And think about all the awesome applications that come to your mind that I haven&amp;#8217;t even thought about yet!&lt;/p&gt;
&lt;p&gt;I spent this week at the Open Video Conference in New York and was amazed about the 800 and more people that understand the value of open video and the need for open video technologies to allow free innovation and sharing. I can feel that the ball has got rolling &amp;#8211; the vision developed almost 10 years ago is starting to take shape. Sometimes, in very very rare moments, you can feel that history has just been made. The Open Video Conference was exactly one such point in time. Things have changed. Forever. For the better. I am stunned.&lt;/p&gt;</content>
		<author>
			<name>silvia</name>
			<uri>http://blog.gingertech.net</uri>
		</author>
		<source>
			<title type="html">ginger's thoughts</title>
			<subtitle type="html">Silvia's blog</subtitle>
			<link rel="self" href="http://blog.gingertech.net/feed/atom/"/>
			<id>http://blog.gingertech.net/feed/atom/</id>
			<updated>2009-11-01T05:00:09+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">YouTube Ogg Theora+Vorbis &amp;amp; H.263/H.264 comparison</title>
		<link href="http://blog.gingertech.net/2009/06/14/youtube-ogg-theoravorbis-h-263h-264-comparison/"/>
		<id>http://blog.gingertech.net/?p=418</id>
		<updated>2009-06-14T12:36:09+00:00</updated>
		<content type="html">&lt;p&gt;On Jun 13th 2009 Chris DiBona of Google claimed on the WhatWG mailing list:&lt;/p&gt;
&lt;p&gt;&amp;#8220;If [youtube] were to switch to theora and maintain even a semblance of the current youtube quality it would take up most available bandwidth across the Internet.&amp;#8221; &lt;/p&gt;
&lt;p&gt;Everyone who has ever encoded a Ogg Theora/Vorbis file and in parallel encoded one with another codec will have to immediately protest. It is sad that even the best people fall for FUD spread by the un-enlightened or the ones who have their own agenda.&lt;/p&gt;
&lt;p&gt;Fortunately, Gregory Maxwell from Wikipedia came to the rescue and did an actual &lt;a href=&quot;http://people.xiph.org/~greg/video/ytcompare/comparison.html&quot;&gt;&amp;#8220;YouTube / Ogg/Theora comparison&amp;#8221;&lt;/a&gt;. It&amp;#8217;s a good read and a comparison on one video. He has put his instructions there, so anyone can repeat it for themselves. You will have to start with a pretty good quality video though to see such differences.&lt;/p&gt;</content>
		<author>
			<name>silvia</name>
			<uri>http://blog.gingertech.net</uri>
		</author>
		<source>
			<title type="html">ginger's thoughts</title>
			<subtitle type="html">Silvia's blog</subtitle>
			<link rel="self" href="http://blog.gingertech.net/feed/atom/"/>
			<id>http://blog.gingertech.net/feed/atom/</id>
			<updated>2009-11-01T05:00:09+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Inviting you to project “PackageMap”</title>
		<link href="http://blog.hartwork.org/?p=373"/>
		<id>http://blog.hartwork.org/?p=373</id>
		<updated>2009-06-12T07:42:50+00:00</updated>
		<content type="html">&lt;p&gt;Quick (re-)introduction:  My task for Gentoo/Google Summer of Code 2009 is to give Gentoo a &lt;a href=&quot;http://popcon.debian.org/&quot;&gt;Debian popcon&lt;/a&gt; equivalent, a tool to collect statistics on &amp;#8220;what package is installed how often&amp;#8221;.  To achieve this goal I&amp;#8217;m extending &lt;a href=&quot;https://fedorahosted.org/smolt/&quot;&gt;Smolt&lt;/a&gt; (a tool currently doing similar things with hardware information) by fine-tunable software stats gathering.&lt;/p&gt;
&lt;p&gt;The plan we have for Smolt is to make it cross-distro, not just fit Gentoo or Fedora.  One point where the consequences and benefits of such an approach can be seen clearly is with&lt;/p&gt;
&lt;p&gt;counting packages from different distros into the same buckets.&lt;/p&gt;
&lt;p&gt;What do I mean by that?  Debian&amp;#8217;s Git counts for Gentoo&amp;#8217;s Git counts for Fedora&amp;#8217;s, you know the list.  With packages counted from accross distros we can suddenly answer questions that we currently cannot answer, among them&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What globally popular packages are missing in distro X? Let&amp;#8217;s say we don&amp;#8217;t have a package for product P. Do other distros have one? They do, maybe we need one, too?  They don&amp;#8217;t, maybe P is not that important then?&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;How many Linux users are approximately using program X in total? Not just on Ubuntu or Arch &amp;#8211; all across Linux, BSD, Solaris!&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Does distro X have 10 times the packages of Y or is it just different splitting?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To count into the same bucket we use global identifiers for the &amp;#8220;products&amp;#8221; that fall out of a package.  Gentoo package &amp;#8220;dev-util/git&amp;#8221; can produce product &amp;#8220;cpe://a:git:git&amp;#8221;, Debian&amp;#8217;s &amp;#8220;git-core&amp;#8221; can, too. That string before is a &lt;a href=&quot;http://cpe.mitre.org/&quot;&gt;CPE&lt;/a&gt; name, a concept close to package naming in Java.  This &amp;#8220;intermediate language&amp;#8221; allows us to relate package names from distro X with those of distro Y and answer various questions from that data.&lt;/p&gt;
&lt;p&gt;To do such mapping we need code (or a &amp;#8220;service&amp;#8221;) that does the mapping for us and base of collected data that the service can operate on.  Both of these is project &amp;#8220;PackageMap&amp;#8221;.&lt;/p&gt;
&lt;p&gt;I have started populating the database with packages (currently 312 in number) made from information extracted from the &lt;a href=&quot;http://sources.gentoo.org/viewcvs.py/gentoo-x86/&quot;&gt;Gentoo tree&lt;/a&gt; and the &lt;a href=&quot;http://nvd.nist.gov/download.cfm&quot;&gt;National Vulnerability Database&lt;/a&gt;.  Latter holds many CPEs. Let me state clearly that packagemap is not about Gentoo in particular.  Sure, the initial data has lots of Gentoo in it but the whole point of the project is to get information and people from &lt;em&gt;different&lt;/em&gt; distros &lt;em&gt;together&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;To see what these 312 packages maps look like at the moment you best do a few clicks through the database folder yourself:&lt;br /&gt;
&lt;a href=&quot;http://git.goodpoint.de/?p=packagemap.git;a=tree;f=database&quot;&gt; http://git.goodpoint.de/?p=packagemap.git;a=tree;f=database&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Also, there are Relax NG schema and DTD for validation, more documentation than I usually write and a few scripts:&lt;br /&gt;
&lt;a href=&quot;http://git.goodpoint.de/?p=packagemap.git;a=tree&quot;&gt; http://git.goodpoint.de/?p=packagemap.git;a=tree&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;By now I hope you have gained interest in what this can become.&lt;br /&gt;
Your active participation is highly appreciated.&lt;br /&gt;
A few minutes from everyone can make a huge difference here.&lt;br /&gt;
If you want write access to the repo &amp;#8211; mail me: &lt;a href=&quot;mailto:sebastian@pipping.org&quot;&gt;sebastian@pipping.org&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Please have a look at the &lt;a href=&quot;http://git.goodpoint.de/?p=packagemap.git;a=tree&quot;&gt;Git repository&lt;/a&gt; and ask questions.&lt;/p&gt;
&lt;p&gt;Thanks for reading up to this point.&lt;/p&gt;
&lt;p&gt;PS: I&amp;#8217;m aware &amp;#8220;hartwork.org&amp;#8221; might not make a good longterm location for DTDs, XML namespaces and such for a cross-distro project.  Any ideas where to put them best?&lt;/p&gt;</content>
		<author>
			<name>Sebastian Pipping</name>
			<uri>http://blog.hartwork.org</uri>
		</author>
		<source>
			<title type="html">Hartwork Blog » Planet Xiph</title>
			<subtitle type="html">Free Software and Music</subtitle>
			<link rel="self" href="http://blog.hartwork.org/?cat=28&amp;feed=rss2"/>
			<id>http://blog.hartwork.org/?cat=28&amp;feed=rss2</id>
			<updated>2009-10-17T13:00:05+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Sites with Ogg in HTML5 video tag</title>
		<link href="http://blog.gingertech.net/2009/06/10/sites-with-ogg-in-html5-video-tag/"/>
		<id>http://blog.gingertech.net/?p=413</id>
		<updated>2009-06-09T22:44:29+00:00</updated>
		<content type="html">&lt;p&gt;Yesterday, somebody mentioned that the HTML5 video tag with Ogg Theora/Vorbis can be played back in Safari if you have &lt;a href=&quot;http://xiph.org/quicktime/&quot;&gt;XiphQT&lt;/a&gt; installed (btw: the 0.1.9 release of XiphQT is upcoming). So, today I thought I should give it a quick test. It indeed works straight through the QuickTime framework, so the player looks like a QuickTime player. So, by now, Firefox 3.5, Chrome, Safari with XiphQT, and experimental builds of Opera support Ogg Theora/Vorbis inside the HTML5 video tag. Now we just need somebody to write some ActiveX controls for the &lt;a href=&quot;http://xiph.org/dshow/&quot;&gt;Xiph DirectShow Filters&lt;/a&gt; and it might even work in IE.&lt;/p&gt;
&lt;p&gt;While doing my testing, I needed to go to some sites that actually use Ogg Theora/Vorbis in HTML5 video tags. Here is a list that I came up with in no particular order:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://tinyvid.tv/&quot;&gt;Chris Double&amp;#8217;s Tinyvid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.dailymotion.com/openvideodemo&quot;&gt;Dailymotion&amp;#8217;s Open Video Demo (restricted to Firefox 3.5)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://metavid.org/&quot;&gt;Michael Dale and Aphid&amp;#8217;s Metavid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.archive.org/details/movies&quot;&gt;Archive.org&amp;#8217;s videos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://commons.wikimedia.org/wiki/Category:Videos_by_format&quot;&gt;Wikipedia&amp;#8217;s videos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.foms-workshop.org/foms2009/pmwiki.php/Main/Proceedings&quot;&gt;the FOMS workshop videos&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;#8217;m sure there&amp;#8217;s a lot more out there &amp;#8211; feel free to post links in the comments.&lt;/p&gt;</content>
		<author>
			<name>silvia</name>
			<uri>http://blog.gingertech.net</uri>
		</author>
		<source>
			<title type="html">ginger's thoughts</title>
			<subtitle type="html">Silvia's blog</subtitle>
			<link rel="self" href="http://blog.gingertech.net/feed/atom/"/>
			<id>http://blog.gingertech.net/feed/atom/</id>
			<updated>2009-11-01T05:00:09+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry>
		<title type="html">Reading Ogg files with JavaScript</title>
		<link href="http://www.bluishcoder.co.nz/2009/06/reading-ogg-files-with-javascript.html"/>
		<id>tag:blogger.com,1999:blog-18561009.post-4911395605634628980</id>
		<updated>2009-06-05T16:09:25+00:00</updated>
		<content type="html">On &lt;a href=&quot;http://tinyvid.tv&quot;&gt;tinyvid.tv&lt;/a&gt; I do quite a bit of server side reading of Ogg files to get things like duration and bitrate information when serving information about the media. I wondered if it would be possible to do this sort of thing using JavaScript running in the browser.&lt;br /&gt;&lt;br /&gt;The format of the Ogg container is defined in &lt;a href=&quot;http://www.ietf.org/rfc/rfc3533.txt&quot;&gt;RFC 3533&lt;/a&gt;. The difficulty comes in reading binary data from JavaScript. The &lt;a href=&quot;https://developer.mozilla.org/en/XMLHttpRequest&quot;&gt;XMLHttpRequest&lt;/a&gt; object can be used to retrieve data via a URL from JavaScript in a page but processing the binary data in the Ogg file is problematic. The response returned by XMLHttpRequest assumes text or XML (in Firefox at least).&lt;br /&gt;&lt;br /&gt;One way of handling binary data is described in &lt;a href=&quot;https://developer.mozilla.org/En/Using_XMLHttpRequest#Handling_binary_data&quot;&gt;this Mozilla Developer article&lt;/a&gt;. Trying this method out works in Firefox and I can download and read the data in the Ogg file.&lt;br /&gt;&lt;br /&gt;Ideally I don't want to download the entire file. It might be a large video. I thought by handling the 'progress' event or ready state 3 (data received) I'd be able to look at the data currently retrieved. This does work but on each call to the 'responseText' attribute in these events Firefox copies its internal copy of the downloaded data into a JavaScript array. Doing this every time a portion of the file is downloaded results in major memory use and slow downs proving impractical for even small files.&lt;br /&gt;&lt;br /&gt;I think the only reliable way to process the file in chunks is to use byte range requests and do multiple requests. Is there a more reliable way to do binary file reading via JavaScript using XMLHttpRequest? I'd like to be able to process the file in chunks using an &lt;a href=&quot;http://okmij.org/ftp/Streams.html#random-bin-IO&quot;&gt;Iteratee&lt;/a&gt; style approach.&lt;br /&gt;&lt;br /&gt;I put up a rough quick demo of loading the first 100Kb of a video and displaying information from each Ogg packet. This probably works in Firefox only due to the workaround needed to read binary data. Click on the 'Go' button in the &lt;a href=&quot;http://www.double.co.nz/video_test/oggparse.html&quot;&gt;demo page&lt;/a&gt;. This will load &lt;a href=&quot;http://www.double.co.nz/video_test/transformers320.ogg&quot;&gt;transformers320.ogg&lt;/a&gt; and display the contents of the first Ogg physical page.&lt;br /&gt;&lt;br /&gt;I decode the header packets for Theora and Vorbis. So the first page shown will show it is for a Theora stream with a given size and framerate. Clicking 'Next' will move on to the Next page. This is a Vorbis header with the rate and channel information. Clicking 'Next' again gets the comment header for the Theora stream. The demo reads the comments and displays them. The same for the Vorbis comment records. As you 'Next' through the file it displays the meaning of the granulepos for each page. It shows whether the Theora data is for a keyframe, what time position it is, etc.&lt;br /&gt;&lt;br /&gt;Something like this could be used to read metadata from Ogg files, read subtitle information, show duration, etc. More interesting would be to implement a Theora and/or Vorbis decoder in JavaScript and see how it performs.&lt;br /&gt;&lt;br /&gt;The main issues with doing this from JavaScript seem to be:&lt;ul&gt;&lt;li&gt;Handling binary data using XMLHttpRequest in a cross browser manner&lt;/li&gt;&lt;li&gt;Processing the file in chunks so the entire file does not need to be kept in memory&lt;/li&gt;&lt;li&gt;Files need to be hosted on the same domain as the page. &lt;a href=&quot;http://tinyvid.tv&quot;&gt;tinyvid.tv&lt;/a&gt; adds the W3C Access Control headers so they can be accessed cross domain but it also hosts some files on Amazon S3 where these headers can't be added. As a result even tinyvid itself can't use XMLHttpRequest to read these files.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;technoratitag&quot;&gt;Categories: &lt;a href=&quot;http://del.icio.us/bluishcoder/tinyvid&quot; rel=&quot;tag&quot;&gt;tinyvid&lt;/a&gt;, &lt;a href=&quot;http://del.icio.us/bluishcoder/javascript&quot; rel=&quot;tag&quot;&gt;javascript&lt;/a&gt;, &lt;a href=&quot;http://del.icio.us/bluishcoder/theora&quot; rel=&quot;tag&quot;&gt;theora&lt;/a&gt;, &lt;a href=&quot;http://del.icio.us/bluishcoder/firefox&quot; rel=&quot;tag&quot;&gt;firefox&lt;/a&gt;&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/18561009-4911395605634628980?l=www.bluishcoder.co.nz%2Findex.html&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Chris Double</name>
			<email>noreply@blogger.com</email>
			<uri>http://www.bluishcoder.co.nz/</uri>
		</author>
		<source>
			<title type="html">Bluish Coder</title>
			<subtitle type="html">Programming Languages, Martial Arts and Computers. The Weblog of Chris Double.</subtitle>
			<link rel="self" href="http://www.bluishcoder.co.nz/atom.xml"/>
			<id>tag:blogger.com,1999:blog-18561009</id>
			<updated>2009-10-27T13:00:44+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Firefox plugin to encode Ogg video</title>
		<link href="http://blog.gingertech.net/2009/06/05/firefox-plugin-to-encode-ogg-video/"/>
		<id>http://blog.gingertech.net/?p=411</id>
		<updated>2009-06-04T22:18:00+00:00</updated>
		<content type="html">&lt;p&gt;Michael Dale just posted this to theora-dev. Go to one of the given URLs to install the Firefox plugin that lets you transcode video to Ogg using your Web browser.&lt;/p&gt;
&lt;p&gt;Firefogg is developed by Jan Gerber and lives at http://www.firefogg.org/. There is a &lt;a href=&quot;http://firefogg.org/dev/index.html&quot;&gt;javascript API&lt;/a&gt; available so you can make use of Firefogg in your own Website project to allow people to upload any video and transcode it to Ogg on the fly.&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;p&gt;On Fri, Jun 5, 2009 at 7:08 AM, Michael Dale  wrote:&lt;br /&gt;
&gt; I mentioned it in the #theora channel a few days ago but here it is with&lt;br /&gt;
&gt; a more permanent url:&lt;br /&gt;
&gt;&lt;br /&gt;
&gt; http://www.firefogg.org/make/advanced.html&lt;br /&gt;
&gt; &amp;#038;&lt;br /&gt;
&gt; http://www.firefogg.org/make/&lt;br /&gt;
&gt;&lt;br /&gt;
&gt; These will be simple links you can send people so that they can encode&lt;br /&gt;
&gt; source footage to a local ogg video file with the latest and greatest&lt;br /&gt;
&gt; ogg encoders (presently thusnelda and vorbis). Updates to thusnelda and&lt;br /&gt;
&gt; possible other free codecs will be pushed out via firefogg updates &lt;img src=&quot;http://blog.gingertech.net/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt;&lt;br /&gt;
&gt;&lt;br /&gt;
&gt; Pass along any feedback if things break or what not.&lt;br /&gt;
&gt;&lt;br /&gt;
&gt; I am also doing testing with &amp;#8220;embed&amp;#8221; these encoder interface. For those&lt;br /&gt;
&gt; familiar with jQuery: an example to rewrite all your file inputs with&lt;br /&gt;
&gt; firefogg enhanced inputs:  $(&amp;#8221;input:[type='file']&amp;#8220;).firefogg()  &amp;#8230; Feel&lt;br /&gt;
&gt; free to expeirment based on those examples. The form rewrite has mostly&lt;br /&gt;
&gt; only been tested in the mediaWiki context:&lt;br /&gt;
&gt; http://sandbox.kaltura.com/testwiki/index.php/Special:Upload&lt;br /&gt;
&gt; but with minor hacking should work elsewhere &lt;img src=&quot;http://blog.gingertech.net/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt;&lt;br /&gt;
&gt;&lt;br /&gt;
&gt; enjoy&lt;br /&gt;
&gt; &amp;#8211;michael&lt;br /&gt;
&gt;&lt;br /&gt;
&gt; _______________________________________________&lt;br /&gt;
&gt; theora mailing list&lt;br /&gt;
&gt; theora@xiph.org&lt;br /&gt;
&gt; http://lists.xiph.org/mailman/listinfo/theora&lt;br /&gt;
&gt;&lt;/p&gt;</content>
		<author>
			<name>silvia</name>
			<uri>http://blog.gingertech.net</uri>
		</author>
		<source>
			<title type="html">ginger's thoughts</title>
			<subtitle type="html">Silvia's blog</subtitle>
			<link rel="self" href="http://blog.gingertech.net/feed/atom/"/>
			<id>http://blog.gingertech.net/feed/atom/</id>
			<updated>2009-11-01T05:00:09+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry>
		<title type="html">Lots of software released this month...</title>
		<link href="http://xiphmont.livejournal.com/42047.html"/>
		<id>http://xiphmont.livejournal.com/42047.html</id>
		<updated>2009-06-03T06:02:24+00:00</updated>
		<content type="html">&lt;table border=&quot;0&quot; cellpadding=&quot;10&quot;&gt;&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;http://www.xiph.org/images/logos/fish_xiph_org.png&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;http://web.mit.edu/xiphmont/Public/gPicon2.png&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;http://gimp.org/images/wilber_work.png&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;With tonight's double-release (well... release candidates) of &lt;a href=&quot;http://www.xiph.org/press/2009/libvorbis-1.2.2-rc1/&quot;&gt;libvorbis 1.2.2&lt;/a&gt; and &lt;a href=&quot;http://www.xiph.org/press/2009/libogg-1.1.4-rc1/&quot;&gt;libogg 1.1.4&lt;/a&gt;, this has been quite a month of software releases.  In addition to Ogg and Vorbis, Ralph, Tim and Greg have cut a &lt;a href=&quot;http://www.xiph.org/press/2009/thusnelda-alpha-2/&quot;&gt;second alpha of Thusnelda&lt;/a&gt; and I managed to push out some vanity software on my own time-- a new release of &lt;a href=&quot;http://web.mit.edu/xiphmont/Public/gPlanarity.html&quot;&gt;gPlanarity&lt;/a&gt; and the beginnings of getting the Gimp monkey off my back.  No, not the new resampler, but a number of &lt;a href=&quot;http://web.mit.edu/xiphmont/Public/gimp-fu/gimp-cache.html&quot;&gt;TileCache fixes that looked pretty necessary&lt;/a&gt;.

&lt;p&gt;Whoof.  Getting tired.  But cdparanoia, two more libvorbis releases and a whooole lotta documentation come next.&lt;/p&gt;&lt;/p&gt;</content>
		<author>
			<name>Monty</name>
			<uri>http://xiphmont.livejournal.com/</uri>
		</author>
		<source>
			<title type="html">Monty</title>
			<subtitle type="html">Monty - LiveJournal.com</subtitle>
			<link rel="self" href="http://xiphmont.livejournal.com/data/rss?tag=xiph"/>
			<id>http://xiphmont.livejournal.com/data/rss?tag=xiph</id>
			<updated>2009-10-02T05:00:25+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Dailymotion using Ogg and other recent cool open video news</title>
		<link href="http://blog.gingertech.net/2009/06/02/dailymotion-using-ogg-and-other-recent-cool-open-video-news/"/>
		<id>http://blog.gingertech.net/?p=403</id>
		<updated>2009-06-02T13:52:22+00:00</updated>
		<content type="html">&lt;p&gt;This past week was amazing, not because of Google Wave, which everybody seems to be talking about now, and not because of Microsoft&amp;#8217;s launch of the bing search engine, but amazing for the world of open video.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://www.youtube.com/html5&quot;&gt;YouTube are experimenting with the HTML5 video tag&lt;/a&gt;. The demo only works in HTML5 video capable browsers, such as Firefox 3.5, Safari, Opera, and the new Chrome, which leads me straight to the next news.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;http://googlechromereleases.blogspot.com/2009/05/dev-channel-release-301822.html&quot;&gt;Google Chrome 3 browser now supports the HTML5 video tag&lt;/a&gt;. The linked release only supports MPEG encoded video, but that&amp;#8217;s a big step forward.&lt;/li&gt;
&lt;li&gt;More importantly even, recently committed code adds Ogg Theora/Vorbis support to Google Chrome 3&amp;#8217;s video tag! This is based on using ffmpeg at this stage, which needs some further work to e.g. gain Ogg Kate support. But this is great news for open media!&lt;/li&gt;
&lt;li&gt;&lt;b&gt;And then the biggest news:&lt;/b&gt; &lt;a href=&quot;http://blog.dailymotion.com/2009/05/27/watch-videowithout-flash/&quot;&gt;Dailymotion&lt;/a&gt;, one of the largest social video networks, has re-encoded all their videos to Ogg Theora/Vorbis and have launched an &lt;a href=&quot;http://openvideo.dailymotion.com/&quot;&gt;openvideo&lt;/a&gt; platform. The blog post is slightly negative about video quality &amp;#8211; probably because they used an older encoder. The Xiph community &lt;del datetime=&quot;2009-06-02T13:50:34+00:00&quot;&gt;has already recommended use of&lt;/del&gt; recommends experimenting with the new &lt;a href=&quot;http://web.mit.edu/xiphmont/Public/theora/demo7.html&quot;&gt;Thusnelda&lt;/a&gt; encoder and the latest &lt;a href=&quot;http://lists.xiph.org/pipermail/theora-dev/2009-May/003902.html&quot;&gt;ffmpeg2theora&lt;/a&gt; release that supports it, since they provide higher compression ratios and better quality.&lt;/li&gt;
&lt;li&gt;That latest ffmpeg2theora release is really awesome news by itself, but I&amp;#8217;d also like to mention two other encoding tools that were released last week: the &lt;a href=&quot;http://people.xiph.org/~j/XiphQT-Thusnelda-1.1alpha1.component.zip&quot;&gt;updated XiphQT QuickTime&lt;/a&gt; components, that now allow export to Ogg Theora/Vorbis directly from iMovie (I tested it and it&amp;#8217;s awesome) and the new GStreamer command-line based python encoder &lt;a href=&quot;http://lists.xiph.org/pipermail/theora-dev/2009-May/003903.html&quot;&gt;gst2ogg&lt;/a&gt; which works mostly like ffmpeg2theora.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Overall a really exciting week for open media and HTML5 video! I think things are only going to heat up more in this space as more content publishers and more browsers will join the video tag implementations and the Ogg Theora/Vorbis support.&lt;/p&gt;</content>
		<author>
			<name>silvia</name>
			<uri>http://blog.gingertech.net</uri>
		</author>
		<source>
			<title type="html">ginger's thoughts</title>
			<subtitle type="html">Silvia's blog</subtitle>
			<link rel="self" href="http://blog.gingertech.net/feed/atom/"/>
			<id>http://blog.gingertech.net/feed/atom/</id>
			<updated>2009-11-01T05:00:09+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry>
		<title type="html">Video for Everybody - HTML 5 video fallback</title>
		<link href="http://www.bluishcoder.co.nz/2009/06/video-for-everybody-html-5-video.html"/>
		<id>tag:blogger.com,1999:blog-18561009.post-1665228612307107866</id>
		<updated>2009-06-02T13:55:28+00:00</updated>
		<content type="html">Kroc Camen has made available &lt;a href=&quot;http://camendesign.com/code/video_for_everybody&quot;&gt;Video for Everybody&lt;/a&gt;, an HTML snippet that uses HTML 5 video if it's available in the browser, otherwise falling back to different video playback options.&lt;br /&gt;&lt;br /&gt;What's interesting about 'Video for Everybody' is it doesn't use scripting at all. It uses the fallback mechanism built into HTML. The video playback mechanism used, in order of availability in the browser, is:&lt;ol&gt;&lt;li&gt;HTML 5 &amp;lt;video&amp;gt;&lt;/li&gt;&lt;li&gt;Adobe Flash&lt;/li&gt;&lt;li&gt;Quicktime&lt;/li&gt;&lt;li&gt;Windows Media Player&lt;/li&gt;&lt;li&gt;Text explaining how to get video support if none of the above is available&lt;/li&gt;&lt;/ol&gt;The fallback options work across multiple browsers and even works on the iPhone. The 'Video For Everybody' page also goes through how to encode videos in Ogg and MP4 format.&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;technoratitag&quot;&gt;Categories: &lt;a href=&quot;http://del.icio.us/bluishcoder/video&quot; rel=&quot;tag&quot;&gt;video&lt;/a&gt;, &lt;a href=&quot;http://del.icio.us/bluishcoder/firefox&quot; rel=&quot;tag&quot;&gt;firefox&lt;/a&gt;&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/18561009-1665228612307107866?l=www.bluishcoder.co.nz%2Findex.html&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Chris Double</name>
			<email>noreply@blogger.com</email>
			<uri>http://www.bluishcoder.co.nz/</uri>
		</author>
		<source>
			<title type="html">Bluish Coder</title>
			<subtitle type="html">Programming Languages, Martial Arts and Computers. The Weblog of Chris Double.</subtitle>
			<link rel="self" href="http://www.bluishcoder.co.nz/atom.xml"/>
			<id>tag:blogger.com,1999:blog-18561009</id>
			<updated>2009-10-27T13:00:44+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Orc-0.4.0</title>
		<link href="http://www.schleef.org/blog/2009/05/31/orc-040/"/>
		<id>http://www.schleef.org/blog/2009/05/31/orc-040/</id>
		<updated>2009-05-31T23:33:42+00:00</updated>
		<content type="html">&lt;p&gt;Lately, I&amp;#8217;ve been working on a side project called &lt;a href=&quot;http://cgit.freedesktop.org/~ds/orc&quot;&gt;Orc&lt;/a&gt; as a replacement for &lt;a href=&quot;http://liboil.freedesktop.org/wiki/&quot;&gt;liboil&lt;/a&gt;.  Liboil&amp;#8217;s first major problem has always been that it doesn&amp;#8217;t scale well &amp;#8212; every software package that wanted to use liboil typically required several new liboil functions, and then someone would need to actually write assembly code for those functions on several architectures.  My original plan was to develop a critical mass of functions, and then additions would be &amp;#8220;simple&amp;#8221;.  This never happened.  The second major problem is that liboil&amp;#8217;s compilation is terribly fragile.  Thousands of lines of inline assembly code that depends on specific compilers, compiler versions, libtool internals, and random snippets of code such as &amp;#8220;if $user != msmith&amp;#8221; do not lead to a maintainable project.&lt;/p&gt;
&lt;p&gt;Orc is now to the point where it can not only reproduce about 90% of the code that is currently in liboil, but also generate 90% of the code that &lt;em&gt;should&lt;/em&gt; be in liboil, but nobody ever wrote.  At runtime.  And the Orc language allows you to describe your own liboil-style functions.  At runtime.  Or, you can also use it like a normal compiler, converting Orc language source into N different assembly source files for every possible vector instruction set combination.&lt;/p&gt;
&lt;p&gt;A large part of the decoding path in Schroedinger has been converted to optionally use Orc, where speed is either slightly faster or 20-30% faster than the previous liboil code.  The real benefit is that takes only a few minutes to convert code that took weeks to develop originally.  A side project of mine, &lt;a href=&quot;http://cgit.freedesktop.org/~ds/cog&quot;&gt;Cog&lt;/a&gt;, has turned into a showcase for Orc, with demonstrations of video processing &lt;a href=&quot;http://gstreamer.net/&quot;&gt;GStreamer&lt;/a&gt; elements, such as format and colorspace conversion and scaling.  I&amp;#8217;ve found that since it is so easy and fast to create vectorized code, it now becomes possible to offer additional features to users, such as quality vs. speed tradeoffs.&lt;/p&gt;
&lt;p&gt;Orc can generate code for MMX and SSE on x86 and x86_64, and Altivec on PowerPC, as well as NEON for ARM and c64x+DSP code.  The NEON and c64x+ backends are not currently open source.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.schleef.org/orc/download/&quot;&gt;Download 0.4.0&lt;/a&gt;.  &lt;a href=&quot;http://www.schleef.org/orc/documentation/&quot;&gt;Online documentation&lt;/a&gt;.&lt;/p&gt;</content>
		<author>
			<name>David Schleef</name>
			<uri>http://www.schleef.org/blog</uri>
		</author>
		<source>
			<title type="html">Passing on the Left » video</title>
			<subtitle type="html">Just another WordPress weblog</subtitle>
			<link rel="self" href="http://www.schleef.org/blog/category/video/feed/"/>
			<id>http://www.schleef.org/blog/category/video/feed/</id>
			<updated>2009-11-07T09:00:14+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Spotlight on: Categories</title>
		<link href="http://metavid.org/blog/2009/05/20/spotlight-on-categories/"/>
		<id>http://metavid.org/blog/?p=320</id>
		<updated>2009-05-20T21:03:43+00:00</updated>
		<content type="html">&lt;p&gt;Categories are like tags, special links that group together similar things.  When applied to annotation layers, (annotation layers describe a particular period of time in a Metavid stream with a start and endpoint), categories create collections of video.  &lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://metavid.org/wiki/Category:Great_Poster&quot;&gt;&lt;img src=&quot;http://metavid.org/blog/wp-content/uploads/2009/05/greatposter-300x232.png&quot; alt=&quot;Example of category &quot; /&gt;&lt;/a&gt;We use categories for a few different kinds of content.  Some occur every day, like &lt;a href=&quot;http://metavid.org/wiki/Category:One_Minute_Speech&quot;&gt;One Minute Speeches&lt;/a&gt; in the House.   Others only occur once a year, like &lt;a href=&quot;http://metavid.org/wiki/Category:San_Jacinto_Day&quot;&gt;San Jacinto Day&lt;/a&gt; or &lt;a href=&quot;http://metavid.org/wiki/Category:Earth_Day&quot;&gt;Earth Day&lt;/a&gt;.  Some will be limited to a particular debate, like &lt;a href=&quot;http://metavid.org/wiki/Category:Salt_Marsh_Harvest_Mouse&quot;&gt;Salt Marsh Harvest Mouse&lt;/a&gt;, and others will be relevant to any topic such as &lt;a href=&quot;http://metavid.org/wiki/Category:Great_Poster&quot;&gt;Great Poster&lt;/a&gt;.   There are small categories like &lt;a href=&quot;http://metavid.org/wiki/Category:Global_Warming_Skepticism&quot;&gt;Global Warming Skepticism&lt;/a&gt; and huge categories like &lt;a href=&quot;http://metavid.org/wiki/Category:Opening_Prayer&quot;&gt;Opening Prayer&lt;/a&gt;; serious ones, like &lt;a href=&quot;http://metavid.org/wiki/Category:Remembrance&quot;&gt;Remembrances&lt;/a&gt; and light-hearted ones like &lt;a href=&quot;http://metavid.org/wiki/Category:Quiet_Please&quot;&gt;Quiet Please&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One quality nearly every category shares is incompleteness &amp;#8212; because there is so much content (over 3000 hours) and only a few of us tagging content,  many categories are missing important content.  As you watch speeches on Metavid, spending the extra 5 seconds to categorize them will make them easier to find in the future.   If there&amp;#8217;s a category you find interesting or appealing, feel free to expand it yourself.  If you find a speech and there&amp;#8217;s isn&amp;#8217;t a category that makes sense for it &amp;#8212; start a new one!  &lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;http://metavid.org/wiki/Help:Participation_Quickstart&quot;&gt;this tutorial&lt;/a&gt; for more information about tagging clips.  You can find a list of current media categories &lt;a href=&quot;http://metavid.org/wiki/Category:Media_Categories&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;</content>
		<author>
			<name>Metavid Project</name>
			<uri>http://metavid.org/blog</uri>
		</author>
		<source>
			<title type="html">Metavid Blog</title>
			<subtitle type="html">This Blog covers the metavid project and related politics.</subtitle>
			<link rel="self" href="http://metavid.org/blog/feed/"/>
			<id>http://metavid.org/blog/feed/</id>
			<updated>2009-09-14T19:00:15+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">FOMS 2009: video introductions available</title>
		<link href="http://blog.gingertech.net/2009/05/18/foms-2009-video-introductions-available/"/>
		<id>http://blog.gingertech.net/?p=395</id>
		<updated>2009-05-18T09:34:53+00:00</updated>
		<content type="html">&lt;p&gt;In January this year we had the third Foundations of Open Media software workshop for developers. The focus this year was on legal issues around codecs, Xiph and Web video (HTML5 video and video servers), authoring/editing software, and accessibility. Check out &lt;a href=&quot;http://www.foms-workshop.org/foms2009/pmwiki.php/Main/CommunityGoals&quot;&gt;the complete set of areas of concern and community goals&lt;/a&gt; that we decided upon.&lt;/p&gt;
&lt;p&gt;As every year, at the beginning of the workshop every participant provided a 5 min introduction about their field of speciality and the current challenges. These are video recorded and shared with the community.&lt;/p&gt;
&lt;p&gt;The videos and accompanying slides have been available for about 2 months now, but I haven&amp;#8217;t gotten around to blogging about it &amp;#8211; apologies everyone! So, here are your star videos in reverse alphabetic order published using open source video software only:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.foms-workshop.org/foms2009/pmwiki.php/Main/ViktorGal&quot;&gt;Viktor Gal, Xiph / Annodex liboggplay&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.foms-workshop.org/foms2009/pmwiki.php/Main/TimTerriberry&quot;&gt;Timothy Terriberry, Xiph &amp;#8211; Theora codec&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.foms-workshop.org/foms2009/pmwiki.php/Main/SilviaPfeiffer&quot;&gt;Silvia Pfeiffer, Annodex/Xiph &amp;#8211; video a11y&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.foms-workshop.org/foms2009/pmwiki.php/Main/ShaneStephens&quot;&gt;Shane Stephens, Google &amp;#8211; liboggplaya&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.foms-workshop.org/foms2009/pmwiki.php/Main/RobinGareus&quot;&gt;Robin Gareus, linuxaudio.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.foms-workshop.org/foms2009/pmwiki.php/Main/RobSavoye&quot;&gt;Rob Savoye, Gnash&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.foms-workshop.org/foms2009/pmwiki.php/Main/PeterRoss&quot;&gt;Peter Ross, Xvid &amp;#038; FFMpeg&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.foms-workshop.org/foms2009/pmwiki.php/Main/MichaelDale&quot;&gt;Michael Dale, Wikipedia &amp;#038; Metavid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.foms-workshop.org/foms2009/pmwiki.php/Main/JanGerber&quot;&gt;Jan Gerber, Xiph hacker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.foms-workshop.org/foms2009/pmwiki.php/Main/EdHervey&quot;&gt;Edward Hervey, Collabora &amp;#8211; PiTiVi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.foms-workshop.org/foms2009/pmwiki.php/Main/ConradParker&quot;&gt;Conrad Parker, Annodex/Xiph hacker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.foms-workshop.org/foms2009/pmwiki.php/Main/Chaals&quot;&gt;Charles McCathieNevile, Opera&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.foms-workshop.org/foms2009/pmwiki.php/Main/BenjaminOtte&quot;&gt;Benjamin Otte, swfdec&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.foms-workshop.org/foms2009/pmwiki.php/Main/AnuSuraparaju&quot;&gt;Anuradha Suraparaju, BBC &amp;#8211; Dirac codec&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;</content>
		<author>
			<name>silvia</name>
			<uri>http://blog.gingertech.net</uri>
		</author>
		<source>
			<title type="html">ginger's thoughts</title>
			<subtitle type="html">Silvia's blog</subtitle>
			<link rel="self" href="http://blog.gingertech.net/feed/atom/"/>
			<id>http://blog.gingertech.net/feed/atom/</id>
			<updated>2009-11-01T05:00:09+00:00</updated>
			<rights type="html">Copyright 2008</rights>
		</source>
	</entry>

	<entry>
		<title type="html">Third Party Comment Engines</title>
		<link href="http://www.bluishcoder.co.nz/2009/05/third-party-comment-engines.html"/>
		<id>tag:blogger.com,1999:blog-18561009.post-6302339428723436012</id>
		<updated>2009-05-16T20:24:05+00:00</updated>
		<content type="html">I've been playing around with different commenting engines on &lt;a href=&quot;http://tinyvid.tv&quot;&gt;tinyvid&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Currently I use &lt;a href=&quot;http://intensedebate.com/&quot;&gt;Intense Debate&lt;/a&gt;. An example of a video using this comment system is &lt;a href=&quot;http://tinyvid.tv/show/yka5q2v7221y&quot;&gt;here&lt;/a&gt;. I like this service a lot. You can sign on with &lt;a href=&quot;http://openid.net/&quot;&gt;OpenId&lt;/a&gt;, the moderation tools are good and it seems to be generally reliable.&lt;br /&gt;&lt;br /&gt;Intense Debate has support for plugins that anyone can write. Potentially I could write a video plugin that allowed embedding &amp;lt;video&gt; into comments for example.&lt;br /&gt;&lt;br /&gt;But it does have some issues. Sometimes comments don't seem to appear in the right order. I'll get an email that a comment was left, visit the page, and it's nowhere. Somehow it gets buried amongst other older comments. This started happening when I switched the ordering of the comments to have the most recent comment at the top.&lt;br /&gt;&lt;br /&gt;Sometimes, depending on the content of your comment, the engine gets confused and the comment is scrambled. This seems to happen if I edit a comment that has a URL in it. It converts the URL to an HTML &amp;lt;a href/&gt; and when editing and saving seems to reconvert, or do some weirdness with it. I've lost comments through this. Long comments can get silently truncated or trashed.&lt;br /&gt;&lt;br /&gt;I set up tinyvid so I can easily add different comment engines and switch them on and off for individual videos for testing. I recently tried &lt;a href=&quot;http://js-kit.com/&quot;&gt;js-kit&lt;/a&gt;. An example of video with js-kit comments for testing is &lt;a href=&quot;http://tinyvid.tv/show/1odneot3p3d2a&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I like js-kit too. I'm using their 'rating' widget and that seems to work nicely. The comments are ok too. You can sign in with OpenId. But there is some weirdness there. If I sign in using OpenId, leave a comment, then revisit the page later, then the comments don't appear. I have to delete the js-kit cookie to have them appear again.&lt;br /&gt;&lt;br /&gt;There is a limit to the size of the comments, similar in size to Intense Debate's, of 3,000 characters. I suspect this limit isn't a problem in practice however.&lt;br /&gt;&lt;br /&gt;There's a lot to like about js-kit, apart from the OpenId issue, but I need to try it out a bit more to see what other issues it has.&lt;br /&gt;&lt;br /&gt;The last one I tried was &lt;a href=&quot;http://disqus.com/home/&quot;&gt;Disqus&lt;/a&gt;. Example &lt;a href=&quot;http://tinyvid.tv/show/2pmbfowazuyds&quot;&gt;here&lt;/a&gt;. The Disqus site lets you register using OpenId. However you can't login to leave a comment using OpenId. You must login using a Disqus Id that gets assigned to you when you've registered.&lt;br /&gt;&lt;br /&gt;When I registered using OpenId, then tried to login to leave a comment it requested a password. I had to go back to the Disqus site, change my profile to add a password. This seems sub-optimal since the point of me using OpenId is to avoid multiple passwords and accounts.&lt;br /&gt;&lt;br /&gt;Disqus requires anonymous posters to leave a valid email address. I couldn't find a way to turn this option off. I'm sure this will just result in people leaving bogus email addresses.&lt;br /&gt;&lt;br /&gt;One step of the Disqus setup requires adding a script block to the page that does document.write. This won't work on XHTML sites. And I dislike document.write usage in general. Thankfully this step appears optional. It's for converting marked up items in the page to a comment count.&lt;br /&gt;&lt;br /&gt;After leaving a comment Disqus does a full page refresh. This unfortunately results in the video on the page restarting and reloading.&lt;br /&gt;&lt;br /&gt;Apart from those issues Disqus seemed quite nice. Simple to set up and configurable.&lt;br /&gt;&lt;br /&gt;So the end result is I'm not sure which is best. I'll play around with them for a bit more and get feedback. Are there any other's worth trying?&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;technoratitag&quot;&gt;Categories: &lt;a href=&quot;http://del.icio.us/bluishcoder/tinyvid&quot; rel=&quot;tag&quot;&gt;tinyvid&lt;/a&gt;&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/18561009-6302339428723436012?l=www.bluishcoder.co.nz%2Findex.html&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Chris Double</name>
			<email>noreply@blogger.com</email>
			<uri>http://www.bluishcoder.co.nz/</uri>
		</author>
		<source>
			<title type="html">Bluish Coder</title>
			<subtitle type="html">Programming Languages, Martial Arts and Computers. The Weblog of Chris Double.</subtitle>
			<link rel="self" href="http://www.bluishcoder.co.nz/atom.xml"/>
			<id>tag:blogger.com,1999:blog-18561009</id>
			<updated>2009-10-27T13:00:44+00:00</updated>
		</source>
	</entry>

</feed>
