NEW FILE HEADER / COPYRIGHT FORMAT
[senf.git] / Examples / DVBAdapter / ULEdec.cc
index 786f07e..95a83a6 100644 (file)
@@ -1,9 +1,9 @@
 // $Id$
 //
-// Copyright (C) 2006
-// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
-// Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
-//     Stefan Bund <stefan.bund@fokus.fraunhofer.de>
+// Copyright (C) 2007
+// Fraunhofer Institute for Open Communication Systems (FOKUS) 
+// Competence Center NETwork research (NET), St. Augustin, GERMANY 
+//     Thorsten Horstmann <tho@berlios.de>
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
 
 #include "ULEdec.hh"
 
-#include "Packets/PacketData.hh"
-#include "Utils/hexdump.hh"
-#include "Utils/membind.hh"
+#include <linux/dvb/dmx.h> 
+#include <boost/format.hpp>
+#include <senf/Packets.hh>
+#include <senf/Utils/hexdump.hh>
+#include <senf/Utils/membind.hh>
 
 #define PID 271
-#define TS_SYNC 0x47
+#define TRANSPORT_PACKET_SIZE 188
+// max. payload_pointer = ts packet payload size ( = ts packet size - ts header - payload_pointer)
+//                          - 2 bytes min. sndu header
+#define MAX_PAYLOAD_POINTER ( TRANSPORT_PACKET_SIZE - 4 - 1 - 2 )   
 
 #define prefix_
 ///////////////////////////////cc.p////////////////////////////////////////
 
 
-ULEdec::ULEdec()
+ULEdec::ULEdec(unsigned short adapter, unsigned short device)
+    : demuxHandle( adapter, device ),  dvrHandle( adapter, device )
 {
     struct dmx_pes_filter_params pes_filter;
     memset(&pes_filter, 0, sizeof (struct dmx_pes_filter_params));
@@ -53,14 +59,14 @@ ULEdec::ULEdec()
     this->priv_sndu_type_1 = false;
 }
 
-void ULEdec::handleEvent(senf::FileHandle, senf::Scheduler::EventId event)
+void ULEdec::handleEvent(senf::Scheduler::EventId event)
 {
     senf::TransportPacket ts_packet (
             senf::TransportPacket::create(188, senf::TransportPacket::noinit));
     dvrHandle.read( ts_packet.data() );
    
     // Check TS error conditions: sync_byte, transport_error_indicator, scrambling_control.
-    if ( (ts_packet->sync_byte() != TS_SYNC) || 
+    if ( (ts_packet->sync_byte() != TRANSPORT_PACKET_SYNC_BYTE) || 
          (ts_packet->transport_error_indicator() == true) || 
          (ts_packet->transport_scrmbl_ctrl() != 0)) 
     {
@@ -107,7 +113,7 @@ void ULEdec::handleTSPacket(senf::TransportPacket ts_packet)
                     return;
                 default:
                     if ( (*payload_iter++ << 8 | *payload_iter++) != ULE_END_INDICATOR )
-                        std::cerr << "delimiting error 1\n";
+                        std::cerr << "delimiting error\n";
             } else {
                 BOOST_ASSERT( std::distance( payload_iter, payload_end ) == 0 );
             }
@@ -117,8 +123,9 @@ void ULEdec::handleTSPacket(senf::TransportPacket ts_packet)
     case 1: {
         // a PUSI value of 1 indicates the presence of a Payload Pointer.
         unsigned char payload_pointer = *payload_iter++;
-        if (payload_pointer > 181) {
-            std::cerr << "invalid payload_pointer\n";
+        if (payload_pointer > MAX_PAYLOAD_POINTER) {
+            std::cerr << str( boost::format( 
+                    "invalid payload_pointer (%d)\n") % unsigned(payload_pointer) ) ;
             this->receiver_state = Idle;
             return;
         }
@@ -130,7 +137,9 @@ void ULEdec::handleTSPacket(senf::TransportPacket ts_packet)
             // Reassembly Payload Pointer Checking
             if (snduPacketBytesLeft() != payload_pointer) {
                 // delimiting error
-                std::cerr << "delimiting error 2\n";
+                std::cerr << str( boost::format(
+                        "delimiting error: bytes left in SNDU packet != payload_pointer ("
+                        "(%d != %d)\n") % snduPacketBytesLeft() % payload_pointer );
                 std::advance(payload_iter, payload_pointer);
             } else {
                 payload_iter = readContSNDUPacket( payload_iter, payload_end );
@@ -178,17 +187,21 @@ ULEdec::iterator ULEdec::readContSNDUPacket(iterator i, iterator const i_end)
 ULEdec::iterator ULEdec::readNewSNDUPacket(iterator i, iterator const i_end)
 { 
     bool dbit = false;
-    senf::Packet::size_type sndu_length;
-    sndu_length = *i++ << 8 | *i++;
+    senf::Packet::size_type sndu_length = *i++ << 8 | *i++;
     if (sndu_length & 0x8000) {
         sndu_length &= 0x7FFF;
         dbit = true;
     }
     if (sndu_length < 5 || sndu_length == 0xffff) {
-        throw ULEdecException("SNDU length error");
+        throw ULEdecException( str( boost::format(
+                "SNDU length error. length=%d") % sndu_length) );
      }
     this->snduPacket = senf::SNDUPacket::create(sndu_length+4);
-    this->snduPacket->d_bit() = dbit;
+
+    if (dbit)
+        this->snduPacket->withoutDestination();
+    // else not needed since default on newly created packet is withDestination()
+
     this->snduPacket->length() = sndu_length;
     this->snduPacketData_iter = boost::next(this->snduPacket.data().begin(), 2);
     this->priv_sndu_type_1 = false;
@@ -227,8 +240,16 @@ void ULEdec::handleSNDUPacket()
     this->snduPacket.dump(std::cout);
     std::cout << "----------------------------------------------------------------------------\n\n";
     if (this->snduPacket->crc() != this->snduPacket->calcCrc()) {
-        throw ULEdecException("CRC Error");
+        throw ULEdecException( str( boost::format( 
+                "CRC Error. received crc:%d calculated crc:%d")
+                    % this->snduPacket->crc() % this->snduPacket->calcCrc() ) );
     }
+//    senf::Packet nextPacket = this->snduPacket.next();
+//    senf::hexdump(
+//            nextPacket.data().begin(),
+//            nextPacket.data().end(),
+//            std::cout);
+    
 }
 
 
@@ -266,6 +287,6 @@ int main(int argc, char const * argv[])
 // c-file-style: "senf"
 // indent-tabs-mode: nil
 // ispell-local-dictionary: "american"
-// compile-command: "scons -u test"
+// compile-command: "scons -U"
 // comment-column: 40
 // End: