FreeCalypso > hg > gsm-codec-lib
comparison efrtest/etsi-enc.c @ 114:ff0372186b59
gsmefr-etsi-enc test program written
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Tue, 29 Nov 2022 20:31:11 +0000 |
| parents | |
| children | a13b1605142b |
comparison
equal
deleted
inserted
replaced
| 113:269d341db403 | 114:ff0372186b59 |
|---|---|
| 1 /* | |
| 2 * gsmefr-etsi-enc is a test program for our EFR encoder: it reads raw | |
| 3 * 16-bit PCM (matching ETSI's *.inp) as input and writes ETSI's *.cod | |
| 4 * format as output, allowing our decoder to be tested with ETSI's | |
| 5 * official test sequences. | |
| 6 * | |
| 7 * ETSI input and output files are read and written in LE byte order, | |
| 8 * matching the official test sequences in ts_100725v050200p0.zip. | |
| 9 */ | |
| 10 | |
| 11 #include <stdio.h> | |
| 12 #include <stdint.h> | |
| 13 #include <stdlib.h> | |
| 14 #include <string.h> | |
| 15 #include <strings.h> | |
| 16 #include "../libgsmefr/gsm_efr.h" | |
| 17 | |
| 18 static int | |
| 19 read_input(inf, pcm, filename_for_errs) | |
| 20 FILE *inf; | |
| 21 int16_t *pcm; | |
| 22 char *filename_for_errs; | |
| 23 { | |
| 24 uint8_t file_bytes[320], *sp; | |
| 25 int cc; | |
| 26 unsigned n; | |
| 27 | |
| 28 cc = fread(file_bytes, 2, 160, inf); | |
| 29 if (cc == 0) | |
| 30 return 0; | |
| 31 if (cc != 160) { | |
| 32 fprintf(stderr, "error: short read from %s\n", | |
| 33 filename_for_errs); | |
| 34 exit(1); | |
| 35 } | |
| 36 sp = file_bytes; | |
| 37 for (n = 0; n < 160; n++) { | |
| 38 pcm[n] = sp[0] | (sp[1] << 8); | |
| 39 sp += 2; | |
| 40 } | |
| 41 return 1; | |
| 42 } | |
| 43 | |
| 44 static void | |
| 45 frame2bits(frame, bits) | |
| 46 uint8_t *frame, *bits; | |
| 47 { | |
| 48 unsigned nb, byte, mask, bit; | |
| 49 | |
| 50 for (nb = 0; nb < EFR_RTP_FRAME_LEN; nb++) { | |
| 51 byte = *frame++; | |
| 52 for (mask = 0x80; mask; mask >>= 1) { | |
| 53 if (byte & mask) | |
| 54 bit = 1; | |
| 55 else | |
| 56 bit = 0; | |
| 57 *bits++ = bit; | |
| 58 } | |
| 59 } | |
| 60 } | |
| 61 | |
| 62 static void | |
| 63 emit_output(outf, bits, nbits) | |
| 64 FILE *outf; | |
| 65 uint8_t *bits; | |
| 66 unsigned nbits; | |
| 67 { | |
| 68 unsigned n; | |
| 69 | |
| 70 for (n = 0; n < nbits; n++) { | |
| 71 putc(bits[n], outf); | |
| 72 putc(0, outf); | |
| 73 } | |
| 74 } | |
| 75 | |
| 76 main(argc, argv) | |
| 77 char **argv; | |
| 78 { | |
| 79 char *infname, *outfname; | |
| 80 FILE *inf, *outf; | |
| 81 struct EFR_encoder_state *state; | |
| 82 int16_t pcm[160]; | |
| 83 uint8_t frame[EFR_RTP_FRAME_LEN], bits[250]; | |
| 84 int dtx, rc, sp, vad; | |
| 85 | |
| 86 if (argc == 3 && argv[1][0] != '-') { | |
| 87 dtx = 0; | |
| 88 infname = argv[1]; | |
| 89 outfname = argv[2]; | |
| 90 } else if (argc == 4 && !strcmp(argv[1], "-d")) { | |
| 91 dtx = 1; | |
| 92 infname = argv[2]; | |
| 93 outfname = argv[3]; | |
| 94 } else { | |
| 95 fprintf(stderr, "usage: %s [-d] input.inp output.cod\n", | |
| 96 argv[0]); | |
| 97 exit(1); | |
| 98 } | |
| 99 inf = fopen(infname, "r"); | |
| 100 if (!inf) { | |
| 101 perror(infname); | |
| 102 exit(1); | |
| 103 } | |
| 104 outf = fopen(outfname, "w"); | |
| 105 if (!outf) { | |
| 106 perror(outfname); | |
| 107 exit(1); | |
| 108 } | |
| 109 state = EFR_encoder_create(dtx); | |
| 110 if (!state) { | |
| 111 perror("EFR_encoder_create()"); | |
| 112 exit(1); | |
| 113 } | |
| 114 for (;;) { | |
| 115 rc = read_input(inf, pcm, argv[1]); | |
| 116 if (!rc) | |
| 117 break; | |
| 118 EFR_encode_frame(state, pcm, frame, &sp, &vad); | |
| 119 frame2bits(frame, bits); | |
| 120 bits[248] = vad; | |
| 121 bits[249] = sp; | |
| 122 emit_output(outf, bits + 4, 246); | |
| 123 } | |
| 124 fclose(outf); | |
| 125 exit(0); | |
| 126 } |
