<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <meta http-equiv="Content-Style-Type" content="text/css" />
  <meta name="generator" content="pandoc" />
  <title></title>
  <style type="text/css">code{white-space: pre;}</style>
</head>
<body>
<p>Hi Steve,</p>
<p>On 2016-11-02 11:39, Steve Lhomme wrote:</p>
<blockquote style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;color:#500050">
<pre><code> As I said, the already merge change is wrong. Non-finite streams
 should be treated as finite streams when it comes to the duration, so
 long as we know the file end (I suppose STREAM_CAN_FASTSEEK implies
 that).</code></pre>
</blockquote>
<p>I do not agree to this, which you know.</p>
<blockquote style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;color:#500050">
<pre><code> But why is it OK with a file with missing/bogus Cues then ? This is
 the exact same code that will try to find the duration.

 Now I'm beginning to see a difference though. If one (and probably
 all) Cluster has no known size we need to parse all elements/Blocks of
 that Cluster. Whereas for a finite size Cluster we just skip over that
 Cluster until we find no Cluster. That's a lot less skipping and
 header reading.

 So I agree that for non-finite Clusters we should not try too hard.
 But that decision should be made in EnsureDuration(). Because if the
 Cues is present we don't have to do that huge data parsing.</code></pre>
</blockquote>
<p>Precisely my point from the beginning (though not where to have the decision take place - that is something I (now) agree with), there is a huge difference between knowing the cluster size (meaning that we can jump to the next one directly), and walking through the entire thing (scanning for the end).</p>
<blockquote style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;color:#500050">
<pre><code> It makes sense than a live Matroska recorder would keep track of where
 it wrote each Cluster and write a Cues at the end, making the file a
 lot easier to seek.

 How about the attached patch ?</code></pre>
</blockquote>
<ul>
<li><p>If one really want to make sure that things behave as I have been trying to explain, one should add a check for non-finite cluster in the while-predicate, inside the if-block modified by your patch, and abort computation if such is discovered.</p></li>
<li><p>The branch to locate the last cluster should be taken even if we have cues that have populated <code>_seeker._cluster_positions</code> (because there is nothing saying that the last entry in the <code>_seeker</code> corresponds to the last cluster in the file (broken or missing cues)).</p></li>
</ul>
<p>Other than the above, LGTM.</p>
</body>
</html>