comparison miscutil/amr2efr.c @ 105:ecfbced76fea

gsm-amr2efr: add -w option to simulate common wrong implementation
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 27 Nov 2022 05:59:10 +0000
parents dd88f9312170
children 41f1ae68d253
comparison
equal deleted inserted replaced
104:7f43089e9a7a 105:ecfbced76fea
16 static const char amr_file_hdr[] = "#!AMR\n"; 16 static const char amr_file_hdr[] = "#!AMR\n";
17 17
18 main(argc, argv) 18 main(argc, argv)
19 char **argv; 19 char **argv;
20 { 20 {
21 char *infname, *outfname;
21 FILE *inf, *outf; 22 FILE *inf, *outf;
22 int hdrb; 23 int wrong_flag, hdrb;
23 uint8_t frm_in[31], frm_out[31]; 24 uint8_t frm_in[31], frm_out[31];
24 unsigned bit_a, bit_n; 25 unsigned bit_a, bit_n;
25 26
26 if (argc != 3) { 27 if (argc == 3 && argv[1][0] != '-') {
27 fprintf(stderr, "usage: %s input.amr output.gsmx\n", argv[0]); 28 wrong_flag = 0;
29 infname = argv[1];
30 outfname = argv[2];
31 } else if (argc == 4 && !strcmp(argv[1], "-w")) {
32 wrong_flag = 1;
33 infname = argv[2];
34 outfname = argv[3];
35 } else {
36 fprintf(stderr, "usage: %s [-w] input.amr output.gsmx\n",
37 argv[0]);
28 exit(1); 38 exit(1);
29 } 39 }
30 inf = fopen(argv[1], "r"); 40 inf = fopen(infname, "r");
31 if (!inf) { 41 if (!inf) {
32 perror(argv[1]); 42 perror(infname);
33 exit(1); 43 exit(1);
34 } 44 }
35 if (fread(frm_in, 1, 6, inf) != 6 || bcmp(frm_in, amr_file_hdr, 6)) { 45 if (fread(frm_in, 1, 6, inf) != 6 || bcmp(frm_in, amr_file_hdr, 6)) {
36 fprintf(stderr, "error: %s is not in AMR format\n", argv[1]); 46 fprintf(stderr, "error: %s is not in AMR format\n", infname);
37 exit(1); 47 exit(1);
38 } 48 }
39 outf = fopen(argv[2], "w"); 49 outf = fopen(outfname, "w");
40 if (!outf) { 50 if (!outf) {
41 perror(argv[2]); 51 perror(outfname);
42 exit(1); 52 exit(1);
43 } 53 }
44 for (;;) { 54 for (;;) {
45 hdrb = getc(inf); 55 hdrb = getc(inf);
46 if (hdrb < 0) 56 if (hdrb < 0)
47 break; 57 break;
48 if ((hdrb & 0x78) != 0x38) { 58 if ((hdrb & 0x78) != 0x38) {
49 fprintf(stderr, "error: unexpected content in %s\n", 59 fprintf(stderr, "error: unexpected content in %s\n",
50 argv[1]); 60 infname);
51 exit(1); 61 exit(1);
52 } 62 }
53 if (fread(frm_in, 1, 31, inf) != 31) { 63 if (fread(frm_in, 1, 31, inf) != 31) {
54 fprintf(stderr, "error: short read from %s\n", argv[1]); 64 fprintf(stderr, "error: short read from %s\n", infname);
55 exit(1); 65 exit(1);
56 } 66 }
57 bzero(frm_out, 31); 67 bzero(frm_out, 31);
58 frm_out[0] = 0xC0; 68 frm_out[0] = 0xC0;
59 for (bit_a = 0; bit_a < 244; bit_a++) { 69 for (bit_a = 0; bit_a < 244; bit_a++) {
60 bit_n = amr_122_bit_order[bit_a]; 70 if (wrong_flag)
71 bit_n = bit_a;
72 else
73 bit_n = amr_122_bit_order[bit_a];
61 msb_set_bit(frm_out, 4 + bit_n, 74 msb_set_bit(frm_out, 4 + bit_n,
62 msb_get_bit(frm_in, bit_a)); 75 msb_get_bit(frm_in, bit_a));
63 } 76 }
64 fwrite(frm_out, 1, 31, outf); 77 fwrite(frm_out, 1, 31, outf);
65 } 78 }