<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 12 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Helvetica;
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p
        {mso-style-priority:99;
        mso-margin-top-alt:auto;
        margin-right:0cm;
        mso-margin-bottom-alt:auto;
        margin-left:0cm;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0cm;
        margin-right:0cm;
        margin-bottom:0cm;
        margin-left:36.0pt;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
span.apple-style-span
        {mso-style-name:apple-style-span;}
span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:1753425451;
        mso-list-type:hybrid;
        mso-list-template-ids:1284003062 134807567 134807577 134807579 134807567 134807577 134807579 134807567 134807577 134807579;}
@list l0:level1
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-18.0pt;}
ol
        {margin-bottom:0cm;}
ul
        {margin-bottom:0cm;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-GB" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Hi Ross,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Thanks for taking the time to consider my requests.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">I understand your wish to support IETF standards primarily and I take the hint about not ‘for free’ (that may be an option).<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Yes, ONVIF have added some extensions to achieve their goals. My understanding is that these extensions are allowed by the SDP and RTP standards. In case you
 are interested, I believe the ONVIF objective is to represent a set of non-contiguous media clips as a single container (a bit like a VOB but without the continuity of chapters). Imagine two video clips with duration T1 to T2 and T3 to T4 then the SDP would
 return a duration of T4-T1. During replay, the RTP timestamp header extension is used to indicate to the client the discontinuity at the T2 to T3 boundary. I don’t think it’s intended for human viewing in a player but for transfer of recordings from a camera
 to an archiver. I think this uses a valid timestamp header extension of the RTP spec but “bends” the SDP specification as it is not envisaged but not forbidden. However it is an unusual use case so is probably not of interest to the majority of LIVE555 stakeholders.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">In response to your specific points:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoListParagraph" style="text-indent:-18.0pt;mso-list:l0 level1 lfo1"><![if !supportLists]><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><span style="mso-list:Ignore">1.<span style="font:7.0pt "Times New Roman"">      
</span></span></span><![endif]><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">I think the ability of being able to add session level attributes of the form “a=x-“ might well be useful to some people. As described above, it was
 not my objective but I can achieve that in other ways e.g subclassing the DESCRIBE handler which is already virtual although it is a bit more clunky. Thanks for considering it.<o:p></o:p></span></p>
<p class="MsoListParagraph" style="text-indent:-18.0pt;mso-list:l0 level1 lfo1"><![if !supportLists]><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><span style="mso-list:Ignore">2.<span style="font:7.0pt "Times New Roman"">      
</span></span></span><![endif]><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Here I was trying to work around the assumption that the session duration is the maximum of the subsessions. Yes indeed I was trying to return a duration
 for the entire collection i.e. T4-T1 in my example. I don’t think this violates SDP but I can understand if you think it does and don’t want to allow subclassing.<o:p></o:p></span></p>
<p class="MsoListParagraph" style="text-indent:-18.0pt;mso-list:l0 level1 lfo1"><![if !supportLists]><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><span style="mso-list:Ignore">3.<span style="font:7.0pt "Times New Roman"">      
</span></span></span><![endif]><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">This was to handle a quirk of the ONVIF spec that wants each track enumerated with a special attribute e.g. video tracks get a=x-onvif-track:VIDEO001,
 002, ... and audio tracks get a=x-onvif-track:AUDIO001, 002, ... and so forth. To me it seems a complete waste of effort since an SDP parser can easily work this out from the media level blocks following the session level lines. But I didn’t write the spec,
 just the poor guy trying to comply with it. </span><span style="font-size:11.0pt;font-family:Wingdings;color:#1F497D">L</span><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> I know the subsessions are already virtual but by
 appending it in the ServerMediaSession I didn’t have to add it for each type of video and audio subsession class in use.<o:p></o:p></span></p>
<p class="MsoListParagraph" style="text-indent:-18.0pt;mso-list:l0 level1 lfo1"><![if !supportLists]><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><span style="mso-list:Ignore">4.<span style="font:7.0pt "Times New Roman"">      
</span></span></span><![endif]><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">This was always a completely different problem domain to 1, 2 & 3. Thanks for adding that, I think it will be useful to everyone.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">As you suggest, I can make changes under the LGPL but just thought I would check first whether you wanted to adopt any of them.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Again thanks for taking the time to consider my request.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Kind Regards,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Mike Brimer<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Oncam Grandeye<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> live-devel-bounces@ns.live555.com [mailto:live-devel-bounces@ns.live555.com]
<b>On Behalf Of </b>Ross Finlayson<br>
<b>Sent:</b> 20 February 2014 17:39<br>
<b>To:</b> LIVE555 Streaming Media - development & use<br>
<b>Subject:</b> Re: [Live-devel] Changes to make it easier to subclass ServerMediaSession and set packet buffer size<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">Michael,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">To begin with, it's important to note that 'ONVIF' is an industry consortium (and one that Live Networks, Inc. does not belong to) - not a standards organization.  The relevant standards organization here (the one that we belong to, and
 whose specifications we try to adhere to) is the IETF.  For the most part, 'ONVIF standards' are really just IETF standards that they have referenced 'as is'; in this case, we will try to support them ourselves.  In some cases, however, 'ONVIF' may have made
 their own changes to SDP (or other IETF standards), without describing them in an IETF RFC or Internet-Draft; in that case, I feel no compulsion to support them in the "LIVE555 Streaming Media" software (and certainly not 'for free').<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<div>
