amrnb_enc_test.cpp revision ab44ed5712c23577b9dc3ab2ee469f27298b77e5
1e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy/*
2e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * Copyright (C) 2014 The Android Open Source Project
3e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * All rights reserved.
4e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy *
5e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * Redistribution and use in source and binary forms, with or without
6e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * modification, are permitted provided that the following conditions
7e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * are met:
8e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * * Redistributions of source code must retain the above copyright
9e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * notice, this list of conditions and the following disclaimer.
10e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * * Redistributions in binary form must reproduce the above copyright
11e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * notice, this list of conditions and the following disclaimer in
12e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * the documentation and/or other materials provided with the
13e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * distribution.
14e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy *
15e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
199d5316e3f56d138504565ff311145ac01621dff4Romain Guy * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
209d5316e3f56d138504565ff311145ac01621dff4Romain Guy * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
219d5316e3f56d138504565ff311145ac01621dff4Romain Guy * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
2285bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25ce0537b80087a6225273040a987414b1dd081aa0Romain Guy * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy * SUCH DAMAGE.
27d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy */
2885bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy#include <stdio.h>
29e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy#include <stdlib.h>
30daf98e941e140e8739458126640183b9f296a2abChet Haase#include <time.h>
31bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy#include <stdint.h>
32ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy#include <assert.h>
338694230ff25fa0a60e480d424843e56b718f0516Romain Guy#include "gsmamr_enc.h"
34bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
357953745dd565167113f8cbfc461bc0521d32d870Romain Guyenum {
367953745dd565167113f8cbfc461bc0521d32d870Romain Guy    kInputSize = 320, // 160 samples * 16-bit per sample.
37c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy    kOutputSize = 1024
3851769a68a5cb34e9564740c6a854fcb93018789dRomain Guy};
39f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy
405cbbce535744b89df5ecea95de21ee3733298260Romain Guystruct AmrNbEncState {
41bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    void *encCtx;
425cbbce535744b89df5ecea95de21ee3733298260Romain Guy    void *pidSyncCtx;
43f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy};
4406f96e2652e4855b6520ad9dd70583677605b79aRomain Guy
45db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guyvoid usage(void) {
46fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy    printf("Usage:\n");
47bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    printf("AMRNBEnc [options] <input file> <output file>\n");
48e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    printf("\n");
499d5316e3f56d138504565ff311145ac01621dff4Romain Guy    printf("Options +M* for setting compression bitrate mode, default is 4.75 kbps\n");
50e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    printf(" +M0 = 4.75 kbps\n");
51f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    printf(" +M1 = 5.15 kbps\n");
52f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    printf(" +M2 = 5.90 kbps\n");
53f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    printf(" +M3 = 6.70 kbps\n");
54f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    printf(" +M4 = 7.40 kbps\n");
550fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    printf(" +M5 = 7.95 kbps\n");
56b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    printf(" +M6 = 10.2 kbps\n");
575cbbce535744b89df5ecea95de21ee3733298260Romain Guy    printf(" +M7 = 12.2 kbps\n");
585cbbce535744b89df5ecea95de21ee3733298260Romain Guy    printf("\n");
595cbbce535744b89df5ecea95de21ee3733298260Romain Guy}
605cbbce535744b89df5ecea95de21ee3733298260Romain Guy
6185bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guyint encode(int mode, const char *srcFile, const char *dstFile) {
62e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    int           retVal     = EXIT_SUCCESS;
637953745dd565167113f8cbfc461bc0521d32d870Romain Guy    FILE          *fSrc      = NULL;
64e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    FILE          *fDst      = NULL;
65e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    int           frameNum   = 0;
6617112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    bool          eofReached = false;
6717112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    uint16_t      *inputBuf  = NULL;
6817112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    uint8_t       *outputBuf = NULL;
6917112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    AmrNbEncState *amr       = NULL;
7017112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy
7149c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    clock_t   start, finish;
7249c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    double    duration = 0.0;
7317112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy
7417112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    // Open input file.
7517112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    fSrc = fopen(srcFile, "rb");
7617112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    if (fSrc == NULL) {
7717112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy        fprintf(stderr, "Error opening input file\n");
7817112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy        retVal = EXIT_FAILURE;
7917112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy        goto safe_exit;
80b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
81e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
8217112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    // Open output file.
8317112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    fDst = fopen(dstFile, "wb");
8417112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    if (fDst == NULL) {
8517112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy        fprintf(stderr, "Error opening output file\n");
8617112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy        retVal = EXIT_FAILURE;
8717112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy        goto safe_exit;
8817112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    }
8917112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy
9017112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    // Allocate input buffer.
9144b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haase    inputBuf = (uint16_t*) malloc(kInputSize);
9217112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    assert(inputBuf != NULL);
9317112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy
9417112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    // Allocate output buffer.
9517112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    outputBuf = (uint8_t*) malloc(kOutputSize);
9617112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    assert(outputBuf != NULL);
9717112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy
9817112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    // Initialize encoder.
9917112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    amr = (AmrNbEncState*) malloc(sizeof(AmrNbEncState));
10017112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    AMREncodeInit(&amr->encCtx, &amr->pidSyncCtx, 0);
10117112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy
10217112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    // Write file header.
10317112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    fwrite("#!AMR\n", 1, 6, fDst);
10417112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy
10517112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    while (1) {
10617112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy        // Read next input frame.
10744b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haase        int bytesRead;
108e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy        bytesRead = fread(inputBuf, 1, kInputSize, fSrc);
10917112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy        if (bytesRead != kInputSize && !feof(fSrc)) {
11017112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy            retVal = EXIT_FAILURE; // Invalid magic number.
11117112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy            fprintf(stderr, "Error reading input file\n");
11217112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy            goto safe_exit;
11317112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy        } else if (feof(fSrc) && bytesRead == 0) {
1146c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            eofReached = true;
115c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy            break;
116c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy        }
117c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy
118c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy        start = clock();
119c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy
120c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy        // Encode the frame.
121c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy        Frame_Type_3GPP frame_type = (Frame_Type_3GPP) mode;
122c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy        int bytesGenerated;
123c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy        bytesGenerated = AMREncode(amr->encCtx, amr->pidSyncCtx, (Mode)mode,
124c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy                                   (Word16*)inputBuf, outputBuf, &frame_type,
125c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy                                   AMR_TX_WMF);
126c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy
127c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy        // Convert from WMF to RFC 3267 format.
128c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy        if (bytesGenerated > 0) {
129c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy            outputBuf[0] = ((outputBuf[0] << 3) | 4) & 0x7c;
1308f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy        }
131ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy
132ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy        finish = clock();
1338f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy        duration += finish - start;
13408ae317c21ec3086b5017672bba87420cc38a407Romain Guy
1357953745dd565167113f8cbfc461bc0521d32d870Romain Guy        if (bytesGenerated < 0) {
1364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            retVal = EXIT_FAILURE;
1374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            fprintf(stderr, "Encoding error\n");
1384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            goto safe_exit;
139bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy        }
140e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
1415c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        frameNum++;
142e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy        printf(" Frames processed: %d\n", frameNum);
143e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
144bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy        // Write the output.
1454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        fwrite(outputBuf, 1, bytesGenerated, fDst);
1464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
1474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
148807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    // Dump the time taken by encode.
149f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    printf("\n%2.5lf seconds\n", (double)duration/CLOCKS_PER_SEC);
1507953745dd565167113f8cbfc461bc0521d32d870Romain Guy
1514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guysafe_exit:
1524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
153f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    // Free the encoder instance.
1547953745dd565167113f8cbfc461bc0521d32d870Romain Guy    if (amr) {
1557953745dd565167113f8cbfc461bc0521d32d870Romain Guy        AMREncodeExit(&amr->encCtx, &amr->pidSyncCtx);
1568a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy        free(amr);
1574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
158a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase
159bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    // Free input and output buffer.
1601271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    free(inputBuf);
1611271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    free(outputBuf);
162ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
163486590963e2207d68eebd6944fec70d50d41116aChet Haase    // Close the input and output files.
164486590963e2207d68eebd6944fec70d50d41116aChet Haase    if (fSrc) {
165486590963e2207d68eebd6944fec70d50d41116aChet Haase        fclose(fSrc);
166486590963e2207d68eebd6944fec70d50d41116aChet Haase    }
167e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    if (fDst) {
1685c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        fclose(fDst);
169486590963e2207d68eebd6944fec70d50d41116aChet Haase    }
170486590963e2207d68eebd6944fec70d50d41116aChet Haase
1715a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    return retVal;
172486590963e2207d68eebd6944fec70d50d41116aChet Haase}
1734bb942083a0d4db746adf95349108dd8ef842e32Romain Guy
1745c13d89c1332fcc499379b9064b891187b75ca32Chet Haaseint main(int argc, char *argv[]) {
175be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    Mode  mode = MR475;
176be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    int   retVal;
177be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    char  *inFileName = NULL;
178486590963e2207d68eebd6944fec70d50d41116aChet Haase    char  *outFileName = NULL;
179486590963e2207d68eebd6944fec70d50d41116aChet Haase    int   arg, filename = 0;
180486590963e2207d68eebd6944fec70d50d41116aChet Haase
18101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    if (argc < 3) {
182486590963e2207d68eebd6944fec70d50d41116aChet Haase        usage();
183486590963e2207d68eebd6944fec70d50d41116aChet Haase        return EXIT_FAILURE;
184486590963e2207d68eebd6944fec70d50d41116aChet Haase    } else {
1858b2f5267f16c295f12faab810527cd6311997e34Romain Guy        for (arg = 1; arg < argc; arg++) {
186486590963e2207d68eebd6944fec70d50d41116aChet Haase            if (argv[arg][0] == '+') {
187486590963e2207d68eebd6944fec70d50d41116aChet Haase                if (argv[arg][1] == 'M') {
188486590963e2207d68eebd6944fec70d50d41116aChet Haase                    switch (argv[arg][2]) {
189486590963e2207d68eebd6944fec70d50d41116aChet Haase                    case '0': mode = MR475;
190325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                        break;
191486590963e2207d68eebd6944fec70d50d41116aChet Haase                    case '1': mode = MR515;
192325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                        break;
193c25259519f1b74bb62a2b051b74537f073436b5cRomain Guy                    case '2': mode = MR59;
194996e57c84368058be793897ebc355b917a59abc2Raph Levien                        break;
19585bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy                    case '3': mode = MR67;
1964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy                        break;
1974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy                    case '4': mode = MR74;
198d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy                        break;
1994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy                    case '5': mode = MR795;
2004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy                        break;
201db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy                    case '6': mode = MR102;
2024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy                        break;
2034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy                    case '7': mode = MR122;
2041e45aae5de003657e5d18f74d34998f5de5db5b7Romain Guy                        break;
2055ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                    default:
2065ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                        usage();
2075ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                        fprintf(stderr, "Invalid parameter '%s'.\n", argv[arg]);
2085ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                        return EXIT_FAILURE;
2095ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                        break;
21017112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy                    }
21117112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy                } else {
21217112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy                    usage();
21317112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy                    fprintf(stderr, "Invalid parameter '%s'.\n", argv[arg]);
214530041d3191ce817832a0108514617768e43cda6Romain Guy                    return EXIT_FAILURE;
215530041d3191ce817832a0108514617768e43cda6Romain Guy                }
21617112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy            } else {
21717112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy                switch (filename) {
21817112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy                case 0:
21917112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy                    inFileName  = argv[arg];
22017112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy                    break;
22117112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy                case 1:
22217112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy                    outFileName = argv[arg];
22317112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy                    break;
22417112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy                default:
22517112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy                    usage();
22617112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy                    fprintf(stderr, "Invalid parameter '%s'.\n", argv[arg]);
22717112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy                    return EXIT_FAILURE;
22817112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy                }
22913631f3da855f200a151e7837ed9f6b079622b58Romain Guy                filename++;
23017112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy            }
23117112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy        }
23217112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    }
23317112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy
23413631f3da855f200a151e7837ed9f6b079622b58Romain Guy    retVal = encode(mode, inFileName, outFileName);
23513631f3da855f200a151e7837ed9f6b079622b58Romain Guy    return retVal;
236e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy}
237e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
238e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy