diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..004af69
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,72 @@
+his source tree contains third party source code which is governed by third
+party licenses. Paths to the files and associated licenses are collected here.
+
+Files governed by third party licenses:
+src/g722_decode.c
+src/g722_encode.c
+include/g722_enc_dec.h
+include/g722_typedef.h
+
+Individual licenses for each file:
+-------------------------------------------------------------------------------
+
+Files:
+src/g722_decode.c
+src/g722_encode.c
+include/g722_enc_dec.h
+
+License:
+/*
+ * SpanDSP - a series of DSP components for telephony
+ *
+ * g722_decode.c - The ITU G.722 codec, decode part.
+ *
+ * Written by Steve Underwood <steveu@coppice.org>
+ *
+ * Copyright (C) 2005 Steve Underwood
+ *
+ *  Despite my general liking of the GPL, I place my own contributions
+ *  to this code in the public domain for the benefit of all mankind -
+ *  even the slimy ones who might try to proprietize my work and use it
+ *  to my detriment.
+ *
+ * Based in part on a single channel G.722 codec which is:
+ *
+ * Copyright (c) CMU 1993
+ * Computer Science, Speech Group
+ * Chengxiang Lu and Alex Hauptmann
+ */
+
+-------------------------------------------------------------------------------
+Files:
+include/g722_typedef.h
+
+Copyright (c) 2011, The WebRTC project authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+  * Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in
+    the documentation and/or other materials provided with the
+    distribution.
+
+  * Neither the name of Google nor the names of its contributors may
+    be used to endorse or promote products derived from this software
+    without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 0000000..4424dc5
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1 @@
+include include/*
\ No newline at end of file
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..b4f6853
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,41 @@
+#
+#    Copyright (c) 2012 Nest Labs, Inc.
+#    All rights reserved.
+#
+#    This document is the property of Nest Labs. It is considered
+#    confidential and proprietary information.
+#
+#    This document may not be reproduced or transmitted in any form,
+#    in whole or in part, without the express written permission of
+#    Nest Labs.
+#
+#    Description:
+#      This file is the make file for WebRTC G722 library
+#
+
+include pre.mak
+
+.DEFAULT_GOAL := all
+
+ARCHIVES = g722
+
+VPATH = src
+
+g722_SOURCES = g722_decode.c \
+	g722_encode.c
+
+g722_INCLUDES = include
+
+g722_LDLIBS = \
+
+g722_DEPLIBS = \
+
+# While the WebRTC G722 codec library uses the nlbuild build system, it is
+# still third-party software and we do not want to enforce style semantics
+# on it. Consequently, set PrettyPaths to empty.
+
+PrettyPaths := $(NULL)
+
+clean:
+
+include post.mak
diff --git a/README b/README
new file mode 100644
index 0000000..40aaacb
--- /dev/null
+++ b/README
@@ -0,0 +1,19 @@
+g722 code was branched from webrtc. See LICENSE file for
+details on the licenses governing files.
+
+Additional changes have been made and it is not known from what
+revision of webrtc we branched.
+
+Multiple uses
+------------
+
+The Makefile is used by platform project build systems.
+
+Python wrapper module can be built using setup.py
+Python releases are available internal to Nest via pip
+```pip install -i https://artifactory2.nestlabs.com/artifactory/api/pypi/pypi-local/simple g722```
+
+To directly install from git (developer versions)
+```pip install --no-index -e git+ssh://git@stash.nestlabs.com:7999/tps/g722.git@master#egg=g722```
+or from a branch
+```pip install --no-index -e git+ssh://git@stash.nestlabs.com:7999/tps/g722.git@feature/generating_packages#egg=g722```
\ No newline at end of file
diff --git a/include/g722_enc_dec.h b/include/g722_enc_dec.h
new file mode 100644
index 0000000..f06cd20
--- /dev/null
+++ b/include/g722_enc_dec.h
@@ -0,0 +1,148 @@
+/*
+ * SpanDSP - a series of DSP components for telephony
+ *
+ * g722.h - The ITU G.722 codec.
+ *
+ * Written by Steve Underwood <steveu@coppice.org>
+ *
+ * Copyright (C) 2005 Steve Underwood
+ *
+ *  Despite my general liking of the GPL, I place my own contributions 
+ *  to this code in the public domain for the benefit of all mankind -
+ *  even the slimy ones who might try to proprietize my work and use it
+ *  to my detriment.
+ *
+ * Based on a single channel G.722 codec which is:
+ *
+ *****    Copyright (c) CMU    1993      *****
+ * Computer Science, Speech Group
+ * Chengxiang Lu and Alex Hauptmann
+ *
+ * $Id: g722.h 48959 2006-12-25 06:42:15Z rizzo $
+ */
+
+
+/*! \file */
+
+#if !defined(_G722_H_)
+#define _G722_H_
+
+/*! \page g722_page G.722 encoding and decoding
+\section g722_page_sec_1 What does it do?
+The G.722 module is a bit exact implementation of the ITU G.722 specification for all three
+specified bit rates - 64000bps, 56000bps and 48000bps. It passes the ITU tests.
+
+To allow fast and flexible interworking with narrow band telephony, the encoder and decoder
+support an option for the linear audio to be an 8k samples/second stream. In this mode the
+codec is considerably faster, and still fully compatible with wideband terminals using G.722.
+
+\section g722_page_sec_2 How does it work?
+???.
+*/
+
+/* Format DAC12 is added to decode directly into samples suitable for
+   a 12-bit DAC using offset binary representation. */
+
+enum
+{
+    G722_SAMPLE_RATE_8000 = 0x0001,
+    G722_PACKED = 0x0002,
+    G722_FORMAT_DAC12 = 0x0004,
+};
+
+#ifdef BUILD_FEATURE_DAC
+#define NLDECOMPRESS_APPLY_GAIN(s,g) (((s) * (int32_t)(g)) >> 16)
+// Equivalent to shift 16, add 0x8000, shift 4
+#define NLDECOMPRESS_APPLY_GAIN_CONVERTED_DAC(s,g) (uint16_t)((uint16_t)(((s) * (int32_t)(g)) >> 20) + 0x800)
+#else
+#define NLDECOMPRESS_APPLY_GAIN(s,g) (((int32_t)(s) * (int32_t)(g)) >> 16)
+#endif
+
+#ifdef BUILD_FEATURE_DAC
+#define NLDECOMPRESS_PREPROCESS_PCM_SAMPLE_WITH_GAIN(s,g) NLDECOMPRESS_APPLY_GAIN_CONVERTED_DAC((s),(g))
+#define NLDECOMPRESS_PREPROCESS_SAMPLE_WITH_GAIN(s,g) ((int16_t)NLDECOMPRESS_APPLY_GAIN((s),(g)))
+#else
+#define NLDECOMPRESS_PREPROCESS_PCM_SAMPLE_WITH_GAIN NLDECOMPRESS_PREPROCESS_SAMPLE_WITH_GAIN
+#define NLDECOMPRESS_PREPROCESS_SAMPLE_WITH_GAIN(s,g) ((int16_t)(NLDECOMPRESS_APPLY_GAIN((s),(g))))
+#endif
+
+typedef struct {
+    int s;
+    int sp;
+    int sz;
+    int r[3];
+    int a[3];
+    int ap[3];
+    int p[3];
+    int d[7];
+    int b[7];
+    int bp[7];
+    int nb;
+    int det;
+} g722_band_t;
+
+typedef struct
+{
+    /*! TRUE if the operating in the special ITU test mode, with the band split filters
+             disabled. */
+    int itu_test_mode;
+    /*! TRUE if the G.722 data is packed */
+    int packed;
+    /*! TRUE if encode from 8k samples/second */
+    int eight_k;
+    /*! 6 for 48000kbps, 7 for 56000kbps, or 8 for 64000kbps. */
+    int bits_per_sample;
+
+    /*! Signal history for the QMF */
+    int x[24];
+
+    g722_band_t band[2];
+
+    unsigned int in_buffer;
+    int in_bits;
+    unsigned int out_buffer;
+    int out_bits;
+} g722_encode_state_t;
+
+typedef struct
+{
+    /*! TRUE if the operating in the special ITU test mode, with the band split filters
+             disabled. */
+    int itu_test_mode;
+    /*! TRUE if the G.722 data is packed */
+    int packed;
+    /*! TRUE if decode to 8k samples/second */
+    int eight_k;
+    /*! 6 for 48000kbps, 7 for 56000kbps, or 8 for 64000kbps. */
+    int bits_per_sample;
+    /*! TRUE if offset binary for a 12-bit DAC */
+    int dac_pcm;
+
+    /*! Signal history for the QMF */
+    int x[24];
+
+    g722_band_t band[2];
+    
+    unsigned int in_buffer;
+    int in_bits;
+    unsigned int out_buffer;
+    int out_bits;
+} g722_decode_state_t;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+g722_encode_state_t *g722_encode_init(g722_encode_state_t *s, unsigned int rate, int options);
+int g722_encode_release(g722_encode_state_t *s);
+int g722_encode(g722_encode_state_t *s, uint8_t g722_data[], const int16_t amp[], int len);
+
+g722_decode_state_t *g722_decode_init(g722_decode_state_t *s, unsigned int rate, int options);
+int g722_decode_release(g722_decode_state_t *s);
+uint32_t g722_decode(g722_decode_state_t *s, int16_t amp[], const uint8_t g722_data[], int len, uint16_t aGain);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/include/g722_typedefs.h b/include/g722_typedefs.h
new file mode 100644
index 0000000..d8977ff
--- /dev/null
+++ b/include/g722_typedefs.h
@@ -0,0 +1,112 @@
+/*
+ *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+// This file contains platform-specific typedefs and defines.
+// Much of it is derived from Chromium's build/build_config.h.
+
+#ifndef WEBRTC_TYPEDEFS_H_
+#define WEBRTC_TYPEDEFS_H_
+
+// Processor architecture detection.  For more info on what's defined, see:
+//   http://msdn.microsoft.com/en-us/library/b0084kay.aspx
+//   http://www.agner.org/optimize/calling_conventions.pdf
+//   or with gcc, run: "echo | gcc -E -dM -"
+#if defined(_M_X64) || defined(__x86_64__)
+#define WEBRTC_ARCH_X86_FAMILY
+#define WEBRTC_ARCH_X86_64
+#define WEBRTC_ARCH_64_BITS
+#define WEBRTC_ARCH_LITTLE_ENDIAN
+#elif defined(__aarch64__)
+#define WEBRTC_ARCH_64_BITS
+#define WEBRTC_ARCH_LITTLE_ENDIAN
+#elif defined(_M_IX86) || defined(__i386__)
+#define WEBRTC_ARCH_X86_FAMILY
+#define WEBRTC_ARCH_X86
+#define WEBRTC_ARCH_32_BITS
+#define WEBRTC_ARCH_LITTLE_ENDIAN
+#elif defined(__ARMEL__)
+// TODO(ajm): We'd prefer to control platform defines here, but this is
+// currently provided by the Android makefiles. Commented to avoid duplicate
+// definition warnings.
+//#define WEBRTC_ARCH_ARM
+// TODO(ajm): Chromium uses the following two defines. Should we switch?
+//#define WEBRTC_ARCH_ARM_FAMILY
+//#define WEBRTC_ARCH_ARMEL
+#define WEBRTC_ARCH_32_BITS
+#define WEBRTC_ARCH_LITTLE_ENDIAN
+#elif defined(__MIPSEL__)
+#define WEBRTC_ARCH_32_BITS
+#define WEBRTC_ARCH_LITTLE_ENDIAN
+#elif defined(__pnacl__)
+#define WEBRTC_ARCH_32_BITS
+#define WEBRTC_ARCH_LITTLE_ENDIAN
+#else
+#error Please add support for your architecture in typedefs.h
+#endif
+
+#if !(defined(WEBRTC_ARCH_LITTLE_ENDIAN) ^ defined(WEBRTC_ARCH_BIG_ENDIAN))
+#error Define either WEBRTC_ARCH_LITTLE_ENDIAN or WEBRTC_ARCH_BIG_ENDIAN
+#endif
+
+#if (defined(WEBRTC_ARCH_X86_FAMILY) && !defined(__SSE2__)) ||  \
+    (defined(WEBRTC_ARCH_ARM_V7) && !defined(WEBRTC_ARCH_ARM_NEON))
+#define WEBRTC_CPU_DETECTION
+#endif
+
+#if !defined(_MSC_VER)
+#include <stdint.h>
+#else
+// Define C99 equivalent types, since pre-2010 MSVC doesn't provide stdint.h.
+typedef signed char         int8_t;
+typedef signed short        int16_t;
+typedef signed int          int32_t;
+typedef __int64             int64_t;
+typedef unsigned char       uint8_t;
+typedef unsigned short      uint16_t;
+typedef unsigned int        uint32_t;
+typedef unsigned __int64    uint64_t;
+#endif
+
+// Borrowed from Chromium's base/compiler_specific.h.
+// Annotate a virtual method indicating it must be overriding a virtual
+// method in the parent class.
+// Use like:
+//   virtual void foo() OVERRIDE;
+#if defined(_MSC_VER)
+#define OVERRIDE override
+#elif defined(__clang__)
+// Clang defaults to C++03 and warns about using override. Squelch that.
+// Intentionally no push/pop here so all users of OVERRIDE ignore the warning
+// too. This is like passing -Wno-c++11-extensions, except that GCC won't die
+// (because it won't see this pragma).
+#pragma clang diagnostic ignored "-Wc++11-extensions"
+#define OVERRIDE override
+#elif defined(__GNUC__) && __cplusplus >= 201103 && \
+    (__GNUC__ * 10000 + __GNUC_MINOR__ * 100) >= 40700
+// GCC 4.7 supports explicit virtual overrides when C++11 support is enabled.
+#define OVERRIDE override
+#else
+#define OVERRIDE
+#endif
+
+// Annotate a function indicating the caller must examine the return value.
+// Use like:
+//   int foo() WARN_UNUSED_RESULT;
+// TODO(ajm): Hack to avoid multiple definitions until the base/ of webrtc and
+// libjingle are merged.
+#if !defined(WARN_UNUSED_RESULT)
+#if defined(__GNUC__)
+#define WARN_UNUSED_RESULT __attribute__((warn_unused_result))
+#else
+#define WARN_UNUSED_RESULT
+#endif
+#endif  // WARN_UNUSED_RESULT
+
+#endif  // WEBRTC_TYPEDEFS_H_
diff --git a/setup.py b/setup.py
new file mode 100755
index 0000000..4fe92fd
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,24 @@
+#!/usr/bin/env python
+
+"""
+setup.py for g722 package (encoder/decoder wrapper)
+"""
+
+from setuptools import setup, Extension
+
+
+g722_module = Extension('g722',
+                        sources=['src/g722_pywrap.c',
+                                 'src/g722_encode.c',
+                                 'src/g722_decode.c'],
+                        include_dirs=['include']
+)
+
+setup (name = 'g722',
+       version = '0.1.0-dev',
+       author      = 'elms',
+       author_email= 'elms@nestlabs.com',
+       url = 'https://stash.nestlabs.com/projects/TPS/repos/g722/browse',
+       description = 'g722 encode/decode wrapper',
+       ext_modules = [g722_module]
+       )
diff --git a/src/g722_decode.c b/src/g722_decode.c
new file mode 100644
index 0000000..4d812ac
--- /dev/null
+++ b/src/g722_decode.c
@@ -0,0 +1,422 @@
+/*
+ * SpanDSP - a series of DSP components for telephony
+ *
+ * g722_decode.c - The ITU G.722 codec, decode part.
+ *
+ * Written by Steve Underwood <steveu@coppice.org>
+ *
+ * Copyright (C) 2005 Steve Underwood
+ *
+ *  Despite my general liking of the GPL, I place my own contributions 
+ *  to this code in the public domain for the benefit of all mankind -
+ *  even the slimy ones who might try to proprietize my work and use it
+ *  to my detriment.
+ *
+ * Based in part on a single channel G.722 codec which is:
+ *
+ * Copyright (c) CMU 1993
+ * Computer Science, Speech Group
+ * Chengxiang Lu and Alex Hauptmann
+ *
+ * $Id: g722_decode.c 194722 2009-05-15 17:59:08Z russell $
+ */
+
+/*! \file */
+
+#include <stdio.h>
+#include <string.h>
+#include <inttypes.h>
+#include <stdlib.h>
+
+#include "g722_typedefs.h"
+#include "g722_enc_dec.h"
+
+#if !defined(FALSE)
+#define FALSE 0
+#endif
+#if !defined(TRUE)
+#define TRUE (!FALSE)
+#endif
+
+#define PACKED_INPUT    (0)
+#define BITS_PER_SAMPLE (8)
+
+#ifndef BUILD_FEATURE_G722_USE_INTRINSIC_SAT
+static __inline int16_t __ssat16(int32_t amp)
+{
+    int16_t amp16;
+
+    /* Hopefully this is optimised for the common case - not clipping */
+    amp16 = (int16_t) amp;
+    if (amp == amp16)
+        return amp16;
+    if (amp > 0x7fff)
+        return  0x7fff;
+    return  0x8000;
+}
+/*- End of function --------------------------------------------------------*/
+#else
+static __inline int16_t __ssat16( int32_t val)
+{
+    register int32_t res;
+    __asm volatile (
+        "SSAT %0, #16, %1\n\t"
+        :"=r"(res)
+        :"r"(val)
+        :);
+    return (int16_t)res;
+}
+#endif
+
+/*- End of function --------------------------------------------------------*/
+
+static void block4(g722_band_t *band, int d);
+
+static void block4(g722_band_t *band, int d)
+{
+    int wd1;
+    int wd2;
+    int wd3;
+    int i;
+    int sg[7];
+    int ap1, ap2;
+    int sg0, sgi;
+    int sz;
+
+    /* Block 4, RECONS */
+    band->d[0] = d;
+    band->r[0] = __ssat16(band->s + d);
+
+    /* Block 4, PARREC */
+    band->p[0] = __ssat16(band->sz + d);
+
+    /* Block 4, UPPOL2 */
+    for (i = 0;  i < 3;  i++)
+    {
+        sg[i] = band->p[i] >> 15;
+    }
+    wd1 = __ssat16(band->a[1] << 2);
+
+    wd2 = (sg[0] == sg[1])  ?  -wd1  :  wd1;
+    if (wd2 > 32767)
+        wd2 = 32767;
+
+    ap2 = (sg[0] == sg[2])  ?  128  :  -128;
+    ap2 += (wd2 >> 7);
+    ap2 += (band->a[2]*32512) >> 15;
+    if (ap2 > 12288)
+        ap2 = 12288;
+    else if (ap2 < -12288)
+        ap2 = -12288;
+    band->ap[2] = ap2;
+
+    /* Block 4, UPPOL1 */
+    sg[0] = band->p[0] >> 15;
+    sg[1] = band->p[1] >> 15;
+    wd1 = (sg[0] == sg[1])  ?  192  :  -192;
+    wd2 = (band->a[1]*32640) >> 15;
+
+    ap1 = __ssat16(wd1 + wd2);
+    wd3 = __ssat16(15360 - band->ap[2]);
+    if (ap1 > wd3)
+        ap1 = wd3;
+    else if (ap1 < -wd3)
+        ap1 = -wd3;
+    band->ap[1] = ap1;
+
+    /* Block 4, UPZERO */
+    /* Block 4, FILTEZ */
+    wd1 = (d == 0)  ?  0  :  128;
+
+    sg0 = sg[0] = d >> 15;
+    for (i = 1;  i < 7;  i++)
+    {
+	sgi = band->d[i] >> 15;
+        wd2 = (sgi == sg0)  ?  wd1  :  -wd1;
+        wd3 = (band->b[i]*32640) >> 15;
+        band->bp[i] = __ssat16(wd2 + wd3);
+    }
+
+    /* Block 4, DELAYA */
+    sz = 0;
+    for (i = 6;  i > 0;  i--)
+    {
+	int bi;
+
+        band->d[i] = band->d[i - 1];
+	bi = band->b[i] = band->bp[i];
+	wd1 = __ssat16(band->d[i] + band->d[i]);
+	sz += (bi*wd1) >> 15;
+    }
+    band->sz = sz;
+    
+    for (i = 2;  i > 0;  i--)
+    {
+        band->r[i] = band->r[i - 1];
+        band->p[i] = band->p[i - 1];
+        band->a[i] = band->ap[i];
+    }
+
+    /* Block 4, FILTEP */
+    wd1 = __ssat16(band->r[1] + band->r[1]);
+    wd1 = (band->a[1]*wd1) >> 15;
+    wd2 = __ssat16(band->r[2] + band->r[2]);
+    wd2 = (band->a[2]*wd2) >> 15;
+    band->sp = __ssat16(wd1 + wd2);
+
+    /* Block 4, PREDIC */
+    band->s = __ssat16(band->sp + band->sz);
+}
+/*- End of function --------------------------------------------------------*/
+
+g722_decode_state_t *g722_decode_init(g722_decode_state_t *s, unsigned int rate, int options)
+{
+    if (s == NULL)
+    {
+#ifdef G722_SUPPORT_MALLOC
+        if ((s = (g722_decode_state_t *) malloc(sizeof(*s))) == NULL)
+#endif
+            return NULL;
+    }
+    memset(s, 0, sizeof(*s));
+    if (rate == 48000)
+        s->bits_per_sample = 6;
+    else if (rate == 56000)
+        s->bits_per_sample = 7;
+    else
+        s->bits_per_sample = 8;
+    s->dac_pcm = options & G722_FORMAT_DAC12;
+    s->band[0].det = 32;
+    s->band[1].det = 8;
+    return s;
+}
+/*- End of function --------------------------------------------------------*/
+
+int g722_decode_release(g722_decode_state_t *s)
+{
+    free(s);
+    return 0;
+}
+/*- End of function --------------------------------------------------------*/
+
+static int16_t wl[8] = {-60, -30, 58, 172, 334, 538, 1198, 3042 };
+static int16_t rl42[16] = {0, 7, 6, 5, 4, 3, 2, 1, 7, 6, 5, 4, 3,  2, 1, 0 };
+static int16_t ilb[32] =
+{
+    2048, 2093, 2139, 2186, 2233, 2282, 2332,
+    2383, 2435, 2489, 2543, 2599, 2656, 2714,
+    2774, 2834, 2896, 2960, 3025, 3091, 3158,
+    3228, 3298, 3371, 3444, 3520, 3597, 3676,
+    3756, 3838, 3922, 4008
+};
+
+static int16_t wh[3] = {0, -214, 798};
+static int16_t rh2[4] = {2, 1, 2, 1};
+static int16_t qm2[4] = {-7408, -1616,  7408,   1616};
+static int16_t qm4[16] = 
+{
+        0, -20456, -12896,  -8968, 
+    -6288,  -4240,  -2584,  -1200,
+    20456,  12896,   8968,   6288,
+     4240,   2584,   1200,      0
+};
+#if 0
+static const int qm5[32] =
+{
+      -280,   -280, -23352, -17560,
+    -14120, -11664,  -9752,  -8184,
+     -6864,  -5712,  -4696,  -3784,
+     -2960,  -2208,  -1520,   -880,
+     23352,  17560,  14120,  11664,
+      9752,   8184,   6864,   5712,
+      4696,   3784,   2960,   2208,
+      1520,    880,    280,   -280
+};
+#endif
+static int16_t qm6[64] =
+{
+      -136,   -136,   -136,   -136,
+    -24808, -21904, -19008, -16704,
+    -14984, -13512, -12280, -11192,
+    -10232,  -9360,  -8576,  -7856,
+     -7192,  -6576,  -6000,  -5456,
+     -4944,  -4464,  -4008,  -3576,
+     -3168,  -2776,  -2400,  -2032,
+     -1688,  -1360,  -1040,   -728,
+     24808,  21904,  19008,  16704,
+     14984,  13512,  12280,  11192,
+     10232,   9360,   8576,   7856,
+      7192,   6576,   6000,   5456,
+      4944,   4464,   4008,   3576,
+      3168,   2776,   2400,   2032,
+      1688,   1360,   1040,    728,
+       432,    136,   -432,   -136
+};
+static int16_t qmf_coeffs_even[12] =
+{
+      3,  -11,   12,   32, -210,  951, 3876, -805,  362, -156,   53,  -11,
+};
+static int16_t qmf_coeffs_odd[12] =
+{
+    -11,   53, -156,  362, -805, 3876, 951,  -210,   32,   12,  -11,    3
+};
+
+uint32_t g722_decode(g722_decode_state_t *s, int16_t amp[], const uint8_t g722_data[], int len, uint16_t gain)
+{
+
+    int dlowt;
+    int rlow;
+    int ihigh;
+    int dhigh;
+    int rhigh;
+    int xout1;
+    int xout2;
+    int wd1;
+    int wd2;
+    int wd3;
+    int code;
+    uint32_t outlen;
+    int i;
+    int j;
+
+    outlen = 0;
+    rhigh = 0;
+
+    for (j = 0;  j < len;  )
+    {
+#if PACKED_INPUT == 1
+        /* Unpack the code bits */
+        if (s->in_bits < s->bits_per_sample)
+        {
+            s->in_buffer |= (g722_data[j++] << s->in_bits);
+            s->in_bits += 8;
+        }
+        code = s->in_buffer & ((1 << s->bits_per_sample) - 1);
+        s->in_buffer >>= s->bits_per_sample;
+        s->in_bits -= s->bits_per_sample;
+#else
+        code = g722_data[j++];
+#endif
+
+#if BITS_PER_SAMPLE == 8
+        wd1 = code & 0x3F;
+        ihigh = (code >> 6) & 0x03;
+        wd2 = qm6[wd1];
+        wd1 >>= 2;
+#elif BITS_PER_SAMPLE == 7
+        wd1 = code & 0x1F;
+        ihigh = (code >> 5) & 0x03;
+        wd2 = qm5[wd1];
+        wd1 >>= 1;
+#elif BITS_PER_SAMPLE == 6
+       wd1 = code & 0x0F;
+       ihigh = (code >> 4) & 0x03;
+       wd2 = qm4[wd1];
+#endif
+        /* Block 5L, LOW BAND INVQBL */
+        wd2 = (s->band[0].det*wd2) >> 15;
+        /* Block 5L, RECONS */
+        rlow = s->band[0].s + wd2;
+        /* Block 6L, LIMIT */
+
+        // ANDREA
+        // rlow=ssat(rlow,2<<14)
+        if (rlow > 16383)
+        {
+            rlow = 16383;
+        }
+        else if (rlow < -16384)
+        {
+            rlow = -16384;
+        }
+
+        /* Block 2L, INVQAL */
+        wd2 = qm4[wd1];
+        dlowt = (s->band[0].det*wd2) >> 15;
+
+        /* Block 3L, LOGSCL */
+        wd2 = rl42[wd1];
+        wd1 = (s->band[0].nb*127) >> 7;
+        wd1 += wl[wd2];
+        if (wd1 < 0)
+        {
+            wd1 = 0;
+        }
+        else if (wd1 > 18432)
+        {
+            wd1 = 18432;
+        }
+        s->band[0].nb = wd1;
+            
+        /* Block 3L, SCALEL */
+        wd1 = (s->band[0].nb >> 6) & 31;
+        wd2 = 8 - (s->band[0].nb >> 11);
+        wd3 = (wd2 < 0)  ?  (ilb[wd1] << -wd2)  :  (ilb[wd1] >> wd2);
+        s->band[0].det = wd3 << 2;
+
+        block4(&s->band[0], dlowt);
+        
+        /* Block 2H, INVQAH */
+        wd2 = qm2[ihigh];
+        dhigh = (s->band[1].det*wd2) >> 15;
+        /* Block 5H, RECONS */
+        rhigh = dhigh + s->band[1].s;
+        /* Block 6H, LIMIT */
+
+        // ANDREA
+        // rhigh=ssat(rhigh,2<<14)
+
+        if (rhigh > 16383)
+            rhigh = 16383;
+        else if (rhigh < -16384)
+            rhigh = -16384;
+
+        /* Block 2H, INVQAH */
+        wd2 = rh2[ihigh];
+        wd1 = (s->band[1].nb*127) >> 7;
+        wd1 += wh[wd2];
+        if (wd1 < 0)
+            wd1 = 0;
+        else if (wd1 > 22528)
+            wd1 = 22528;
+        s->band[1].nb = wd1;
+            
+        /* Block 3H, SCALEH */
+        wd1 = (s->band[1].nb >> 6) & 31;
+        wd2 = 10 - (s->band[1].nb >> 11);
+        wd3 = (wd2 < 0)  ?  (ilb[wd1] << -wd2)  :  (ilb[wd1] >> wd2);
+        s->band[1].det = wd3 << 2;
+
+        block4(&s->band[1], dhigh);
+
+        /* Apply the receive QMF */
+        for (i = 0;  i < 22;  i++)
+            s->x[i] = s->x[i + 2];
+        s->x[22] = rlow + rhigh;
+        s->x[23] = rlow - rhigh;
+
+        // we should get PERF numbers for the following loop 
+        xout1 = 0;
+        xout2 = 0;
+        for (i = 0;  i < 12;  i++)
+        {
+            xout2 += s->x[2*i]   * qmf_coeffs_even[i];
+            xout1 += s->x[2*i+1] * qmf_coeffs_odd[i];
+        }
+        xout1 = NLDECOMPRESS_PREPROCESS_SAMPLE_WITH_GAIN((int16_t) __ssat16(xout1 >> 11), gain);
+        xout2 = NLDECOMPRESS_PREPROCESS_SAMPLE_WITH_GAIN((int16_t) __ssat16(xout2 >> 11), gain);
+        if (s->dac_pcm)
+        {
+            amp[outlen++] = ((int16_t) (xout1 >> 4) + 2048);
+            amp[outlen++] = ((int16_t) (xout2 >> 4) + 2048);
+        }
+        else
+        {
+            amp[outlen++] = xout1;
+            amp[outlen++] = xout2;
+        }
+    }
+    return outlen;
+}
+/*- End of function --------------------------------------------------------*/
+/*- End of file ------------------------------------------------------------*/
diff --git a/src/g722_encode.c b/src/g722_encode.c
new file mode 100644
index 0000000..817f5c0
--- /dev/null
+++ b/src/g722_encode.c
@@ -0,0 +1,438 @@
+/*
+ * SpanDSP - a series of DSP components for telephony
+ *
+ * g722_encode.c - The ITU G.722 codec, encode part.
+ *
+ * Written by Steve Underwood <steveu@coppice.org>
+ *
+ * Copyright (C) 2005 Steve Underwood
+ *
+ * All rights reserved.
+ *
+ *  Despite my general liking of the GPL, I place my own contributions 
+ *  to this code in the public domain for the benefit of all mankind -
+ *  even the slimy ones who might try to proprietize my work and use it
+ *  to my detriment.
+ *
+ * Based on a single channel 64kbps only G.722 codec which is:
+ *
+ *****    Copyright (c) CMU    1993      *****
+ * Computer Science, Speech Group
+ * Chengxiang Lu and Alex Hauptmann
+ *
+ * $Id: g722_encode.c,v 1.14 2006/07/07 16:37:49 steveu Exp $
+ */
+
+/*! \file */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "g722_typedefs.h"
+#include "g722_enc_dec.h"
+
+#if !defined(FALSE)
+#define FALSE 0
+#endif
+#if !defined(TRUE)
+#define TRUE (!FALSE)
+#endif
+
+#define PACKED_OUTPUT   (0)
+#define BITS_PER_SAMPLE (8)
+
+#ifndef BUILD_FEATURE_G722_USE_INTRINSIC_SAT
+static __inline int16_t saturate(int32_t amp)
+{
+    int16_t amp16;
+
+    /* Hopefully this is optimised for the common case - not clipping */
+    amp16 = (int16_t) amp;
+    if (amp == amp16)
+        return amp16;
+    if (amp > 0x7FFF)
+        return  0x7FFF;
+    return  0x8000;
+}
+#else
+static __inline int16_t saturate(int32_t val)
+{
+    register int32_t res;
+    __asm volatile (
+        "SSAT %0, #16, %1\n\t"
+        :"=r"(res)
+        :"r"(val)
+        :);
+    return (int16_t)res;
+}
+#endif
+/*- End of function --------------------------------------------------------*/
+
+static void block4(g722_band_t *band, int d)
+{
+    int wd1;
+    int wd2;
+    int wd3;
+    int i;
+    int sg[7];
+    int ap1, ap2;
+    int sg0, sgi;
+    int sz;
+
+    /* Block 4, RECONS */
+    band->d[0] = d;
+    band->r[0] = saturate(band->s + d);
+
+    /* Block 4, PARREC */
+    band->p[0] = saturate(band->sz + d);
+
+    /* Block 4, UPPOL2 */
+    for (i = 0;  i < 3;  i++)
+        sg[i] = band->p[i] >> 15;
+    wd1 = saturate(band->a[1] << 2);
+
+    wd2 = (sg[0] == sg[1])  ?  -wd1  :  wd1;
+    if (wd2 > 32767)
+        wd2 = 32767;
+
+    ap2 = (wd2 >> 7) + ((sg[0] == sg[2])  ?  128  :  -128);
+    ap2 += (band->a[2]*32512) >> 15;
+    if (ap2 > 12288)
+        ap2 = 12288;
+    else if (ap2 < -12288)
+        ap2 = -12288;
+    band->ap[2] = ap2;
+
+    /* Block 4, UPPOL1 */
+    sg[0] = band->p[0] >> 15;
+    sg[1] = band->p[1] >> 15;
+    wd1 = (sg[0] == sg[1])  ?  192  :  -192;
+    wd2 = (band->a[1]*32640) >> 15;
+
+    ap1 = saturate(wd1 + wd2);
+    wd3 = saturate(15360 - band->ap[2]);
+    if (ap1 > wd3)
+        ap1 = wd3;
+    else if (ap1 < -wd3)
+        ap1 = -wd3;
+    band->ap[1] = ap1;
+
+    /* Block 4, UPZERO */
+    /* Block 4, FILTEZ */
+    wd1 = (d == 0)  ?  0  :  128;
+
+    sg0 = sg[0] = d >> 15;
+    for (i = 1;  i < 7;  i++)
+    {
+	sgi = band->d[i] >> 15;
+	wd2 = (sgi == sg0) ? wd1 : -wd1;
+        wd3 = (band->b[i]*32640) >> 15;
+        band->bp[i] = saturate(wd2 + wd3);
+    }
+
+    /* Block 4, DELAYA */
+    sz = 0;
+    for (i = 6;  i > 0;  i--)
+    {
+	int bi;
+
+        band->d[i] = band->d[i - 1];
+        bi = band->b[i] = band->bp[i];
+        wd1 = saturate(band->d[i] + band->d[i]);
+        sz += (bi*wd1) >> 15;
+    }
+    band->sz = sz;
+    
+    for (i = 2;  i > 0;  i--)
+    {
+        band->r[i] = band->r[i - 1];
+        band->p[i] = band->p[i - 1];
+        band->a[i] = band->ap[i];
+    }
+
+    /* Block 4, FILTEP */
+    wd1 = saturate(band->r[1] + band->r[1]);
+    wd1 = (band->a[1]*wd1) >> 15;
+    wd2 = saturate(band->r[2] + band->r[2]);
+    wd2 = (band->a[2]*wd2) >> 15;
+    band->sp = saturate(wd1 + wd2);
+
+    /* Block 4, PREDIC */
+    band->s = saturate(band->sp + band->sz);
+}
+/*- End of function --------------------------------------------------------*/
+
+g722_encode_state_t *g722_encode_init(g722_encode_state_t *s,
+                                             unsigned int rate, int options)
+{
+    if (s == NULL)
+    {
+#ifdef G722_SUPPORT_MALLOC
+        if ((s = (g722_encode_state_t *) malloc(sizeof(*s))) == NULL)
+#endif
+            return NULL;
+    }
+    memset(s, 0, sizeof(*s));
+    if (rate == 48000)
+        s->bits_per_sample = 6;
+    else if (rate == 56000)
+        s->bits_per_sample = 7;
+    else
+        s->bits_per_sample = 8;
+    s->band[0].det = 32;
+    s->band[1].det = 8;
+    return s;
+}
+/*- End of function --------------------------------------------------------*/
+
+int g722_encode_release(g722_encode_state_t *s)
+{
+    free(s);
+    return 0;
+}
+/*- End of function --------------------------------------------------------*/
+
+/* WebRtc, tlegrand:
+ * Only define the following if bit-exactness with reference implementation
+ * is needed. Will only have any effect if input signal is saturated.
+ */
+//#define RUN_LIKE_REFERENCE_G722
+#ifdef RUN_LIKE_REFERENCE_G722
+int16_t limitValues (int16_t rl)
+{
+
+    int16_t yl;
+
+    yl = (rl > 16383) ? 16383 : ((rl < -16384) ? -16384 : rl);
+
+    return (yl);
+}
+/*- End of function --------------------------------------------------------*/
+#endif
+
+static int16_t q6[32] =
+{
+       0,   35,   72,  110,  150,  190,  233,  276,
+     323,  370,  422,  473,  530,  587,  650,  714,
+     786,  858,  940, 1023, 1121, 1219, 1339, 1458,
+    1612, 1765, 1980, 2195, 2557, 2919,    0,    0
+};
+static int16_t iln[32] =
+{
+     0, 63, 62, 31, 30, 29, 28, 27,
+    26, 25, 24, 23, 22, 21, 20, 19,
+    18, 17, 16, 15, 14, 13, 12, 11,
+    10,  9,  8,  7,  6,  5,  4,  0
+};
+static int16_t ilp[32] =
+{
+     0, 61, 60, 59, 58, 57, 56, 55,
+    54, 53, 52, 51, 50, 49, 48, 47,
+    46, 45, 44, 43, 42, 41, 40, 39,
+    38, 37, 36, 35, 34, 33, 32,  0
+};
+static int16_t wl[8] =
+{
+    -60, -30, 58, 172, 334, 538, 1198, 3042
+};
+static int16_t rl42[16] =
+{
+    0, 7, 6, 5, 4, 3, 2, 1, 7, 6, 5, 4, 3, 2, 1, 0
+};
+static int16_t ilb[32] =
+{
+    2048, 2093, 2139, 2186, 2233, 2282, 2332,
+    2383, 2435, 2489, 2543, 2599, 2656, 2714,
+    2774, 2834, 2896, 2960, 3025, 3091, 3158,
+    3228, 3298, 3371, 3444, 3520, 3597, 3676,
+    3756, 3838, 3922, 4008
+};
+static int16_t qm4[16] =
+{
+         0, -20456, -12896, -8968,
+     -6288,  -4240,  -2584, -1200,
+     20456,  12896,   8968,  6288,
+      4240,   2584,   1200,     0
+};
+static int16_t qm2[4] =
+{
+    -7408,  -1616,   7408,   1616
+};
+static int16_t qmf_coeffs[12] =
+{
+       3,  -11,   12,   32, -210,  951, 3876, -805,  362, -156,   53,  -11,
+};
+static int16_t ihn[3] = {0, 1, 0};
+static int16_t ihp[3] = {0, 3, 2};
+static int16_t wh[3] = {0, -214, 798};
+static int16_t rh2[4] = {2, 1, 2, 1};
+
+int g722_encode(g722_encode_state_t *s, uint8_t g722_data[],
+                       const int16_t amp[], int len)
+{
+    int dlow;
+    int dhigh;
+    int el;
+    int wd;
+    int wd1;
+    int ril;
+    int wd2;
+    int il4;
+    int ih2;
+    int wd3;
+    int eh;
+    int mih;
+    int i;
+    int j;
+    /* Low and high band PCM from the QMF */
+    int xlow;
+    int xhigh;
+    int g722_bytes;
+    /* Even and odd tap accumulators */
+    int sumeven;
+    int sumodd;
+    int ihigh;
+    int ilow;
+    int code;
+
+    g722_bytes = 0;
+    xhigh = 0;
+    for (j = 0;  j < len;  )
+    {
+        if (s->itu_test_mode)
+        {
+            xlow =
+            xhigh = amp[j++] >> 1;
+        }
+        else
+        {
+            {
+                /* Apply the transmit QMF */
+                /* Shuffle the buffer down */
+                for (i = 0;  i < 22;  i++)
+                    s->x[i] = s->x[i + 2];
+                //TODO: if len is odd, then this can be a buffer overrun
+                s->x[22] = amp[j++];
+                s->x[23] = amp[j++];
+    
+                /* Discard every other QMF output */
+                sumeven = 0;
+                sumodd = 0;
+                for (i = 0;  i < 12;  i++)
+                {
+                    sumodd += s->x[2*i]*qmf_coeffs[i];
+                    sumeven += s->x[2*i + 1]*qmf_coeffs[11 - i];
+                }
+                /* We shift by 12 to allow for the QMF filters (DC gain = 4096), plus 1
+                   to allow for us summing two filters, plus 1 to allow for the 15 bit
+                   input to the G.722 algorithm. */
+                xlow = (sumeven + sumodd) >> 14;
+                xhigh = (sumeven - sumodd) >> 14;
+
+#ifdef RUN_LIKE_REFERENCE_G722
+                /* The following lines are only used to verify bit-exactness
+                 * with reference implementation of G.722. Higher precision
+                 * is achieved without limiting the values.
+                 */
+                xlow = limitValues(xlow);
+                xhigh = limitValues(xhigh);
+#endif
+            }
+        }
+        /* Block 1L, SUBTRA */
+        el = saturate(xlow - s->band[0].s);
+
+        /* Block 1L, QUANTL */
+        wd = (el >= 0)  ?  el  :  -(el + 1);
+
+        for (i = 1;  i < 30;  i++)
+        {
+            wd1 = (q6[i]*s->band[0].det) >> 12;
+            if (wd < wd1)
+                break;
+        }
+        ilow = (el < 0)  ?  iln[i]  :  ilp[i];
+
+        /* Block 2L, INVQAL */
+        ril = ilow >> 2;
+        wd2 = qm4[ril];
+        dlow = (s->band[0].det*wd2) >> 15;
+
+        /* Block 3L, LOGSCL */
+        il4 = rl42[ril];
+        wd = (s->band[0].nb*127) >> 7;
+        s->band[0].nb = wd + wl[il4];
+        if (s->band[0].nb < 0)
+            s->band[0].nb = 0;
+        else if (s->band[0].nb > 18432)
+            s->band[0].nb = 18432;
+
+        /* Block 3L, SCALEL */
+        wd1 = (s->band[0].nb >> 6) & 31;
+        wd2 = 8 - (s->band[0].nb >> 11);
+        wd3 = (wd2 < 0)  ?  (ilb[wd1] << -wd2)  :  (ilb[wd1] >> wd2);
+        s->band[0].det = wd3 << 2;
+
+        block4(&s->band[0], dlow);
+        {
+	    int nb;
+
+            /* Block 1H, SUBTRA */
+            eh = saturate(xhigh - s->band[1].s);
+
+            /* Block 1H, QUANTH */
+            wd = (eh >= 0)  ?  eh  :  -(eh + 1);
+            wd1 = (564*s->band[1].det) >> 12;
+            mih = (wd >= wd1)  ?  2  :  1;
+            ihigh = (eh < 0)  ?  ihn[mih]  :  ihp[mih];
+
+            /* Block 2H, INVQAH */
+            wd2 = qm2[ihigh];
+            dhigh = (s->band[1].det*wd2) >> 15;
+
+            /* Block 3H, LOGSCH */
+            ih2 = rh2[ihigh];
+            wd = (s->band[1].nb*127) >> 7;
+
+            nb = wd + wh[ih2];
+            if (nb < 0)
+                nb = 0;
+            else if (nb > 22528)
+                nb = 22528;
+	    s->band[1].nb = nb;
+
+            /* Block 3H, SCALEH */
+            wd1 = (s->band[1].nb >> 6) & 31;
+            wd2 = 10 - (s->band[1].nb >> 11);
+            wd3 = (wd2 < 0)  ?  (ilb[wd1] << -wd2)  :  (ilb[wd1] >> wd2);
+            s->band[1].det = wd3 << 2;
+
+            block4(&s->band[1], dhigh);
+#if   BITS_PER_SAMPLE == 8
+            code = ((ihigh << 6) | ilow);
+#elif BITS_PER_SAMPLE == 7
+            code = ((ihigh << 6) | ilow) >> 1;
+#elif BITS_PER_SAMPLE == 6
+            code = ((ihigh << 6) | ilow) >> 2;
+#endif
+        }
+
+#if PACKED_OUTPUT == 1
+            /* Pack the code bits */
+            s->out_buffer |= (code << s->out_bits);
+            s->out_bits += s->bits_per_sample;
+            if (s->out_bits >= 8)
+            {
+                g722_data[g722_bytes++] = (uint8_t) (s->out_buffer & 0xFF);
+                s->out_bits -= 8;
+                s->out_buffer >>= 8;
+            }
+#else
+            g722_data[g722_bytes++] = (uint8_t) code;
+#endif
+    }
+    return g722_bytes;
+}
+/*- End of function --------------------------------------------------------*/
+/*- End of file ------------------------------------------------------------*/
diff --git a/src/g722_pywrap.c b/src/g722_pywrap.c
new file mode 100644
index 0000000..0442adc
--- /dev/null
+++ b/src/g722_pywrap.c
@@ -0,0 +1,80 @@
+#include <Python.h>
+
+#include "g722_enc_dec.h"
+#include "g722_typedefs.h"
+
+
+static PyObject* g722_dec (PyObject* self, PyObject* args) {
+  g722_decode_state_t s;
+  int opts = 0;
+  uint16_t gain = 0xFFFF;
+  int ratio = 4;
+
+  PyObject* obj0 = NULL;
+  PyObject* obj1 = NULL;
+  PyObject* resultobj = NULL;
+
+  if (!PyArg_ParseTuple(args,(char *)"OO:decode", &obj0, &obj1)) {
+    return 0;
+  }
+
+  int rate = PyInt_AsLong(obj0);
+  char* in = PyString_AsString(obj1);
+  int len = PyString_Size(obj1);
+
+  g722_decode_init(&s, rate, opts);
+
+  void* out = malloc(len*ratio);
+
+  g722_decode(&s, out, (uint8_t*)in, len, gain);
+
+  resultobj = PyString_FromStringAndSize(out, len*ratio);
+  free(out);
+
+  return resultobj;
+ }
+
+
+
+static PyObject* g722_enc (PyObject* self, PyObject* args) {
+  g722_encode_state_t s;
+  int opts = 0;
+  int ratio = 4;
+
+  PyObject* obj0 = NULL;
+  PyObject* obj1 = NULL;
+  PyObject* resultobj = NULL;
+  if (!PyArg_ParseTuple(args, (char *)"OO:encode", &obj0, &obj1)) {
+    return 0;
+  }
+
+  memset(&s, 0, sizeof(s));
+  int rate = PyInt_AsLong(obj0);
+  char* in = PyString_AsString(obj1);
+  int len = PyString_Size(obj1);
+
+  g722_encode_init(&s, rate, opts);
+
+  void* out = calloc(len/ratio + 1, 1);
+
+  int res = g722_encode(&s, out, (int16_t*)in, (len/4)*2);
+
+  resultobj = PyString_FromStringAndSize(out, res);
+  free(out);
+
+  return resultobj;
+}
+
+
+static PyMethodDef g722Methods[] = {
+         { (char *)"decode", g722_dec, METH_VARARGS, "decode g722 to PCM"},
+         { (char *)"encode", g722_enc, METH_VARARGS, "encode PCM data to g722"},
+         { NULL, NULL, 0, NULL }
+};
+
+
+PyMODINIT_FUNC
+initg722(void)
+{
+  (void) Py_InitModule("g722", g722Methods);
+}
