1c5dfeb24c41fd14f79094900257636b8756d7f3
[senf.git] / senf / Packets / MPEGDVBBundle / TransportPacket.hh
1 // $Id:TransportPacket.hh 560 2007-12-13 14:39:37Z tho $
2 //
3 // Copyright (C) 2007
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 //     Thorsten Horstmann <tho@berlios.de>
7 //
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 2 of the License, or
11 // (at your option) any later version.
12 //
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 // GNU General Public License for more details.
17 //
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the
20 // Free Software Foundation, Inc.,
21 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22
23 /** \file
24     \brief TransportPacket public header */
25
26 #ifndef HH_SENF_Packets_MPEGDVBBundle_TransportPacket_
27 #define HH_SENF_Packets_MPEGDVBBundle_TransportPacket_ 1
28
29 // Custom includes
30 #include <senf/Packets/Packets.hh>
31
32 //#include "TransportPacket.mpp"
33 //-/////////////////////////////////////////////////////////////////////////////////////////////////
34
35 namespace senf {
36
37     /** \brief Parse a Transport Stream packet
38
39         Parser implementing the header of a MPEG Transport Stream packet.
40         \image html TransportPacket.png
41
42         \see TransportPacketType
43      */
44     struct TransportPacketParser : public PacketParserBase
45     {
46 #       include SENF_PARSER()
47
48         SENF_PARSER_FIELD       ( sync_byte,                  UInt8Parser );
49
50         SENF_PARSER_BITFIELD    ( transport_error_indicator,  1, bool     );
51         SENF_PARSER_BITFIELD_RO ( pusi,                       1, bool     );
52         SENF_PARSER_BITFIELD    ( transport_priority,         1, bool     );
53         SENF_PARSER_BITFIELD    ( pid,                       13, unsigned );
54         SENF_PARSER_BITFIELD    ( transport_scrmbl_ctrl,      2, unsigned );
55         SENF_PARSER_BITFIELD    ( adaptation_field_ctrl,      2, unsigned );
56         SENF_PARSER_BITFIELD    ( continuity_counter,         4, unsigned );
57
58         SENF_PARSER_PRIVATE_VARIANT ( pointer_field_, pusi,
59                 (senf::VoidPacketParser) (UInt8Parser) );
60
61         SENF_PARSER_FINALIZE( TransportPacketParser );
62
63         UInt8Parser pointer_field() const;
64         void init_fields() const;
65         void setPUSI(bool pusi) const;
66
67         SENF_PARSER_INIT() {
68             defaultInit();
69             init_fields();
70         }
71     };
72
73     /** \brief Transport Stream packet
74
75         <table class="senf">
76           <tr style="text-align:center">
77             <th>Syntax</th><th>No. of bits</th></tr>
78           <tr>
79             <td>transport_packet() {</td> <td></td>
80           </tr>
81           <tr>
82             <td style="padding-left:2em">\ref TransportPacketParser::sync_byte() "sync_byte"</td>
83             <td>8</td></tr>
84           <tr>
85             <td style="padding-left:2em">\ref TransportPacketParser::transport_error_indicator() "transport_error_indicator"</td>
86             <td>1</td></tr>
87           <tr>
88             <td style="padding-left:2em">\ref TransportPacketParser::pusi() "payload_uni_start_indicator"</td>
89             <td>1</td></tr>
90           <tr>
91             <td style="padding-left:2em">\ref TransportPacketParser::transport_priority() "transport_priority"</td>
92             <td>1</td></tr>
93           <tr>
94             <td style="padding-left:2em">\ref TransportPacketParser::pid() "PID"</td>
95             <td>13</td></tr>
96           <tr>
97             <td style="padding-left:2em">\ref TransportPacketParser::transport_scrmbl_ctrl() "transport_scrambling_control"</td>
98             <td>2</td></tr>
99           <tr>
100             <td style="padding-left:2em">\ref TransportPacketParser::adaptation_field_ctrl() "adaptation_field_control"</td>
101             <td>2</td></tr>
102           <tr>
103             <td style="padding-left:2em">\ref TransportPacketParser::continuity_counter() "continuity_counter"</td>
104             <td>4</td></tr>
105           <tr>
106             <td>}</td> <td></td></tr>
107         </table>
108
109         \par Packet type (typedef):
110             \ref TransportPacket
111
112         \par Fields:
113             \ref TransportPacketParser
114
115         \ingroup protocolbundle_mpegdvb
116      */
117     struct TransportPacketType
118         : public PacketTypeBase,
119           public PacketTypeMixin<TransportPacketType>
120     {
121 #ifndef DOXYGEN
122         typedef PacketTypeMixin<TransportPacketType> mixin;
123 #endif
124         typedef ConcretePacket<TransportPacketType> packet; ///< Transport packet typedef
125         typedef TransportPacketParser parser; ///< typedef to the parser of Transport packet
126
127         using mixin::nextPacketRange;
128         using mixin::init;
129         using mixin::initSize;
130
131         /** \brief Dump given Transport packet in readable form to given output stream */
132         static void dump(packet p, std::ostream & os);
133         static const byte SYNC_BYTE = 0x47;
134     };
135
136     /** \brief Transport packet typedef */
137     typedef ConcretePacket<TransportPacketType> TransportPacket;
138 }
139
140
141 //-/////////////////////////////////////////////////////////////////////////////////////////////////
142 //#include "TransportPacket.cci"
143 //#include "TransportPacket.ct"
144 //#include "TransportPacket.cti"
145 #endif
146
147 \f
148 // Local Variables:
149 // mode: c++
150 // fill-column: 100
151 // c-file-style: "senf"
152 // indent-tabs-mode: nil
153 // ispell-local-dictionary: "american"
154 // compile-command: "scons -u test"
155 // comment-column: 40
156 // End: