/* Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Her Majesty the Queen in Right of Canada (Communications Research Center Canada) Copyrigth (C) 2014 Matthias P. Braendli, matthias.braendli@mpb.li Taken from ODR-DabMod Supported file formats: RAW, FRAMED, STREAMED Supports re-sync to RAW ETI file */ /* This file is part of ODR-DabMod. ODR-DabMod 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. ODR-DabMod 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 ODR-DabMod. If not, see . */ #include "etiinput.hpp" #include #include #include #include #include #include #include /* Definition of AT_* constants */ #include int identify_eti_format(FILE* inputFile, int *streamType) { *streamType = ETI_STREAM_TYPE_NONE; struct stat inputFileStat; fstat(fileno(inputFile), &inputFileStat); size_t inputfilelength_ = inputFileStat.st_size; int nbframes_; uint32_t sync; uint32_t nbFrames; uint16_t frameSize; char discard_buffer[6144]; if (fread(&sync, sizeof(sync), 1, inputFile) != 1) { fprintf(stderr, "Unable to read sync in input file!\n"); perror(""); return -1; } if ((sync == 0x49c5f8ff) || (sync == 0xb63a07ff)) { *streamType = ETI_STREAM_TYPE_RAW; if (inputfilelength_ > 0) { nbframes_ = inputfilelength_ / 6144; } else { nbframes_ = ~0; } if (fseek(inputFile, -sizeof(sync), SEEK_CUR) != 0) { // if the seek fails, consume the rest of the frame if (fread(discard_buffer, 6144 - sizeof(sync), 1, inputFile) != 1) { fprintf(stderr, "Unable to read from input file!\n"); perror(""); return -1; } } return 0; } nbFrames = sync; if (fread(&frameSize, sizeof(frameSize), 1, inputFile) != 1) { fprintf(stderr, "Unable to read frame size in input file!\n"); perror(""); return -1; } sync >>= 16; sync &= 0xffff; sync |= ((uint32_t)frameSize) << 16; if ((sync == 0x49c5f8ff) || (sync == 0xb63a07ff)) { *streamType = ETI_STREAM_TYPE_STREAMED; frameSize = nbFrames & 0xffff; if (inputfilelength_ > 0) { nbframes_ = inputfilelength_ / (frameSize + 2); } else { nbframes_ = ~0; } if (fseek(inputFile, -6, SEEK_CUR) != 0) { // if the seek fails, consume the rest of the frame if (fread(discard_buffer, frameSize - 4, 1, inputFile) != 1) { fprintf(stderr, "Unable to read from input file!\n"); perror(""); return -1; } } return 0; } if (fread(&sync, sizeof(sync), 1, inputFile) != 1) { fprintf(stderr, "Unable to read nb frame in input file!\n"); perror(""); return -1; } if ((sync == 0x49c5f8ff) || (sync == 0xb63a07ff)) { *streamType = ETI_STREAM_TYPE_FRAMED; if (fseek(inputFile, -6, SEEK_CUR) != 0) { // if the seek fails, consume the rest of the frame if (fread(discard_buffer, frameSize - 4, 1, inputFile) != 1) { fprintf(stderr, "Unable to read from input file!\n"); perror(""); return -1; } } nbframes_ = ~0; return 0; } // Search for the sync marker byte by byte for (size_t i = 10; i < 6144 + 10; ++i) { sync >>= 8; sync &= 0xffffff; if (fread((uint8_t*)&sync + 3, 1, 1, inputFile) != 1) { fprintf(stderr, "Unable to read from input file!\n"); perror(""); return -1; } if ((sync == 0x49c5f8ff) || (sync == 0xb63a07ff)) { *streamType = ETI_STREAM_TYPE_RAW; if (inputfilelength_ > 0) { nbframes_ = (inputfilelength_ - i) / 6144; } else { nbframes_ = ~0; } if (fseek(inputFile, -sizeof(sync), SEEK_CUR) != 0) { if (fread(discard_buffer, 6144 - sizeof(sync), 1, inputFile) != 1) { fprintf(stderr, "Unable to read from input file!\n"); perror(""); return -1; } } return 0; } } (void)nbframes_; // suppress warning "nbframes_ unused" fprintf(stderr, "Bad input file format!\n"); return -1; } int get_eti_frame(FILE* inputfile, int stream_type, void* buf) { // Initialise buffer memset(buf, 0x55, 6144); uint16_t frameSize; if (stream_type == ETI_STREAM_TYPE_RAW) { frameSize = 6144; } else { if (fread(&frameSize, sizeof(frameSize), 1, inputfile) != 1) { // EOF return 0; } } if (frameSize > 6144) { // there might be a better limit fprintf(stderr, "Wrong frame size %u in ETI file!\n", frameSize); return -1; } int read_bytes = fread(buf, 1, frameSize, inputfile); if (read_bytes != frameSize) { // A short read of a frame (i.e. reading an incomplete frame) // is not tolerated. Input files must not contain incomplete frames fprintf(stderr, "Incomplete frame in ETI file!\n"); return -1; } // We have added padding, so we always return 6144 bytes return 6144; }