FreeCalypso > hg > gsm-codec-lib
view amrefr/tseq-enc.c @ 467:ad032051166a
doc: AMR-EFR-hybrid-emu new article
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 12 May 2024 23:54:43 +0000 |
parents | 026bdc1f0dda |
children |
line wrap: on
line source
/* * amrefr-tseq-enc is a test program for our libtwamr-based "alternative EFR" * encoder: it functions just like gsmefr-etsi-enc, but uses libtwamr as * the encoder engine instead of libgsmefr. Libgsmefr functions are still * used for frame packing, but not for actual encoding. Note that there is * no -d option in this version, and no DTX encoding support: a DTX-capable * AMR-EFR hybrid is a beast that is currently outside our capabilities. * * The byte order is LE by default or BE with -b option. Practical testing * will always require some manual byte-swap conversion: t??_efr.cod files * in amr122_efr.zip are shipped in BE, but the corresponding t??.inp files * in the 06.74 package are LE. */ #include <stdio.h> #include <stdint.h> #include <stdlib.h> #include <string.h> #include <strings.h> #include <unistd.h> #include "../libgsmefr/gsm_efr.h" #include "../libtwamr/tw_amr.h" main(argc, argv) char **argv; { char *infname, *outfname; FILE *inf, *outf; struct amr_encoder_state *state; int16_t pcm[160]; struct amr_param_frame amr_frame; uint8_t efr_frame[EFR_RTP_FRAME_LEN], bits[250]; int opt, rc, big_endian = 0; extern int optind; while ((opt = getopt(argc, argv, "b")) != EOF) { switch (opt) { case 'b': big_endian = 1; continue; default: usage: fprintf(stderr, "usage: %s [-b] input.inp output.cod\n", argv[0]); exit(1); } } if (argc != optind + 2) goto usage; infname = argv[optind]; outfname = argv[optind+1]; inf = fopen(infname, "r"); if (!inf) { perror(infname); exit(1); } outf = fopen(outfname, "w"); if (!outf) { perror(outfname); exit(1); } state = amr_encoder_create(0, 0); if (!state) { perror("amr_encoder_create()"); exit(1); } for (;;) { rc = read_input(inf, pcm, infname, big_endian); if (!rc) break; amr_encode_frame(state, MR122, pcm, &amr_frame); amr_dhf_subst_efr2(&amr_frame, pcm); EFR_params2frame(amr_frame.param, efr_frame); frame2bits(efr_frame, bits); bits[248] = 1; bits[249] = 1; emit_output(outf, bits + 4, 246, big_endian); } fclose(outf); exit(0); }