main.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:77k
源码类别:

Windows CE

开发平台:

C/C++

  1. /* flac - Command-line FLAC encoder/decoder
  2.  * Copyright (C) 2000,2001,2002,2003,2004,2005  Josh Coalson
  3.  *
  4.  * This program is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU General Public License
  6.  * as published by the Free Software Foundation; either version 2
  7.  * of the License, or (at your option) any later version.
  8.  *
  9.  * This program is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  * GNU General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU General Public License
  15.  * along with this program; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  17.  */
  18. #include <ctype.h>
  19. #include <locale.h>
  20. #include <stdarg.h>
  21. #include <stdio.h>
  22. #include <stdlib.h>
  23. #include <string.h>
  24. #include <time.h>
  25. #ifdef HAVE_CONFIG_H
  26. #include <config.h>
  27. #endif
  28. #if !defined _MSC_VER && !defined __MINGW32__
  29. /* unlink is in stdio.h in VC++ */
  30. #include <unistd.h> /* for unlink() */
  31. #else
  32. #define strcasecmp stricmp
  33. #endif
  34. #include "FLAC/all.h"
  35. #include "share/grabbag.h"
  36. #include "analyze.h"
  37. #include "decode.h"
  38. #include "encode.h"
  39. #include "local_string_utils.h" /* for flac__strlcat() and flac__strlcpy() */
  40. #include "utils.h"
  41. #include "vorbiscomment.h"
  42. #if 0
  43. /*[JEC] was:#if HAVE_GETOPT_LONG*/
  44. /*[JEC] see flac/include/share/getopt.h as to why the change */
  45. #  include <getopt.h>
  46. #else
  47. #  include "share/getopt.h"
  48. #endif
  49. typedef enum { RAW, WAV, AIF } FileFormat;
  50. static int do_it();
  51. static FLAC__bool init_options();
  52. static int parse_options(int argc, char *argv[]);
  53. static int parse_option(int short_option, const char *long_option, const char *option_argument);
  54. static void free_options();
  55. static int usage_error(const char *message, ...);
  56. static void short_usage();
  57. static void show_version();
  58. static void show_help();
  59. static void show_explain();
  60. static void format_mistake(const char *infilename, const char *wrong, const char *right);
  61. static int encode_file(const char *infilename, FLAC__bool is_first_file, FLAC__bool is_last_file);
  62. static int decode_file(const char *infilename);
  63. static const char *get_encoded_outfilename(const char *infilename);
  64. static const char *get_decoded_outfilename(const char *infilename);
  65. static const char *get_outfilename(const char *infilename, const char *suffix);
  66. static void die(const char *message);
  67. static char *local_strdup(const char *source);
  68. /*
  69.  * share__getopt format struct; note that for long options with no
  70.  * short option equivalent we just set the 'val' field to 0.
  71.  */
  72. static struct share__option long_options_[] = {
  73. /*
  74.  * general options
  75.  */
  76. { "help"             , share__no_argument, 0, 'h' },
  77. { "explain"          , share__no_argument, 0, 'H' },
  78. { "version"          , share__no_argument, 0, 'v' },
  79. { "decode"           , share__no_argument, 0, 'd' },
  80. { "analyze"          , share__no_argument, 0, 'a' },
  81. { "test"             , share__no_argument, 0, 't' },
  82. { "stdout"           , share__no_argument, 0, 'c' },
  83. { "silent"           , share__no_argument, 0, 's' },
  84. { "totally-silent"   , share__no_argument, 0, 0 },
  85. { "force"            , share__no_argument, 0, 'f' },
  86. { "delete-input-file", share__no_argument, 0, 0 },
  87. { "output-prefix"    , share__required_argument, 0, 0 },
  88. { "output-name"      , share__required_argument, 0, 'o' },
  89. { "skip"             , share__required_argument, 0, 0 },
  90. { "until"            , share__required_argument, 0, 0 },
  91. /*
  92.  * decoding options
  93.  */
  94. { "decode-through-errors", share__no_argument, 0, 'F' },
  95. { "cue"                  , share__required_argument, 0, 0 },
  96. { "apply-replaygain-which-is-not-lossless", share__optional_argument, 0, 0 }, /* undocumented */
  97. /*
  98.  * encoding options
  99.  */
  100. { "cuesheet"                  , share__required_argument, 0, 0 },
  101. { "no-cued-seekpoints"        , share__no_argument, 0, 0 },
  102. { "tag"                       , share__required_argument, 0, 'T' },
  103. { "compression-level-0"       , share__no_argument, 0, '0' },
  104. { "compression-level-1"       , share__no_argument, 0, '1' },
  105. { "compression-level-2"       , share__no_argument, 0, '2' },
  106. { "compression-level-3"       , share__no_argument, 0, '3' },
  107. { "compression-level-4"       , share__no_argument, 0, '4' },
  108. { "compression-level-5"       , share__no_argument, 0, '5' },
  109. { "compression-level-6"       , share__no_argument, 0, '6' },
  110. { "compression-level-7"       , share__no_argument, 0, '7' },
  111. { "compression-level-8"       , share__no_argument, 0, '8' },
  112. { "compression-level-9"       , share__no_argument, 0, '9' },
  113. { "best"                      , share__no_argument, 0, '8' },
  114. { "fast"                      , share__no_argument, 0, '0' },
  115. { "super-secret-totally-impractical-compression-level", share__no_argument, 0, 0 },
  116. { "verify"                    , share__no_argument, 0, 'V' },
  117. { "force-aiff-format"         , share__no_argument, 0, 0 },
  118. { "force-raw-format"          , share__no_argument, 0, 0 },
  119. { "lax"                       , share__no_argument, 0, 0 },
  120. { "replay-gain"               , share__no_argument, 0, 0 },
  121. { "sector-align"              , share__no_argument, 0, 0 },
  122. { "seekpoint"                 , share__required_argument, 0, 'S' },
  123. { "padding"                   , share__required_argument, 0, 'P' },
  124. #ifdef FLAC__HAS_OGG
  125. { "ogg"                       , share__no_argument, 0, 0 },
  126. { "serial-number"             , share__required_argument, 0, 0 },
  127. #endif
  128. { "blocksize"                 , share__required_argument, 0, 'b' },
  129. { "exhaustive-model-search"   , share__no_argument, 0, 'e' },
  130. { "max-lpc-order"             , share__required_argument, 0, 'l' },
  131. { "mid-side"                  , share__no_argument, 0, 'm' },
  132. { "adaptive-mid-side"         , share__no_argument, 0, 'M' },
  133. { "qlp-coeff-precision-search", share__no_argument, 0, 'p' },
  134. { "qlp-coeff-precision"       , share__required_argument, 0, 'q' },
  135. { "rice-partition-order"      , share__required_argument, 0, 'r' },
  136. { "endian"                    , share__required_argument, 0, 0 },
  137. { "channels"                  , share__required_argument, 0, 0 },
  138. { "bps"                       , share__required_argument, 0, 0 },
  139. { "sample-rate"               , share__required_argument, 0, 0 },
  140. { "sign"                      , share__required_argument, 0, 0 },
  141. { "input-size"                , share__required_argument, 0, 0 },
  142. /*
  143.  * analysis options
  144.  */
  145. { "residual-gnuplot", share__no_argument, 0, 0 },
  146. { "residual-text", share__no_argument, 0, 0 },
  147. /*
  148.  * negatives
  149.  */
  150. { "no-decode-through-errors"  , share__no_argument, 0, 0 },
  151. { "no-silent"                 , share__no_argument, 0, 0 },
  152. { "no-force"                  , share__no_argument, 0, 0 },
  153. { "no-seektable"              , share__no_argument, 0, 0 },
  154. { "no-delete-input-file"      , share__no_argument, 0, 0 },
  155. { "no-replay-gain"            , share__no_argument, 0, 0 },
  156. { "no-sector-align"           , share__no_argument, 0, 0 },
  157. { "no-lax"                    , share__no_argument, 0, 0 },
  158. #ifdef FLAC__HAS_OGG
  159. { "no-ogg"                    , share__no_argument, 0, 0 },
  160. #endif
  161. { "no-exhaustive-model-search", share__no_argument, 0, 0 },
  162. { "no-mid-side"               , share__no_argument, 0, 0 },
  163. { "no-adaptive-mid-side"      , share__no_argument, 0, 0 },
  164. { "no-qlp-coeff-prec-search"  , share__no_argument, 0, 0 },
  165. { "no-padding"                , share__no_argument, 0, 0 },
  166. { "no-verify"                 , share__no_argument, 0, 0 },
  167. { "no-residual-gnuplot"       , share__no_argument, 0, 0 },
  168. { "no-residual-text"          , share__no_argument, 0, 0 },
  169. /*
  170.  * undocumented debugging options for the test suite
  171.  */
  172. { "disable-constant-subframes", share__no_argument, 0, 0 },
  173. { "disable-fixed-subframes"   , share__no_argument, 0, 0 },
  174. { "disable-verbatim-subframes", share__no_argument, 0, 0 },
  175. {0, 0, 0, 0}
  176. };
  177. /*
  178.  * global to hold command-line option values
  179.  */
  180. static struct {
  181. FLAC__bool show_help;
  182. FLAC__bool show_explain;
  183. FLAC__bool show_version;
  184. FLAC__bool mode_decode;
  185. FLAC__bool verify;
  186. FLAC__bool force_file_overwrite;
  187. FLAC__bool continue_through_decode_errors;
  188. replaygain_synthesis_spec_t replaygain_synthesis_spec;
  189. FLAC__bool lax;
  190. FLAC__bool test_only;
  191. FLAC__bool analyze;
  192. FLAC__bool use_ogg;
  193. FLAC__bool has_serial_number; /* true iff --serial-number was used */
  194. long serial_number; /* this is the Ogg serial number and is unused for native FLAC */
  195. FLAC__bool do_mid_side;
  196. FLAC__bool loose_mid_side;
  197. FLAC__bool do_exhaustive_model_search;
  198. FLAC__bool do_escape_coding;
  199. FLAC__bool do_qlp_coeff_prec_search;
  200. FLAC__bool force_to_stdout;
  201. FLAC__bool force_aiff_format;
  202. FLAC__bool force_raw_format;
  203. FLAC__bool delete_input;
  204. FLAC__bool replay_gain;
  205. FLAC__bool sector_align;
  206. const char *cmdline_forced_outfilename;
  207. const char *output_prefix;
  208. analysis_options aopts;
  209. int padding;
  210. unsigned max_lpc_order;
  211. unsigned qlp_coeff_precision;
  212. const char *skip_specification;
  213. const char *until_specification;
  214. const char *cue_specification;
  215. int format_is_big_endian;
  216. int format_is_unsigned_samples;
  217. int format_channels;
  218. int format_bps;
  219. int format_sample_rate;
  220. long format_input_size;
  221. int blocksize;
  222. int min_residual_partition_order;
  223. int max_residual_partition_order;
  224. int rice_parameter_search_dist;
  225. char requested_seek_points[50000]; /* bad MAGIC NUMBER but buffer overflow is checked */
  226. int num_requested_seek_points; /* -1 => no -S options were given, 0 => -S- was given */
  227. const char *cuesheet_filename;
  228. FLAC__bool cued_seekpoints;
  229. unsigned num_files;
  230. char **filenames;
  231. FLAC__StreamMetadata *vorbis_comment;
  232. struct {
  233. FLAC__bool disable_constant_subframes;
  234. FLAC__bool disable_fixed_subframes;
  235. FLAC__bool disable_verbatim_subframes;
  236. } debug;
  237. } option_values;
  238. /*
  239.  * miscellaneous globals
  240.  */
  241. static FLAC__int32 align_reservoir_0[588], align_reservoir_1[588]; /* for carrying over samples from --sector-align */
  242. static FLAC__int32 *align_reservoir[2] = { align_reservoir_0, align_reservoir_1 };
  243. static unsigned align_reservoir_samples = 0; /* 0 .. 587 */
  244. int main(int argc, char *argv[])
  245. {
  246. int retval = 0;
  247. setlocale(LC_ALL, "");
  248. if(!init_options()) {
  249. flac__utils_printf(stderr, 1, "ERROR: allocating memoryn");
  250. retval = 1;
  251. }
  252. else {
  253. if((retval = parse_options(argc, argv)) == 0)
  254. retval = do_it();
  255. }
  256. free_options();
  257. return retval;
  258. }
  259. int do_it()
  260. {
  261. int retval = 0;
  262. if(option_values.show_version) {
  263. show_version();
  264. return 0;
  265. }
  266. else if(option_values.show_explain) {
  267. show_explain();
  268. return 0;
  269. }
  270. else if(option_values.show_help) {
  271. show_help();
  272. return 0;
  273. }
  274. else {
  275. if(option_values.num_files == 0) {
  276. if(flac__utils_verbosity_ >= 1)
  277. short_usage();
  278. return 0;
  279. }
  280. /*
  281.  * tweak options; validate the values
  282.  */
  283. if(!option_values.mode_decode) {
  284. if(option_values.blocksize < 0) {
  285. if(option_values.max_lpc_order == 0)
  286. option_values.blocksize = 1152;
  287. else
  288. option_values.blocksize = 4608;
  289. }
  290. if(option_values.max_residual_partition_order < 0) {
  291. if(option_values.blocksize <= 1152)
  292. option_values.max_residual_partition_order = 2;
  293. else if(option_values.blocksize <= 2304)
  294. option_values.max_residual_partition_order = 3;
  295. else if(option_values.blocksize <= 4608)
  296. option_values.max_residual_partition_order = 3;
  297. else
  298. option_values.max_residual_partition_order = 4;
  299. option_values.min_residual_partition_order = option_values.max_residual_partition_order;
  300. }
  301. if(option_values.rice_parameter_search_dist < 0) {
  302. option_values.rice_parameter_search_dist = 0;
  303. }
  304. if(0 != option_values.cue_specification)
  305. return usage_error("ERROR: --cue is not allowed in test moden");
  306. }
  307. else {
  308. if(option_values.test_only) {
  309. if(0 != option_values.skip_specification)
  310. return usage_error("ERROR: --skip is not allowed in test moden");
  311. if(0 != option_values.until_specification)
  312. return usage_error("ERROR: --until is not allowed in test moden");
  313. if(0 != option_values.cue_specification)
  314. return usage_error("ERROR: --cue is not allowed in test moden");
  315. }
  316. }
  317. if(0 != option_values.cue_specification && (0 != option_values.skip_specification || 0 != option_values.until_specification))
  318. return usage_error("ERROR: --cue may not be combined with --skip or --untiln");
  319. FLAC__ASSERT(option_values.blocksize >= 0 || option_values.mode_decode);
  320. if(option_values.format_channels >= 0) {
  321. if(option_values.format_channels == 0 || (unsigned)option_values.format_channels > FLAC__MAX_CHANNELS)
  322. return usage_error("ERROR: invalid number of channels '%u', must be > 0 and <= %un", option_values.format_channels, FLAC__MAX_CHANNELS);
  323. }
  324. if(option_values.format_bps >= 0) {
  325. if(option_values.format_bps != 8 && option_values.format_bps != 16 && option_values.format_bps != 24)
  326. return usage_error("ERROR: invalid bits per sample '%u' (must be 8/16/24)n", option_values.format_bps);
  327. }
  328. if(option_values.format_sample_rate >= 0) {
  329. if(!FLAC__format_sample_rate_is_valid(option_values.format_sample_rate))
  330. return usage_error("ERROR: invalid sample rate '%u', must be > 0 and <= %un", option_values.format_sample_rate, FLAC__MAX_SAMPLE_RATE);
  331. }
  332. if(option_values.force_raw_format && option_values.force_aiff_format)
  333. return usage_error("ERROR: only one of --force-raw-format and --force-aiff-format allowedn");
  334. if(option_values.mode_decode) {
  335. if(!option_values.force_raw_format) {
  336. if(option_values.format_is_big_endian >= 0)
  337. return usage_error("ERROR: --endian only allowed with --force-raw-formatn");
  338. if(option_values.format_is_unsigned_samples >= 0)
  339. return usage_error("ERROR: --sign only allowed with --force-raw-formatn");
  340. }
  341. if(option_values.format_channels >= 0)
  342. return usage_error("ERROR: --channels not allowed with --decoden");
  343. if(option_values.format_bps >= 0)
  344. return usage_error("ERROR: --bps not allowed with --decoden");
  345. if(option_values.format_sample_rate >= 0)
  346. return usage_error("ERROR: --sample-rate not allowed with --decoden");
  347. }
  348. if(!option_values.mode_decode && ((unsigned)option_values.blocksize < FLAC__MIN_BLOCK_SIZE || (unsigned)option_values.blocksize > FLAC__MAX_BLOCK_SIZE)) {
  349. return usage_error("ERROR: invalid blocksize '%u', must be >= %u and <= %un", (unsigned)option_values.blocksize, FLAC__MIN_BLOCK_SIZE, FLAC__MAX_BLOCK_SIZE);
  350. }
  351. if(option_values.qlp_coeff_precision > 0 && option_values.qlp_coeff_precision < FLAC__MIN_QLP_COEFF_PRECISION) {
  352. return usage_error("ERROR: invalid value '%u' for qlp coeff precision, must be 0 or >= %un", option_values.qlp_coeff_precision, FLAC__MIN_QLP_COEFF_PRECISION);
  353. }
  354. if(option_values.sector_align) {
  355. if(option_values.mode_decode)
  356. return usage_error("ERROR: --sector-align only allowed for encodingn");
  357. if(0 != option_values.skip_specification)
  358. return usage_error("ERROR: --sector-align not allowed with --skipn");
  359. if(0 != option_values.until_specification)
  360. return usage_error("ERROR: --sector-align not allowed with --untiln");
  361. if(0 != option_values.cue_specification)
  362. return usage_error("ERROR: --sector-align not allowed with --cuen");
  363. if(option_values.format_channels >= 0 && option_values.format_channels != 2)
  364. return usage_error("ERROR: --sector-align can only be done with stereo inputn");
  365. if(option_values.format_bps >= 0 && option_values.format_bps != 16)
  366. return usage_error("ERROR: --sector-align can only be done with 16-bit samplesn");
  367. if(option_values.format_sample_rate >= 0 && option_values.format_sample_rate != 44100)
  368. return usage_error("ERROR: --sector-align can only be done with a sample rate of 44100n");
  369. }
  370. if(option_values.replay_gain) {
  371. if(option_values.force_to_stdout)
  372. return usage_error("ERROR: --replay-gain not allowed with -c/--stdoutn");
  373. if(option_values.mode_decode)
  374. return usage_error("ERROR: --replay-gain only allowed for encodingn");
  375. if(option_values.format_channels > 2)
  376. return usage_error("ERROR: --replay-gain can only be done with mono/stereo inputn");
  377. if(option_values.format_sample_rate >= 0 && !grabbag__replaygain_is_valid_sample_frequency(option_values.format_sample_rate))
  378. return usage_error("ERROR: invalid sample rate used with --replay-gainn");
  379. /*
  380.  * We want to reserve padding space for the ReplayGain
  381.  * tags that we will set later, to avoid rewriting the
  382.  * whole file.
  383.  */
  384. if(option_values.padding < 0) {
  385. flac__utils_printf(stderr, 1, "NOTE: --replay-gain may leave a small PADDING block even with --no-paddingn");
  386. option_values.padding = GRABBAG__REPLAYGAIN_MAX_TAG_SPACE_REQUIRED;
  387. }
  388. else {
  389. option_values.padding += GRABBAG__REPLAYGAIN_MAX_TAG_SPACE_REQUIRED;
  390. }
  391. }
  392. if(option_values.num_files > 1 && option_values.cmdline_forced_outfilename) {
  393. return usage_error("ERROR: -o/--output-name cannot be used with multiple filesn");
  394. }
  395. if(option_values.cmdline_forced_outfilename && option_values.output_prefix) {
  396. return usage_error("ERROR: --output-prefix conflicts with -o/--output-namen");
  397. }
  398. if(!option_values.mode_decode && 0 != option_values.cuesheet_filename && option_values.num_files > 1) {
  399. return usage_error("ERROR: --cuesheet cannot be used when encoding multiple filesn");
  400. }
  401. }
  402. flac__utils_printf(stderr, 2, "n");
  403. flac__utils_printf(stderr, 2, "flac %s, Copyright (C) 2000,2001,2002,2003,2004,2005  Josh Coalsonn", FLAC__VERSION_STRING);
  404. flac__utils_printf(stderr, 2, "flac comes with ABSOLUTELY NO WARRANTY.  This is free software, and you aren");
  405. flac__utils_printf(stderr, 2, "welcome to redistribute it under certain conditions.  Type `flac' for details.nn");
  406. if(!option_values.mode_decode) {
  407. char padopt[16];
  408. if(option_values.padding < 0)
  409. strcpy(padopt, "-");
  410. else
  411. sprintf(padopt, " %d", option_values.padding);
  412. flac__utils_printf(stderr, 2,
  413. "options:%s%s%s%s -P%s -b %u%s -l %u%s%s%s -q %u -r %u,%u%sn",
  414. option_values.delete_input?" --delete-input-file":"",
  415. option_values.sector_align?" --sector-align":"",
  416. option_values.use_ogg?" --ogg":"",
  417. option_values.lax?" --lax":"",
  418. padopt,
  419. (unsigned)option_values.blocksize,
  420. option_values.loose_mid_side?" -M":option_values.do_mid_side?" -m":"",
  421. option_values.max_lpc_order,
  422. option_values.do_exhaustive_model_search?" -e":"",
  423. option_values.do_escape_coding?" -E":"",
  424. option_values.do_qlp_coeff_prec_search?" -p":"",
  425. option_values.qlp_coeff_precision,
  426. (unsigned)option_values.min_residual_partition_order,
  427. (unsigned)option_values.max_residual_partition_order,
  428. option_values.verify? " -V":""
  429. );
  430. }
  431. if(option_values.mode_decode) {
  432. FLAC__bool first = true;
  433. if(option_values.num_files == 0) {
  434. retval = decode_file("-");
  435. }
  436. else {
  437. unsigned i;
  438. if(option_values.num_files > 1)
  439. option_values.cmdline_forced_outfilename = 0;
  440. for(i = 0, retval = 0; i < option_values.num_files; i++) {
  441. if(0 == strcmp(option_values.filenames[i], "-") && !first)
  442. continue;
  443. retval |= decode_file(option_values.filenames[i]);
  444. first = false;
  445. }
  446. }
  447. }
  448. else { /* encode */
  449. FLAC__bool first = true;
  450. if(option_values.num_files == 0) {
  451. retval = encode_file("-", first, true);
  452. }
  453. else {
  454. unsigned i;
  455. if(option_values.num_files > 1)
  456. option_values.cmdline_forced_outfilename = 0;
  457. for(i = 0, retval = 0; i < option_values.num_files; i++) {
  458. if(0 == strcmp(option_values.filenames[i], "-") && !first)
  459. continue;
  460. retval |= encode_file(option_values.filenames[i], first, i == (option_values.num_files-1));
  461. first = false;
  462. }
  463. if(option_values.replay_gain && retval == 0) {
  464. float album_gain, album_peak;
  465. grabbag__replaygain_get_album(&album_gain, &album_peak);
  466. for(i = 0; i < option_values.num_files; i++) {
  467. const char *error, *outfilename = get_encoded_outfilename(option_values.filenames[i]);
  468. if(0 == outfilename) {
  469. flac__utils_printf(stderr, 1, "ERROR: filename too long: %s", option_values.filenames[i]);
  470. return 1;
  471. }
  472. if(0 == strcmp(option_values.filenames[i], "-")) {
  473. FLAC__ASSERT(0);
  474. /* double protection */
  475. flac__utils_printf(stderr, 1, "internal errorn");
  476. return 2;
  477. }
  478. if(0 != (error = grabbag__replaygain_store_to_file_album(outfilename, album_gain, album_peak, /*preserve_modtime=*/true))) {
  479. flac__utils_printf(stderr, 1, "%s: ERROR writing ReplayGain album tagsn", outfilename);
  480. retval = 1;
  481. }
  482. }
  483. }
  484. }
  485. }
  486. return retval;
  487. }
  488. FLAC__bool init_options()
  489. {
  490. option_values.show_help = false;
  491. option_values.show_explain = false;
  492. option_values.mode_decode = false;
  493. option_values.verify = false;
  494. option_values.force_file_overwrite = false;
  495. option_values.continue_through_decode_errors = false;
  496. option_values.replaygain_synthesis_spec.apply = false;
  497. option_values.replaygain_synthesis_spec.use_album_gain = true;
  498. option_values.replaygain_synthesis_spec.limiter = RGSS_LIMIT__HARD;
  499. option_values.replaygain_synthesis_spec.noise_shaping = NOISE_SHAPING_LOW;
  500. option_values.replaygain_synthesis_spec.preamp = 0.0;
  501. option_values.lax = false;
  502. option_values.test_only = false;
  503. option_values.analyze = false;
  504. option_values.use_ogg = false;
  505. option_values.has_serial_number = false;
  506. option_values.serial_number = 0;
  507. option_values.do_mid_side = true;
  508. option_values.loose_mid_side = false;
  509. option_values.do_exhaustive_model_search = false;
  510. option_values.do_escape_coding = false;
  511. option_values.do_qlp_coeff_prec_search = false;
  512. option_values.force_to_stdout = false;
  513. option_values.force_aiff_format = false;
  514. option_values.force_raw_format = false;
  515. option_values.delete_input = false;
  516. option_values.replay_gain = false;
  517. option_values.sector_align = false;
  518. option_values.cmdline_forced_outfilename = 0;
  519. option_values.output_prefix = 0;
  520. option_values.aopts.do_residual_text = false;
  521. option_values.aopts.do_residual_gnuplot = false;
  522. option_values.padding = 4096;
  523. option_values.max_lpc_order = 8;
  524. option_values.qlp_coeff_precision = 0;
  525. option_values.skip_specification = 0;
  526. option_values.until_specification = 0;
  527. option_values.cue_specification = 0;
  528. option_values.format_is_big_endian = -1;
  529. option_values.format_is_unsigned_samples = -1;
  530. option_values.format_channels = -1;
  531. option_values.format_bps = -1;
  532. option_values.format_sample_rate = -1;
  533. option_values.format_input_size = -1;
  534. option_values.blocksize = -1;
  535. option_values.min_residual_partition_order = -1;
  536. option_values.max_residual_partition_order = -1;
  537. option_values.rice_parameter_search_dist = -1;
  538. option_values.requested_seek_points[0] = '';
  539. option_values.num_requested_seek_points = -1;
  540. option_values.cuesheet_filename = 0;
  541. option_values.cued_seekpoints = true;
  542. option_values.num_files = 0;
  543. option_values.filenames = 0;
  544. if(0 == (option_values.vorbis_comment = FLAC__metadata_object_new(FLAC__METADATA_TYPE_VORBIS_COMMENT)))
  545. return false;
  546. option_values.debug.disable_constant_subframes = false;
  547. option_values.debug.disable_fixed_subframes = false;
  548. option_values.debug.disable_verbatim_subframes = false;
  549. return true;
  550. }
  551. int parse_options(int argc, char *argv[])
  552. {
  553. int short_option;
  554. int option_index = 1;
  555. FLAC__bool had_error = false;
  556. const char *short_opts = "0123456789ab:cdefFhHl:mMo:pP:q:r:sS:tT:vV";
  557. while ((short_option = share__getopt_long(argc, argv, short_opts, long_options_, &option_index)) != -1) {
  558. switch (short_option) {
  559. case 0: /* long option with no equivalent short option */
  560. had_error |= (parse_option(short_option, long_options_[option_index].name, share__optarg) != 0);
  561. break;
  562. case '?':
  563. case ':':
  564. had_error = true;
  565. break;
  566. default: /* short option */
  567. had_error |= (parse_option(short_option, 0, share__optarg) != 0);
  568. break;
  569. }
  570. }
  571. if(had_error) {
  572. return 1;
  573. }
  574. FLAC__ASSERT(share__optind <= argc);
  575. option_values.num_files = argc - share__optind;
  576. if(option_values.num_files > 0) {
  577. unsigned i = 0;
  578. if(0 == (option_values.filenames = (char**)malloc(sizeof(char*) * option_values.num_files)))
  579. die("out of memory allocating space for file names list");
  580. while(share__optind < argc)
  581. option_values.filenames[i++] = local_strdup(argv[share__optind++]);
  582. }
  583. return 0;
  584. }
  585. int parse_option(int short_option, const char *long_option, const char *option_argument)
  586. {
  587. char *p;
  588. if(short_option == 0) {
  589. FLAC__ASSERT(0 != long_option);
  590. if(0 == strcmp(long_option, "totally-silent")) {
  591. flac__utils_verbosity_ = 0;
  592. }
  593. else if(0 == strcmp(long_option, "delete-input-file")) {
  594. option_values.delete_input = true;
  595. }
  596. else if(0 == strcmp(long_option, "output-prefix")) {
  597. FLAC__ASSERT(0 != option_argument);
  598. option_values.output_prefix = option_argument;
  599. }
  600. else if(0 == strcmp(long_option, "skip")) {
  601. FLAC__ASSERT(0 != option_argument);
  602. option_values.skip_specification = option_argument;
  603. }
  604. else if(0 == strcmp(long_option, "until")) {
  605. FLAC__ASSERT(0 != option_argument);
  606. option_values.until_specification = option_argument;
  607. }
  608. else if(0 == strcmp(long_option, "input-size")) {
  609. FLAC__ASSERT(0 != option_argument);
  610. option_values.format_input_size = atol(option_argument);
  611. }
  612. else if(0 == strcmp(long_option, "cue")) {
  613. FLAC__ASSERT(0 != option_argument);
  614. option_values.cue_specification = option_argument;
  615. }
  616. else if(0 == strcmp(long_option, "apply-replaygain-which-is-not-lossless")) {
  617. option_values.replaygain_synthesis_spec.apply = true;
  618. if (0 != option_argument) {
  619. char *p;
  620. option_values.replaygain_synthesis_spec.limiter = RGSS_LIMIT__NONE;
  621. option_values.replaygain_synthesis_spec.noise_shaping = NOISE_SHAPING_NONE;
  622. option_values.replaygain_synthesis_spec.preamp = strtod(option_argument, &p);
  623. for ( ; *p; p++) {
  624. if (*p == 'a')
  625. option_values.replaygain_synthesis_spec.use_album_gain = true;
  626. else if (*p == 't')
  627. option_values.replaygain_synthesis_spec.use_album_gain = false;
  628. else if (*p == 'l')
  629. option_values.replaygain_synthesis_spec.limiter = RGSS_LIMIT__PEAK;
  630. else if (*p == 'L')
  631. option_values.replaygain_synthesis_spec.limiter = RGSS_LIMIT__HARD;
  632. else if (*p == 'n' && p[1] >= '0' && p[1] <= '3') {
  633. option_values.replaygain_synthesis_spec.noise_shaping = p[1] - '0';
  634. p++;
  635. }
  636. else
  637. return usage_error("ERROR: bad specification string "%s" for --%sn", option_argument, long_option);
  638. }
  639. }
  640. }
  641. else if(0 == strcmp(long_option, "cuesheet")) {
  642. FLAC__ASSERT(0 != option_argument);
  643. option_values.cuesheet_filename = option_argument;
  644. }
  645. else if(0 == strcmp(long_option, "no-cued-seekpoints")) {
  646. option_values.cued_seekpoints = false;
  647. }
  648. else if(0 == strcmp(long_option, "super-secret-totally-impractical-compression-level")) {
  649. option_values.lax = true;
  650. option_values.do_exhaustive_model_search = true;
  651. option_values.do_escape_coding = true;
  652. option_values.do_mid_side = true;
  653. option_values.loose_mid_side = false;
  654. option_values.do_qlp_coeff_prec_search = true;
  655. option_values.min_residual_partition_order = 0;
  656. option_values.max_residual_partition_order = 16;
  657. option_values.rice_parameter_search_dist = 0;
  658. option_values.max_lpc_order = 32;
  659. }
  660. else if(0 == strcmp(long_option, "force-aiff-format")) {
  661. option_values.force_aiff_format = true;
  662. }
  663. else if(0 == strcmp(long_option, "force-raw-format")) {
  664. option_values.force_raw_format = true;
  665. }
  666. else if(0 == strcmp(long_option, "lax")) {
  667. option_values.lax = true;
  668. }
  669. else if(0 == strcmp(long_option, "replay-gain")) {
  670. option_values.replay_gain = true;
  671. }
  672. else if(0 == strcmp(long_option, "sector-align")) {
  673. option_values.sector_align = true;
  674. }
  675. #ifdef FLAC__HAS_OGG
  676. else if(0 == strcmp(long_option, "ogg")) {
  677. option_values.use_ogg = true;
  678. }
  679. else if(0 == strcmp(long_option, "serial-number")) {
  680. option_values.has_serial_number = true;
  681. option_values.serial_number = atol(option_argument);
  682. }
  683. #endif
  684. else if(0 == strcmp(long_option, "endian")) {
  685. FLAC__ASSERT(0 != option_argument);
  686. if(0 == strncmp(option_argument, "big", strlen(option_argument)))
  687. option_values.format_is_big_endian = true;
  688. else if(0 == strncmp(option_argument, "little", strlen(option_argument)))
  689. option_values.format_is_big_endian = false;
  690. else
  691. return usage_error("ERROR: argument to --endian must be "big" or "little"n");
  692. }
  693. else if(0 == strcmp(long_option, "channels")) {
  694. FLAC__ASSERT(0 != option_argument);
  695. option_values.format_channels = atoi(option_argument);
  696. }
  697. else if(0 == strcmp(long_option, "bps")) {
  698. FLAC__ASSERT(0 != option_argument);
  699. option_values.format_bps = atoi(option_argument);
  700. }
  701. else if(0 == strcmp(long_option, "sample-rate")) {
  702. FLAC__ASSERT(0 != option_argument);
  703. option_values.format_sample_rate = atoi(option_argument);
  704. }
  705. else if(0 == strcmp(long_option, "sign")) {
  706. FLAC__ASSERT(0 != option_argument);
  707. if(0 == strncmp(option_argument, "signed", strlen(option_argument)))
  708. option_values.format_is_unsigned_samples = false;
  709. else if(0 == strncmp(option_argument, "unsigned", strlen(option_argument)))
  710. option_values.format_is_unsigned_samples = true;
  711. else
  712. return usage_error("ERROR: argument to --sign must be "signed" or "unsigned"n");
  713. }
  714. else if(0 == strcmp(long_option, "residual-gnuplot")) {
  715. option_values.aopts.do_residual_gnuplot = true;
  716. }
  717. else if(0 == strcmp(long_option, "residual-text")) {
  718. option_values.aopts.do_residual_text = true;
  719. }
  720. /*
  721.  * negatives
  722.  */
  723. else if(0 == strcmp(long_option, "no-decode-through-errors")) {
  724. option_values.continue_through_decode_errors = false;
  725. }
  726. else if(0 == strcmp(long_option, "no-silent")) {
  727. flac__utils_verbosity_ = 2;
  728. }
  729. else if(0 == strcmp(long_option, "no-force")) {
  730. option_values.force_file_overwrite = false;
  731. }
  732. else if(0 == strcmp(long_option, "no-seektable")) {
  733. option_values.num_requested_seek_points = 0;
  734. option_values.requested_seek_points[0] = '';
  735. }
  736. else if(0 == strcmp(long_option, "no-delete-input-file")) {
  737. option_values.delete_input = false;
  738. }
  739. else if(0 == strcmp(long_option, "no-replay-gain")) {
  740. option_values.replay_gain = false;
  741. }
  742. else if(0 == strcmp(long_option, "no-sector-align")) {
  743. option_values.sector_align = false;
  744. }
  745. else if(0 == strcmp(long_option, "no-lax")) {
  746. option_values.lax = false;
  747. }
  748. #ifdef FLAC__HAS_OGG
  749. else if(0 == strcmp(long_option, "no-ogg")) {
  750. option_values.use_ogg = false;
  751. }
  752. #endif
  753. else if(0 == strcmp(long_option, "no-exhaustive-model-search")) {
  754. option_values.do_exhaustive_model_search = false;
  755. }
  756. else if(0 == strcmp(long_option, "no-mid-side")) {
  757. option_values.do_mid_side = option_values.loose_mid_side = false;
  758. }
  759. else if(0 == strcmp(long_option, "no-adaptive-mid-side")) {
  760. option_values.loose_mid_side = option_values.do_mid_side = false;
  761. }
  762. else if(0 == strcmp(long_option, "no-qlp-coeff-prec-search")) {
  763. option_values.do_qlp_coeff_prec_search = false;
  764. }
  765. else if(0 == strcmp(long_option, "no-padding")) {
  766. option_values.padding = -1;
  767. }
  768. else if(0 == strcmp(long_option, "no-verify")) {
  769. option_values.verify = false;
  770. }
  771. else if(0 == strcmp(long_option, "no-residual-gnuplot")) {
  772. option_values.aopts.do_residual_gnuplot = false;
  773. }
  774. else if(0 == strcmp(long_option, "no-residual-text")) {
  775. option_values.aopts.do_residual_text = false;
  776. }
  777. else if(0 == strcmp(long_option, "disable-constant-subframes")) {
  778. option_values.debug.disable_constant_subframes = true;
  779. }
  780. else if(0 == strcmp(long_option, "disable-fixed-subframes")) {
  781. option_values.debug.disable_fixed_subframes = true;
  782. }
  783. else if(0 == strcmp(long_option, "disable-verbatim-subframes")) {
  784. option_values.debug.disable_verbatim_subframes = true;
  785. }
  786. }
  787. else {
  788. const char *violation;
  789. switch(short_option) {
  790. case 'h':
  791. option_values.show_help = true;
  792. break;
  793. case 'H':
  794. option_values.show_explain = true;
  795. break;
  796. case 'v':
  797. option_values.show_version = true;
  798. break;
  799. case 'd':
  800. option_values.mode_decode = true;
  801. break;
  802. case 'a':
  803. option_values.mode_decode = true;
  804. option_values.analyze = true;
  805. break;
  806. case 't':
  807. option_values.mode_decode = true;
  808. option_values.test_only = true;
  809. break;
  810. case 'c':
  811. option_values.force_to_stdout = true;
  812. break;
  813. case 's':
  814. flac__utils_verbosity_ = 1;
  815. break;
  816. case 'f':
  817. option_values.force_file_overwrite = true;
  818. break;
  819. case 'o':
  820. FLAC__ASSERT(0 != option_argument);
  821. option_values.cmdline_forced_outfilename = option_argument;
  822. break;
  823. case 'F':
  824. option_values.continue_through_decode_errors = true;
  825. break;
  826. case 'T':
  827. FLAC__ASSERT(0 != option_argument);
  828. if(!flac__vorbiscomment_add(option_values.vorbis_comment, option_argument, &violation))
  829. return usage_error("ERROR: (-T/--tag) %sn", violation);
  830. break;
  831. case '0':
  832. option_values.do_exhaustive_model_search = false;
  833. option_values.do_escape_coding = false;
  834. option_values.do_mid_side = false;
  835. option_values.loose_mid_side = false;
  836. option_values.qlp_coeff_precision = 0;
  837. option_values.min_residual_partition_order = option_values.max_residual_partition_order = 2;
  838. option_values.rice_parameter_search_dist = 0;
  839. option_values.max_lpc_order = 0;
  840. break;
  841. case '1':
  842. option_values.do_exhaustive_model_search = false;
  843. option_values.do_escape_coding = false;
  844. option_values.do_mid_side = true;
  845. option_values.loose_mid_side = true;
  846. option_values.qlp_coeff_precision = 0;
  847. option_values.min_residual_partition_order = option_values.max_residual_partition_order = 2;
  848. option_values.rice_parameter_search_dist = 0;
  849. option_values.max_lpc_order = 0;
  850. break;
  851. case '2':
  852. option_values.do_exhaustive_model_search = false;
  853. option_values.do_escape_coding = false;
  854. option_values.do_mid_side = true;
  855. option_values.loose_mid_side = false;
  856. option_values.qlp_coeff_precision = 0;
  857. option_values.min_residual_partition_order = 0;
  858. option_values.max_residual_partition_order = 3;
  859. option_values.rice_parameter_search_dist = 0;
  860. option_values.max_lpc_order = 0;
  861. break;
  862. case '3':
  863. option_values.do_exhaustive_model_search = false;
  864. option_values.do_escape_coding = false;
  865. option_values.do_mid_side = false;
  866. option_values.loose_mid_side = false;
  867. option_values.qlp_coeff_precision = 0;
  868. option_values.min_residual_partition_order = option_values.max_residual_partition_order = 3;
  869. option_values.rice_parameter_search_dist = 0;
  870. option_values.max_lpc_order = 6;
  871. break;
  872. case '4':
  873. option_values.do_exhaustive_model_search = false;
  874. option_values.do_escape_coding = false;
  875. option_values.do_mid_side = true;
  876. option_values.loose_mid_side = true;
  877. option_values.qlp_coeff_precision = 0;
  878. option_values.min_residual_partition_order = option_values.max_residual_partition_order = 3;
  879. option_values.rice_parameter_search_dist = 0;
  880. option_values.max_lpc_order = 8;
  881. break;
  882. case '5':
  883. option_values.do_exhaustive_model_search = false;
  884. option_values.do_escape_coding = false;
  885. option_values.do_mid_side = true;
  886. option_values.loose_mid_side = false;
  887. option_values.qlp_coeff_precision = 0;
  888. option_values.min_residual_partition_order = option_values.max_residual_partition_order = 3;
  889. option_values.rice_parameter_search_dist = 0;
  890. option_values.max_lpc_order = 8;
  891. break;
  892. case '6':
  893. option_values.do_exhaustive_model_search = false;
  894. option_values.do_escape_coding = false;
  895. option_values.do_mid_side = true;
  896. option_values.loose_mid_side = false;
  897. option_values.qlp_coeff_precision = 0;
  898. option_values.min_residual_partition_order = 0;
  899. option_values.max_residual_partition_order = 4;
  900. option_values.rice_parameter_search_dist = 0;
  901. option_values.max_lpc_order = 8;
  902. break;
  903. case '7':
  904. option_values.do_exhaustive_model_search = true;
  905. option_values.do_escape_coding = false;
  906. option_values.do_mid_side = true;
  907. option_values.loose_mid_side = false;
  908. option_values.qlp_coeff_precision = 0;
  909. option_values.min_residual_partition_order = 0;
  910. option_values.max_residual_partition_order = 6;
  911. option_values.rice_parameter_search_dist = 0;
  912. option_values.max_lpc_order = 8;
  913. break;
  914. case '8':
  915. option_values.do_exhaustive_model_search = true;
  916. option_values.do_escape_coding = false;
  917. option_values.do_mid_side = true;
  918. option_values.loose_mid_side = false;
  919. option_values.qlp_coeff_precision = 0;
  920. option_values.min_residual_partition_order = 0;
  921. option_values.max_residual_partition_order = 6;
  922. option_values.rice_parameter_search_dist = 0;
  923. option_values.max_lpc_order = 12;
  924. break;
  925. case '9':
  926. return usage_error("ERROR: compression level '9' is reservedn");
  927. case 'V':
  928. option_values.verify = true;
  929. break;
  930. case 'S':
  931. FLAC__ASSERT(0 != option_argument);
  932. if(option_values.num_requested_seek_points < 0)
  933. option_values.num_requested_seek_points = 0;
  934. option_values.num_requested_seek_points++;
  935. if(strlen(option_values.requested_seek_points)+strlen(option_argument)+2 >= sizeof(option_values.requested_seek_points)) {
  936. return usage_error("ERROR: too many seekpoints requestedn");
  937. }
  938. else {
  939. strcat(option_values.requested_seek_points, option_argument);
  940. strcat(option_values.requested_seek_points, ";");
  941. }
  942. break;
  943. case 'P':
  944. FLAC__ASSERT(0 != option_argument);
  945. option_values.padding = atoi(option_argument);
  946. if(option_values.padding < 0)
  947. return usage_error("ERROR: argument to -P must be >= 0n");
  948. break;
  949. case 'b':
  950. FLAC__ASSERT(0 != option_argument);
  951. option_values.blocksize = atoi(option_argument);
  952. break;
  953. case 'e':
  954. option_values.do_exhaustive_model_search = true;
  955. break;
  956. case 'E':
  957. option_values.do_escape_coding = true;
  958. break;
  959. case 'l':
  960. FLAC__ASSERT(0 != option_argument);
  961. option_values.max_lpc_order = atoi(option_argument);
  962. break;
  963. case 'm':
  964. option_values.do_mid_side = true;
  965. option_values.loose_mid_side = false;
  966. break;
  967. case 'M':
  968. option_values.loose_mid_side = option_values.do_mid_side = true;
  969. break;
  970. case 'p':
  971. option_values.do_qlp_coeff_prec_search = true;
  972. break;
  973. case 'q':
  974. FLAC__ASSERT(0 != option_argument);
  975. option_values.qlp_coeff_precision = atoi(option_argument);
  976. break;
  977. case 'r':
  978. FLAC__ASSERT(0 != option_argument);
  979. p = strchr(option_argument, ',');
  980. if(0 == p) {
  981. option_values.min_residual_partition_order = 0;
  982. option_values.max_residual_partition_order = atoi(option_argument);
  983. }
  984. else {
  985. option_values.min_residual_partition_order = atoi(option_argument);
  986. option_values.max_residual_partition_order = atoi(++p);
  987. }
  988. break;
  989. case 'R':
  990. FLAC__ASSERT(0 != option_argument);
  991. option_values.rice_parameter_search_dist = atoi(option_argument);
  992. break;
  993. default:
  994. FLAC__ASSERT(0);
  995. }
  996. }
  997. return 0;
  998. }
  999. void free_options()
  1000. {
  1001. unsigned i;
  1002. if(0 != option_values.filenames) {
  1003. for(i = 0; i < option_values.num_files; i++) {
  1004. if(0 != option_values.filenames[i])
  1005. free(option_values.filenames[i]);
  1006. }
  1007. free(option_values.filenames);
  1008. }
  1009. if(0 != option_values.vorbis_comment)
  1010. FLAC__metadata_object_delete(option_values.vorbis_comment);
  1011. }
  1012. int usage_error(const char *message, ...)
  1013. {
  1014. if(flac__utils_verbosity_ >= 1) {
  1015. va_list args;
  1016. FLAC__ASSERT(0 != message);
  1017. va_start(args, message);
  1018. (void) vfprintf(stderr, message, args);
  1019. va_end(args);
  1020. printf("Type "flac" for a usage summary or "flac --help" for all optionsn");
  1021. }
  1022. return 1;
  1023. }
  1024. void show_version()
  1025. {
  1026. printf("flac %sn", FLAC__VERSION_STRING);
  1027. }
  1028. static void usage_header()
  1029. {
  1030. printf("===============================================================================n");
  1031. printf("flac - Command-line FLAC encoder/decoder version %sn", FLAC__VERSION_STRING);
  1032. printf("Copyright (C) 2000,2001,2002,2003,2004,2005  Josh Coalsonn");
  1033. printf("n");
  1034. printf("This program is free software; you can redistribute it and/orn");
  1035. printf("modify it under the terms of the GNU General Public Licensen");
  1036. printf("as published by the Free Software Foundation; either version 2n");
  1037. printf("of the License, or (at your option) any later version.n");
  1038. printf("n");
  1039. printf("This program is distributed in the hope that it will be useful,n");
  1040. printf("but WITHOUT ANY WARRANTY; without even the implied warranty ofn");
  1041. printf("MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See then");
  1042. printf("GNU General Public License for more details.n");
  1043. printf("n");
  1044. printf("You should have received a copy of the GNU General Public Licensen");
  1045. printf("along with this program; if not, write to the Free Softwaren");
  1046. printf("Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.n");
  1047. printf("===============================================================================n");
  1048. }
  1049. static void usage_summary()
  1050. {
  1051. printf("Usage:n");
  1052. printf("n");
  1053. printf(" Encoding: flac [<general-options>] [<encoding/format-options>] [INPUTFILE [...]]n");
  1054. printf(" Decoding: flac -d [<general-options>] [<format-options>] [FLACFILE [...]]n");
  1055. printf("  Testing: flac -t [<general-options>] [FLACFILE [...]]n");
  1056. printf("Analyzing: flac -a [<general-options>] [<analysis-options>] [FLACFILE [...]]n");
  1057. printf("n");
  1058. }
  1059. void short_usage()
  1060. {
  1061. usage_header();
  1062. printf("n");
  1063. printf("This is the short help; for all options use 'flac --help'; for even moren");
  1064. printf("instructions use 'flac --explain'n");
  1065. printf("n");
  1066. printf("To encode:n");
  1067. printf("  flac [-#] [INPUTFILE [...]]n");
  1068. printf("n");
  1069. printf("  -# is -0 (fastest compression) to -8 (highest compression); -5 is the defaultn");
  1070. printf("n");
  1071. printf("To decode:n");
  1072. printf("  flac -d [INPUTFILE [...]]n");
  1073. printf("n");
  1074. printf("To test:n");
  1075. printf("  flac -t [INPUTFILE [...]]n");
  1076. }
  1077. void show_help()
  1078. {
  1079. usage_header();
  1080. usage_summary();
  1081. printf("general options:n");
  1082. printf("  -v, --version                Show the flac version numbern");
  1083. printf("  -h, --help                   Show this screenn");
  1084. printf("  -H, --explain                Show detailed explanation of usage and optionsn");
  1085. printf("  -d, --decode                 Decode (the default behavior is to encode)n");
  1086. printf("  -t, --test                   Same as -d except no decoded file is writtenn");
  1087. printf("  -a, --analyze                Same as -d except an analysis file is writtenn");
  1088. printf("  -c, --stdout                 Write output to stdoutn");
  1089. printf("  -s, --silent                 Do not write runtime encode/decode statisticsn");
  1090. printf("      --totally-silent         Do not print anything, including errorsn");
  1091. printf("  -f, --force                  Force overwriting of output filesn");
  1092. printf("  -o, --output-name=FILENAME   Force the output file namen");
  1093. printf("      --output-prefix=STRING   Prepend STRING to output namesn");
  1094. printf("      --delete-input-file      Deletes after a successful encode/decoden");
  1095. printf("      --skip={#|mm:ss.ss}      Skip the given initial samples for each inputn");
  1096. printf("      --until={#|[+|-]mm:ss.ss}  Stop at the given sample for each input filen");
  1097. #ifdef FLAC__HAS_OGG
  1098. printf("      --ogg                    Use Ogg as transport layern");
  1099. printf("      --serial-number          Serial number to use for the FLAC streamn");
  1100. #endif
  1101. printf("analysis options:n");
  1102. printf("      --residual-text          Include residual signal in text outputn");
  1103. printf("      --residual-gnuplot       Generate gnuplot files of residual distributionn");
  1104. printf("decoding options:n");
  1105. printf("  -F, --decode-through-errors  Continue decoding through stream errorsn");
  1106. printf("      --cue=[#.#][-[#.#]]      Set the beginning and ending cuepoints to decoden");
  1107. printf("encoding options:n");
  1108. printf("  -V, --verify                 Verify a correct encodingn");
  1109. printf("      --lax                    Allow encoder to generate non-Subset filesn");
  1110. printf("      --sector-align           Align multiple files on sector boundariesn");
  1111. printf("      --replay-gain            Calculate ReplayGain & store in Vorbis commentsn");
  1112. printf("      --cuesheet=FILENAME      Import cuesheet and store in CUESHEET blockn");
  1113. printf("  -T, --tag=FIELD=VALUE        Add a Vorbis comment; may appear multiple timesn");
  1114. printf("  -S, --seekpoint={#|X|#x|#s}  Add seek point(s)n");
  1115. printf("  -P, --padding=#              Write a PADDING block of length #n");
  1116. printf("  -0, --compression-level-0, --fast  Synonymous with -l 0 -b 1152 -r 2,2n");
  1117. printf("  -1, --compression-level-1          Synonymous with -l 0 -b 1152 -M -r 2,2n");
  1118. printf("  -2, --compression-level-2          Synonymous with -l 0 -b 1152 -m -r 3n");
  1119. printf("  -3, --compression-level-3          Synonymous with -l 6 -b 4608 -r 3,3n");
  1120. printf("  -4, --compression-level-4          Synonymous with -l 8 -b 4608 -M -r 3,3n");
  1121. printf("  -5, --compression-level-5          Synonymous with -l 8 -b 4608 -m -r 3,3n");
  1122. printf("  -6, --compression-level-6          Synonymous with -l 8 -b 4608 -m -r 4n");
  1123. printf("  -7, --compression-level-7          Synonymous with -l 8 -b 4608 -m -e -r 6n");
  1124. printf("  -8, --compression-level-8, --best  Synonymous with -l 12 -b 4608 -m -e -r 6n");
  1125. printf("  -b, --blocksize=#                  Specify blocksize in samplesn");
  1126. printf("  -m, --mid-side                     Try mid-side coding for each framen");
  1127. printf("  -M, --adaptive-mid-side            Adaptive mid-side coding for all framesn");
  1128. printf("  -e, --exhaustive-model-search      Do exhaustive model search (expensive!)n");
  1129. printf("  -l, --max-lpc-order=#              Max LPC order; 0 => only fixed predictorsn");
  1130. printf("  -p, --qlp-coeff-precision-search   Exhaustively search LP coeff quantizationn");
  1131. printf("  -q, --qlp-coeff-precision=#        Specify precision in bitsn");
  1132. printf("  -r, --rice-partition-order=[#,]#   Set [min,]max residual partition ordern");
  1133. printf("format options:n");
  1134. printf("      --endian={big|little}    Set byte order for samplesn");
  1135. printf("      --channels=#             Number of channelsn");
  1136. printf("      --bps=#                  Number of bits per samplen");
  1137. printf("      --sample-rate=#          Sample rate in Hzn");
  1138. printf("      --sign={signed|unsigned} Sign of samplesn");
  1139. printf("      --input-size=#           Size of the raw input in bytesn");
  1140. printf("      --force-aiff-format      Force decoding to AIFF formatn");
  1141. printf("      --force-raw-format       Treat input or output as raw samplesn");
  1142. printf("negative options:n");
  1143. printf("      --no-adaptive-mid-siden");
  1144. printf("      --no-decode-through-errorsn");
  1145. printf("      --no-delete-input-filen");
  1146. printf("      --no-exhaustive-model-searchn");
  1147. printf("      --no-laxn");
  1148. printf("      --no-mid-siden");
  1149. #ifdef FLAC__HAS_OGG
  1150. printf("      --no-oggn");
  1151. #endif
  1152. printf("      --no-paddingn");
  1153. printf("      --no-qlp-coeff-prec-searchn");
  1154. printf("      --no-replay-gainn");
  1155. printf("      --no-residual-gnuplotn");
  1156. printf("      --no-residual-textn");
  1157. printf("      --no-sector-alignn");
  1158. printf("      --no-seektablen");
  1159. printf("      --no-silentn");
  1160. printf("      --no-forcen");
  1161. printf("      --no-verifyn");
  1162. }
  1163. void show_explain()
  1164. {
  1165. usage_header();
  1166. usage_summary();
  1167. printf("For encoding:n");
  1168. printf("  The input file(s) may be a PCM RIFF WAVE file, AIFF file, or raw samples.n");
  1169. printf("  The output file(s) will be in native FLAC or Ogg FLAC formatn");
  1170. printf("For decoding, the reverse is true.n");
  1171. printf("n");
  1172. printf("A single INPUTFILE may be - for stdin.  No INPUTFILE implies stdin.  Use ofn");
  1173. printf("stdin implies -c (write to stdout).  Normally you should use:n");
  1174. printf("   flac [options] -o outfilename  or  flac -d [options] -o outfilenamen");
  1175. printf("instead of:n");
  1176. printf("   flac [options] > outfilename   or  flac -d [options] > outfilenamen");
  1177. printf("since the former allows flac to seek backwards to write the STREAMINFO orn");
  1178. printf("WAVE/AIFF header contents when necessary.n");
  1179. printf("n");
  1180. printf("flac checks for the presence of a AIFF/WAVE header to decide whether or not ton");
  1181. printf("treat an input file as AIFF/WAVE format or raw samples.  If any input file isn");
  1182. printf("raw you must specify the format options {-fb|fl} -fc -fp and -fs, which willn");
  1183. printf("apply to all raw files.  You can force AIFF/WAVE files to be treated as rawn");
  1184. printf("files using -fr.n");
  1185. printf("n");
  1186. printf("general options:n");
  1187. printf("  -v, --version                Show the flac version numbern");
  1188. printf("  -h, --help                   Show basic usage a list of all optionsn");
  1189. printf("  -H, --explain                Show this screenn");
  1190. printf("  -d, --decode                 Decode (the default behavior is to encode)n");
  1191. printf("  -t, --test                   Same as -d except no decoded file is writtenn");
  1192. printf("  -a, --analyze                Same as -d except an analysis file is writtenn");
  1193. printf("  -c, --stdout                 Write output to stdoutn");
  1194. printf("  -s, --silent                 Do not write runtime encode/decode statisticsn");
  1195. printf("      --totally-silent         Do not print anything of any kind, includingn");
  1196. printf("                               warnings or errors.  The exit code will be then");
  1197. printf("                               only way to determine successful completion.n");
  1198. printf("  -f, --force                  Force overwriting of output filesn");
  1199. printf("  -o, --output-name=FILENAME   Force the output file name; usually flac justn");
  1200. printf("                               changes the extension.  May only be used whenn");
  1201. printf("                               encoding a single file.  May not be used inn");
  1202. printf("                               conjunction with --output-prefix.n");
  1203. printf("      --output-prefix=STRING   Prefix each output file name with the givenn");
  1204. printf("                               STRING.  This can be useful for encoding orn");
  1205. printf("                               decoding files to a different directory.  Maken");
  1206. printf("                               sure if your STRING is a path name that it endsn");
  1207. printf("                               with a '/' slash.n");
  1208. printf("      --delete-input-file      Automatically delete the input file after an");
  1209. printf("                               successful encode or decode.  If there was ann");
  1210. printf("                               error (including a verify error) the input filen");
  1211. printf("                               is left intact.n");
  1212. printf("      --skip={#|mm:ss.ss}      Skip the first # samples of each input file; cann");
  1213. printf("                               be used both for encoding and decoding.  Then");
  1214. printf("                               alternative form mm:ss.ss can be used to specifyn");
  1215. printf("                               minutes, seconds, and fractions of a second.n");
  1216. printf("      --until={#|[+|-]mm:ss.ss}  Stop at the given sample number for each inputn");
  1217. printf("                               file.  The given sample number is not includedn");
  1218. printf("                               in the decoded output.  The alternative formn");
  1219. printf("                               mm:ss.ss can be used to specify minutes,n");
  1220. printf("                               seconds, and fractions of a second.  If a `+'n");
  1221. printf("                               sign is at the beginning, the --until point isn");
  1222. printf("                               relative to the --skip point.  If a `-' sign isn");
  1223. printf("                               at the beginning, the --until point is relativen");
  1224. printf("                               to end of the audio.n");
  1225. #ifdef FLAC__HAS_OGG
  1226. printf("      --ogg                    When encoding, generate Ogg FLAC output insteadn");
  1227. printf("                               of native FLAC.  Ogg FLAC streams are FLACn");
  1228. printf("                               streams wrapped in an Ogg transport layer.  Then");
  1229. printf("                               resulting file should have an '.ogg' extensionn");
  1230. printf("                               and will still be decodable by flac.  Whenn");
  1231. printf("                               decoding, force the input to be treated asn");
  1232. printf("                               Ogg FLAC.  This is useful when piping inputn");
  1233. printf("                               from stdin or when the filename does not end inn");
  1234. printf("                               '.ogg'.n");
  1235. printf("      --serial-number          Serial number to use for the FLAC stream.  Whenn");
  1236. printf("                               encoding and no serial number is given, flacn");
  1237. printf("                               uses '0'.  When decoding and no number isn");
  1238. printf("                               given, flac uses the serial number of the firstn");
  1239. printf("                               page.n");
  1240. #endif
  1241. printf("analysis options:n");
  1242. printf("      --residual-text          Include residual signal in text output.  Thisn");
  1243. printf("                               will make the file very big, much larger thann");
  1244. printf("                               even the decoded file.n");
  1245. printf("      --residual-gnuplot       Generate gnuplot files of residual distributionn");
  1246. printf("                               of each subframen");
  1247. printf("decoding options:n");
  1248. printf("  -F, --decode-through-errors  By default flac stops decoding with an errorn");
  1249. printf("                               and removes the partially decoded file if itn");
  1250. printf("                               encounters a bitstream error.  With -F, errorsn");
  1251. printf("                               are still printed but flac will continuen");
  1252. printf("                               decoding to completion.  Note that errors mayn");
  1253. printf("                               cause the decoded audio to be missing somen");
  1254. printf("                               samples or have silent sections.n");
  1255. printf("      --cue=[#.#][-[#.#]]      Set the beginning and ending cuepoints ton");
  1256. printf("                               decode.  The optional first #.# is the track andn");
  1257. printf("                               index point at which decoding will start; then");
  1258. printf("                               default is the beginning of the stream.  Then");
  1259. printf("                               optional second #.# is the track and index pointn");
  1260. printf("                               at which decoding will end; the default is then");
  1261. printf("                               end of the stream.  If the cuepoint does notn");
  1262. printf("                               exist, the closest one before it (for the startn");
  1263. printf("                               point) or after it (for the end point) will ben");
  1264. printf("                               used.  The cuepoints are merely translated inton");
  1265. printf("                               sample numbers then used as --skip and --until.n");
  1266. printf("encoding options:n");
  1267. printf("  -V, --verify                 Verify a correct encoding by decoding then");
  1268. printf("                               output in parallel and comparing to then");
  1269. printf("                               originaln");
  1270. printf("      --lax                    Allow encoder to generate non-Subset filesn");
  1271. printf("      --sector-align           Align encoding of multiple CD format WAVE filesn");
  1272. printf("                               on sector boundaries.n");
  1273. printf("      --replay-gain            Calculate ReplayGain values and store in Vorbisn");
  1274. printf("                               comments.  Title gains/peaks will be computedn");
  1275. printf("                               for each file, and an album gain/peak will ben");
  1276. printf("                               computed for all files.  All input files mustn");
  1277. printf("                               have the same resolution, sample rate, andn");
  1278. printf("                               number of channels.  The sample rate must ben");
  1279. printf("                               one of 8, 11.025, 12, 16, 22.05, 24, 32, 44.1,n");
  1280. printf("                               or 48 kHz.  NOTE: this option may also leave an");
  1281. printf("                               few extra bytes in the PADDING block.n");
  1282. printf("      --cuesheet=FILENAME      Import the given cuesheet file and store it inn");
  1283. printf("                               a CUESHEET metadata block.  This option may onlyn");
  1284. printf("                               be used when encoding a single file.  An");
  1285. printf("                               seekpoint will be added for each index point inn");
  1286. printf("                               the cuesheet to the SEEKTABLE unlessn");
  1287. printf("                               --no-cued-seekpoints is specified.n");
  1288. printf("  -T, --tag=FIELD=VALUE        Add a Vorbis comment.  Make sure to quote then");
  1289. printf("                               comment if necessary.  This option may appearn");
  1290. printf("                               more than once to add several comments.  NOTE:n");
  1291. printf("                               all tags will be added to all encoded files.n");
  1292. printf("  -S, --seekpoint={#|X|#x|#s}  Include a point or points in a SEEKTABLEn");
  1293. printf("       #  : a specific sample number for a seek pointn");
  1294. printf("       X  : a placeholder point (always goes at the end of the SEEKTABLE)n");
  1295. printf("       #x : # evenly spaced seekpoints, the first being at sample 0n");
  1296. printf("       #s : a seekpoint every # seconds; # does not have to be a whole numbern");
  1297. printf("     You may use many -S options; the resulting SEEKTABLE will be the unique-n");
  1298. printf("           ified union of all such values.n");
  1299. printf("     With no -S options, flac defaults to '-S 10s'.  Use -S- for no SEEKTABLE.n");
  1300. printf("     Note: -S #x and -S #s will not work if the encoder can't determine then");
  1301. printf("           input size before starting.n");
  1302. printf("     Note: if you use -S # and # is >= samples in the input, there will ben");
  1303. printf("           either no seek point entered (if the input size is determinablen");
  1304. printf("           before encoding starts) or a placeholder point (if input size is notn");
  1305. printf("           determinable)n");
  1306. printf("  -P, --padding=#              Tell the encoder to write a PADDING metadatan");
  1307. printf("                               block of the given length (in bytes) after then");
  1308. printf("                               STREAMINFO block.  This is useful if you plann");
  1309. printf("                               to tag the file later with an APPLICATIONn");
  1310. printf("                               block; instead of having to rewrite the entiren");
  1311. printf("                               file later just to insert your block, you cann");
  1312. printf("                               write directly over the PADDING block.  Noten");
  1313. printf("                               that the total length of the PADDING block willn");
  1314. printf("                               be 4 bytes longer than the length given becausen");
  1315. printf("                               of the 4 metadata block header bytes.  You cann");
  1316. printf("                               force no PADDING block at all to be written withn");
  1317. printf("                               --no-padding.  The encoder writes a PADDINGn");
  1318. printf("                               block of 4096 bytes by default.n");
  1319. printf("  -b, --blocksize=#            Specify the blocksize in samples; the default isn");
  1320. printf("                               1152 for -l 0, else 4608; must be one of 192,n");
  1321. printf("                               576, 1152, 2304, 4608, 256, 512, 1024, 2048,n");
  1322. printf("                               4096, 8192, 16384, or 32768 (unless --lax isn");
  1323. printf("                               used)n");
  1324. printf("  -0, --compression-level-0, --fast  Synonymous with -l 0 -b 1152 -r 2,2n");
  1325. printf("  -1, --compression-level-1          Synonymous with -l 0 -b 1152 -M -r 2,2n");
  1326. printf("  -2, --compression-level-2          Synonymous with -l 0 -b 1152 -m -r 3n");
  1327. printf("  -3, --compression-level-3          Synonymous with -l 6 -b 4608 -r 3,3n");
  1328. printf("  -4, --compression-level-4          Synonymous with -l 8 -b 4608 -M -r 3,3n");
  1329. printf("  -5, --compression-level-5          Synonymous with -l 8 -b 4608 -m -r 3,3n");
  1330. printf("                                     -5 is the default settingn");
  1331. printf("  -6, --compression-level-6          Synonymous with -l 8 -b 4608 -m -r 4n");
  1332. printf("  -7, --compression-level-7          Synonymous with -l 8 -b 4608 -m -e -r 6n");
  1333. printf("  -8, --compression-level-8, --best  Synonymous with -l 12 -b 4608 -m -e -r 6n");
  1334. printf("  -m, --mid-side                     Try mid-side coding for each framen");
  1335. printf("                                     (stereo only)n");
  1336. printf("  -M, --adaptive-mid-side            Adaptive mid-side coding for all framesn");
  1337. printf("                                     (stereo only)n");
  1338. printf("  -e, --exhaustive-model-search      Do exhaustive model search (expensive!)n");
  1339. printf("  -l, --max-lpc-order=#              Max LPC order; 0 => only fixed predictorsn");
  1340. printf("  -p, --qlp-coeff-precision-search   Do exhaustive search of LP coefficientn");
  1341. printf("                                     quantization (expensive!); overrides -q;n");
  1342. printf("                                     does nothing if using -l 0n");
  1343. printf("  -q, --qlp-coeff-precision=#        Specify precision in bits of quantizedn");
  1344. printf("                                     linear-predictor coefficients; 0 => letn");
  1345. printf("                                     encoder decide (the minimun is %u, then", FLAC__MIN_QLP_COEFF_PRECISION);
  1346. printf("                                     default is -q 0)n");
  1347. printf("  -r, --rice-partition-order=[#,]#   Set [min,]max residual partition ordern");
  1348. printf("                                     (# is 0..16; min defaults to 0; then");
  1349. printf("                                     default is -r 0; above 4 doesn't usuallyn");
  1350. printf("                                     help much)n");
  1351. printf("format options:n");
  1352. printf("      --endian={big|little}    Set byte order for samplesn");
  1353. printf("      --channels=#             Number of channelsn");
  1354. printf("      --bps=#                  Number of bits per samplen");
  1355. printf("      --sample-rate=#          Sample rate in Hzn");
  1356. printf("      --sign={signed|unsigned} Sign of samples (the default is signed)n");
  1357. printf("      --input-size=#           Size of the raw input in bytes.  If you aren");
  1358. printf("                               encoding raw samples from stdin, you must setn");
  1359. printf("                               this option in order to be able to use --skip,n");
  1360. printf("                               --until, --cue-sheet, or other options that needn");
  1361. printf("                               to know the size of the input beforehand.  Ifn");
  1362. printf("                               the size given is greater than what is found inn");
  1363. printf("                               the input stream, the encoder will complainn");
  1364. printf("                               about an unexpected end-of-file.  If the sizen");
  1365. printf("                               given is less, samples will be truncated.n");
  1366. printf("      --force-aiff-format      Force the decoder to output AIFF format.  Thisn");
  1367. printf("                               option is not needed if the output filename (asn");
  1368. printf("                               set by -o) ends with .aif or .aiff; this optionn");
  1369. printf("                               has no effect when encoding since input AIFF isn");
  1370. printf("                               auto-detected.n");
  1371. printf("      --force-raw-format       Force input (when encoding) or output (whenn");
  1372. printf("                               decoding) to be treated as raw samplesn");
  1373. printf("negative options:n");
  1374. printf("      --no-adaptive-mid-siden");
  1375. printf("      --no-decode-through-errorsn");
  1376. printf("      --no-delete-input-filen");
  1377. printf("      --no-exhaustive-model-searchn");
  1378. printf("      --no-laxn");
  1379. printf("      --no-mid-siden");
  1380. #ifdef FLAC__HAS_OGG
  1381. printf("      --no-oggn");
  1382. #endif
  1383. printf("      --no-paddingn");
  1384. printf("      --no-qlp-coeff-prec-searchn");
  1385. printf("      --no-residual-gnuplotn");
  1386. printf("      --no-residual-textn");
  1387. printf("      --no-sector-alignn");
  1388. printf("      --no-seektablen");
  1389. printf("      --no-silentn");
  1390. printf("      --no-forcen");
  1391. printf("      --no-verifyn");
  1392. }
  1393. void format_mistake(const char *infilename, const char *wrong, const char *right)
  1394. {
  1395. flac__utils_printf(stderr, 1, "WARNING: %s is not a %s file; treating as a %s filen", infilename, wrong, right);
  1396. }
  1397. int encode_file(const char *infilename, FLAC__bool is_first_file, FLAC__bool is_last_file)
  1398. {
  1399. FILE *encode_infile;
  1400. FLAC__byte lookahead[12];
  1401. unsigned lookahead_length = 0;
  1402. FileFormat fmt= RAW;
  1403. int retval;
  1404. long infilesize;
  1405. encode_options_t common_options;
  1406. const char *outfilename = get_encoded_outfilename(infilename);
  1407. if(0 == outfilename) {
  1408. flac__utils_printf(stderr, 1, "ERROR: filename too long: %s", infilename);
  1409. return 1;
  1410. }
  1411. /*
  1412.  * Error if output file already exists (and -f not used).
  1413.  * Use grabbag__file_get_filesize() as a cheap way to check.
  1414.  */
  1415. if(!option_values.test_only && !option_values.force_file_overwrite && grabbag__file_get_filesize(outfilename) != (off_t)(-1)) {
  1416. flac__utils_printf(stderr, 1, "ERROR: output file %s already exists, use -f to overriden", outfilename);
  1417. return 1;
  1418. }
  1419. if(0 == strcmp(infilename, "-")) {
  1420. infilesize = -1;
  1421. encode_infile = grabbag__file_get_binary_stdin();
  1422. }
  1423. else {
  1424. infilesize = grabbag__file_get_filesize(infilename);
  1425. if(0 == (encode_infile = fopen(infilename, "rb"))) {
  1426. flac__utils_printf(stderr, 1, "ERROR: can't open input file %sn", infilename);
  1427. return 1;
  1428. }
  1429. }
  1430. if(!option_values.force_raw_format) {
  1431. /* first set format based on name */
  1432. if(strlen(infilename) >= 4 && 0 == strcasecmp(infilename+(strlen(infilename)-4), ".wav"))
  1433. fmt= WAV;
  1434. else if(strlen(infilename) >= 4 && 0 == strcasecmp(infilename+(strlen(infilename)-4), ".aif"))
  1435. fmt= AIF;
  1436. else if(strlen(infilename) >= 5 && 0 == strcasecmp(infilename+(strlen(infilename)-5), ".aiff"))
  1437. fmt= AIF;
  1438. /* attempt to guess the file type based on the first 12 bytes */
  1439. if((lookahead_length = fread(lookahead, 1, 12, encode_infile)) < 12) {
  1440. if(fmt != RAW)
  1441. format_mistake(infilename, fmt == AIF ? "AIFF" : "WAVE", "raw");
  1442. fmt= RAW;
  1443. }
  1444. else {
  1445. if(!strncmp((const char *)lookahead, "RIFF", 4) && !strncmp((const char *)lookahead+8, "WAVE", 4))
  1446. fmt= WAV;
  1447. else if(!strncmp((const char *)lookahead, "FORM", 4) && !strncmp((const char *)lookahead+8, "AIFF", 4))
  1448. fmt= AIF;
  1449. else {
  1450. if(fmt != RAW)
  1451. format_mistake(infilename, fmt == AIF ? "AIFF" : "WAVE", "raw");
  1452. fmt= RAW;
  1453. }
  1454. }
  1455. }
  1456. if(option_values.format_input_size >= 0) {
  1457.     if (fmt != RAW || infilesize >= 0) {
  1458. flac__utils_printf(stderr, 1, "ERROR: can only use --input-size when encoding raw samples from stdinn");
  1459. return 1;
  1460. }
  1461. else {
  1462. infilesize = option_values.format_input_size;
  1463. }
  1464. }
  1465. if(option_values.sector_align && fmt == RAW && infilesize < 0) {
  1466. flac__utils_printf(stderr, 1, "ERROR: can't --sector-align when the input size is unknownn");
  1467. return 1;
  1468. }
  1469. if(fmt == RAW) {
  1470. if(option_values.format_is_big_endian < 0 || option_values.format_is_unsigned_samples < 0 || option_values.format_channels < 0 || option_values.format_bps < 0 || option_values.format_sample_rate < 0)
  1471. return usage_error("ERROR: for encoding a raw file you must specify a value for --endian, --sign, --channels, --bps, and --sample-raten");
  1472. }
  1473. if(encode_infile == stdin || option_values.force_to_stdout) {
  1474. if(option_values.replay_gain)
  1475. return usage_error("ERROR: --replay-gain cannot be used when encoding to stdoutn");
  1476. }
  1477. if(!flac__utils_parse_skip_until_specification(option_values.skip_specification, &common_options.skip_specification) || common_options.skip_specification.is_relative)
  1478. return usage_error("ERROR: invalid value for --skipn");
  1479. if(!flac__utils_parse_skip_until_specification(option_values.until_specification, &common_options.until_specification)) /*@@@ more checks: no + without --skip, no - unless known total_samples_to_{en,de}code */
  1480. return usage_error("ERROR: invalid value for --untiln");
  1481. /* if there is no "--until" we want to default to "--until=-0" */
  1482. if(0 == option_values.until_specification)
  1483. common_options.until_specification.is_relative = true;
  1484. common_options.verify = option_values.verify;
  1485. #ifdef FLAC__HAS_OGG
  1486. common_options.use_ogg = option_values.use_ogg;
  1487. /* set a random serial number if one has not yet been specified */
  1488. if(!option_values.has_serial_number) {
  1489. srand(time(0));
  1490. option_values.serial_number = rand();
  1491. option_values.has_serial_number = true;
  1492. }
  1493. common_options.serial_number = option_values.serial_number++;
  1494. #endif
  1495. common_options.lax = option_values.lax;
  1496. common_options.do_mid_side = option_values.do_mid_side;
  1497. common_options.loose_mid_side = option_values.loose_mid_side;
  1498. common_options.do_exhaustive_model_search = option_values.do_exhaustive_model_search;
  1499. common_options.do_escape_coding = option_values.do_escape_coding;
  1500. common_options.do_qlp_coeff_prec_search = option_values.do_qlp_coeff_prec_search;
  1501. common_options.min_residual_partition_order = option_values.min_residual_partition_order;
  1502. common_options.max_residual_partition_order = option_values.max_residual_partition_order;
  1503. common_options.rice_parameter_search_dist = option_values.rice_parameter_search_dist;
  1504. common_options.max_lpc_order = option_values.max_lpc_order;
  1505. common_options.blocksize = (unsigned)option_values.blocksize;
  1506. common_options.qlp_coeff_precision = option_values.qlp_coeff_precision;
  1507. common_options.padding = option_values.padding;
  1508. common_options.requested_seek_points = option_values.requested_seek_points;
  1509. common_options.num_requested_seek_points = option_values.num_requested_seek_points;
  1510. common_options.cuesheet_filename = option_values.cuesheet_filename;
  1511. common_options.cued_seekpoints = option_values.cued_seekpoints;
  1512. common_options.is_first_file = is_first_file;
  1513. common_options.is_last_file = is_last_file;
  1514. common_options.align_reservoir = align_reservoir;
  1515. common_options.align_reservoir_samples = &align_reservoir_samples;
  1516. common_options.replay_gain = option_values.replay_gain;
  1517. common_options.sector_align = option_values.sector_align;
  1518. common_options.vorbis_comment = option_values.vorbis_comment;
  1519. common_options.debug.disable_constant_subframes = option_values.debug.disable_constant_subframes;
  1520. common_options.debug.disable_fixed_subframes = option_values.debug.disable_fixed_subframes;
  1521. common_options.debug.disable_verbatim_subframes = option_values.debug.disable_verbatim_subframes;
  1522. if(fmt == RAW) {
  1523. raw_encode_options_t options;
  1524. options.common = common_options;
  1525. options.is_big_endian = option_values.format_is_big_endian;
  1526. options.is_unsigned_samples = option_values.format_is_unsigned_samples;
  1527. options.channels = option_values.format_channels;
  1528. options.bps = option_values.format_bps;
  1529. options.sample_rate = option_values.format_sample_rate;
  1530. retval = flac__encode_raw(encode_infile, infilesize, infilename, outfilename, lookahead, lookahead_length, options);
  1531. }
  1532. else {
  1533. wav_encode_options_t options;
  1534. options.common = common_options;
  1535. if(fmt == AIF)
  1536. retval = flac__encode_aif(encode_infile, infilesize, infilename, outfilename, lookahead, lookahead_length, options);
  1537. else
  1538. retval = flac__encode_wav(encode_infile, infilesize, infilename, outfilename, lookahead, lookahead_length, options);
  1539. }
  1540. if(retval == 0 && strcmp(infilename, "-")) {
  1541. if(strcmp(outfilename, "-")) {
  1542. if(option_values.replay_gain) {
  1543. float title_gain, title_peak;
  1544. const char *error;
  1545. grabbag__replaygain_get_title(&title_gain, &title_peak);
  1546. if(0 != (error = grabbag__replaygain_store_to_file_title(outfilename, title_gain, title_peak, /*preserve_modtime=*/true))) {
  1547. flac__utils_printf(stderr, 1, "%s: ERROR writing ReplayGain title tagsn", outfilename);
  1548. }
  1549. }
  1550. grabbag__file_copy_metadata(infilename, outfilename);
  1551. }
  1552. if(option_values.delete_input)
  1553. unlink(infilename);
  1554. }
  1555. return retval;
  1556. }
  1557. int decode_file(const char *infilename)
  1558. {
  1559. int retval;
  1560. FLAC__bool treat_as_ogg = false;
  1561. decode_options_t common_options;
  1562. const char *outfilename = get_decoded_outfilename(infilename);
  1563. if(0 == outfilename) {
  1564. flac__utils_printf(stderr, 1, "ERROR: filename too long: %s", infilename);
  1565. return 1;
  1566. }
  1567. /*
  1568.  * Error if output file already exists (and -f not used).
  1569.  * Use grabbag__file_get_filesize() as a cheap way to check.
  1570.  */
  1571. if(!option_values.test_only && !option_values.force_file_overwrite && grabbag__file_get_filesize(outfilename) != (off_t)(-1)) {
  1572. flac__utils_printf(stderr, 1, "ERROR: output file %s already exists, use -f to overriden", outfilename);
  1573. return 1;
  1574. }
  1575. if(!option_values.test_only && !option_values.analyze) {
  1576. if(option_values.force_raw_format && (option_values.format_is_big_endian < 0 || option_values.format_is_unsigned_samples < 0))
  1577. return usage_error("ERROR: for decoding to a raw file you must specify a value for --endian and --signn");
  1578. }
  1579. if(option_values.use_ogg)
  1580. treat_as_ogg = true;
  1581. else if(strlen(infilename) >= 4 && 0 == strcasecmp(infilename+(strlen(infilename)-4), ".ogg"))
  1582. treat_as_ogg = true;
  1583. else
  1584. treat_as_ogg = false;
  1585. #ifndef FLAC__HAS_OGG
  1586. if(treat_as_ogg) {
  1587. flac__utils_printf(stderr, 1, "%s: Ogg support has not been built into this copy of flacn", infilename);
  1588. return 1;
  1589. }
  1590. #endif
  1591. if(!flac__utils_parse_skip_until_specification(option_values.skip_specification, &common_options.skip_specification) || common_options.skip_specification.is_relative)
  1592. return usage_error("ERROR: invalid value for --skipn");
  1593. if(!flac__utils_parse_skip_until_specification(option_values.until_specification, &common_options.until_specification)) /*@@@ more checks: no + without --skip, no - unless known total_samples_to_{en,de}code */
  1594. return usage_error("ERROR: invalid value for --untiln");
  1595. /* if there is no "--until" we want to default to "--until=-0" */
  1596. if(0 == option_values.until_specification)
  1597. common_options.until_specification.is_relative = true;
  1598. if(option_values.cue_specification) {
  1599. if(!flac__utils_parse_cue_specification(option_values.cue_specification, &common_options.cue_specification))
  1600. return usage_error("ERROR: invalid value for --cuen");
  1601. common_options.has_cue_specification = true;
  1602. }
  1603. else
  1604. common_options.has_cue_specification = false;
  1605. common_options.continue_through_decode_errors = option_values.continue_through_decode_errors;
  1606. common_options.replaygain_synthesis_spec = option_values.replaygain_synthesis_spec;
  1607. #ifdef FLAC__HAS_OGG
  1608. common_options.is_ogg = treat_as_ogg;
  1609. common_options.use_first_serial_number = !option_values.has_serial_number;
  1610. common_options.serial_number = option_values.serial_number;
  1611. #endif
  1612. if(!option_values.force_raw_format) {
  1613. wav_decode_options_t options;
  1614. options.common = common_options;
  1615. if(
  1616. option_values.force_aiff_format ||
  1617. (strlen(outfilename) >= 4 && 0 == strcasecmp(outfilename+(strlen(outfilename)-4), ".aif")) ||
  1618. (strlen(outfilename) >= 5 && 0 == strcasecmp(outfilename+(strlen(outfilename)-5), ".aiff"))
  1619. )
  1620. retval = flac__decode_aiff(infilename, option_values.test_only? 0 : outfilename, option_values.analyze, option_values.aopts, options);
  1621. else
  1622. retval = flac__decode_wav(infilename, option_values.test_only? 0 : outfilename, option_values.analyze, option_values.aopts, options);
  1623. }
  1624. else {
  1625. raw_decode_options_t options;
  1626. options.common = common_options;
  1627. options.is_big_endian = option_values.format_is_big_endian;
  1628. options.is_unsigned_samples = option_values.format_is_unsigned_samples;
  1629. retval = flac__decode_raw(infilename, option_values.test_only? 0 : outfilename, option_values.analyze, option_values.aopts, options);
  1630. }
  1631. if(retval == 0 && strcmp(infilename, "-")) {
  1632. if(strcmp(outfilename, "-"))
  1633. grabbag__file_copy_metadata(infilename, outfilename);
  1634. if(option_values.delete_input && !option_values.test_only && !option_values.analyze)
  1635. unlink(infilename);
  1636. }
  1637. return retval;
  1638. }
  1639. const char *get_encoded_outfilename(const char *infilename)
  1640. {
  1641. const char *suffix = (option_values.use_ogg? ".ogg" : ".flac");
  1642. return get_outfilename(infilename, suffix);
  1643. }
  1644. const char *get_decoded_outfilename(const char *infilename)
  1645. {
  1646. const char *suffix;
  1647. if(option_values.analyze) {
  1648. suffix = ".ana";
  1649. }
  1650. else if(option_values.force_raw_format) {
  1651. suffix = ".raw";
  1652. }
  1653. else if(option_values.force_aiff_format) {
  1654. suffix = ".aiff";
  1655. }
  1656. else {
  1657. suffix = ".wav";
  1658. }
  1659. return get_outfilename(infilename, suffix);
  1660. }
  1661. const char *get_outfilename(const char *infilename, const char *suffix)
  1662. {
  1663. if(0 == option_values.cmdline_forced_outfilename) {
  1664. static char buffer[4096]; /* @@@ bad MAGIC NUMBER */
  1665. if(0 == strcmp(infilename, "-") || option_values.force_to_stdout) {
  1666. strcpy(buffer, "-");
  1667. }
  1668. else {
  1669. char *p;
  1670. if (flac__strlcpy(buffer, option_values.output_prefix? option_values.output_prefix : "", sizeof buffer) >= sizeof buffer)
  1671. return 0;
  1672. if (flac__strlcat(buffer, infilename, sizeof buffer) >= sizeof buffer)
  1673. return 0;
  1674. if(0 == (p = strrchr(buffer, '.'))) {
  1675. if (flac__strlcat(buffer, suffix, sizeof buffer) >= sizeof buffer)
  1676. return 0;
  1677. }
  1678. else {
  1679. if(0 == strcmp(p, suffix)) {
  1680. *p = '';
  1681. if (flac__strlcat(buffer, "_new", sizeof buffer) >= sizeof buffer)
  1682. return 0;
  1683. }
  1684. else {
  1685. *p = '';
  1686. }
  1687. if (flac__strlcat(buffer, suffix, sizeof buffer) >= sizeof buffer)
  1688. return 0;
  1689. }
  1690. }
  1691. return buffer;
  1692. }
  1693. else
  1694. return option_values.cmdline_forced_outfilename;
  1695. }
  1696. void die(const char *message)
  1697. {
  1698. FLAC__ASSERT(0 != message);
  1699. flac__utils_printf(stderr, 1, "ERROR: %sn", message);
  1700. exit(1);
  1701. }
  1702. char *local_strdup(const char *source)
  1703. {
  1704. char *ret;
  1705. FLAC__ASSERT(0 != source);
  1706. if(0 == (ret = strdup(source)))
  1707. die("out of memory during strdup()");
  1708. return ret;
  1709. }