gnash-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gnash-commit] gnash ChangeLog doc/C/amf.xml doc/C/appendix.xm...


From: Rob Savoye
Subject: [Gnash-commit] gnash ChangeLog doc/C/amf.xml doc/C/appendix.xm...
Date: Tue, 15 Aug 2006 05:07:34 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Rob Savoye <rsavoye>    06/08/15 05:07:34

Modified files:
        .              : ChangeLog 
        doc/C          : amf.xml appendix.xml gnash.xml rtmp.xml 

Log message:
                * doc/C/rtmp.xml: Add RTMP chapter with graphic of the RTMP
                protocol.
                * doc/C/gnash.xml: Add entity for rtmp.xml.
                * doc/C/Makefile.am: Add rtmp.xml.
                * doc/C/amf.xml: Rewrite AMF chapter now that I understand how 
it
                really works.
                * doc/C/appendix.xml: Replace AMF chapter with RTMP one. Make 
AMF
                chapter a sub section of the RTMP one.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.645&r2=1.646
http://cvs.savannah.gnu.org/viewcvs/gnash/doc/C/amf.xml?cvsroot=gnash&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/gnash/doc/C/appendix.xml?cvsroot=gnash&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/gnash/doc/C/gnash.xml?cvsroot=gnash&r1=1.23&r2=1.24
http://cvs.savannah.gnu.org/viewcvs/gnash/doc/C/rtmp.xml?cvsroot=gnash&r1=1.1&r2=1.2

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.645
retrieving revision 1.646
diff -u -b -r1.645 -r1.646
--- ChangeLog   14 Aug 2006 23:16:57 -0000      1.645
+++ ChangeLog   15 Aug 2006 05:07:33 -0000      1.646
@@ -19,6 +19,13 @@
 
 2006-08-14  Rob Savoye  <address@hidden>
 
+       * doc/C/rtmp.xml: Add RTMP chapter with graphic of the RTMP
+       protocol.
+       * doc/C/gnash.xml: Add entity for rtmp.xml.
+       * doc/C/Makefile.am: Add rtmp.xml.
+       * doc/C/amf.xml: Rewrite AMF chapter now that I understand how it
+       really works.
+
        * macros/atk.m4: Look for atk.h, not atkgl.h.
        * macros/opengl.m4: Put the single tick mark before the rest of
        the statement so it gets expanded correctly.

Index: doc/C/amf.xml
===================================================================
RCS file: /sources/gnash/gnash/doc/C/amf.xml,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- doc/C/amf.xml       22 Apr 2006 03:12:08 -0000      1.2
+++ doc/C/amf.xml       15 Aug 2006 05:07:34 -0000      1.3
@@ -1,203 +1,124 @@
-<sect2 id="amf">
+<sect3 id="amf">
   <title>AMF Format</title>
   
   <para>
-    The AMF format is used the LocalConnection and SharedObject
-    ActionScript classes. This is a means of binary data interchange
-    between Flash movies.
+    The AMF format is used the LocalConnection, SharedObject,
+    NetConnection, and NetStream ActionScript classes. This is a means
+    of binary data interchange between Flash movies, or between a
+    Flash player and a Flash server.
   </para>
   
   <para>
-    There are two sets of data types to consider. One set is used by
-    the AfMF format, the other is an ActionScript data type tag used
-    to denote which type of object is being transferred.
+    Like the RTMP messages, an AMF packet header can be of a variable
+    size. The size if either the same as the initial header of the
+    RTMP message, or a 1 byte header, which is commonly used for
+    streaming audio or video data.
   </para>
   
   <para>
-    These data types are used to exchange data between Flash
-    movies. The data part of a message is one of the ActionScript data
-    types.
+    The body of an AMF packet may look something like this
+    example. The spaces have been added for clarity.
+    
+    <screen>
+      02  0007 636f6e6e656374
+    </screen>
 
     <variablelist>
       <varlistentry>
