FreeCalypso > hg > gsm-codec-lib
comparison miscutil/efr2amr.c @ 106:e7c8d739c4c8
gsm-efr2amr: implement -w option like in gsm-amr2efr
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 27 Nov 2022 06:25:06 +0000 |
parents | 7f43089e9a7a |
children | 41f1ae68d253 |
comparison
equal
deleted
inserted
replaced
105:ecfbced76fea | 106:e7c8d739c4c8 |
---|---|
18 static const char amr_file_hdr[] = "#!AMR\n"; | 18 static const char amr_file_hdr[] = "#!AMR\n"; |
19 | 19 |
20 main(argc, argv) | 20 main(argc, argv) |
21 char **argv; | 21 char **argv; |
22 { | 22 { |
23 char *infname, *outfname; | |
23 FILE *inf, *outf; | 24 FILE *inf, *outf; |
25 int wrong_flag; | |
24 uint8_t frm_in[BINFILE_MAX_FRAME], frm_out[32]; | 26 uint8_t frm_in[BINFILE_MAX_FRAME], frm_out[32]; |
25 unsigned bit_a, bit_n, outlen; | 27 unsigned bit_a, bit_n, outlen; |
26 int rc, bfi; | 28 int rc, bfi; |
27 | 29 |
28 if (argc != 3) { | 30 if (argc == 3 && argv[1][0] != '-') { |
29 fprintf(stderr, "usage: %s input.gsmx output.amr\n", argv[0]); | 31 wrong_flag = 0; |
32 infname = argv[1]; | |
33 outfname = argv[2]; | |
34 } else if (argc == 4 && !strcmp(argv[1], "-w")) { | |
35 wrong_flag = 1; | |
36 infname = argv[2]; | |
37 outfname = argv[3]; | |
38 } else { | |
39 fprintf(stderr, "usage: %s [-w] input.gsmx output.amr\n", | |
40 argv[0]); | |
30 exit(1); | 41 exit(1); |
31 } | 42 } |
32 inf = fopen(argv[1], "r"); | 43 inf = fopen(infname, "r"); |
33 if (!inf) { | 44 if (!inf) { |
34 perror(argv[1]); | 45 perror(infname); |
35 exit(1); | 46 exit(1); |
36 } | 47 } |
37 outf = fopen(argv[2], "w"); | 48 outf = fopen(outfname, "w"); |
38 if (!outf) { | 49 if (!outf) { |
39 perror(argv[2]); | 50 perror(outfname); |
40 exit(1); | 51 exit(1); |
41 } | 52 } |
42 fwrite(amr_file_hdr, 1, 6, outf); | 53 fwrite(amr_file_hdr, 1, 6, outf); |
43 for (;;) { | 54 for (;;) { |
44 rc = binfile_read_frame(inf, frm_in); | 55 rc = binfile_read_frame(inf, frm_in); |
45 if (rc < 0) { | 56 if (rc < 0) { |
46 fprintf(stderr, "error: garbage in %s\n", argv[1]); | 57 fprintf(stderr, "error: garbage in %s\n", infname); |
47 exit(1); | 58 exit(1); |
48 } | 59 } |
49 if (!rc) | 60 if (!rc) |
50 break; | 61 break; |
51 if (frm_in[0] == 0xBF) | 62 if (frm_in[0] == 0xBF) |
53 else if ((frm_in[0] & 0xF0) == 0xC0) | 64 else if ((frm_in[0] & 0xF0) == 0xC0) |
54 bfi = 0; | 65 bfi = 0; |
55 else { | 66 else { |
56 fprintf(stderr, | 67 fprintf(stderr, |
57 "error: %s is not in EFR codec format\n", | 68 "error: %s is not in EFR codec format\n", |
58 argv[1]); | 69 infname); |
59 exit(1); | 70 exit(1); |
60 } | 71 } |
61 if (bfi) { | 72 if (bfi) { |
62 frm_out[0] = 0x78; | 73 frm_out[0] = 0x78; |
63 outlen = 1; | 74 outlen = 1; |
64 } else { | 75 } else { |
65 frm_out[0] = 0x3C; | 76 frm_out[0] = 0x3C; |
66 bzero(frm_out + 1, 31); | 77 bzero(frm_out + 1, 31); |
67 for (bit_a = 0; bit_a < 244; bit_a++) { | 78 for (bit_a = 0; bit_a < 244; bit_a++) { |
68 bit_n = amr_122_bit_order[bit_a]; | 79 if (wrong_flag) |
80 bit_n = bit_a; | |
81 else | |
82 bit_n = amr_122_bit_order[bit_a]; | |
69 msb_set_bit(frm_out + 1, bit_a, | 83 msb_set_bit(frm_out + 1, bit_a, |
70 msb_get_bit(frm_in, 4 + bit_n)); | 84 msb_get_bit(frm_in, 4 + bit_n)); |
71 } | 85 } |
72 outlen = 32; | 86 outlen = 32; |
73 } | 87 } |