FreeCalypso > hg > vband-misc
comparison amrdiff/amrdiff.c @ 0:a03c87a2abc6
amrdiff program written
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Wed, 03 Apr 2024 18:44:27 +0000 |
| parents | |
| children | b55451463161 |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:a03c87a2abc6 |
|---|---|
| 1 /* | |
| 2 * This program reads two ETSI/3GPP test sequence files, one from | |
| 3 * the AMR set of 3GPP TS 26.074 and the other from the "EFR2" set of | |
| 4 * amr122_efr.zip, and performs a diff between them. | |
| 5 */ | |
| 6 | |
| 7 #include <stdio.h> | |
| 8 #include <stdint.h> | |
| 9 #include <stdlib.h> | |
| 10 #include <string.h> | |
| 11 #include <strings.h> | |
| 12 #include "etsi.h" | |
| 13 #include "amr_defs.h" | |
| 14 | |
| 15 main(argc, argv) | |
| 16 char **argv; | |
| 17 { | |
| 18 char *amr_filename, *efr_filename; | |
| 19 int amr_be, efr_be; | |
| 20 FILE *inf_amr, *inf_efr; | |
| 21 unsigned frame_no; | |
| 22 uint8_t amr_bits[COD_FORMAT_NWORDS], efr_bits[ETSI_ENC_NWORDS]; | |
| 23 int rc_amr, rc_efr, amr_sp, efr_sp; | |
| 24 | |
| 25 if (argc != 5) { | |
| 26 usage: fprintf(stderr, | |
| 27 "usage: %s amr-cod-file be|le efr-cod-file be|le\n", | |
| 28 argv[0]); | |
| 29 exit(1); | |
| 30 } | |
| 31 amr_filename = argv[1]; | |
| 32 if (!strcmp(argv[2], "be")) | |
| 33 amr_be = 1; | |
| 34 else if (!strcmp(argv[2], "le")) | |
| 35 amr_be = 0; | |
| 36 else | |
| 37 goto usage; | |
| 38 efr_filename = argv[3]; | |
| 39 if (!strcmp(argv[4], "be")) | |
| 40 efr_be = 1; | |
| 41 else if (!strcmp(argv[4], "le")) | |
| 42 efr_be = 0; | |
| 43 else | |
| 44 goto usage; | |
| 45 inf_amr = fopen(amr_filename, "r"); | |
| 46 if (!inf_amr) { | |
| 47 perror(amr_filename); | |
| 48 exit(1); | |
| 49 } | |
| 50 inf_efr = fopen(efr_filename, "r"); | |
| 51 if (!inf_efr) { | |
| 52 perror(efr_filename); | |
| 53 exit(1); | |
| 54 } | |
| 55 for (frame_no = 0; ; frame_no++) { | |
| 56 rc_amr = read_etsi_bits(inf_amr, amr_be, amr_bits, | |
| 57 COD_FORMAT_NWORDS, amr_filename); | |
| 58 rc_efr = read_etsi_bits(inf_efr, efr_be, efr_bits, | |
| 59 ETSI_ENC_NWORDS, efr_filename); | |
| 60 if (!rc_amr && !rc_efr) | |
| 61 break; | |
| 62 if (!rc_amr) { | |
| 63 printf("EFR file %s is longer than AMR file %s\n", | |
| 64 efr_filename, amr_filename); | |
| 65 exit(0); | |
| 66 } | |
| 67 if (!rc_efr) { | |
| 68 printf("AMR file %s is longer than EFR file %s\n", | |
| 69 amr_filename, efr_filename); | |
| 70 exit(0); | |
| 71 } | |
| 72 /* grok AMR frame type */ | |
| 73 switch (amr_bits[0]) { | |
| 74 case TX_SPEECH_GOOD: | |
| 75 if (amr_bits[245] != MR122) { | |
| 76 fprintf(stderr, | |
| 77 "error: %s frame #%u is not MR122\n", | |
| 78 amr_filename, frame_no); | |
| 79 exit(1); | |
| 80 } | |
| 81 amr_sp = 1; | |
| 82 break; | |
| 83 case TX_SID_FIRST: | |
| 84 case TX_SID_UPDATE: | |
| 85 case TX_NO_DATA: | |
| 86 amr_sp = 0; | |
| 87 break; | |
| 88 default: | |
| 89 fprintf(stderr, | |
| 90 "error: %s frame #%u has unknown type %u\n", | |
| 91 amr_filename, frame_no, amr_bits[0]); | |
| 92 exit(1); | |
| 93 } | |
| 94 efr_sp = efr_bits[245]; | |
| 95 if (!amr_sp && !efr_sp) | |
| 96 continue; | |
| 97 if (!amr_sp || !efr_sp) { | |
| 98 printf("frame #%u: AMR SP %d != EFR SP %d\n", frame_no, | |
| 99 amr_sp, efr_sp); | |
| 100 continue; | |
| 101 } | |
| 102 if (bcmp(amr_bits+1, efr_bits, 244)) | |
| 103 printf("frame #%u: bits differ\n", frame_no); | |
| 104 } | |
| 105 exit(0); | |
| 106 } |
