FreeCalypso > hg > gsm-codec-lib
view amrefr/decode-r.c @ 514:67b13a6a63c9
libgsmhr1: implement validation for *.dec frames
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 25 Aug 2024 19:14:40 +0000 |
parents | 65d20172e92a |
children |
line wrap: on
line source
/* * 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 <stdio.h> #include <stdint.h> #include <stdlib.h> #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); }