1ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat/* 2ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat * Copyright (C) 2014 The Android Open Source Project 3ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat * All rights reserved. 4ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat * 5ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat * Redistribution and use in source and binary forms, with or without 6ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat * modification, are permitted provided that the following conditions 7ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat * are met: 8ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat * * Redistributions of source code must retain the above copyright 9ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat * notice, this list of conditions and the following disclaimer. 10ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat * * Redistributions in binary form must reproduce the above copyright 11ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat * notice, this list of conditions and the following disclaimer in 12ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat * the documentation and/or other materials provided with the 13ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat * distribution. 14ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat * 15ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 18ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 19ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 20ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 22ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 23ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 25ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat * SUCH DAMAGE. 27ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat */ 28ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat#include <stdio.h> 29ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat#include <stdlib.h> 30ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat#include <time.h> 31ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat#include <stdint.h> 32ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat#include <assert.h> 33ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat#include "gsmamr_enc.h" 34ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat 35ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhatenum { 36ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat kInputSize = 320, // 160 samples * 16-bit per sample. 37ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat kOutputSize = 1024 38ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat}; 39ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat 40ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhatstruct AmrNbEncState { 41ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat void *encCtx; 42ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat void *pidSyncCtx; 43ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat}; 44ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat 45ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhatvoid usage(void) { 46ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat printf("Usage:\n"); 47ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat printf("AMRNBEnc [options] <input file> <output file>\n"); 48ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat printf("\n"); 49ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat printf("Options +M* for setting compression bitrate mode, default is 4.75 kbps\n"); 50ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat printf(" +M0 = 4.75 kbps\n"); 51ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat printf(" +M1 = 5.15 kbps\n"); 52ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat printf(" +M2 = 5.90 kbps\n"); 53ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat printf(" +M3 = 6.70 kbps\n"); 54ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat printf(" +M4 = 7.40 kbps\n"); 55ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat printf(" +M5 = 7.95 kbps\n"); 56ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat printf(" +M6 = 10.2 kbps\n"); 57ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat printf(" +M7 = 12.2 kbps\n"); 58ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat printf("\n"); 59ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat} 60ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat 61ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhatint encode(int mode, const char *srcFile, const char *dstFile) { 62ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat int retVal = EXIT_SUCCESS; 63ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat FILE *fSrc = NULL; 64ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat FILE *fDst = NULL; 65ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat int frameNum = 0; 66ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat bool eofReached = false; 67ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat uint16_t *inputBuf = NULL; 68ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat uint8_t *outputBuf = NULL; 69ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat AmrNbEncState *amr = NULL; 70ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat 71ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat clock_t start, finish; 72ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat double duration = 0.0; 73ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat 74ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat // Open input file. 75ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat fSrc = fopen(srcFile, "rb"); 76ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat if (fSrc == NULL) { 77ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat fprintf(stderr, "Error opening input file\n"); 78ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat retVal = EXIT_FAILURE; 79ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat goto safe_exit; 80ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat } 81ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat 82ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat // Open output file. 83ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat fDst = fopen(dstFile, "wb"); 84ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat if (fDst == NULL) { 85ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat fprintf(stderr, "Error opening output file\n"); 86ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat retVal = EXIT_FAILURE; 87ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat goto safe_exit; 88ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat } 89ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat 90ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat // Allocate input buffer. 91ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat inputBuf = (uint16_t*) malloc(kInputSize); 92ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat assert(inputBuf != NULL); 93ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat 94ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat // Allocate output buffer. 95ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat outputBuf = (uint8_t*) malloc(kOutputSize); 96ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat assert(outputBuf != NULL); 97ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat 98ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat // Initialize encoder. 99ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat amr = (AmrNbEncState*) malloc(sizeof(AmrNbEncState)); 100ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat AMREncodeInit(&amr->encCtx, &amr->pidSyncCtx, 0); 101ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat 102ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat // Write file header. 103ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat fwrite("#!AMR\n", 1, 6, fDst); 104ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat 105ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat while (1) { 106ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat // Read next input frame. 107ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat int bytesRead; 108ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat bytesRead = fread(inputBuf, 1, kInputSize, fSrc); 109ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat if (bytesRead != kInputSize && !feof(fSrc)) { 110ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat retVal = EXIT_FAILURE; // Invalid magic number. 111ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat fprintf(stderr, "Error reading input file\n"); 112ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat goto safe_exit; 113ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat } else if (feof(fSrc) && bytesRead == 0) { 114ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat eofReached = true; 115ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat break; 116ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat } 117ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat 118ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat start = clock(); 119ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat 120ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat // Encode the frame. 121ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat Frame_Type_3GPP frame_type = (Frame_Type_3GPP) mode; 122ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat int bytesGenerated; 123ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat bytesGenerated = AMREncode(amr->encCtx, amr->pidSyncCtx, (Mode)mode, 124ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat (Word16*)inputBuf, outputBuf, &frame_type, 125ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat AMR_TX_WMF); 126ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat 127ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat // Convert from WMF to RFC 3267 format. 128ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat if (bytesGenerated > 0) { 129ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat outputBuf[0] = ((outputBuf[0] << 3) | 4) & 0x7c; 130ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat } 131ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat 132ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat finish = clock(); 133ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat duration += finish - start; 134ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat 135ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat if (bytesGenerated < 0) { 136ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat retVal = EXIT_FAILURE; 137ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat fprintf(stderr, "Encoding error\n"); 138ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat goto safe_exit; 139ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat } 140ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat 141ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat frameNum++; 142ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat printf(" Frames processed: %d\n", frameNum); 143ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat 144ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat // Write the output. 145ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat fwrite(outputBuf, 1, bytesGenerated, fDst); 146ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat } 147ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat 148ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat // Dump the time taken by encode. 149ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat printf("\n%2.5lf seconds\n", (double)duration/CLOCKS_PER_SEC); 150ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat 151ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhatsafe_exit: 152ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat 153ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat // Free the encoder instance. 154ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat if (amr) { 155ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat AMREncodeExit(&amr->encCtx, &amr->pidSyncCtx); 156ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat free(amr); 157ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat } 158ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat 159ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat // Free input and output buffer. 160ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat free(inputBuf); 161ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat free(outputBuf); 162ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat 163ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat // Close the input and output files. 164ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat if (fSrc) { 165ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat fclose(fSrc); 166ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat } 167ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat if (fDst) { 168ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat fclose(fDst); 169ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat } 170ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat 171ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat return retVal; 172ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat} 173ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat 174ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhatint main(int argc, char *argv[]) { 175ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat Mode mode = MR475; 176ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat int retVal; 177ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat char *inFileName = NULL; 178ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat char *outFileName = NULL; 179ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat int arg, filename = 0; 180ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat 181ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat if (argc < 3) { 182ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat usage(); 183ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat return EXIT_FAILURE; 184ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat } else { 185ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat for (arg = 1; arg < argc; arg++) { 186ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat if (argv[arg][0] == '+') { 187ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat if (argv[arg][1] == 'M') { 188ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat switch (argv[arg][2]) { 189ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat case '0': mode = MR475; 190ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat break; 191ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat case '1': mode = MR515; 192ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat break; 193ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat case '2': mode = MR59; 194ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat break; 195ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat case '3': mode = MR67; 196ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat break; 197ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat case '4': mode = MR74; 198ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat break; 199ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat case '5': mode = MR795; 200ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat break; 201ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat case '6': mode = MR102; 202ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat break; 203ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat case '7': mode = MR122; 204ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat break; 205ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat default: 206ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat usage(); 207ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat fprintf(stderr, "Invalid parameter '%s'.\n", argv[arg]); 208ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat return EXIT_FAILURE; 209ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat break; 210ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat } 211ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat } else { 212ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat usage(); 213ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat fprintf(stderr, "Invalid parameter '%s'.\n", argv[arg]); 214ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat return EXIT_FAILURE; 215ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat } 216ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat } else { 217ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat switch (filename) { 218ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat case 0: 219ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat inFileName = argv[arg]; 220ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat break; 221ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat case 1: 222ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat outFileName = argv[arg]; 223ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat break; 224ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat default: 225ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat usage(); 226ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat fprintf(stderr, "Invalid parameter '%s'.\n", argv[arg]); 227ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat return EXIT_FAILURE; 228ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat } 229ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat filename++; 230ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat } 231ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat } 232ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat } 233ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat 234ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat retVal = encode(mode, inFileName, outFileName); 235ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat return retVal; 236ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat} 237ab44ed5712c23577b9dc3ab2ee469f27298b77e5Ashok Bhat 238