-       <term>Byte</term>
-       <listitem>
-         <para>
-           A single byte.
-         </para>
-       </listitem>
-      </varlistentry>
-      <varlistentry>
-       <term>Int</term>
-       <listitem>
-         <para>
-           Two bytes (a short).
-         </para>
-       </listitem>
-      </varlistentry>
-      <varlistentry>
-       <term>MediumInt</term>
-       <listitem>
-         <para>
-           Three bytes.
-         </para>
-       </listitem>
-      </varlistentry>
-      <varlistentry>
-       <term>Long</term>
-       <listitem>
-         <para>
-           Four bytes (an int).
-         </para>
-       </listitem>
-      </varlistentry>
-      <varlistentry>
-       <term>Double</term>
-       <listitem>
-         <para>
-         </para>
-       </listitem>
-      </varlistentry>
-      <varlistentry>
-       <term>UTF8</term>
+       <term>02</term>
        <listitem>
          <para>
+           This is a single byte header. The value of the first 2
+           bits is 0x3, and the AMF index is also 0x3.
          </para>
        </listitem>
       </varlistentry>
+
       <varlistentry>
-       <term></term>
+       <term>0007</term>
        <listitem>
          <para>
+           This is the length in bytes of the string.
          </para>
        </listitem>
       </varlistentry>
+
       <varlistentry>
-       <term>LongUTF8</term>
+       <term>63 6f 6e 6e 65 63 74</term>
        <listitem>
          <para>
+           This is the string. Note that there is no null terminator
+           since the length is specified.
          </para>
        </listitem>
       </varlistentry>
+
     </variablelist>    
+
   </para>
 
+<!--
   <para>
+    These data types are used to exchange data between Flash
+    movies. The data part of a message is one of the ActionScript data
+    types.
+
     <variablelist>
       <varlistentry>
-       <term>Number</term>
-       <listitem>
-         <para>
-         </para>
-       </listitem>
-      </varlistentry>
-      <varlistentry>
-       <term>Boolean</term>
-       <listitem>
-         <para>
-         </para>
-       </listitem>
-      </varlistentry>
-      <varlistentry>
-       <term>String</term>
-       <listitem>
-         <para>
-         </para>
-       </listitem>
-      </varlistentry>
-      <varlistentry>
-       <term>Object</term>
-       <listitem>
-         <para>
-         </para>
-       </listitem>
-      </varlistentry>
-      <varlistentry>
-       <term>MovieClip</term>
-       <listitem>
-         <para>
-         </para>
-       </listitem>
-      </varlistentry>
-      <varlistentry>
-       <term>Null</term>
-       <listitem>
-         <para>
-         </para>
-       </listitem>
-      </varlistentry>
-      <varlistentry>
-       <term>Undefined</term>
-       <listitem>
-         <para>
-         </para>
-       </listitem>
-      </varlistentry>
-      <varlistentry>
-       <term>Reference</term>
-       <listitem>
-         <para>
-         </para>
-       </listitem>
-      </varlistentry>
-      <varlistentry>
-       <term>ECMAArray</term>
-       <listitem>
-         <para>
-         </para>
-       </listitem>
-      </varlistentry>
-      <varlistentry>
-       <term>ObjectEnd</term>
+       <term>Byte</term>
        <listitem>
          <para>
+           A single byte.
          </para>
        </listitem>
       </varlistentry>
       <varlistentry>
-       <term>StrictArray</term>
+       <term>Int</term>
        <listitem>
          <para>
+           Two bytes (a short).
          </para>
        </listitem>
       </varlistentry>
       <varlistentry>
-       <term>Date</term>
+       <term>MediumInt</term>
        <listitem>
          <para>
+           Three bytes.
          </para>
        </listitem>
       </varlistentry>
       <varlistentry>
-       <term>LongString</term>
+       <term>Long</term>
        <listitem>
          <para>
+           Four bytes (an int).
          </para>
        </listitem>
       </varlistentry>
       <varlistentry>
-       <term>Unsupported</term>
+       <term>Double</term>
        <listitem>
          <para>
          </para>
        </listitem>
       </varlistentry>
       <varlistentry>
-       <term>Recordset</term>
+       <term>UTF8</term>
        <listitem>
          <para>
          </para>
        </listitem>
       </varlistentry>
       <varlistentry>
