示例#1
0
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;
}
示例#2
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;
}
示例#3
0
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;
}
示例#4
0
文件: amr.c 项目: GGGO/baresip
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;
}
示例#6
0
/*
 * 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;
}
示例#7
0
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);
}
示例#10
0
AMRDecoder::~AMRDecoder()
{
	if (codecState != NULL)
		Decoder_Interface_exit(codecState);
}