comparison efrtest/etsi-enc.c @ 151:a13b1605142b

gsmefr-etsi-enc: add BE support
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 14 Dec 2022 22:25:31 +0000
parents ff0372186b59
children d4f47d0962e7
comparison
equal deleted inserted replaced
150:da17c7f02c6c 151:a13b1605142b
11 #include <stdio.h> 11 #include <stdio.h>
12 #include <stdint.h> 12 #include <stdint.h>
13 #include <stdlib.h> 13 #include <stdlib.h>
14 #include <string.h> 14 #include <string.h>
15 #include <strings.h> 15 #include <strings.h>
16 #include <unistd.h>
16 #include "../libgsmefr/gsm_efr.h" 17 #include "../libgsmefr/gsm_efr.h"
17 18
18 static int 19 static int
19 read_input(inf, pcm, filename_for_errs) 20 read_input(inf, pcm, filename_for_errs, big_endian)
20 FILE *inf; 21 FILE *inf;
21 int16_t *pcm; 22 int16_t *pcm;
22 char *filename_for_errs; 23 char *filename_for_errs;
23 { 24 {
24 uint8_t file_bytes[320], *sp; 25 uint8_t file_bytes[320], *sp;
33 filename_for_errs); 34 filename_for_errs);
34 exit(1); 35 exit(1);
35 } 36 }
36 sp = file_bytes; 37 sp = file_bytes;
37 for (n = 0; n < 160; n++) { 38 for (n = 0; n < 160; n++) {
38 pcm[n] = sp[0] | (sp[1] << 8); 39 if (big_endian)
40 pcm[n] = (sp[0] << 8) | sp[1];
41 else
42 pcm[n] = sp[0] | (sp[1] << 8);
39 sp += 2; 43 sp += 2;
40 } 44 }
41 return 1; 45 return 1;
42 } 46 }
43 47
58 } 62 }
59 } 63 }
60 } 64 }
61 65
62 static void 66 static void
63 emit_output(outf, bits, nbits) 67 emit_output(outf, bits, nbits, big_endian)
64 FILE *outf; 68 FILE *outf;
65 uint8_t *bits; 69 uint8_t *bits;
66 unsigned nbits; 70 unsigned nbits;
67 { 71 {
68 unsigned n; 72 unsigned n;
69 73
70 for (n = 0; n < nbits; n++) { 74 for (n = 0; n < nbits; n++) {
71 putc(bits[n], outf); 75 if (big_endian) {
72 putc(0, outf); 76 putc(0, outf);
77 putc(bits[n], outf);
78 } else {
79 putc(bits[n], outf);
80 putc(0, outf);
81 }
73 } 82 }
74 } 83 }
75 84
76 main(argc, argv) 85 main(argc, argv)
77 char **argv; 86 char **argv;
79 char *infname, *outfname; 88 char *infname, *outfname;
80 FILE *inf, *outf; 89 FILE *inf, *outf;
81 struct EFR_encoder_state *state; 90 struct EFR_encoder_state *state;
82 int16_t pcm[160]; 91 int16_t pcm[160];
83 uint8_t frame[EFR_RTP_FRAME_LEN], bits[250]; 92 uint8_t frame[EFR_RTP_FRAME_LEN], bits[250];
84 int dtx, rc, sp, vad; 93 int opt, dtx = 0, rc, sp, vad, big_endian = 0;
94 extern int optind;
85 95
86 if (argc == 3 && argv[1][0] != '-') { 96 while ((opt = getopt(argc, argv, "bd")) != EOF) {
87 dtx = 0; 97 switch (opt) {
88 infname = argv[1]; 98 case 'b':
89 outfname = argv[2]; 99 big_endian = 1;
90 } else if (argc == 4 && !strcmp(argv[1], "-d")) { 100 continue;
91 dtx = 1; 101 case 'd':
92 infname = argv[2]; 102 dtx = 1;
93 outfname = argv[3]; 103 continue;
94 } else { 104 default:
95 fprintf(stderr, "usage: %s [-d] input.inp output.cod\n", 105 usage:
96 argv[0]); 106 fprintf(stderr,
97 exit(1); 107 "usage: %s [-b] [-d] input.inp output.cod\n",
108 argv[0]);
109 exit(1);
110 }
98 } 111 }
112 if (argc != optind + 2)
113 goto usage;
114 infname = argv[optind];
115 outfname = argv[optind+1];
116
99 inf = fopen(infname, "r"); 117 inf = fopen(infname, "r");
100 if (!inf) { 118 if (!inf) {
101 perror(infname); 119 perror(infname);
102 exit(1); 120 exit(1);
103 } 121 }
110 if (!state) { 128 if (!state) {
111 perror("EFR_encoder_create()"); 129 perror("EFR_encoder_create()");
112 exit(1); 130 exit(1);
113 } 131 }
114 for (;;) { 132 for (;;) {
115 rc = read_input(inf, pcm, argv[1]); 133 rc = read_input(inf, pcm, infname, big_endian);
116 if (!rc) 134 if (!rc)
117 break; 135 break;
118 EFR_encode_frame(state, pcm, frame, &sp, &vad); 136 EFR_encode_frame(state, pcm, frame, &sp, &vad);
119 frame2bits(frame, bits); 137 frame2bits(frame, bits);
120 bits[248] = vad; 138 bits[248] = vad;
121 bits[249] = sp; 139 bits[249] = sp;
122 emit_output(outf, bits + 4, 246); 140 emit_output(outf, bits + 4, 246, big_endian);
123 } 141 }
124 fclose(outf); 142 fclose(outf);
125 exit(0); 143 exit(0);
126 } 144 }