-       <term>XMLObject</term>
+       <term></term>
        <listitem>
          <para>
          </para>
        </listitem>
       </varlistentry>
       <varlistentry>
-       <term>TypedObject</term>
+       <term>LongUTF8</term>
        <listitem>
          <para>
          </para>
@@ -205,5 +126,7 @@
       </varlistentry>
     </variablelist>    
   </para>
-</sect2>
+-->
+
+</sect3>
   

Index: doc/C/appendix.xml
===================================================================
RCS file: /sources/gnash/gnash/doc/C/appendix.xml,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- doc/C/appendix.xml  14 Aug 2006 23:44:06 -0000      1.7
+++ doc/C/appendix.xml  15 Aug 2006 05:07:34 -0000      1.8
@@ -122,7 +122,6 @@
   </sect2>
 
   &rtmp;
-  &amf;
 
 <!--
   <sect2 id="opcodes">

Index: doc/C/gnash.xml
===================================================================
RCS file: /sources/gnash/gnash/doc/C/gnash.xml,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -b -r1.23 -r1.24
--- doc/C/gnash.xml     14 Aug 2006 23:44:07 -0000      1.23
+++ doc/C/gnash.xml     15 Aug 2006 05:07:34 -0000      1.24
@@ -658,10 +658,13 @@
     <title>Authors</title>
     <para>
       <application>Gnash</application> is maintained by Rob Savoye
-      <email>address@hidden</email>. Please send all comments and
-      suggestions to <email>address@hidden</email> Please use this link
-      to <ulink  type="http"
-       url="https://savannah.gnu.org/patch/?group=gnash";>submit a patch</ulink>
+      <email>address@hidden</email>. The other developers currently are 
+      Sandro Santilli, Bastiaan Jacques, Vitaly Alexeev, and Tomas
+      Groth. Please send all comments and suggestions to
+      <email>address@hidden</email> Please use this link to <ulink
+      type="http"
+      url="https://savannah.gnu.org/patch/?group=gnash";>submit a
+      patch</ulink> 
        or this link to <ulink  type="http"
        url="https://savannah.gnu.org/bugs/?group=gnash";>file a bug
        report</ulink>.
@@ -672,11 +675,12 @@
 
     <para>
       The following people all contributed code to GameSWF, which was
-      the original code base for Gnash. I was also a GameSWF
-      contributor. The primary author of GameSWF is Thatcher Ulrich
-      <email>address@hidden</email>. Other individuals that contributed code 
are:
-      Mike Shaver, Thierry Berger-Perrin, Ignacio Castaño, Willem
-      Kokke, Vitaly Alexeev, Alexander Streit.
+      the original code base for Gnash. Both Vitaly and myself were
+      also GameSWF contributors. The primary author of GameSWF is
+      Thatcher Ulrich <email>address@hidden</email>. Other individuals
+      that contributed code are: Mike Shaver, Thierry Berger-Perrin,
+      Ignacio Castaño, Willem Kokke, Vitaly Alexeev,
+      Alexander Streit.
     </para>
 
   </sect1>

Index: doc/C/rtmp.xml
===================================================================
RCS file: /sources/gnash/gnash/doc/C/rtmp.xml,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- doc/C/rtmp.xml      14 Aug 2006 23:44:07 -0000      1.1
+++ doc/C/rtmp.xml      15 Aug 2006 05:07:34 -0000      1.2
@@ -1,7 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
 <sect2 id="rtmp">
   <title>RTMP Protocol</title>
   
   <para>
+    This document is based mostly on my own reverse engineering of the
+    RTMP protocol and AMF format. <code>tcpdump</code> and
+    <code>ethereal</code> are your friend. Some addition info that got
+    me started was from the <ulink  type="http"
+       url="http://www.osflash.org/red5";>Red5</ulink>
+    project. <code>Red5</code> is the only other open source Flash
+    server. So some details are still vague, but as the implementation
+    appears to work, we'll figure out what they are later.
+  </para>
+
+  <para>
     The Real Time Messaging Protocol was created by MacroMedia (now
     Adobe) for delivering Flash objects and video over a network
     connection. Currently the only servers that support this format