<p class="MsoNormal">But having said that, let's look at each of the specific changes that you requested:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif"">1. ServerMediaSession::generateSDPDescription() becomes a virtual method. Allows subclass to generate the SDP description in an independent manner e.g. database lookup.<o:p></o:p></span></p>
</div>
</div>
</div>
</blockquote>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<p class="MsoNormal">The reason I can't do this is that the existing "generateSDPDescription()" code is important.  It explicitly generates 'session-level' SDP lines, followed by 'media-level' SDP lines for each "ServerMediaSubsession" - by calling "sdpLines()"
 (which, BTW, *is* a virtual function) on each subsession.  If I were to make it possible for subclasses to completely replace this code, then there's no guarantee that the resulting SDP would be (1) standards compliant, and (2) in a form that would allow a
 client to properly operate on the session/subsessions.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">However, what I *might* do - sometime in the future - is provide a mechanism to allow developers to add their own 'session-level' attributes (i.e., beginning with "a=x-") to a SDP description.  Perhaps that would give you what you want
 here??<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><br>
<br>
<o:p></o:p></p>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif""> 2. ServerMediaSession::duration() becomes a virtual method. Allows subclass to generate the duration in an independent manner e.g. database lookup.<o:p></o:p></span></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Note that "ServerMedia*Sub*session::duration()" is already a virtual function, so your "ServerMediaSubsession" subclasses can redefine "duration()" to return whatever you want.  But the existing "ServerMediaSession::duration()" code is
 important (although admittedly a bit 'hacky'), and the code in several places makes assumptions about how "ServerMediaSession::duration()" works (basically, by returning the maximum of all the subsession "duration()"s, along with an indication of whether or
 not the subsession "duration()"s differ).  So it can't be changed arbitrarily.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Note that the child "ServerMediaSubsession"s are assumed to be 'concurrent' tracks within the parent "ServerMediaSession", so that the "duration()" of the parent is simply the maximum of the "duration()" of the children.  I hope you're
 not proposing that media-level SDP lines (i.e., generated from "ServerMediaSubsession"s) within a SDP description mean something different that this.  That's certainly not something that I could support, because that would be a non-standard interpretation
 of SDP (unless the SDP description also includes some IETF-defined 'grouping' mechanism that indicates otherwise).<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif""> 3. Add a virtual method called ServerMediaSession::mediaSdpLines() and modify the implementation of ServerMediaSession::generateSDPDescription() to call mediaSdpLines()
 instead of calling subsession->sdpLines() directly.<o:p></o:p></span></p>
</div>
</div>
</blockquote>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<p class="MsoNormal">This seems unnecessary, because "ServerMediaSubsession::sdpLines()" is already a virtual function.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><br>
<br>
<o:p></o:p></p>
<div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif"">4. Modify MatroskaFile::createSourceForStreaming() implementation to check for larger values of OutPacketBuffer::maxSize before setting 300000 value. Allows server instantiation
 to set a larger value without it being ignored. With a full field-of-view I'm seeing a few warning messages being emitted during replay and therefore a larger value than 300000 is recommended.<o:p></o:p></span></p>
</div>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<p class="MsoNormal">Yes, this is a good point.  What I'll do (in the next release of the software) is define a new function "OutPacketBuffer::increaseMaxSizeTo(unsigned)" that doesn't change "OutPacketBuffer::maxSize" if it's already less than the specified
 value - and then change "MatroskaFile::createSourceForStreaming()" to call this new function instead.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Needless to say, you are, of course, welcome to make whatever changes you want to your own copy of the code, provided that - in doing so - you comply with the LGPL; see
<a href="http://www.live555.com/liveMedia/faq.html#copyright-and-license">http://www.live555.com/liveMedia/faq.html#copyright-and-license</a><o:p></o:p></p>
</div>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal"><span class="apple-style-span"><span style="font-family:"Helvetica","sans-serif";color:black">Ross Finlayson</span></span><span style="font-family:"Helvetica","sans-serif";color:black"><br>
<span class="apple-style-span">Live Networks, Inc.</span><br>
<span class="apple-style-span"><a href="http://www.live555.com/">http://www.live555.com/</a></span></span>
<o:p></o:p></p>
</div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><br>
<br>
<span style="background:white"><o:p></o:p></span></p>
<p align="center" style="text-align:center"><span style="background:white">Click <a href="https://www.mailcontrol.com/sr/MZbqvYs5QwJvpeaetUwhCQ==">
here</a> to report this email as spam.<o:p></o:p></span></p>
</div>
<br><br>
<P align=center><FONT style="BACKGROUND-COLOR: #ffffff">This message has been scanned for malware by Websense.  </FONT><A href="http://www.websense.com/"><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>www.websense.com</FONT></A></P>
</body>
</html>