switch to new MPL based Fraunhofer FOKUS Public License
[senf.git] / senf / Packets / DefaultBundle / RTPPacket.hh
1 // $Id$
2 //
3 // Copyright (C) 2006
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 //
6 // The contents of this file are subject to the Fraunhofer FOKUS Public License
7 // Version 1.0 (the "License"); you may not use this file except in compliance
8 // with the License. You may obtain a copy of the License at 
9 // http://senf.berlios.de/license.html
10 //
11 // The Fraunhofer FOKUS Public License Version 1.0 is based on, 
12 // but modifies the Mozilla Public License Version 1.1.
13 // See the full license text for the amendments.
14 //
15 // Software distributed under the License is distributed on an "AS IS" basis, 
16 // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 
17 // for the specific language governing rights and limitations under the License.
18 //
19 // The Original Code is Fraunhofer FOKUS code.
20 //
21 // The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V. 
22 // (registered association), Hansastraße 27 c, 80686 Munich, Germany.
23 // All Rights Reserved.
24 //
25 // Contributor(s):
26 //   Philipp Batroff <pug@berlios.de>
27
28 /** \file
29     \brief RTPPacket public header */
30
31 #ifndef HH_SENF_Packets_DefaultBundle_RTPPacket_
32 #define HH_SENF_Packets_DefaultBundle_RTPPacket_ 1
33
34 // Custom includes
35 #include <senf/Packets/Packets.hh>
36
37 //-/////////////////////////////////////////////////////////////////////////////////////////////////
38 namespace senf {
39
40     struct RTPPacketParser : public PacketParserBase
41     {
42 #       include SENF_PARSER()
43         SENF_PARSER_BITFIELD  ( version,        2, unsigned     );      //Version (RFC 3550)
44         SENF_PARSER_BITFIELD  ( padding,        1, bool         );      //1 if padding behind payload
45         SENF_PARSER_BITFIELD  ( extension,      1, bool         );
46         SENF_PARSER_BITFIELD_RO  ( csrcCount,      4, unsigned     );   //0-15,define the number of contributing sources
47         SENF_PARSER_BITFIELD  ( marker,         1, bool         );      //Marker M=1, used to signal speech silent compression; further use in combination with PT to be defined
48         SENF_PARSER_BITFIELD  ( payloadType,    7, unsigned     );      //Payload Type; e.g. PCM=8 (RFC 3550)
49         SENF_PARSER_FIELD     ( seqNumber,      UInt16Parser );   //random number to identify initial segment of  a stream, increment by 1 used to resequence segments at receiver
50         SENF_PARSER_FIELD     ( timeStamp,      UInt32Parser );   //signals sampling time of 1st byte of payload; initialized; used to calculate Jitter between segments
51         SENF_PARSER_FIELD     ( synSourceId,    UInt32Parser );   //Synchronization source identifier; identifier of RFTP stream source (random number) in case of conferencing identifier of mixer
52         SENF_PARSER_VECTOR    (csrcOpt, csrcCount, UInt32Parser );
53
54         SENF_PARSER_FINALIZE(RTPPacketParser);
55
56         bool valid() const { return version() == 2; }
57     };
58
59     struct RTPPacketType
60         : public PacketTypeBase,
61           public PacketTypeMixin<RTPPacketType>
62     {
63         typedef PacketTypeMixin<RTPPacketType> mixin;
64         typedef ConcretePacket<RTPPacketType> packet;
65         typedef RTPPacketParser parser;
66
67         using mixin::nextPacketRange;
68         using mixin::init;
69         using mixin::initSize;
70
71         static void dump(packet p, std::ostream & os);
72     };
73
74     typedef RTPPacketType::packet RTPPacket;
75
76 }
77
78 //-/////////////////////////////////////////////////////////////////////////////////////////////////
79 #endif