@@ -12,12 +24,15 @@
     This is a simple protocol, optimized for poor bandwidth
     connections. It can support up to 64 concurrent streams over the
     same network connection. Part of each AMF packet header contains
-    the index number of the stream.
+    the index number of the stream. A single RTMP message can contain
+    multiple AMF packets.
   </para>
 
   <para>
     An RTMP connection uses Tcp/ip port 1935. It is also possible to
-    tunnel RTMP over an HTTP connection using port 80.
+    tunnel RTMP over an HTTP connection using port 80. Each AMF packet
+    is 128 bytes long except for streaming audio, which has 64 byte
+    packets.
   </para>
 
   <para>
@@ -46,12 +61,500 @@
 
   <para>
     The client receives the 1536 byte data block, and if they match,
-    the connection is established.
+    the connection is established. After the handshake process is
+    done, there are three other messages that the client sends to the
+    sever to start the data flowing.
+  </para>
+
+  <para>
+    The first AMF packet sent to the server contains the
+    <emphasis>connect</emphasis> packet. This doesn't appear to do
+    much but notify the server the client is happy with the
+    handshake, and to start reading packets.
+  </para>
+
+  <para>
+    The second packet is the <code>NetConnection</code> object from
+    the client. This ActionScript class is used by the Flash movie to
+    create the network connection to the server.
+  </para>
+
+  <para>
+    The third packet is the <code>NetStream</code> object from the
+    client. This is the ActionScript class used to specify the file to
+    be streamed by the server.
+  </para>
+
+  <para>
+    The RTMP packet for our example looks like this:
+   
+    <programlisting>
+      
030000190000c91400000000020007connect00?f0000000000000030003app0200#software/gnash/tests/1153948634.flv0008flashVer02000cLNX
 6,0,82,0 
0006swfUrl02001dfile:///file|%2Ftmp%2Fout.swfc30005tcUrl\002\0004rtmp://localhost/software/gnash/tests/1153948634.flv\000\000\t\002\000\005userx
+    </programlisting>
+    
+    We'll take this apart in a bit, but you can see how all three AMF
+    packets are in the same message. The message ius recieved in
+    several 128 byte blocks, with the last one being less than
+    that. The total size of the RTMP message is in the header, so the
+    reader can tell if the entire message was read or not.
+  </para>
+  
+  <para>
+    The RTMP header is first, followed by the connect message as an
+    ascii string as the message body. The following AMF packet is the
+    <code>NetConnection</code> one, that specifies this is coming from
+    a Flash application/ This also contains the file path the server
+    can use to find the file to stream. This is then followed by the
+    version number, which I assume is the version of the Flash player,
+    so the server knows what it is talking to.
   </para>
 
   <para>
-    The first AMF packet sent to the server contains the connect 
+    The third packet is the one from <code>NetStream</code>, which
+    specifies the URL used for the movie, followed by the user name
+    for a semblance of security.
   </para>
 
