Skip to content

Commit

Permalink
Add support for g722
Browse files Browse the repository at this point in the history
  • Loading branch information
N4IRS committed Feb 15, 2018
1 parent a22990d commit 8c198b4
Show file tree
Hide file tree
Showing 10 changed files with 1,251 additions and 1 deletion.
8 changes: 8 additions & 0 deletions asterisk/codecs/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ endif

LIBILBC:=ilbc/libilbc.a
LIBLPC10:=lpc10/liblpc10.a
LIBG722:=g722/libg722.a

all: _all

Expand All @@ -45,6 +46,7 @@ clean::
$(MAKE) -C gsm clean
$(MAKE) -C lpc10 clean
$(MAKE) -C ilbc clean
$(MAKE) -C g722 clean

gsm/lib/libgsm.a:
@mkdir -p gsm/lib
Expand All @@ -59,3 +61,9 @@ $(LIBILBC):
@$(MAKE) -C ilbc all ASTCFLAGS="$(filter-out -Wmissing-prototypes -Wmissing-declarations,$(ASTCFLAGS)) $(AST_NO_STRICT_OVERFLOW)"

$(if $(filter codec_ilbc,$(EMBEDDED_MODS)),modules.link,codec_ilbc.so): $(LIBILBC)

$(LIBG722):
@$(MAKE) -C g722 all

$(if $(filter codec_g722,$(EMBEDDED_MODS)),modules.link,codec_g722.so): $(LIBG722)

227 changes: 227 additions & 0 deletions asterisk/codecs/codec_g722.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,227 @@
/*
* Asterisk -- An open source telephony toolkit.
*
* Copyright (C) 1999 - 2008, Digium, Inc.
*
* Matthew Fredrickson <[email protected]>
* Russell Bryant <[email protected]>
*
* Special thanks to Steve Underwood for the implementation
* and for doing the 8khz<->g.722 direct translation code.
*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
*
* This program is free software, distributed under the terms of
* the GNU General Public License Version 2. See the LICENSE file
* at the top of the source tree.
*/

/*! \file
*
* \brief codec_g722.c - translate between signed linear and ITU G.722-64kbps
*
* \author Matthew Fredrickson <[email protected]>
* \author Russell Bryant <[email protected]>
*
* \arg http://soft-switch.org/downloads/non-gpl-bits.tgz
* \arg http://lists.digium.com/pipermail/asterisk-dev/2006-September/022866.html
*
* \ingroup codecs
*/

#include "asterisk.h"

ASTERISK_FILE_VERSION(__FILE__, "$Revision: 130129 $")

#include "asterisk/linkedlists.h"
#include "asterisk/module.h"
#include "asterisk/config.h"
#include "asterisk/options.h"
#include "asterisk/translate.h"
#include "asterisk/utils.h"

#define BUFFER_SAMPLES 8096 /* size for the translation buffers */
#define BUF_SHIFT 5

/* Sample frame data */

#include "g722/g722.h"
#include "slin_g722_ex.h"
#include "g722_slin_ex.h"

struct g722_encoder_pvt {
g722_encode_state_t g722;
};

struct g722_decoder_pvt {
g722_decode_state_t g722;
};

/*! \brief init a new instance of g722_encoder_pvt. */
static int lintog722_new(struct ast_trans_pvt *pvt)
{
struct g722_encoder_pvt *tmp = pvt->pvt;

g722_encode_init(&tmp->g722, 64000, G722_SAMPLE_RATE_8000);

return 0;
}

/*! \brief init a new instance of g722_encoder_pvt. */
static int g722tolin_new(struct ast_trans_pvt *pvt)
{
struct g722_decoder_pvt *tmp = pvt->pvt;

g722_decode_init(&tmp->g722, 64000, G722_SAMPLE_RATE_8000);

return 0;
}

static int g722tolin_framein(struct ast_trans_pvt *pvt, struct ast_frame *f)
{
struct g722_decoder_pvt *tmp = pvt->pvt;
int out_samples;
int in_samples;

/* g722_decode expects the samples to be in the invalid samples / 2 format */
in_samples = f->samples / 2;

out_samples = g722_decode(&tmp->g722, (int16_t *) &pvt->outbuf[pvt->samples * sizeof(int16_t)], (uint8_t *) f->data, in_samples);

pvt->samples += out_samples;

pvt->datalen += (out_samples * sizeof(int16_t));

return 0;
}

