osmo-cc-router/src/router/gsm_codec.c

82 lines
1.8 KiB
C

#include <errno.h>
#include <stdint.h>
#include <stdlib.h>
#include <gsm.h>
#include "call.h"
#include "gsm_codec.h"
#include "../libdebug/debug.h"
/* create gsm instance */
int gsm_fr_create(call_relation_t *relation)
{
int value = 1;
gsm encoder, decoder;
encoder = gsm_create();
if (!encoder) {
fprintf(stderr, "gsm codec failed to intialize.\n");
abort();
}
gsm_option(encoder, 0/*GSM_OPT_WAV49*/, &value);
decoder = gsm_create();
if (!decoder) {
fprintf(stderr, "gsm codec failed to intialize.\n");
abort();
}
gsm_option(decoder, 0/*GSM_OPT_WAV49*/, &value);
relation->gsm_fr_encoder = encoder;
relation->gsm_fr_decoder = decoder;
return -ENOMEM;
}
/* free gsm instance */
void gsm_fr_destroy(call_relation_t *relation)
{
gsm_destroy((gsm)relation->gsm_fr_encoder);
gsm_destroy((gsm)relation->gsm_fr_decoder);
}
/* encode samples into frame */
void gsm_fr_encode(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv)
{
call_relation_t *relation = (call_relation_t *)priv;
gsm_signal *src = (gsm_signal *)src_data;
gsm_byte *dst;
dst = malloc(33);
if (!dst)
return;
if (src_len / 2 != 160)
fprintf(stderr, "GSM encoder requires 160 samples per chunk! Please fix!\n");
else
gsm_encode((gsm)relation->gsm_fr_encoder, src, dst);
*dst_data = (uint8_t *)dst;
*dst_len = 33;
}
/* decode frame into samples */
void gsm_fr_decode(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv)
{
call_relation_t *relation = (call_relation_t *)priv;
gsm_byte *src = (gsm_byte *)src_data;
gsm_signal *dst;
dst = malloc(160 * 2);
if (!dst)
return;
if (src_len != 33)
fprintf(stderr, "GSM decoder requires 33 bytes per chunk! Please fix!\n");
else
gsm_decode((gsm)relation->gsm_fr_decoder, src, dst);
*dst_data = (uint8_t *)dst;
*dst_len = 160 * 2;
}