int main(int argc, char *argv[]) { FILE* in; char header[6]; int n; void *wav, *amr; if (argc < 3) { fprintf(stderr, "%s in.amr out.wav\n", argv[0]); return 1; } in = fopen(argv[1], "rb"); if (!in) { perror(argv[1]); return 1; } n = fread(header, 1, 6, in); if (n != 6 || memcmp(header, "#!AMR\n", 6)) { fprintf(stderr, "Bad header\n"); return 1; } wav = wav_write_open(argv[2], 8000, 16, 1); if (!wav) { fprintf(stderr, "Unable to open %s\n", argv[2]); return 1; } amr = Decoder_Interface_init(); while (1) { uint8_t buffer[500], littleendian[320], *ptr; int size, i; int16_t outbuffer[160]; /* Read the mode byte */ n = fread(buffer, 1, 1, in); if (n <= 0) break; /* Find the packet size */ size = sizes[(buffer[0] >> 3) & 0x0f]; n = fread(buffer + 1, 1, size, in); if (n != size) break; /* Decode the packet */ Decoder_Interface_Decode(amr, buffer, outbuffer, 0); /* Convert to little endian and write to wav */ ptr = littleendian; for (i = 0; i < 160; i++) { *ptr++ = (outbuffer[i] >> 0) & 0xff; *ptr++ = (outbuffer[i] >> 8) & 0xff; } wav_write_data(wav, littleendian, 320); } fclose(in); Decoder_Interface_exit(amr); wav_write_close(wav); return 0; }
static switch_status_t switch_amr_destroy(switch_codec_t *codec) { #ifndef AMR_PASSTHROUGH struct amr_context *context = codec->private_info; if (context->encoder_state) { Encoder_Interface_exit(context->encoder_state); } if (context->decoder_state) { Decoder_Interface_exit(context->decoder_state); } codec->private_info = NULL; #endif return SWITCH_STATUS_SUCCESS; }
int decode_amr(const char* infile, const char* outfile) { FILE* in = fopen(infile, "rb"); if (!in) { return 1; } char header[6]; ssize_t n = fread(header, 1, 6, in); if (n != 6 || memcmp(header, "#!AMR\n", 6)) { fprintf(stderr, "Bad header\n"); return 1; } void* wav = wav_write_open(outfile, 8000, 16, 1); void* amr = Decoder_Interface_init(); while (1) { uint8_t buffer[500]; /* Read the mode byte */ n = fread(buffer, 1, 1, in); if (n <= 0) break; /* Find the packet size */ int size = sizes[(buffer[0] >> 3) & 0x0f]; if (size <= 0) continue; n = fread(buffer + 1, 1, size, in); if (n != size) break; /* Decode the packet */ int16_t outbuffer[160]; Decoder_Interface_Decode(amr, buffer, outbuffer, 0); /* Convert to little endian and write to wav */ uint8_t littleendian[320]; uint8_t* ptr = littleendian; for (int i = 0; i < 160; i++) { *ptr++ = (outbuffer[i] >> 0) & 0xff; *ptr++ = (outbuffer[i] >> 8) & 0xff; } wav_write_data(wav, littleendian, 320); } fclose(in); Decoder_Interface_exit(amr); wav_write_close(wav); return 0; }
static void decode_destructor(void *arg) { struct audec_state *st = arg; switch (st->ac->srate) { #ifdef AMR_NB case 8000: Decoder_Interface_exit(st->dec); break; #endif #ifdef AMR_WB case 16000: D_IF_exit(st->dec); break; #endif } }
/* * Close codec. */ static pj_status_t amr_codec_close( pjmedia_codec *codec ) { struct amr_data *amr_data; PJ_ASSERT_RETURN(codec, PJ_EINVAL); amr_data = (struct amr_data*) codec->codec_data; PJ_ASSERT_RETURN(amr_data != NULL, PJ_EINVALIDOP); if (amr_data->encoder) { Encoder_Interface_exit(amr_data, amr_data->encoder); amr_data->encoder = NULL; } if (amr_data->decoder) { Decoder_Interface_exit(amr_data, amr_data->decoder); amr_data->decoder = NULL; } TRACE_((THIS_FILE, "AMR-NB codec closed")); return PJ_SUCCESS; }
/* * Close codec. */ static pj_status_t amr_codec_close( pjmedia_codec *codec ) { struct amr_data *amr_data; PJ_ASSERT_RETURN(codec, PJ_EINVAL); amr_data = (struct amr_data*) codec->codec_data; PJ_ASSERT_RETURN(amr_data != NULL, PJ_EINVALIDOP); if (amr_data->encoder) { if (amr_data->enc_setting.amr_nb) { #ifdef USE_AMRNB Encoder_Interface_exit(amr_data->encoder); #endif } else { #ifdef USE_AMRWB E_IF_exit(amr_data->encoder); #endif } amr_data->encoder = NULL; } if (amr_data->decoder) { if (amr_data->dec_setting.amr_nb) { #ifdef USE_AMRNB Decoder_Interface_exit(amr_data->decoder); #endif } else { #ifdef USE_AMRWB D_IF_exit(amr_data->decoder); #endif } amr_data->decoder = NULL; } TRACE_((THIS_FILE, "AMR codec closed")); return PJ_SUCCESS; }
static void dec_uninit(MSFilter *f) { Decoder_Interface_exit(f->data); }
static void amr_destroy_decoder(const struct PluginCodec_Definition * codec, void * context) { Decoder_Interface_exit(context); }
JNIEXPORT void JNICALL Java_ac_robinson_mov_AMRtoPCMConverter_AmrDecoderExit(JNIEnv* env, jobject obj, jint* nativePointer) { Decoder_Interface_exit(nativePointer); }
AMRDecoder::~AMRDecoder() { if (codecState != NULL) Decoder_Interface_exit(codecState); }