<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii">
<META NAME="Generator" CONTENT="MS Exchange Server version 6.5.7234.20">
<TITLE>H263 over RTP</TITLE>
</HEAD>
<BODY>
<!-- Converted from text/rtf format -->

<P><FONT SIZE=2 FACE="Arial">All,</FONT>

<BR><FONT SIZE=2 FACE="Arial">If anyone is interested I have managed to get VLC to playback file based H263 video remotely over RTP (as a non-encapsulated elementary stream).</FONT></P>

<P><FONT SIZE=2 FACE="Arial">I had trouble getting this to work as I couldn't figure out how to transpose the file based H263 records into RFC4629 RTP packets. I finally managed to reverse engineer to live555 code (which includes an H263 streamer module) and this is what u have to do:</FONT></P>

<P><FONT SIZE=2 FACE="Arial">Many thanks to Ross Finlayson BTW who prodded me in the right direction several times...</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial">The following does not detail all the RTP field setups as they are not crucial to getting this to work, things like sequence number and time stamps are taken as read…</FONT></P>

<P><FONT SIZE=2 FACE="Arial">1. Read 5 bytes first (from file based H263 data) , this gives you a starting frame of reference.</FONT>

<BR><FONT SIZE=2 FACE="Arial">    Create 1st RTP packet and set the M bit to 1</FONT>

<BR><FONT SIZE=2 FACE="Arial">    Create and add to RTP payload the 2 byte H263 header and set the P bit to 1 (zero rest out)</FONT>

<BR><FONT SIZE=2 FACE="Arial">   </FONT>

<BR><FONT SIZE=2 FACE="Arial">    copy the 5 byte record  into the RTP payload body (after the H263 header).</FONT>

<BR><FONT SIZE=2 FACE="Arial"> </FONT>

<BR><FONT SIZE=2 FACE="Arial">    Send it </FONT>
</P>

<P><FONT SIZE=2 FACE="Arial">2. Read as much as u can from file without blowing your MTU , in my case this is 1500 so I chose 1436 (like the live555 code)</FONT></P>

<P><FONT SIZE=2 FACE="Arial">    Create new RTP packet + new 2 byte H263 header</FONT>

<BR><FONT SIZE=2 FACE="Arial">    Scan newly read in H263 record for occurance of end of frame marker - this is two consectutive bytes of zeros (00 00).</FONT></P>

<P>        

<BR><FONT SIZE=2 FACE="Arial">    pseudo code follows:</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial">     IF eof frame marker found:</FONT>

<BR><FONT SIZE=2 FACE="Arial">               This record contains an end of frame so set the RTP M bit to 1 and  set the H263 header P bit to 0, then copy to RTP payload (after H263 header) </FONT></P>

<P>        <FONT SIZE=2 FACE="Arial">    the record data  up to but NOT including the "0000". Store remainder in temp.</FONT>

<BR>        <FONT SIZE=2 FACE="Arial">    The next record read will therefore be a new start of frame.</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial">    IF eof frame marker not found:</FONT>

<BR><FONT SIZE=2 FACE="Arial">               IF previous record read contained an end of frame marker</FONT>

<BR><FONT SIZE=2 FACE="Arial">                           prefix the this packet with any remainder stored in temp and set the P bit to 1 </FONT>

<BR><FONT SIZE=2 FACE="Arial">                           and the M bit to 0.          </FONT>

<BR><FONT SIZE=2 FACE="Arial">                           Need to make sure at this point that we don't blow the MTU.</FONT>

<BR><FONT SIZE=2 FACE="Arial">               ELSE</FONT>

<BR><FONT SIZE=2 FACE="Arial">                           Set RTP M bit to 0 and H263 P bit to 0 and copy whole record into RTP payload(after the H263 header).</FONT></P>

<P><FONT SIZE=2 FACE="Arial">    Send it !</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial">3. Repeat 2 until EOF</FONT>
</P>
<BR>

<P><FONT SIZE=2 FACE="Arial">To get a remote vlc to read this stream, create an sdp file like this</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial"> v=0</FONT>

<BR><FONT SIZE=2 FACE="Arial">o=- 7776 3 IN IP4 10.215.130.112</FONT>

<BR><FONT SIZE=2 FACE="Arial">s=Test H263 stream</FONT>

<BR><FONT SIZE=2 FACE="Arial">i=Parameters for the session streamed by "ChipsAhoyH263"</FONT>

<BR><FONT SIZE=2 FACE="Arial">t=0 0</FONT>

<BR><FONT SIZE=2 FACE="Arial">m=video 7776 RTP/AVP 98</FONT>

<BR><FONT SIZE=2 FACE="Arial">a=rtpmap:98 H263-1998/90000</FONT>

<BR><FONT SIZE=2 FACE="Arial">a=fmtp:98 profile=0; level=40</FONT>

<BR><FONT SIZE=2 FACE="Arial">b=TIAS:2048000 </FONT>
</P>
<BR>

<P><FONT SIZE=2 FACE="Arial">Where 7776 is the port you are streaming out to from above steps.</FONT>

<BR><FONT SIZE=2 FACE="Arial">Save as say c:\testH263.sdp</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial">Start vlc like this:</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial">Vlc -vvv </FONT><A HREF="file://c:\testH263.sdp"><U><FONT COLOR="#0000FF" SIZE=2 FACE="Arial">file://c:\testH263.sdp</FONT></U></A>
</P>
<BR>

<P><FONT SIZE=2 FACE="Arial">Start the stream and u should see video.</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial">I guess I should have figured all this out from the various RFC's but to actually implement was not exactly straightforward - no where could I find info on how to look for the end of frame marker ("0000") which is the key to the whole thing! </FONT></P>

<P><FONT SIZE=2 FACE="Arial">Hope this helps as it drove me nuts...</FONT>

<BR><FONT SIZE=2 FACE="Arial">-Chris</FONT>
</P>

</BODY>
</HTML>