<p>From: Ross Finlayson &lt;<a href="mailto:finlayson@live555.com" target="_blank">finlayson@live555.com</a>&gt;<br>To: LIVE555 Streaming Media - development &amp; use &lt;<a href="mailto:live-devel@ns.live555.com" target="_blank">live-devel@ns.live555.com</a>&gt;<br>
Date: Wed, 19 Mar 2008 23:18:49 -0700<br>Subject: Re: [Live-devel] live 555 rtsp library for mplayer<br>&gt;&gt;When you stream audio over live-555&#39;s RTSP plugin&nbsp; on mplayer, what<br>&gt;&gt;decides the<br>&gt;&gt;audio data to be big endian vs little endian?</p>

<p>&gt;16-bit PCM audio data - when streamed using RTP using an<br>&gt;IETF-standard RTP payload format - is *always* in Big Endian order<br>&gt;(called &quot;Network Byte Order&quot; in the RFCs).&nbsp; That&#39;s the standard[*].</p>

<div>I am developing the server for an embedded device, I was hoping I could avoid that but alas!</div>
<div>It sucks that mplayer code actually support a whole slew of combinations (any of the </div>
<div>types specified in&nbsp;file&nbsp;ad_pcm.c, function static int init(sh_audio_t *sh_audio). The code<br>checks sh_audio-&gt;format&nbsp; to&nbsp; match a data format, in order for data to be 16 bit, little endian </div>
<div>it has to be one of these formats: &#39;sowt&#39; (0x74776F73)&nbsp;, 0x0, 0x1, 0xfffe .</div>
<div>If I could soecify a string for&nbsp;that would falll into one of these cases, I wouldve been</div>
<div>in good shape.</div>
<div><br>&gt;&gt;I am developing a server and I am<br>&gt;&gt;specifying the format as 97 (dynamic format) with rtpmap being : 96 L16/8000<br>&gt;&gt;for single channel, 16 bit/sample, 8 khz sample rate audio. But<br>&gt;&gt;mplayer somehow<br>
&gt;&gt;thinks audio data is in&nbsp; big endian format and attaches a BE -&gt; LE<br>&gt;&gt;conversion filter</div>
<div>&nbsp;</div>
<div>&gt;It is correct; your server is not.&nbsp; If your server&#39;s PCM data is<br>&gt;originally in Little Endian order, then you need to insert a LE-&gt;BE<br>&gt;filter in your server.&nbsp; If you are using our libraries to build your<br>
&gt;server, then this involves just inserting a &quot;EndianSwap16&quot; filter<br>&gt;object in front of your &quot;SimpleRTPSink&quot;.&nbsp; (If you are streaming from<br>&gt;WAV audio files, then you could just use the<br>
&gt;&quot;WAVAudioFileServerMediaSubsession&quot; class, which does this for you.<br>&gt;Note also our &quot;LIVE555 Media Server&quot;, which can stream &quot;.wav&quot; audio<br>&gt;files.)</div>
<div>&nbsp;</div>
<div>I am not using live555 libraries because of the light weight&nbsp;requirement of </div>
<div>this project, so&nbsp;I need to come up with an optimized version of the byte&nbsp;</div>
<div>swaper.&nbsp;I wonder if there would be a way to read the data backwards from </div>
<div>the A/D that we use for audio.</div>
<div><br>&gt;[*] The reason for this is that IETF protocol standards began in an<br>&gt;era when most computers on the Internet were Big Endian computers<br>&gt;like Sun workstations (which originally used the Motorola 68xxx<br>
&gt;architecture).&nbsp; Back then, computers that used the (Little Endian)<br>&gt;Intel 8086 architecture were (generally speaking) too underpowered to<br>&gt;be used as Internet nodes.&nbsp; If we had known back then that the x86<br>
&gt;architecture would come to dominate the industry, then perhaps things<br>&gt;would have been done differently....</div>
<div>&nbsp;</div>
<div>The standards definitely lack today&#39;s computing and multimedia needs.</div>
<div>I was looking at the rfc for media specification - the fourcc and character</div>
<div>based&nbsp;&nbsp;stream identification all&nbsp;sleems like a joke to me ..they need&nbsp;new</div>
<div>revisions like many other rfc&#39;s.</div>
<div>&nbsp;</div>
<div>Ratin&nbsp;&nbsp;</div>
<div>&nbsp;</div>
<div>Ross Finlayson<br>Live Networks, Inc.<br><a href="http://www.live555.com/" target="_blank">http://www.live555.com/</a></div>