diff options
| -rw-r--r-- | host/CMakeLists.txt | 20 | ||||
| -rw-r--r-- | host/lib/CMakeLists.txt | 46 | ||||
| -rwxr-xr-x | host/lib/transport/gen_vrt.py | 3 | ||||
| -rw-r--r-- | host/lib/transport/vrt.cpp | 549 | 
4 files changed, 57 insertions, 561 deletions
| diff --git a/host/CMakeLists.txt b/host/CMakeLists.txt index baae90861..6334b44ff 100644 --- a/host/CMakeLists.txt +++ b/host/CMakeLists.txt @@ -25,8 +25,8 @@ ENABLE_TESTING()  SET(CPACK_PACKAGE_VERSION_MAJOR 0)  SET(CPACK_PACKAGE_VERSION_MINOR 0)  SET(CPACK_PACKAGE_VERSION_PATCH 0) -SET(CPACK_RESOURCE_FILE_README ${CMAKE_SOURCE_DIR}/README) -SET(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_SOURCE_DIR}/LICENSE) +SET(CPACK_RESOURCE_FILE_README ${CMAKE_CURRENT_SOURCE_DIR}/README) +SET(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE)  INCLUDE(CPack) #include after setting vars  ######################################################################## @@ -42,18 +42,18 @@ MESSAGE(STATUS "Using install prefix: ${CMAKE_INSTALL_PREFIX}")  ########################################################################  # Local Include Dir  ######################################################################## -INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include) +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include)  ########################################################################  # Optional Compiler Flags  ########################################################################  INCLUDE(CheckCXXCompilerFlag) -FUNCTION(UHD_ADD_OPTIONAL_CXX_COMPILER_FLAG flag have) +MACRO(UHD_ADD_OPTIONAL_CXX_COMPILER_FLAG flag have)      CHECK_CXX_COMPILER_FLAG(${flag} ${have})      IF(${have})          ADD_DEFINITIONS(${flag})      ENDIF(${have}) -ENDFUNCTION(UHD_ADD_OPTIONAL_CXX_COMPILER_FLAG) +ENDMACRO(UHD_ADD_OPTIONAL_CXX_COMPILER_FLAG)  IF(UNIX)      UHD_ADD_OPTIONAL_CXX_COMPILER_FLAG(-Wall      HAVE_WALL) @@ -114,7 +114,7 @@ ADD_CUSTOM_TARGET(uninstall  # Create Pkg Config File  ########################################################################  CONFIGURE_FILE( -    ${CMAKE_SOURCE_DIR}/uhd.pc.in +    ${CMAKE_CURRENT_SOURCE_DIR}/uhd.pc.in      ${CMAKE_CURRENT_BINARY_DIR}/uhd.pc  @ONLY) @@ -131,7 +131,7 @@ INCLUDE(FindDoxygen)  IF(DOXYGEN_FOUND)      SET(CMAKE_CURRENT_BINARY_DIR_DOXYGEN ${CMAKE_CURRENT_BINARY_DIR}/doxygen)      CONFIGURE_FILE( -        ${CMAKE_SOURCE_DIR}/Doxyfile.in +        ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in          ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile      @ONLY)      ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR_DOXYGEN} @@ -143,9 +143,9 @@ IF(DOXYGEN_FOUND)  ENDIF(DOXYGEN_FOUND)  INSTALL(FILES -    ${CMAKE_SOURCE_DIR}/README -    ${CMAKE_SOURCE_DIR}/LICENSE -    ${CMAKE_SOURCE_DIR}/AUTHORS +    ${CMAKE_CURRENT_SOURCE_DIR}/README +    ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE +    ${CMAKE_CURRENT_SOURCE_DIR}/AUTHORS      DESTINATION ${PKG_DOC_DIR}  ) diff --git a/host/lib/CMakeLists.txt b/host/lib/CMakeLists.txt index f21a4a491..87e35f412 100644 --- a/host/lib/CMakeLists.txt +++ b/host/lib/CMakeLists.txt @@ -15,6 +15,33 @@  # along with this program.  If not, see <http://www.gnu.org/licenses/>.  # + +######################################################################## +# Setup Python +######################################################################## +INCLUDE(FindPythonInterp) + +MACRO(PYTHON_CHECK_MODULE module have) +    MESSAGE(STATUS "Checking for python module ${module}") +    EXECUTE_PROCESS( +        COMMAND ${PYTHON_EXECUTABLE} -c "import ${module}" +        RESULT_VARIABLE ${have} +    ) +    IF(${have} EQUAL 0) +        MESSAGE(STATUS "Checking for python module ${module} - found") +        SET(${have} TRUE) +    ELSE(${have} EQUAL 0) +        MESSAGE(STATUS "Checking for python module ${module} - not found") +        SET(${have} FALSE) +    ENDIF(${have} EQUAL 0) +ENDMACRO(PYTHON_CHECK_MODULE) + +PYTHON_CHECK_MODULE("Cheetah" HAVE_PYTHON_MODULE_CHEETAH) + +IF(NOT HAVE_PYTHON_MODULE_CHEETAH) +    MESSAGE(FATAL_ERROR "Error: Cheetah Templates needed for pre-build generation.") +ENDIF(NOT HAVE_PYTHON_MODULE_CHEETAH) +  ########################################################################  # Create a list of libuhd sources  ######################################################################## @@ -26,7 +53,6 @@ SET(libuhd_sources      wax.cpp      transport/if_addrs.cpp      transport/udp_simple.cpp -    transport/vrt.cpp      usrp/dboard/db_basic_and_lf.cpp      usrp/dboard/db_rfx.cpp      usrp/dboard_base.cpp @@ -42,6 +68,24 @@ SET(libuhd_sources  )  ######################################################################## +# Generate Files +######################################################################## +MACRO(UHD_PYTHON_GEN_FILE pyfile outfile) +    ADD_CUSTOM_COMMAND( +        OUTPUT ${outfile} DEPENDS ${pyfile} +        COMMAND ${PYTHON_EXECUTABLE} ${pyfile} ${outfile} +        COMMENT "Calling ${pyfile} to generate ${outfile}" +    ) +ENDMACRO(UHD_PYTHON_GEN_FILE) +UHD_PYTHON_GEN_FILE( +    ${CMAKE_CURRENT_SOURCE_DIR}/transport/gen_vrt.py +    ${CMAKE_CURRENT_BINARY_DIR}/transport/vrt.cpp +) +LIST(APPEND libuhd_sources +    ${CMAKE_CURRENT_BINARY_DIR}/transport/vrt.cpp +) + +########################################################################  # Conditionally add the udp sources  ########################################################################  LIST(APPEND libuhd_sources diff --git a/host/lib/transport/gen_vrt.py b/host/lib/transport/gen_vrt.py index bc6635d78..0f961efc2 100755 --- a/host/lib/transport/gen_vrt.py +++ b/host/lib/transport/gen_vrt.py @@ -200,9 +200,10 @@ void vrt::unpack(  }  """ +import sys  from Cheetah import Template  def parse_str(_tmpl_text, **kwargs): return str(Template.Template(_tmpl_text, kwargs))  if __name__ == '__main__':      from Cheetah import Template -    print parse_str(TMPL_TEXT, file=__file__) +    open(sys.argv[1], 'w').write(parse_str(TMPL_TEXT, file=__file__)) diff --git a/host/lib/transport/vrt.cpp b/host/lib/transport/vrt.cpp deleted file mode 100644 index 78c3cf2cb..000000000 --- a/host/lib/transport/vrt.cpp +++ /dev/null @@ -1,549 +0,0 @@ - - - -/*********************************************************************** - * This file was generated by gen_vrt.py on 04/08/10 10:55:26 - **********************************************************************/ - -#include <uhd/transport/vrt.hpp> -#include <boost/asio.hpp> //endianness conversion -#include <stdexcept> - -using namespace uhd; -using namespace uhd::transport; - -void vrt::pack( -    const tx_metadata_t &metadata, //input -    boost::uint32_t *header_buff,  //output -    size_t &num_header_words32,    //output -    size_t num_payload_words32,    //input -    size_t &num_packet_words32,    //output -    size_t packet_count,           //input -    double tick_rate               //input -){ -    boost::uint32_t vrt_hdr_flags; - -    boost::uint8_t pred = 0; -    if (metadata.has_stream_id) pred |= 0x1; -    if (metadata.has_time_spec) pred |= 0xc; - -    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.get_ticks(tick_rate)); -            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.get_ticks(tick_rate)); -            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.get_ticks(tick_rate)); -            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.get_ticks(tick_rate)); -            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.get_ticks(tick_rate)); -            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.get_ticks(tick_rate)); -            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.get_ticks(tick_rate)); -            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.get_ticks(tick_rate)); -            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.get_ticks(tick_rate)); -            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.get_ticks(tick_rate)); -            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.get_ticks(tick_rate)); -            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.get_ticks(tick_rate)); -            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.get_ticks(tick_rate)); -            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.get_ticks(tick_rate)); -            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.get_ticks(tick_rate)); -            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.get_ticks(tick_rate)); -            num_header_words32 = 7; -            num_packet_words32 = 8 + num_payload_words32; -            vrt_hdr_flags = 0x1cd00000; -        break; -    } - -    //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 | -        ((packet_count & 0xf) << 16) | -        (num_packet_words32 & 0xffff) -    ); -} - -void vrt::unpack( -    rx_metadata_t &metadata,            //output -    const boost::uint32_t *header_buff, //input -    size_t &num_header_words32,         //output -    size_t &num_payload_words32,        //output -    size_t num_packet_words32,          //input -    size_t &packet_count,               //output -    double tick_rate                    //input -){ -    //clear the metadata -    metadata = rx_metadata_t(); - -    //extract vrt header -    boost::uint32_t vrt_hdr_word = ntohl(header_buff[0]); -    size_t packet_words32 = vrt_hdr_word & 0xffff; -    packet_count = (vrt_hdr_word >> 16) & 0xf; - -    //failure cases -    if (packet_words32 == 0 or num_packet_words32 < packet_words32) -        throw std::runtime_error("bad vrt header or packet fragment"); -    if (vrt_hdr_word & (0x7 << 29)) -        throw std::runtime_error("unsupported vrt packet type"); - -    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; - -    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.set_ticks(ntohl(header_buff[2]), tick_rate); -            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.set_ticks(ntohl(header_buff[3]), tick_rate); -            num_header_words32 = 4; -            num_payload_words32 = packet_words32 - 4; -        break; -    case 10: -            metadata.has_time_spec = true; -            metadata.time_spec.set_ticks(ntohl(header_buff[4]), tick_rate); -            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.set_ticks(ntohl(header_buff[5]), tick_rate); -            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.set_ticks(ntohl(header_buff[3]), tick_rate); -            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.set_ticks(ntohl(header_buff[4]), tick_rate); -            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.set_ticks(ntohl(header_buff[5]), tick_rate); -            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.set_ticks(ntohl(header_buff[6]), tick_rate); -            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.set_ticks(ntohl(header_buff[2]), tick_rate); -            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.set_ticks(ntohl(header_buff[3]), tick_rate); -            num_header_words32 = 4; -            num_payload_words32 = packet_words32 - 5; -        break; -    case 26: -            metadata.has_time_spec = true; -            metadata.time_spec.set_ticks(ntohl(header_buff[4]), tick_rate); -            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.set_ticks(ntohl(header_buff[5]), tick_rate); -            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.set_ticks(ntohl(header_buff[3]), tick_rate); -            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.set_ticks(ntohl(header_buff[4]), tick_rate); -            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.set_ticks(ntohl(header_buff[5]), tick_rate); -            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.set_ticks(ntohl(header_buff[6]), tick_rate); -            num_header_words32 = 7; -            num_payload_words32 = packet_words32 - 8; -        break; -    } -} - | 
