diff options
Diffstat (limited to 'src/dabInputDmbFile.cpp')
-rw-r--r-- | src/dabInputDmbFile.cpp | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/src/dabInputDmbFile.cpp b/src/dabInputDmbFile.cpp new file mode 100644 index 0000000..a057764 --- /dev/null +++ b/src/dabInputDmbFile.cpp @@ -0,0 +1,161 @@ +/* + Copyright (C) 2009 Her Majesty the Queen in Right of Canada (Communications + Research Center Canada) + */ +/* + 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 <http://www.gnu.org/licenses/>. + */ + +#include "dabInputDmbFile.h" +#include "dabInputFifo.h" +#include "Dmb.h" +#include "UdpSocket.h" + +#include <string.h> +#include <stdio.h> + + +struct dabInputDmbFileData { + FILE* file; + Dmb* dmb; + dabInputFifoStats stats; + unsigned char buffer[188]; + unsigned bufferLength; +}; + + +struct dabInputOperations dabInputDmbFileOperations = { + dabInputDmbFileInit, + dabInputDmbFileOpen, + dabInputSetbuf, + NULL, + NULL, + NULL, + dabInputDmbFileRead, + dabInputSetbitrate, + dabInputDmbFileClose, + dabInputDmbFileClean, + NULL +}; + + +int dabInputDmbFileInit(void** args) +{ + dabInputDmbFileData* input = new dabInputDmbFileData; + memset(&input->stats, 0, sizeof(input->stats)); + input->stats.id = dabInputFifoData::nb++; + input->file = NULL; + input->bufferLength = 0; + input->dmb = new Dmb(); + *args = input; + + UdpSocket::init(); + return 0; +} + + +int dabInputDmbFileOpen(void* args, const char* inputName) +{ + int returnCode = 0; + dabInputDmbFileData* input = (dabInputDmbFileData*)args; + + input->file = fopen(inputName, "r"); + if (input->file == NULL) { + perror(inputName); + returnCode = -1; + } + + return returnCode;; +} + + +int dabInputDmbFileRead(dabInputOperations* ops, void* args, void* buffer, int size) +{ + int nbBytes = 0; + dabInputDmbFileData* input = (dabInputDmbFileData*)args; + dabInputFifoStats* stats = (dabInputFifoStats*)&input->stats; + + input->stats.frameRecords[input->stats.frameCount].curSize = 0; + input->stats.frameRecords[input->stats.frameCount].maxSize = size; + + if (input->bufferLength == 0) { + input->bufferLength = fread(input->buffer, 188, 1, input->file); + } +/* while ((nbBytes = writePacket(input->packet->getData(), + input->packet->getLength(), buffer, size, input->info)) + != 0) { + input->stats.frameRecords[input->stats.frameCount].curSize = nbBytes; + input->socket->receive(*input->packet); + }*/ + while ((nbBytes = input->dmb->encode(input->buffer, + input->bufferLength * 188, buffer, size)) + != 0) { + input->stats.frameRecords[input->stats.frameCount].curSize = nbBytes; + input->bufferLength = fread(input->buffer, 188, 1, input->file); + if (input->bufferLength == 0) { + etiLog.print(TcpLog::NOTICE, "reach end of file -> rewinding\n"); + if (fseek(input->file, 0, SEEK_SET) == 0) { + input->bufferLength = fread(input->buffer, 188, 1, input->file); + } + } + //++mpgFrameNb; + } + //++dmbFrameNb; + + if (input->bufferLength != 0) { + input->stats.frameRecords[input->stats.frameCount].curSize = size; + } + + if (++stats->frameCount == NB_RECORDS) { + etiLog.print(TcpLog::INFO, "Data subchannel usage: (%i)", + stats->id); + for (int i = 0; i < stats->frameCount; ++i) { + etiLog.print(TcpLog::INFO, " %i/%i", + stats->frameRecords[i].curSize, + stats->frameRecords[i].maxSize); + } + etiLog.print(TcpLog::INFO, "\n"); + stats->frameCount = 0; + } + return size; +} + + +int dabInputDmbFileClose(void* args) +{ + dabInputDmbFileData* input = (dabInputDmbFileData*)args; + + if (input->file != NULL) { + if (fclose(input->file)) { + perror(""); + return -1; + } + } + + return 0; +} + + +int dabInputDmbFileClean(void** args) +{ + dabInputDmbFileData* input = (dabInputDmbFileData*)(*args); + dabInputDmbFileClose(args); + delete input->dmb; + delete input; + return 0; +} + + |