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