/* Copyright (C) 2009 Her Majesty the Queen in Right of Canada (Communications Research Center Canada) Copyright (C) 2013 Matthias P. Braendli http://mpb.li Base class for all file and fifo-based inputs. */ /* This file is part of CRC-DabMux. CRC-DabMux 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-DabMux 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-DabMux. If not, see . */ #include "inputs/Input.h" #ifdef HAVE_FORMAT_DABPLUS #ifdef HAVE_INPUT_FILE #include "mpeg.h" #include "TcpLog.h" #include #include #include #include #include #include #include #include #include #ifndef _WIN32 # define O_BINARY 0 #endif extern TcpLog etiLog; int InputDabplusFile::Read(void* buffer, int size) { if (this->buffer.size() != size * 5) { this->buffer.resize(size * 5); this->bufferIndex = 0; } if (this->bufferIndex + size > this->buffer.size()) { int ret = read(this->file, &this->buffer[0], this->buffer.size()); if (ret != this->buffer.size()) { if (ret != 0) { etiLog.print(TcpLog::CRIT, "ERROR: Incomplete DAB+ frame!\n"); } return 0; } this->bufferIndex = 0; } memcpy(buffer, &this->buffer[this->bufferIndex], size); this->bufferIndex += size; return size; } int InputDabplusFile::ReadFrame(void* buffer, int size) { int result; uint8_t* dataOut = reinterpret_cast(buffer); result = Read(dataOut, size); if (result == -1) { etiLog.print(TcpLog::CRIT, "ERROR: Can't read file\n"); perror(""); return -1; } if (result < size) { int sizeOut = result; etiLog.print(TcpLog::NOTICE, "reach end of file -> rewinding\n"); if (Rewind() == -1) { etiLog.print(TcpLog::CRIT, "ERROR: Can't rewind file\n"); return -1; } result = Read(dataOut + sizeOut, size - sizeOut); if (result == -1) { etiLog.print(TcpLog::CRIT, "ERROR: Can't read file\n"); perror(""); return -1; } if (result < size) { etiLog.print(TcpLog::CRIT, "ERROR: Not enought data in file\n"); return -1; } } return size; } #endif #endif