static int lintog722_framein(struct ast_trans_pvt *pvt, struct ast_frame *f)
{
struct g722_encoder_pvt *tmp = pvt->pvt;
int outlen;

outlen = g722_encode(&tmp->g722, (uint8_t *) (&pvt->outbuf[pvt->datalen]), (int16_t *) f->data, f->samples);


pvt->samples += outlen * 2;

pvt->datalen += outlen;

return 0;
}

static struct ast_frame *g722tolin_sample(void)
{
static struct ast_frame f = {
.frametype = AST_FRAME_VOICE,
.subclass = AST_FORMAT_G722,
.datalen = sizeof(g722_slin_ex),
.samples = sizeof(g722_slin_ex) * 2,
.src = __PRETTY_FUNCTION__,
.data = g722_slin_ex,
};

return &f;
}

static struct ast_frame *lintog722_sample (void)
{
static struct ast_frame f = {
.frametype = AST_FRAME_VOICE,
.subclass = AST_FORMAT_SLINEAR,
.datalen = sizeof(slin_g722_ex),
.samples = ARRAY_LEN(slin_g722_ex),
.src = __PRETTY_FUNCTION__,
.data = slin_g722_ex,
};

return &f;
}

static struct ast_translator g722tolin = {
.name = "g722tolin",
.srcfmt = AST_FORMAT_G722,
.dstfmt = AST_FORMAT_SLINEAR,
.newpvt = g722tolin_new, /* same for both directions */
.framein = g722tolin_framein,
.sample = g722tolin_sample,
.desc_size = sizeof(struct g722_decoder_pvt),
.buffer_samples = BUFFER_SAMPLES / sizeof(int16_t),
.buf_size = BUFFER_SAMPLES,
.plc_samples = 160,
};

static struct ast_translator lintog722 = {
.name = "lintog722",
.srcfmt = AST_FORMAT_SLINEAR,
.dstfmt = AST_FORMAT_G722,
.newpvt = lintog722_new, /* same for both directions */
.framein = lintog722_framein,
.sample = lintog722_sample,
.desc_size = sizeof(struct g722_encoder_pvt),
.buffer_samples = BUFFER_SAMPLES * 2,
.buf_size = BUFFER_SAMPLES,
};

static int parse_config(int reload)
{
struct ast_variable *var;
struct ast_config *cfg = ast_config_load("codecs.conf");

if (!cfg)
return 0;
for (var = ast_variable_browse(cfg, "plc"); var; var = var->next) {
if (!strcasecmp(var->name, "genericplc")) {
g722tolin.useplc = ast_true(var->value) ? 1 : 0;
if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "codec_g722: %susing generic PLC\n", g722tolin.useplc ? "" : "not ");
}
}
ast_config_destroy(cfg);
return 0;
}

static int reload(void)
{
if (parse_config(1))
return AST_MODULE_LOAD_DECLINE;
return AST_MODULE_LOAD_SUCCESS;
}

static int unload_module(void)
{
int res = 0;

res |= ast_unregister_translator(&g722tolin);
res |= ast_unregister_translator(&lintog722);

return res;
}

static int load_module(void)
{
int res = 0;

if (parse_config(0))
return AST_MODULE_LOAD_DECLINE;

res |= ast_register_translator(&g722tolin);
res |= ast_register_translator(&lintog722);

if (res) {
unload_module();
return AST_MODULE_LOAD_FAILURE;
}

return AST_MODULE_LOAD_SUCCESS;
}

AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "ITU G.722-64kbps G722 Transcoder",
.load = load_module,
.unload = unload_module,
.reload = reload,
);
18 changes: 18 additions & 0 deletions asterisk/codecs/g722/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
LIB=libg722.a
CFLAGS+=-fPIC

include $(ASTTOPDIR)/Makefile.rules

OBJS=g722_encode.o g722_decode.o

all: $(LIB)

$(LIB): $(OBJS)
$(ECHO_PREFIX) echo " [AR] $^ -> $@"
$(CMD_PREFIX) $(AR) cr $@ $^
$(CMD_PREFIX) $(RANLIB) $@

clean:
rm -f $(LIB) *.o
rm -f .*.o.d
rm -f *.s *.i
Loading

0 comments on commit 8c198b4

Please sign in to comment.