+  <para>
+    For the next level of detail, we'll explain the format of AMF. AMF
+    is used by the RTMP protocol to transfer data. Each Flash object
+    is encapsulated in an AMF packet, including streaming audio or
+    video.
+  </para>
+
+  <para>
+    The first byte of the RTMP header determines two things about the
+    rest of the message. The first 2 bits of this byte signify the
+    total size of the RTMP header. The RTMP header is of a variable
+    size, so this is important.
+
+    <variablelist>
+      <varlistentry>
+       <term>0x0</term>
+       <listitem>
+         <para>
+           This specifies the header contains 12 bytes, including
+           this one.
+         </para>
+       </listitem>
+      </varlistentry>
+      <varlistentry>
+       <term>0x1</term>
+       <listitem>
+         <para>
+           This specifies the header contains 8 bytes, including this
+           one.
+         </para>
+       </listitem>
+      </varlistentry>
+      <varlistentry>
+       <term>02</term>
+       <listitem>
+         <para>
+           This specifies the header contains 4 bytes, including this
+           one.
+         </para>
+       </listitem>
+      </varlistentry>
+      <varlistentry>
+       <term>0x3</term>
+       <listitem>
+         <para>
+           This specifies the header contains 1 byte, so this is the
+           complete header.
+         </para>
+       </listitem>
+      </varlistentry>
+    </variablelist>
+  </para>
+
+  <para>
+    The other 6 bits in this byte represent the AMF index. As a single
+    RTMP connection can support multiple data streams, this signifies
+    which stream this packet is for. Once an AMF object is fully
+    received by the client, the AMF index may be reused.
+  </para>
+
+  <para>
+    For messages with a 4 bytes or larger header, the next 3 bytes are
+    used by audio and video data packets, but at this time the meaning
+    of this field is unknown.
+  </para>
+
+  <para>
+    For messages with a 8 byte or larger header, the next 3 bytes
+    determine the size of the RTMP message being transmitted. Messages
+    with a 1 byte or 4 byte header use a standard size, 128 bytes for
+    video, and 64 bytes for audio.
+  </para>
+
+  <para>
+    For messages with an 8 byte or larger header, the next byte is the
+    type of the AMF object.
+    
+    <variablelist>
+      <varlistentry>
+       <term>0x3</term>
+       <listitem>
+         <para>
+           This specifies the content type of the RTMP packet is the
+           number of bytes read. This is used to start the RTMP
+           connection.
+         </para>
+       </listitem>
+      </varlistentry> 
+      <varlistentry>
+       <term>0x4</term>
+       <listitem>
+         <para>
+           This specifies the content type of the RTMP message is a
+           <code>ping</code> packet.
+         </para>
+       </listitem>
+      </varlistentry> 
+      <varlistentry>
+       <term>0x5</term>
+       <listitem>
+         <para>
+           This specifies the content type of the RTMP message is
+           server response of some type.
+         </para>
+       </listitem>
+      </varlistentry> 
+      <varlistentry>
+       <term>0x6</term>
+       <listitem>
+         <para>
+           This specifies the content type of the RTMP packet is
+           client request of some type.
+         </para>
+       </listitem>
+      </varlistentry> 
+      <varlistentry>
+       <term>0x8</term>
+       <listitem>
+         <para>
+           This specifies the content type of the RTMP packet is an
+           audio message.
+         </para>
+       </listitem>
+      </varlistentry> 
+      <varlistentry>
+       <term>0x9</term>
+       <listitem>
+         <para>
+           This specifies the content type of the RTMP message is a
+           video packet.
+         </para>
+       </listitem>
+      </varlistentry> 
+      <varlistentry>
+       <term>0x12</term>
+       <listitem>
+         <para>
+           This specifies the content type of the RTMP message is
+           notify. 
+         </para>
+       </listitem>
+      </varlistentry> 
+      <varlistentry>
+       <term>0x13</term>
+       <listitem>
+         <para>
+           This specifies the content type of the RTMP message is
+           shared object.
+         </para>
+       </listitem>
+      </varlistentry> 
+      <varlistentry>
+       <term>0x14</term>
+       <listitem>
+         <para>
+           This specifies the content type of the RTMP message is
+           remote procedure call. This invokes the method of a Flash
+           class remotely.
+         </para>
+       </listitem>
+      </varlistentry> 
+    </variablelist>     
+  
+  </para>
+
+  <para>
+  </para>
+
+  <para>
+    There are two sets of data types to consider. One set is used by
+    the to specify the content type of the AMF object, the other is an
+    ActionScript data type tag used to denote which type of object is
+    being transferred.
+  </para>
+  
+  <para>
+    The values of the initial type byte are:
+    <variablelist>
+
+      <varlistentry>
+       <term>0x0</term>
+       <listitem>
+         <para>
+           This specifies the data in the AMF packet is a numeric
+           value. All numeric values in Flash are 64 bit,
+           <code>big-endian</code>.
+         </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>0x1</term>
+       <listitem>
+         <para>
+           This specifies the data in the AMF packet is a boolean
+           value.
+         </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>0x2</term>
+       <listitem>
+         <para>
+           This specifies the data in the AMF packet is an
+           <code>ASCII</code> string. 
+         </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>0x3</term>
+       <listitem>
+         <para>
+           This specifies the data in the AMF packet is a Flash
+           object. The Flash object data type field furthur along in
+           the message specifies which type of ActionScript object it
+           is.
+         </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>0x4</term>
+       <listitem>
+         <para>
+           This specifies the data in the AMF packet is a Flash
+           movie, ie... another Flash movie.
+         </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>0x5</term>
+       <listitem>
+         <para>
+           This specifies the data in the AMF packet is a NULL
+           value. NULL is often used as the return code from calling
+           Flash functions.
+         </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>0x6</term>
+       <listitem>
+         <para>
+           This specifies the data in the AMF packet is a
+           undefined. This is also used as the return code from
+           calling Flash functions.
+         </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>0x7</term>
+       <listitem>
+         <para>
+           This specifies the data in the AMF packet is a reference.
+         </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>0x8</term>
+       <listitem>
+         <para>
+           This specifies the data in the AMF packet is a ECMA
+           array.
+         </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>0x9</term>
+       <listitem>
+         <para>
+           This specifies the data in the AMF packet is the end of an
+           objct definition. As an object is transmitted with
+           multiple AMF packets, this lets the server know when the
+           end of the object is reached.
+         </para>
+       </listitem>
+      </varlistentry>
+
+
+      <varlistentry>
+       <term>0xa</term>
+       <listitem>
+         <para>
+           This specifies the data in the AMF packet is a Strict
+           array.
+         </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>0xb</term>
+       <listitem>
+         <para>
+           This specifies the data in the AMF packet is a date.
+         </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>0xc</term>
+       <listitem>
+         <para>
+           This specifies the data in the AMF packet is a multibyte
+           string. Multibyt strings are used for international
+           language support to represent non <code>ASCII</code>
+           fonts.
+         </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>0xd</term>
+       <listitem>
+         <para>
+           This specifies the data in the AMF packet is a an
+           unsupported feature.
+         </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>0xe</term>
+       <listitem>
+         <para>
+           This specifies the data in the AMF packet is a record
+           set.
+         </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>0xf</term>
+       <listitem>
+         <para>
+           This specifies the data in the AMF packet is a AML
+           object. XML objects are then parsed by the
+           <code>XML</code> ActionScript class.
+         </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>0x10</term>
+       <listitem>
+         <para>
+           This specifies the data in the AMF packet is a typed object.
+         </para>
+       </listitem>
+      </varlistentry>
+
+    </variablelist>
+    
+  </para>
+
+  <para>
+    For messages with a 12 byte header, the last 4 bytes are the
+    routing of the message. If the destination is the server, this
+    value is the NetStream object source. If the destination is the
+    cllient, this is the NetStream object for this RTMP message. A
+    value of 0x00000000 appears to be reserved for the NetConnection
+    object. 
+  </para>
+
+  <para>
+    Multiple AMF streams can be contained in a single RTMP messages,
+    so it's important to check the index of each AMF packet.
+  </para>
+
+  <para>
+    An example RTMP header might look like this. (spaces added between
+    fields for clarity) All the numbers are in hex.
+
+    <screen>
+      03 000019 0000c9 14 000000000
+    </screen>
+    
+    <variablelist>
+      <varlistentry>
+       <term>03</term>
+       <listitem>
+         <para>
+           The first two bits of this byte are the size of the
+           header, which in this example is 00, for a 12 byte
+           header. The next 6 bits is the AMF stream index number,
+           which in this example is 0x3.
+         </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>000019</term>
+       <listitem>
+         <para>
+           These 3 bytes currently have an unknown purpose.
+         </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>000c9</term>
+       <listitem>
+         <para>
+           Since this example has a 12 byte header, this is the size
+           of the RTMP message, in this case 201 bytes.
+         </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>14</term>
+       <listitem>
+         <para>
+           This is the content type of the RTMP message, which in
+           this case is to invoke a remote function call. (which we
+           later see is the connect function)
+         </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry>
+       <term>00000000</term>
+       <listitem>
+         <para>
+           The source is the NetConnection object used to start this
+           connection.
+         </para>
+       </listitem>
+      </varlistentry>
+    </variablelist>
+
+  </para>
+
+  &amf;
+
 </sect2>
   




reply via email to

[Prev in Thread] Current Thread [Next in Thread]