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

<channel>
	<title>robert.swain &#187; Collabora</title>
	<atom:link href="http://rob.opendot.cl/index.php/category/work/collabora/feed/" rel="self" type="application/rss+xml" />
	<link>http://rob.opendot.cl</link>
	<description>stuff about me, what i do and some other hopefully useful stuff</description>
	<lastBuildDate>Tue, 06 Apr 2010 13:58:11 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>more progressive downloading</title>
		<link>http://rob.opendot.cl/index.php/2010/02/24/more-progressive-downloading/</link>
		<comments>http://rob.opendot.cl/index.php/2010/02/24/more-progressive-downloading/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 07:55:18 +0000</pubDate>
		<dc:creator>rob</dc:creator>
				<category><![CDATA[Collabora]]></category>
		<category><![CDATA[GStreamer]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[multimedia]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://rob.opendot.cl/?p=228</guid>
		<description><![CDATA[Since my last post I have worked on applying a similar approach of making HTTP range requests to obtain indexes necessary for seeking in the Flash Video format version 1 (&#8216;old&#8217; FLV, if you will) and AVI (both legacy and  &#8230; <a href="http://rob.opendot.cl/index.php/2010/02/24/more-progressive-downloading/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Since my <a href="http://rob.opendot.cl/index.php/2010/01/17/working-hard/">last post</a> I have worked on applying a similar approach of making HTTP range requests to obtain indexes necessary for seeking in the Flash Video format version 1 (&#8216;old&#8217; FLV, if you will) and AVI (both legacy and ODML) in GStreamer.</p>
<p>Legacy AVI was fairly straightforward as we only need to do one seek to get the index. ODML AVI was somewhat messy because we had to perform multiple seeks as there can be multiple indexes spread across the file. As such, within the GStreamer framework, we have to handle the multiple seeks in the streaming thread rather than in the seek thread as we might prefer. This is because we cannot block the seek thread.</p>
<p>Check out the head commit of git master or the next release of GStreamer to try out this work. If you find bugs, file them on bugzilla as normal for GStreamer. <img src='http://rob.opendot.cl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://rob.opendot.cl/index.php/2010/02/24/more-progressive-downloading/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>working hard</title>
		<link>http://rob.opendot.cl/index.php/2010/01/17/working-hard/</link>
		<comments>http://rob.opendot.cl/index.php/2010/01/17/working-hard/#comments</comments>
		<pubDate>Sun, 17 Jan 2010 13:03:01 +0000</pubDate>
		<dc:creator>rob</dc:creator>
				<category><![CDATA[Collabora]]></category>
		<category><![CDATA[GStreamer]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[multimedia]]></category>
		<category><![CDATA[qtdemux]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://rob.opendot.cl/?p=216</guid>
		<description><![CDATA[Progressive download with seek support for mov/mp4/3gp files in GStreamer. <a href="http://rob.opendot.cl/index.php/2010/01/17/working-hard/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>So, I&#8217;ve been rather busy again over the past months and have not had time to blog. However, as I&#8217;ve been busy I have things to blog about! <img src='http://rob.opendot.cl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>I have been working for <a href="http://www.collabora.co.uk/about/multimedia/">Collabora Multimedia</a> since October. It&#8217;s been challenging, interesting, rewarding and definitely very enjoyable. They&#8217;re a fun bunch to work with.</p>
<p>Most of my previous experience has been with codecs, but I have been working on demuxers since joining the company. I also didn&#8217;t really have any prior experience with multi-threaded code and <a href="http://gstreamer.freedesktop.org/">GStreamer</a> certainly is. As such, debugging has been more difficult than usual but I&#8217;m seeing potential issues in code before I hit them now, so that&#8217;s progress.</p>
<p>I&#8217;ve been working on <strong>progressive download support for mov/mp4/3gp in GStreamer</strong>. The changes were pushed into the master branch not too long ago and I welcome testing of the code and filing of bug reports for any issues you encounter.</p>
<p>The feature was both engaging and problematic to implement. Support for progressive download required a new concept in GStreamer (though I didn&#8217;t know that when I started <img src='http://rob.opendot.cl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ) &#8211; <strong>seeking in push mode</strong>. &#8216;What is push mode?&#8217; you might ask&#8230;</p>
<p>A GStreamer element has the possibility to support one or both of <strong>pull</strong> and <strong>push</strong> modes. Elements are modules that fit together to make up a &#8216;pipeline&#8217; e.g. an element might be a file source, demuxer, decoder, scaler, volume normaliser, encoder, muxer, file sink, etc..</p>
<p>In <strong>pull mode</strong>, the element is allowed to seek around as much as it likes. Reads do not have to be contiguous and consecutive because the data from upstream is available with <strong>random access</strong>. This works just fine for locally stored files for example where seeks are relatively cheap.</p>
<p>In <strong>push mode</strong>, the data is received contiguously and consecutively &#8211; like a <strong>stream</strong>. Imagine streaming a live radio broadcast &#8211; the data comes when it comes and without some cache of the stream somewhere, you can&#8217;t seek backwards and you certainly can&#8217;t seek forwards to data that does not yet exist.</p>
<p>Now, for progressive download (think YouTube) a file is stored on an HTTP server. One wishes to view the file as quickly as possible after requesting to start playing. <strong>mov/mp4/3gp files often have the information necessary to begin playing stored at the end of the file.</strong> These formats are handled by the qtdemux element in GStreamer.</p>
<p>This is a problem. Normally, to get the data from the end of the file, <strong>one would have to wait for the entire file to download</strong>, storing the data locally on the playback device, then reading the data from the end of the file and commencing playback. It should be clear that <strong>for any file of significant size compared to the downstream bandwidth available, this approach is slow</strong>. Also, on many devices, it may not be possible to store all that data locally. And finally, there was a limit in qtdemux push mode that if this data was outside the first 10MB, we would abort. I assume this was to avoid the above-mentioned issues.</p>
<p>Thankfully, HTTP servers often support &#8216;range requests&#8217; &#8211; asking for data starting and ending at certain byte offsets. We can locate the byte offset of the data necessary to begin playing the file, <strong>use a range request to obtain the data</strong> (this is a push mode seek!), parse the information and begin playing. This requires much less data upfront and so allows for much faster start up without having to perform too many seeks (which HTTP servers don&#8217;t really like&#8230;).</p>
<p>But then we want full functionality when playing a stream from some push mode source that doesn&#8217;t allow random access like an HTTP server. <strong>We want to be able to seek</strong> around in the stream to go to the point that we want to watch/hear.</p>
<p>Most container formats have some form of seek index that allows translation of a time position into a byte offset in the file/stream. <strong>For mov/mp4/3gp, this information is amongst the same data that we obtained to begin playing the file in the first instance.</strong> So, if a seek request to 10 minutes 31 seconds is made, we can <strong>build the index from said data</strong>, translate the seek time stamp into a byte offset and push the byte offset seek request upstream to the source element. And then&#8230; voila! <strong>Progressive download with seek support.</strong></p>
<p>It should be noted that this method will only work for HTTP servers supporting range requests.</p>
<p>Of course, better would be for all files intended for distribution over the web to have all information necessary to play at the beginning, or failing that, that all HTTP servers support unlimited range requests and trust that software obtaining data from them does not abuse that privilege.</p>
]]></content:encoded>
			<wfw:commentRss>http://rob.opendot.cl/index.php/2010/01/17/working-hard/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A wedding, OpenKvarken, ffmpeg-mt, Collabora</title>
		<link>http://rob.opendot.cl/index.php/2009/10/13/a-wedding-openkvarken-ffmpeg-mt-collabora/</link>
		<comments>http://rob.opendot.cl/index.php/2009/10/13/a-wedding-openkvarken-ffmpeg-mt-collabora/#comments</comments>
		<pubDate>Tue, 13 Oct 2009 18:34:41 +0000</pubDate>
		<dc:creator>rob</dc:creator>
				<category><![CDATA[AAC]]></category>
		<category><![CDATA[Collabora]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[ffmpeg]]></category>
		<category><![CDATA[multimedia]]></category>
		<category><![CDATA[technology]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://rob.opendot.cl/?p=207</guid>
		<description><![CDATA[Well, I&#8217;ve been quite busy over the past months, despite my lack of blog posts.
My brother got married.
FFmpeg finally has channel layout support for AAC and Vorbis. I&#8217;ve published my work-in-progress HE AAC v1 (Spectral Band Replication) code in FFmpeg&#8217;s  &#8230; <a href="http://rob.opendot.cl/index.php/2009/10/13/a-wedding-openkvarken-ffmpeg-mt-collabora/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Well, I&#8217;ve been quite busy over the past months, despite my lack of blog posts.</p>
<p>My brother got married.</p>
<p>FFmpeg finally has channel layout support for AAC and Vorbis. I&#8217;ve published my work-in-progress HE AAC v1 (Spectral Band Replication) code in FFmpeg&#8217;s Summer of Code repository (though it has nothing to do with Google SoC).</p>
<p>A collaboration focused on open source software between two universities in <a href="http://ucoss.se/">Umeå, Sweden</a> and <a href="http://vcoss.fi/">Vaasa, Finland</a> called <a href="http://openkvarken.fi/">OpenKvarken</a> held a <a href="http://openkvarken.fi/?q=content/seminar-5">seminar</a> about VoIP and related technologies. I did two talks there titled: <em>An Open Standard IPTV Implementation in MythTV</em> and <em>Improving FFmpeg for High Definition Video Conferencing</em>.</p>
<p>The latter refers to <a href="http://gitorious.org/ffmpeg/ffmpeg-mt">ffmpeg-mt</a> &#8211; multi-threaded decoding for macroblock-based codecs as developed by Alexander Strange. OpenKvarken should be funding the merge of this code into FFmpeg trunk.</p>
<p>I should be getting a new job with <a href="http://www.collabora.co.uk/">Collabora</a> working to improve the quality of open source multimedia on the whole. It&#8217;s a very exciting venture for me and it may lead to more regular blog posts. <img src='http://rob.opendot.cl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://rob.opendot.cl/index.php/2009/10/13/a-wedding-openkvarken-ffmpeg-mt-collabora/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
