# HG changeset patch # User Mychaela Falconia # Date 1715213553 0 # Node ID 65d20172e92afe48a3b6879754a7c4946c1b2fa6 # Parent 1bf1bbcef763f145b15a84d026cde886922c1e37 amrefr: implement amrefr-decode-r utility diff -r 1bf1bbcef763 -r 65d20172e92a amrefr/Makefile --- a/amrefr/Makefile Wed May 08 23:43:26 2024 +0000 +++ b/amrefr/Makefile Thu May 09 00:12:33 2024 +0000 @@ -1,6 +1,6 @@ CC= gcc CFLAGS= -O2 -PROGS= amrefr-encode-r amrefr-tseq-dec amrefr-tseq-enc +PROGS= amrefr-decode-r amrefr-encode-r amrefr-tseq-dec amrefr-tseq-enc LIBEFR= ../libgsmefr/libgsmefr.a LIBAMR= ../libtwamr/libtwamr.a LIBTEST=../libtest/libtest.a @@ -10,6 +10,9 @@ all: ${PROGS} +amrefr-decode-r: decode-r.o ${LIBST} + ${CC} ${CFLAGS} -o $@ $^ + amrefr-encode-r: encode-r.o ${LIBST} ${CC} ${CFLAGS} -o $@ $^ diff -r 1bf1bbcef763 -r 65d20172e92a amrefr/decode-r.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/amrefr/decode-r.c Thu May 09 00:12:33 2024 +0000 @@ -0,0 +1,75 @@ +/* + * amrefr-decode-r is a counterpart to gsmefr-decode-r, implementing + * "alternative EFR" by way of libtwamr. Unlike standard gsmefr-decode-r, + * this version cannot handle SID frames in input: they are not explicitly + * checked for, but an input containing SIDs will not be decoded correctly. + */ + +#include +#include +#include +#include "../libgsmefr/gsm_efr.h" +#include "../libtwamr/tw_amr.h" +#include "../libtest/binreader.h" +#include "../libtest/robewrite.h" + +main(argc, argv) + char **argv; +{ + FILE *binf, *outf; + struct amr_decoder_state *state; + uint8_t frame[BINFILE_MAX_FRAME]; + struct amr_param_frame amr_frame; + int16_t pcm[160]; + int rc, bfi; + + if (argc != 3) { + fprintf(stderr, "usage: %s input.gsmx output.robe\n", argv[0]); + exit(1); + } + binf = fopen(argv[1], "r"); + if (!binf) { + perror(argv[1]); + exit(1); + } + outf = fopen(argv[2], "w"); + if (!outf) { + perror(argv[2]); + exit(1); + } + state = amr_decoder_create(); + if (!state) { + perror("amr_decoder_create()"); + exit(1); + } + amr_frame.mode = 0x87; + for (;;) { + rc = binfile_read_frame(binf, frame); + if (rc < 0) { + fprintf(stderr, "error: garbage in %s\n", argv[1]); + exit(1); + } + if (!rc) + break; + if (frame[0] == 0xBF) + bfi = 1; + else if ((frame[0] & 0xF0) == 0xC0) + bfi = 0; + else { + fprintf(stderr, + "error: %s is not in EFR codec format\n", + argv[1]); + exit(1); + } + if (bfi) + amr_frame.type = RX_NO_DATA; + else { + amr_frame.type = RX_SPEECH_GOOD; + EFR_frame2params(frame, amr_frame.param); + } + amr_decode_frame(state, &amr_frame, pcm); + write_pcm_to_robe(outf, pcm); + } + fclose(outf); + exit(0); +}