aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/transport/vrt.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib/transport/vrt.cpp')
-rw-r--r--host/lib/transport/vrt.cpp550
1 files changed, 494 insertions, 56 deletions
diff --git a/host/lib/transport/vrt.cpp b/host/lib/transport/vrt.cpp
index a06b5bf21..bebca5db9 100644
--- a/host/lib/transport/vrt.cpp
+++ b/host/lib/transport/vrt.cpp
@@ -1,19 +1,9 @@
-//
-// Copyright 2010 Ettus Research LLC
-//
-// 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
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see <http://www.gnu.org/licenses/>.
-//
+
+
+
+/***********************************************************************
+ * This file was generated by ./gen_vrt.py on Fri Mar 26 15:33:00 2010
+ **********************************************************************/
#include <uhd/transport/vrt.hpp>
#include <boost/asio.hpp> //endianness conversion
@@ -30,26 +20,274 @@ void vrt::pack(
size_t &num_packet_words32, //output
size_t packet_count //input
){
- boost::uint32_t vrt_hdr_flags = 0;
- num_header_words32 = 1;
+ boost::uint32_t vrt_hdr_flags;
- //load the vrt header and flags
- if(metadata.has_stream_id){
- vrt_hdr_flags |= (0x1 << 28); //IF Data packet with Stream Identifier
- header_buff[num_header_words32++] = htonl(metadata.stream_id);
- }
+ boost::uint8_t pred = 0;
+ if (metadata.has_stream_id) pred |= 0x1;
+ if (metadata.has_time_spec) pred |= 0xc;
- if(metadata.has_time_spec){
- vrt_hdr_flags |= (0x3 << 22) | (0x1 << 20); //TSI: Other, TSF: Sample Count Timestamp
- header_buff[num_header_words32++] = htonl(metadata.time_spec.secs);
- header_buff[num_header_words32++] = htonl(metadata.time_spec.ticks);
- header_buff[num_header_words32++] = 0; //unused part of fractional seconds
+ switch(pred){
+ case 0:
+ num_header_words32 = 1;
+ num_packet_words32 = 1 + num_payload_words32;
+ vrt_hdr_flags = 0x0;
+ break;
+ case 1:
+ header_buff[1] = htonl(metadata.stream_id);
+ num_header_words32 = 2;
+ num_packet_words32 = 2 + num_payload_words32;
+ vrt_hdr_flags = 0x10000000;
+ break;
+ case 2:
+ header_buff[1] = htonl(0);
+ header_buff[2] = htonl(0);
+ num_header_words32 = 3;
+ num_packet_words32 = 3 + num_payload_words32;
+ vrt_hdr_flags = 0x8000000;
+ break;
+ case 3:
+ header_buff[1] = htonl(metadata.stream_id);
+ header_buff[2] = htonl(0);
+ header_buff[3] = htonl(0);
+ num_header_words32 = 4;
+ num_packet_words32 = 4 + num_payload_words32;
+ vrt_hdr_flags = 0x18000000;
+ break;
+ case 4:
+ header_buff[1] = htonl(metadata.time_spec.secs);
+ num_header_words32 = 2;
+ num_packet_words32 = 2 + num_payload_words32;
+ vrt_hdr_flags = 0xc00000;
+ break;
+ case 5:
+ header_buff[1] = htonl(metadata.stream_id);
+ header_buff[2] = htonl(metadata.time_spec.secs);
+ num_header_words32 = 3;
+ num_packet_words32 = 3 + num_payload_words32;
+ vrt_hdr_flags = 0x10c00000;
+ break;
+ case 6:
+ header_buff[1] = htonl(0);
+ header_buff[2] = htonl(0);
+ header_buff[3] = htonl(metadata.time_spec.secs);
+ num_header_words32 = 4;
+ num_packet_words32 = 4 + num_payload_words32;
+ vrt_hdr_flags = 0x8c00000;
+ break;
+ case 7:
+ header_buff[1] = htonl(metadata.stream_id);
+ header_buff[2] = htonl(0);
+ header_buff[3] = htonl(0);
+ header_buff[4] = htonl(metadata.time_spec.secs);
+ num_header_words32 = 5;
+ num_packet_words32 = 5 + num_payload_words32;
+ vrt_hdr_flags = 0x18c00000;
+ break;
+ case 8:
+ header_buff[1] = htonl(0);
+ header_buff[2] = htonl(metadata.time_spec.ticks);
+ num_header_words32 = 3;
+ num_packet_words32 = 3 + num_payload_words32;
+ vrt_hdr_flags = 0x100000;
+ break;
+ case 9:
+ header_buff[1] = htonl(metadata.stream_id);
+ header_buff[2] = htonl(0);
+ header_buff[3] = htonl(metadata.time_spec.ticks);
+ num_header_words32 = 4;
+ num_packet_words32 = 4 + num_payload_words32;
+ vrt_hdr_flags = 0x10100000;
+ break;
+ case 10:
+ header_buff[1] = htonl(0);
+ header_buff[2] = htonl(0);
+ header_buff[3] = htonl(0);
+ header_buff[4] = htonl(metadata.time_spec.ticks);
+ num_header_words32 = 5;
+ num_packet_words32 = 5 + num_payload_words32;
+ vrt_hdr_flags = 0x8100000;
+ break;
+ case 11:
+ header_buff[1] = htonl(metadata.stream_id);
+ header_buff[2] = htonl(0);
+ header_buff[3] = htonl(0);
+ header_buff[4] = htonl(0);
+ header_buff[5] = htonl(metadata.time_spec.ticks);
+ num_header_words32 = 6;
+ num_packet_words32 = 6 + num_payload_words32;
+ vrt_hdr_flags = 0x18100000;
+ break;
+ case 12:
+ header_buff[1] = htonl(metadata.time_spec.secs);
+ header_buff[2] = htonl(0);
+ header_buff[3] = htonl(metadata.time_spec.ticks);
+ num_header_words32 = 4;
+ num_packet_words32 = 4 + num_payload_words32;
+ vrt_hdr_flags = 0xd00000;
+ break;
+ case 13:
+ header_buff[1] = htonl(metadata.stream_id);
+ header_buff[2] = htonl(metadata.time_spec.secs);
+ header_buff[3] = htonl(0);
+ header_buff[4] = htonl(metadata.time_spec.ticks);
+ num_header_words32 = 5;
+ num_packet_words32 = 5 + num_payload_words32;
+ vrt_hdr_flags = 0x10d00000;
+ break;
+ case 14:
+ header_buff[1] = htonl(0);
+ header_buff[2] = htonl(0);
+ header_buff[3] = htonl(metadata.time_spec.secs);
+ header_buff[4] = htonl(0);
+ header_buff[5] = htonl(metadata.time_spec.ticks);
+ num_header_words32 = 6;
+ num_packet_words32 = 6 + num_payload_words32;
+ vrt_hdr_flags = 0x8d00000;
+ break;
+ case 15:
+ header_buff[1] = htonl(metadata.stream_id);
+ header_buff[2] = htonl(0);
+ header_buff[3] = htonl(0);
+ header_buff[4] = htonl(metadata.time_spec.secs);
+ header_buff[5] = htonl(0);
+ header_buff[6] = htonl(metadata.time_spec.ticks);
+ num_header_words32 = 7;
+ num_packet_words32 = 7 + num_payload_words32;
+ vrt_hdr_flags = 0x18d00000;
+ break;
+ case 16:
+ num_header_words32 = 1;
+ num_packet_words32 = 2 + num_payload_words32;
+ vrt_hdr_flags = 0x4000000;
+ break;
+ case 17:
+ header_buff[1] = htonl(metadata.stream_id);
+ num_header_words32 = 2;
+ num_packet_words32 = 3 + num_payload_words32;
+ vrt_hdr_flags = 0x14000000;
+ break;
+ case 18:
+ header_buff[1] = htonl(0);
+ header_buff[2] = htonl(0);
+ num_header_words32 = 3;
+ num_packet_words32 = 4 + num_payload_words32;
+ vrt_hdr_flags = 0xc000000;
+ break;
+ case 19:
+ header_buff[1] = htonl(metadata.stream_id);
+ header_buff[2] = htonl(0);
+ header_buff[3] = htonl(0);
+ num_header_words32 = 4;
+ num_packet_words32 = 5 + num_payload_words32;
+ vrt_hdr_flags = 0x1c000000;
+ break;
+ case 20:
+ header_buff[1] = htonl(metadata.time_spec.secs);
+ num_header_words32 = 2;
+ num_packet_words32 = 3 + num_payload_words32;
+ vrt_hdr_flags = 0x4c00000;
+ break;
+ case 21:
+ header_buff[1] = htonl(metadata.stream_id);
+ header_buff[2] = htonl(metadata.time_spec.secs);
+ num_header_words32 = 3;
+ num_packet_words32 = 4 + num_payload_words32;
+ vrt_hdr_flags = 0x14c00000;
+ break;
+ case 22:
+ header_buff[1] = htonl(0);
+ header_buff[2] = htonl(0);
+ header_buff[3] = htonl(metadata.time_spec.secs);
+ num_header_words32 = 4;
+ num_packet_words32 = 5 + num_payload_words32;
+ vrt_hdr_flags = 0xcc00000;
+ break;
+ case 23:
+ header_buff[1] = htonl(metadata.stream_id);
+ header_buff[2] = htonl(0);
+ header_buff[3] = htonl(0);
+ header_buff[4] = htonl(metadata.time_spec.secs);
+ num_header_words32 = 5;
+ num_packet_words32 = 6 + num_payload_words32;
+ vrt_hdr_flags = 0x1cc00000;
+ break;
+ case 24:
+ header_buff[1] = htonl(0);
+ header_buff[2] = htonl(metadata.time_spec.ticks);
+ num_header_words32 = 3;
+ num_packet_words32 = 4 + num_payload_words32;
+ vrt_hdr_flags = 0x4100000;
+ break;
+ case 25:
+ header_buff[1] = htonl(metadata.stream_id);
+ header_buff[2] = htonl(0);
+ header_buff[3] = htonl(metadata.time_spec.ticks);
+ num_header_words32 = 4;
+ num_packet_words32 = 5 + num_payload_words32;
+ vrt_hdr_flags = 0x14100000;
+ break;
+ case 26:
+ header_buff[1] = htonl(0);
+ header_buff[2] = htonl(0);
+ header_buff[3] = htonl(0);
+ header_buff[4] = htonl(metadata.time_spec.ticks);
+ num_header_words32 = 5;
+ num_packet_words32 = 6 + num_payload_words32;
+ vrt_hdr_flags = 0xc100000;
+ break;
+ case 27:
+ header_buff[1] = htonl(metadata.stream_id);
+ header_buff[2] = htonl(0);
+ header_buff[3] = htonl(0);
+ header_buff[4] = htonl(0);
+ header_buff[5] = htonl(metadata.time_spec.ticks);
+ num_header_words32 = 6;
+ num_packet_words32 = 7 + num_payload_words32;
+ vrt_hdr_flags = 0x1c100000;
+ break;
+ case 28:
+ header_buff[1] = htonl(metadata.time_spec.secs);
+ header_buff[2] = htonl(0);
+ header_buff[3] = htonl(metadata.time_spec.ticks);
+ num_header_words32 = 4;
+ num_packet_words32 = 5 + num_payload_words32;
+ vrt_hdr_flags = 0x4d00000;
+ break;
+ case 29:
+ header_buff[1] = htonl(metadata.stream_id);
+ header_buff[2] = htonl(metadata.time_spec.secs);
+ header_buff[3] = htonl(0);
+ header_buff[4] = htonl(metadata.time_spec.ticks);
+ num_header_words32 = 5;
+ num_packet_words32 = 6 + num_payload_words32;
+ vrt_hdr_flags = 0x14d00000;
+ break;
+ case 30:
+ header_buff[1] = htonl(0);
+ header_buff[2] = htonl(0);
+ header_buff[3] = htonl(metadata.time_spec.secs);
+ header_buff[4] = htonl(0);
+ header_buff[5] = htonl(metadata.time_spec.ticks);
+ num_header_words32 = 6;
+ num_packet_words32 = 7 + num_payload_words32;
+ vrt_hdr_flags = 0xcd00000;
+ break;
+ case 31:
+ header_buff[1] = htonl(metadata.stream_id);
+ header_buff[2] = htonl(0);
+ header_buff[3] = htonl(0);
+ header_buff[4] = htonl(metadata.time_spec.secs);
+ header_buff[5] = htonl(0);
+ header_buff[6] = htonl(metadata.time_spec.ticks);
+ num_header_words32 = 7;
+ num_packet_words32 = 8 + num_payload_words32;
+ vrt_hdr_flags = 0x1cd00000;
+ break;
}
- vrt_hdr_flags |= (metadata.start_of_burst)? (0x1 << 25) : 0;
- vrt_hdr_flags |= (metadata.end_of_burst)? (0x1 << 24) : 0;
-
- num_packet_words32 = num_header_words32 + num_payload_words32;
+ //set the burst flags
+ if (metadata.start_of_burst) vrt_hdr_flags |= 0x2000000;
+ if (metadata.end_of_burst) vrt_hdr_flags |= 0x1000000;
//fill in complete header word
header_buff[0] = htonl(vrt_hdr_flags |
@@ -80,30 +318,230 @@ void vrt::unpack(
if (vrt_hdr_word & (0x7 << 29))
throw std::runtime_error("unsupported vrt packet type");
- //parse the header flags
- num_header_words32 = 1;
-
- if (vrt_hdr_word & (0x1 << 28)){ //stream id
- metadata.has_stream_id = true;
- metadata.stream_id = ntohl(header_buff[num_header_words32++]);
- }
-
- if (vrt_hdr_word & (0x1 << 27)){ //class id (we dont use)
- num_header_words32 += 2;
- }
-
- if (vrt_hdr_word & (0x3 << 22)){ //integer time
- metadata.has_time_spec = true;
- metadata.time_spec.secs = ntohl(header_buff[num_header_words32++]);
- }
+ boost::uint8_t pred = 0;
+ if(vrt_hdr_word & 0x10000000) pred |= 0x1;
+ if(vrt_hdr_word & 0x8000000) pred |= 0x2;
+ if(vrt_hdr_word & 0xc00000) pred |= 0x4;
+ if(vrt_hdr_word & 0x300000) pred |= 0x8;
+ if(vrt_hdr_word & 0x4000000) pred |= 0x10;
- if (vrt_hdr_word & (0x3 << 20)){ //fractional time
- metadata.has_time_spec = true;
- metadata.time_spec.ticks = ntohl(header_buff[num_header_words32++]);
- num_header_words32++; //unused part of fractional seconds
+ switch(pred){
+ case 0:
+ num_header_words32 = 1;
+ num_payload_words32 = packet_words32 - 1;
+ break;
+ case 1:
+ metadata.has_stream_id = true;
+ metadata.stream_id = ntohl(header_buff[1]);
+ num_header_words32 = 2;
+ num_payload_words32 = packet_words32 - 2;
+ break;
+ case 2:
+ num_header_words32 = 3;
+ num_payload_words32 = packet_words32 - 3;
+ break;
+ case 3:
+ metadata.has_stream_id = true;
+ metadata.stream_id = ntohl(header_buff[1]);
+ num_header_words32 = 4;
+ num_payload_words32 = packet_words32 - 4;
+ break;
+ case 4:
+ metadata.has_time_spec = true;
+ metadata.time_spec.secs = ntohl(header_buff[1]);
+ num_header_words32 = 2;
+ num_payload_words32 = packet_words32 - 2;
+ break;
+ case 5:
+ metadata.has_stream_id = true;
+ metadata.stream_id = ntohl(header_buff[1]);
+ metadata.has_time_spec = true;
+ metadata.time_spec.secs = ntohl(header_buff[2]);
+ num_header_words32 = 3;
+ num_payload_words32 = packet_words32 - 3;
+ break;
+ case 6:
+ metadata.has_time_spec = true;
+ metadata.time_spec.secs = ntohl(header_buff[3]);
+ num_header_words32 = 4;
+ num_payload_words32 = packet_words32 - 4;
+ break;
+ case 7:
+ metadata.has_stream_id = true;
+ metadata.stream_id = ntohl(header_buff[1]);
+ metadata.has_time_spec = true;
+ metadata.time_spec.secs = ntohl(header_buff[4]);
+ num_header_words32 = 5;
+ num_payload_words32 = packet_words32 - 5;
+ break;
+ case 8:
+ metadata.has_time_spec = true;
+ metadata.time_spec.ticks = ntohl(header_buff[2]);
+ num_header_words32 = 3;
+ num_payload_words32 = packet_words32 - 3;
+ break;
+ case 9:
+ metadata.has_stream_id = true;
+ metadata.stream_id = ntohl(header_buff[1]);
+ metadata.has_time_spec = true;
+ metadata.time_spec.ticks = ntohl(header_buff[3]);
+ num_header_words32 = 4;
+ num_payload_words32 = packet_words32 - 4;
+ break;
+ case 10:
+ metadata.has_time_spec = true;
+ metadata.time_spec.ticks = ntohl(header_buff[4]);
+ num_header_words32 = 5;
+ num_payload_words32 = packet_words32 - 5;
+ break;
+ case 11:
+ metadata.has_stream_id = true;
+ metadata.stream_id = ntohl(header_buff[1]);
+ metadata.has_time_spec = true;
+ metadata.time_spec.ticks = ntohl(header_buff[5]);
+ num_header_words32 = 6;
+ num_payload_words32 = packet_words32 - 6;
+ break;
+ case 12:
+ metadata.has_time_spec = true;
+ metadata.time_spec.secs = ntohl(header_buff[1]);
+ metadata.time_spec.ticks = ntohl(header_buff[3]);
+ num_header_words32 = 4;
+ num_payload_words32 = packet_words32 - 4;
+ break;
+ case 13:
+ metadata.has_stream_id = true;
+ metadata.stream_id = ntohl(header_buff[1]);
+ metadata.has_time_spec = true;
+ metadata.time_spec.secs = ntohl(header_buff[2]);
+ metadata.time_spec.ticks = ntohl(header_buff[4]);
+ num_header_words32 = 5;
+ num_payload_words32 = packet_words32 - 5;
+ break;
+ case 14:
+ metadata.has_time_spec = true;
+ metadata.time_spec.secs = ntohl(header_buff[3]);
+ metadata.time_spec.ticks = ntohl(header_buff[5]);
+ num_header_words32 = 6;
+ num_payload_words32 = packet_words32 - 6;
+ break;
+ case 15:
+ metadata.has_stream_id = true;
+ metadata.stream_id = ntohl(header_buff[1]);
+ metadata.has_time_spec = true;
+ metadata.time_spec.secs = ntohl(header_buff[4]);
+ metadata.time_spec.ticks = ntohl(header_buff[6]);
+ num_header_words32 = 7;
+ num_payload_words32 = packet_words32 - 7;
+ break;
+ case 16:
+ num_header_words32 = 1;
+ num_payload_words32 = packet_words32 - 2;
+ break;
+ case 17:
+ metadata.has_stream_id = true;
+ metadata.stream_id = ntohl(header_buff[1]);
+ num_header_words32 = 2;
+ num_payload_words32 = packet_words32 - 3;
+ break;
+ case 18:
+ num_header_words32 = 3;
+ num_payload_words32 = packet_words32 - 4;
+ break;
+ case 19:
+ metadata.has_stream_id = true;
+ metadata.stream_id = ntohl(header_buff[1]);
+ num_header_words32 = 4;
+ num_payload_words32 = packet_words32 - 5;
+ break;
+ case 20:
+ metadata.has_time_spec = true;
+ metadata.time_spec.secs = ntohl(header_buff[1]);
+ num_header_words32 = 2;
+ num_payload_words32 = packet_words32 - 3;
+ break;
+ case 21:
+ metadata.has_stream_id = true;
+ metadata.stream_id = ntohl(header_buff[1]);
+ metadata.has_time_spec = true;
+ metadata.time_spec.secs = ntohl(header_buff[2]);
+ num_header_words32 = 3;
+ num_payload_words32 = packet_words32 - 4;
+ break;
+ case 22:
+ metadata.has_time_spec = true;
+ metadata.time_spec.secs = ntohl(header_buff[3]);
+ num_header_words32 = 4;
+ num_payload_words32 = packet_words32 - 5;
+ break;
+ case 23:
+ metadata.has_stream_id = true;
+ metadata.stream_id = ntohl(header_buff[1]);
+ metadata.has_time_spec = true;
+ metadata.time_spec.secs = ntohl(header_buff[4]);
+ num_header_words32 = 5;
+ num_payload_words32 = packet_words32 - 6;
+ break;
+ case 24:
+ metadata.has_time_spec = true;
+ metadata.time_spec.ticks = ntohl(header_buff[2]);
+ num_header_words32 = 3;
+ num_payload_words32 = packet_words32 - 4;
+ break;
+ case 25:
+ metadata.has_stream_id = true;
+ metadata.stream_id = ntohl(header_buff[1]);
+ metadata.has_time_spec = true;
+ metadata.time_spec.ticks = ntohl(header_buff[3]);
+ num_header_words32 = 4;
+ num_payload_words32 = packet_words32 - 5;
+ break;
+ case 26:
+ metadata.has_time_spec = true;
+ metadata.time_spec.ticks = ntohl(header_buff[4]);
+ num_header_words32 = 5;
+ num_payload_words32 = packet_words32 - 6;
+ break;
+ case 27:
+ metadata.has_stream_id = true;
+ metadata.stream_id = ntohl(header_buff[1]);
+ metadata.has_time_spec = true;
+ metadata.time_spec.ticks = ntohl(header_buff[5]);
+ num_header_words32 = 6;
+ num_payload_words32 = packet_words32 - 7;
+ break;
+ case 28:
+ metadata.has_time_spec = true;
+ metadata.time_spec.secs = ntohl(header_buff[1]);
+ metadata.time_spec.ticks = ntohl(header_buff[3]);
+ num_header_words32 = 4;
+ num_payload_words32 = packet_words32 - 5;
+ break;
+ case 29:
+ metadata.has_stream_id = true;
+ metadata.stream_id = ntohl(header_buff[1]);
+ metadata.has_time_spec = true;
+ metadata.time_spec.secs = ntohl(header_buff[2]);
+ metadata.time_spec.ticks = ntohl(header_buff[4]);
+ num_header_words32 = 5;
+ num_payload_words32 = packet_words32 - 6;
+ break;
+ case 30:
+ metadata.has_time_spec = true;
+ metadata.time_spec.secs = ntohl(header_buff[3]);
+ metadata.time_spec.ticks = ntohl(header_buff[5]);
+ num_header_words32 = 6;
+ num_payload_words32 = packet_words32 - 7;
+ break;
+ case 31:
+ metadata.has_stream_id = true;
+ metadata.stream_id = ntohl(header_buff[1]);
+ metadata.has_time_spec = true;
+ metadata.time_spec.secs = ntohl(header_buff[4]);
+ metadata.time_spec.ticks = ntohl(header_buff[6]);
+ num_header_words32 = 7;
+ num_payload_words32 = packet_words32 - 8;
+ break;
}
-
- size_t num_trailer_words32 = (vrt_hdr_word & (0x1 << 26))? 1 : 0;
-
- num_payload_words32 = packet_words32 - num_header_words32 - num_trailer_words32;
}
+