From 4f9a01a80570437b86e69eb0542b13df9a20743d Mon Sep 17 00:00:00 2001 From: "Matthias P. Braendli (think)" Date: Sun, 10 Nov 2013 18:25:04 +0100 Subject: dabmod: add file input to separate class, change version --- src/InputReader.h | 125 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 src/InputReader.h (limited to 'src/InputReader.h') diff --git a/src/InputReader.h b/src/InputReader.h new file mode 100644 index 0000000..dbc7c11 --- /dev/null +++ b/src/InputReader.h @@ -0,0 +1,125 @@ +/* + Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 + Her Majesty the Queen in Right of Canada (Communications Research + Center Canada) + + Copyrigth (C) 2013 + Matthias P. Braendli, matthias.braendli@mpb.li + */ +/* + This file is part of CRC-DADMOD. + + CRC-DADMOD 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. + + CRC-DADMOD 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 CRC-DADMOD. If not, see . + */ + +#ifndef INPUTREADER_H +#define INPUTREADER_H + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include "porting.h" +#include "Log.h" + +/* Known types of input streams. Description taken from the CRC mmbTools forum. + + All numbers are little-endian. + + Framed format is used for file recording. It is the default format. The + padding can be removed from data. Format: + uint32_t nbFrames + for each frame + uint16_t frameSize + uint8_t data[frameSize] + + Streamed format is used for streamed applications. As the total number of + frames is unknown before end of transmission, the corresponding field is + removed. The padding can be removed from data. Format: + for each frame + uint16_t frameSize + uint8_t data[frameSize] + + Raw format is a bit-by-bit (but byte aligned on sync) recording of a G.703 + data stream. The padding is always present. Format: + for each frame + uint8_t data[6144] + + Please note that our raw format can also be referred to as ETI(NI, G.703) or ETI(NI). +*/ +enum EtiStreamType { + ETI_STREAM_TYPE_NONE = 0, + ETI_STREAM_TYPE_RAW, + ETI_STREAM_TYPE_STREAMED, + ETI_STREAM_TYPE_FRAMED, +}; + +class InputReader +{ + public: + // Save the next frame into the buffer, and return the number of bytes read. + virtual int GetNextFrame(void* buffer) = 0; +}; + +class InputFileReader : public InputReader +{ + public: + InputFileReader(Logger logger) : + streamtype_(ETI_STREAM_TYPE_NONE), + inputfile_(NULL), logger_(logger) {}; + + ~InputFileReader() + { + fprintf(stderr, "\nClosing input file...\n"); + + if (inputfile_ != NULL) { + fclose(inputfile_); + } + } + + // open file and determine stream type + int Open(std::string filename); + + // Print information about the file opened + void PrintInfo(); + + // Rewind the file, and replay anew + // returns 0 on success, -1 on failure + int Rewind(); + + // Put next frame into buffer. This function will never write more than + // 6144 bytes into buffer. + // returns number of bytes written to buffer, 0 on eof, -1 on error + int GetNextFrame(void* buffer); + + EtiStreamType GetStreamType() + { + return streamtype_; + } + + private: + int IdentifyType(); + + std::string filename_; + EtiStreamType streamtype_; + FILE* inputfile_; + Logger logger_; + + size_t inputfilelength_; + uint64_t nbframes_; // 64-bit because 32-bit overflow is + // after 2**32 * 24ms ~= 3.3 years +}; + +#endif -- cgit v1.2.3