[Opalvoip-devel] G.726 AAL2 problem
Brought to you by:
csoutheren,
rjongbloed
From: Eugene M. <em@HERMONLABS.com> - 2008-07-02 09:33:57
|
Greetings! I'm trying to make plugin for G.726 AAL2 codec (same as G.726 but with reverse bit packing). I copied codec defs from original G.726 but somehow OPAL doesn't recognise this plugin (I don't see it in codec list in trace). Any ideas? #include <codec/opalplugin.h> #include <stdlib.h> #ifdef _WIN32 #include <malloc.h> #endif #include "inttypes.h" #include "bitstream.h" #include "g726.h" #define SAMPLES_PER_FRAME 8 #define MAX_FRAMES_PER_PACKET 240 // Really milliseconds #define PREF_FRAMES_PER_PACKET 30 // Really milliseconds #define PAYLOAD_CODE 2 // used to be 2, uses dynamic payload type (RFC 3551) ///////////////////////////////////////////////////////////////////////////// static void * create_codec(const struct PluginCodec_Definition * codec) { return g726_init( NULL, codec->bitsPerSec, 0, 1 ); } static void destroy_codec(const struct PluginCodec_Definition * codec, void * _context) { g726_release( (g726_state_t*)_context ); } static int encoder(const struct PluginCodec_Definition * codec, void * _context, const void * from, unsigned * fromLen, void * to, unsigned * toLen, unsigned int * flag) { *toLen = g726_decode( (g726_state_t*)_context, (int16_t*)from, (uint8_t*)to, *fromLen ); return 1; } static int decoder(const struct PluginCodec_Definition * codec, void * _context, const void * from, unsigned * fromLen, void * to, unsigned * toLen, unsigned int * flag) { *toLen = g726_encode( (g726_state_t*)_context, (uint8_t*)from, (int16_t*)to, *fromLen ); return 1; } ///////////////////////////////////////////////////////////////////////////// static struct PluginCodec_information licenseInfo = { 1084181196, // timestamp = Mon 10 May 2004 09:26:36 AM UTC "Eugene Mednikov, Hermon Labs", // source code author "1.0", // source code version "em...@he...<mailto:em...@he...>", // source code email "http://www.hermonlabs.com", // source code URL "Copyright (C) 2008 by Hermon Labs, All Rights Reserved", // source code copyright "MPL 1.0", // source code license PluginCodec_License_MPL, // source code license "ITU G.722", // codec description "Steve Underwood", // codec author NULL, // codec version "st...@co...<mailto:st...@co...>", // codec email NULL, // codec URL NULL, // codec copyright information NULL, // codec license PluginCodec_License_LGPL // codec license code }; ///////////////////////////////////////////////////////////////////////////// static const char L16Desc[] = { "L16" }; static const char sdpG726_16[] = { "G726-16" }; static const char sdpG726_24[] = { "G726-24" }; static const char sdpG726_32[] = { "G726-32" }; static const char sdpG726_40[] = { "G726-40" }; static const char g726_40[] = "AAL2-G.726-40k"; static const char g726_32[] = "AAL2-G.726-32k"; static const char g726_24[] = "AAL2-G.726-24k"; static const char g726_16[] = "AAL2-G.726-16k"; ///////////////////////////////////////////////////////////////////////////// #define EQUIVALENCE_COUNTRY_CODE 9 #define EQUIVALENCE_EXTENSION_CODE 0 #define EQUIVALENCE_MANUFACTURER_CODE 61 static struct PluginCodec_H323NonStandardCodecData g726_40_Cap = { NULL, EQUIVALENCE_COUNTRY_CODE, EQUIVALENCE_EXTENSION_CODE, EQUIVALENCE_MANUFACTURER_CODE, (const unsigned char *)g726_40, sizeof(g726_40)-1, NULL }; static struct PluginCodec_H323NonStandardCodecData g726_32_Cap = { NULL, EQUIVALENCE_COUNTRY_CODE, EQUIVALENCE_EXTENSION_CODE, EQUIVALENCE_MANUFACTURER_CODE, (const unsigned char *)g726_32, sizeof(g726_32)-1, NULL }; static struct PluginCodec_H323NonStandardCodecData g726_24_Cap = { NULL, EQUIVALENCE_COUNTRY_CODE, EQUIVALENCE_EXTENSION_CODE, EQUIVALENCE_MANUFACTURER_CODE, (const unsigned char *)g726_24, sizeof(g726_24)-1, NULL }; static struct PluginCodec_H323NonStandardCodecData g726_16_Cap = { NULL, EQUIVALENCE_COUNTRY_CODE, EQUIVALENCE_EXTENSION_CODE, EQUIVALENCE_MANUFACTURER_CODE, (const unsigned char *)g726_16, sizeof(g726_16)-1, NULL }; static struct PluginCodec_Definition g726CodecDefn[] = { { // encoder 40k PLUGIN_CODEC_VERSION, // codec API version &licenseInfo, // license information PluginCodec_MediaTypeAudio | // audio codec PluginCodec_InputTypeRaw | // raw input data PluginCodec_OutputTypeRaw | // raw output data PluginCodec_RTPTypeDynamic, // dynamic RTP type g726_40, // text decription L16Desc, // source format g726_40, // destination format 0, // user data 8000, // samples per second 40000, // raw bits per second 1000, // nanoseconds per frame SAMPLES_PER_FRAME, // samples per frame 5, // bytes per frame PREF_FRAMES_PER_PACKET, // recommended number of frames per packet MAX_FRAMES_PER_PACKET, // maximum number of frames per packe PAYLOAD_CODE, // IANA RTP payload code sdpG726_40, // RTP payload name create_codec, // create codec function destroy_codec, // destroy codec encoder, // encode/decode NULL, // codec controls PluginCodec_H323Codec_nonStandard, // h323CapabilityType &g726_40_Cap // h323CapabilityData }, { // decoder 40k PLUGIN_CODEC_VERSION, // codec API version &licenseInfo, // license information PluginCodec_MediaTypeAudio | // audio codec PluginCodec_InputTypeRaw | // raw input data PluginCodec_OutputTypeRaw | // raw output data PluginCodec_RTPTypeDynamic, // dynamic RTP type g726_40, // text decription g726_40, // source format L16Desc, // destination format 0, // user data 8000, // samples per second 40000, // raw bits per second 1000, // nanoseconds per frame SAMPLES_PER_FRAME, // samples per frame 5, // bytes per frame PREF_FRAMES_PER_PACKET, // recommended number of frames per packet MAX_FRAMES_PER_PACKET, // maximum number of frames per packe PAYLOAD_CODE, // IANA RTP payload code sdpG726_40, // RTP payload name create_codec, // create codec function destroy_codec, // destroy codec decoder, // encode/decode NULL, // codec controls PluginCodec_H323Codec_nonStandard, // h323CapabilityType &g726_40_Cap // h323CapabilityData }, //////////////////////////////////// { // encoder 32k PLUGIN_CODEC_VERSION, // codec API version &licenseInfo, // license information PluginCodec_MediaTypeAudioStreamed | // audio codec (4 << PluginCodec_BitsPerSamplePos) | // bits per sample PluginCodec_InputTypeRaw | // raw input data PluginCodec_OutputTypeRaw | // raw output data PluginCodec_RTPTypeExplicit, // dynamic RTP type g726_32, // text decription L16Desc, // source format g726_32, // destination format 0, // user data 8000, // samples per second 32000, // raw bits per second 1000, // nanoseconds per frame SAMPLES_PER_FRAME, // samples per frame 4, // bytes per frame PREF_FRAMES_PER_PACKET, // recommended number of frames per packet MAX_FRAMES_PER_PACKET, // maximum number of frames per packe PAYLOAD_CODE, // IANA RTP payload code sdpG726_32, // RTP payload name create_codec, // create codec function destroy_codec, // destroy codec encoder, // encode/decode NULL, // codec controls PluginCodec_H323Codec_nonStandard, // h323CapabilityType &g726_32_Cap // h323CapabilityData }, { // decoder 32k PLUGIN_CODEC_VERSION, // codec API version &licenseInfo, // license information PluginCodec_MediaTypeAudio | // audio codec PluginCodec_InputTypeRaw | // raw input data PluginCodec_OutputTypeRaw | // raw output data PluginCodec_RTPTypeExplicit, // dynamic RTP type g726_32, // text decription g726_32, // source format L16Desc, // destination format 0, // user data 8000, // samples per second 32000, // raw bits per second 1000, // nanoseconds per frame SAMPLES_PER_FRAME, // samples per frame 4, // bytes per frame PREF_FRAMES_PER_PACKET, // recommended number of frames per packet MAX_FRAMES_PER_PACKET, // maximum number of frames per packe PAYLOAD_CODE, // IANA RTP payload code sdpG726_32, // RTP payload name create_codec, // create codec function destroy_codec, // destroy codec decoder, // encode/decode NULL, // codec controls PluginCodec_H323Codec_nonStandard, // h323CapabilityType &g726_32_Cap // h323CapabilityData }, //////////////////////////////////// { // encoder 24k PLUGIN_CODEC_VERSION, // codec API version &licenseInfo, // license information PluginCodec_MediaTypeAudio | // audio codec PluginCodec_InputTypeRaw | // raw input data PluginCodec_OutputTypeRaw | // raw output data PluginCodec_RTPTypeDynamic, // dynamic RTP type g726_24, // text decription L16Desc, // source format g726_24, // destination format 0, // user data 8000, // samples per second 24000, // raw bits per second 1000, // nanoseconds per frame SAMPLES_PER_FRAME, // samples per frame 3, // bytes per frame PREF_FRAMES_PER_PACKET, // recommended number of frames per packet MAX_FRAMES_PER_PACKET, // maximum number of frames per packe PAYLOAD_CODE, // IANA RTP payload code sdpG726_24, // RTP payload name create_codec, // create codec function destroy_codec, // destroy codec encoder, // encode/decode NULL, // codec controls PluginCodec_H323Codec_nonStandard, // h323CapabilityType &g726_24_Cap // h323CapabilityData }, { // decoder 24k PLUGIN_CODEC_VERSION, // codec API version &licenseInfo, // license information PluginCodec_MediaTypeAudio | // audio codec PluginCodec_InputTypeRaw | // raw input data PluginCodec_OutputTypeRaw | // raw output data PluginCodec_RTPTypeDynamic, // dynamic RTP type g726_24, // text decription g726_24, // source format L16Desc, // destination format 0, // user data 8000, // samples per second 24000, // raw bits per second 1000, // nanoseconds per frame SAMPLES_PER_FRAME, // samples per frame 3, // bytes per frame PREF_FRAMES_PER_PACKET, // recommended number of frames per packet MAX_FRAMES_PER_PACKET, // maximum number of frames per packe PAYLOAD_CODE, // IANA RTP payload code sdpG726_32, // RTP payload name create_codec, // create codec function destroy_codec, // destroy codec decoder, // encode/decode NULL, // codec controls PluginCodec_H323Codec_nonStandard, // h323CapabilityType &g726_24_Cap // h323CapabilityData }, //////////////////////////////////// { // encoder 16k PLUGIN_CODEC_VERSION, // codec API version &licenseInfo, // license information PluginCodec_MediaTypeAudio | // audio codec PluginCodec_InputTypeRaw | // raw input data PluginCodec_OutputTypeRaw | // raw output data PluginCodec_RTPTypeDynamic, // dynamic RTP type g726_16, // text decription L16Desc, // source format g726_16, // destination format 0, // user data 8000, // samples per second 16000, // raw bits per second 1000, // nanoseconds per frame SAMPLES_PER_FRAME, // samples per frame 2, // bytes per frame PREF_FRAMES_PER_PACKET, // recommended number of frames per packet MAX_FRAMES_PER_PACKET, // maximum number of frames per packe PAYLOAD_CODE, // IANA RTP payload code sdpG726_16, // RTP payload name create_codec, // create codec function destroy_codec, // destroy codec encoder, // encode/decode NULL, // codec controls PluginCodec_H323Codec_nonStandard, // h323CapabilityType &g726_16_Cap // h323CapabilityData }, { // decoder 16k PLUGIN_CODEC_VERSION, // codec API version &licenseInfo, // license information PluginCodec_MediaTypeAudio | // audio codec PluginCodec_InputTypeRaw | // raw input data PluginCodec_OutputTypeRaw | // raw output data PluginCodec_RTPTypeDynamic, // dynamic RTP type g726_16, // text decription g726_16, // source format L16Desc, // destination format 0, // user data 8000, // samples per second 16000, // raw bits per second 1000, // nanoseconds per frame SAMPLES_PER_FRAME, // samples per frame 2, // bytes per frame PREF_FRAMES_PER_PACKET, // recommended number of frames per packet MAX_FRAMES_PER_PACKET, // maximum number of frames per packe PAYLOAD_CODE, // IANA RTP payload code sdpG726_16, // RTP payload name create_codec, // create codec function destroy_codec, // destroy codec decoder, // encode/decode NULL, // codec controls PluginCodec_H323Codec_nonStandard, // h323CapabilityType &g726_16_Cap // h323CapabilityData } }; PLUGIN_CODEC_IMPLEMENT_ALL(G726, g726CodecDefn, PLUGIN_CODEC_VERSION) ///////////////////////////////////////////////////////////////////////////// Respectfully yours, Eugene Mednikov SW Development Project Leader, IT manager Hermon Labs Phone: +972-4-6288001, 217 Mobile: +972-54-4520187 Fax: +972-4-6288277 em...@he...<mailto:em...@he...> www.hermonlabs.com<http://www.hermonlabs.com/> |