/* 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 . */ #include "dabInputDmbFile.h" #include "dabInputFifo.h" #include "Dmb.h" #include "UdpSocket.h" #include #include 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; }