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