switch to new MPL based Fraunhofer FOKUS Public License
[senf.git] / Examples / DVBAdapter / MPEdec.cc
1 // $Id$
2 //
3 // Copyright (C) 2007
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 //   Thorsten Horstmann <tho@berlios.de>
27
28
29 // Definition of non-inline non-template functions
30
31 #include <string>
32 #include <iostream>
33 #include <iomanip>
34 #include <sys/ioctl.h>
35 #include <linux/sockios.h>
36 #include <linux/dvb/dmx.h>
37
38 #include <senf/Scheduler/Scheduler.hh>
39 #include <senf/Packets/DefaultBundle/EthernetPacket.hh>
40 #include <senf/Packets/MPEGDVBBundle/MPESection.hh>
41 #include <senf/Utils/membind.hh>
42 #include <senf/Utils/hexdump.hh>
43 #include <senf/Socket/Protocols/DVB.hh>
44 #include <senf/Packets.hh>
45
46 #define PID 500
47
48 #define prefix_
49 //-/////////////////////////////////////////////////////////////////////////////////////////////////
50
51 class MySniffer
52 {
53     senf::DVBDemuxSectionHandle handle;
54
55 public:
56     MySniffer(unsigned short adapter=0, unsigned short device=0)
57         : handle( adapter, device )
58     {
59         struct dmx_sct_filter_params sec_filter;
60         memset(&sec_filter, 0, sizeof (struct dmx_sct_filter_params));
61         sec_filter.pid = PID;
62         sec_filter.filter.filter[0] = 62;
63         sec_filter.filter.mask[0] = 0xff;
64         sec_filter.flags = DMX_IMMEDIATE_START;
65         sec_filter.flags |= DMX_CHECK_CRC;
66
67         handle.protocol().setSectionFilter( &sec_filter );
68
69         senf::Scheduler::instance().add(
70             handle, senf::membind(&MySniffer::dumpSection, this));
71     }
72
73 private:
74     void dumpSection(senf::Scheduler::EventId event)
75     {
76         std::string data (handle.read());
77         senf::MPESection section (senf::MPESection::create(data));
78         section.dump(std::cout);
79         senf::PacketData & datagramData (section.next().data());
80         senf::hexdump(datagramData.begin(), datagramData.end(), std::cout);
81     }
82 };
83
84 int main(int argc, char const * argv[])
85 {
86     try {
87         MySniffer sniffer;
88         senf::Scheduler::instance().process();
89     }
90     catch (std::exception const & ex) {
91         std::cerr << senf::prettyName(typeid(ex)) << ": " << ex.what() << "\n";
92     }
93     return 0;
94 }
95
96
97 //-/////////////////////////////////////////////////////////////////////////////////////////////////
98 #undef prefix_
99
100 \f
101 // Local Variables:
102 // mode: c++
103 // fill-column: 100
104 // c-file-style: "senf"
105 // indent-tabs-mode: nil
106 // ispell-local-dictionary: "american"
107 // compile-command: "scons -u"
108 // comment-column: 40
109 // End: