提交 8543778b authored 作者: Anthony Minessale's avatar Anthony Minessale

pack this mutha %^%$^&

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@2483 d0543943-73ff-0310-b7d9-9358b9ac24b2
上级 1bfe008b
/*
* FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
* Copyright (C) 2005/2006, Anthony Minessale II <anthmct@yahoo.com>
*
* Version: MPL 1.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
*
* The Initial Developer of the Original Code is
* Anthony Minessale II <anthmct@yahoo.com>
* Portions created by the Initial Developer are Copyright (C)
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Anthony Minessale II <anthmct@yahoo.com>
*
*
* switch_utils.h -- Compatability and Helper Code
*
*/
/*! \file switch_bitpack.h
\brief BITPACKING code for RFC3551 and AAL2 packing
*/
#ifndef SWITCH_BITPACK_H
#define SWITCH_BITPACK_H
BEGIN_EXTERN_C
#include <switch.h>
#ifdef DEBUG_BITS
static char bb[80] = "";
static inline char *print_bits(switch_byte_t byte, char *x)
{
int i,j = 0;
x[j++] = '[';
for (i=7;i>=0;i--) {
x[j++] = (byte & (1 << i)) ? '1' : '0';
}
x[j++] = ']';
x[j++] = '\0';
return x;
}
#endif
/*!
\defgroup bp1 Bitpacking
\ingroup core1
\{
*/
static const int8_t SWITCH_BITPACKED_MASKS[] = {0, 1, 3, 7, 15, 31, 63, 127, 255};
static const int8_t SWITCH_REVERSE_BITPACKED_MASKS[] = {255, 254, 252, 248, 240, 224, 192, 128};
/*!
\brief Initialize a bitpack object
\param pack the pack object
\param bitlen the number of bits per packet
\param buf the buffer to use for storage
\param buflen the length of the storage buffer
\param mode RFC3551 or AAL2 mode (curse you backwards folks)
*/
static inline void switch_bitpack_init(switch_bitpack_t *pack, int32_t bitlen, switch_byte_t *buf, uint32_t buflen, switch_bitpack_mode_t mode)
{
memset(pack, 0, sizeof(*pack));
memset(buf, 0, buflen);
pack->frame_bits = bitlen;
pack->buf = buf;
pack->buflen = buflen;
pack->cur = pack->buf;
pack->mode = mode;
}
static inline void pack_check_over(switch_bitpack_t *pack)
{
switch_byte_t this = pack->this;
if (pack->over) {
pack->bits_cur = pack->over;
if (pack->mode == SWITCH_BITPACK_MODE_RFC3551) {
this &= SWITCH_BITPACKED_MASKS[pack->over];
this <<= pack->under;
*pack->cur |= this;
pack->cur++;
} else {
switch_byte_t mask = SWITCH_BITS_PER_BYTE - pack->over;
this &= SWITCH_REVERSE_BITPACKED_MASKS[mask];
this >>= mask;
*pack->cur <<= pack->over;
*pack->cur |= this;
pack->cur++;
}
pack->bytes++;
pack->over = pack->under = 0;
}
}
/*!
\brief finalize a bitpack object
\param pack the pack/unpack object
*/
static inline int8_t switch_bitpack_done(switch_bitpack_t *pack)
{
if (pack->bits_cur && pack->bits_cur < SWITCH_BITS_PER_BYTE) {
pack->bytes++;
if (pack->mode == SWITCH_BITPACK_MODE_AAL2) {
*pack->cur <<= SWITCH_BITS_PER_BYTE - pack->bits_cur;
}
}
if (pack->over) {
pack_check_over(pack);
}
return 0;
}
/*!
\brief pull data out of a bitpack object into it's buffer
\param unpack the pack/unpack object
\param in a 1 byte int packed with bits
\return -1 if the buffer is full otherwise 0
*/
static inline int8_t switch_bitpack_out(switch_bitpack_t *unpack, switch_byte_t in)
{
switch_byte_t this;
if (unpack->cur - unpack->buf > unpack->buflen) {
return -1;
}
unpack->bits_cur = 0;
unpack->this = this = in;
pack_check_over(unpack);
while(unpack->bits_cur <= SWITCH_BITS_PER_BYTE) {
switch_byte_t next = unpack->bits_cur + unpack->frame_bits;
switch_byte_t under_in;
switch_byte_t mask;
this = unpack->this;
if (next > SWITCH_BITS_PER_BYTE) {
unpack->over = next - SWITCH_BITS_PER_BYTE;
unpack->under = unpack->frame_bits - unpack->over;
if (unpack->mode == SWITCH_BITPACK_MODE_RFC3551) {
mask = SWITCH_BITS_PER_BYTE - unpack->under;
under_in = this & SWITCH_REVERSE_BITPACKED_MASKS[mask];
under_in >>= mask;
*unpack->cur |= under_in;
} else {
mask = unpack->under;
under_in = this & SWITCH_BITPACKED_MASKS[mask];
*unpack->cur <<= mask;
*unpack->cur |= under_in;
}
break;
}
if (unpack->mode == SWITCH_BITPACK_MODE_RFC3551) {
this >>= unpack->bits_cur;
this &= SWITCH_BITPACKED_MASKS[unpack->frame_bits];
*unpack->cur |= this;
unpack->cur++;
} else {
this >>= (SWITCH_BITS_PER_BYTE - next);
this &= SWITCH_BITPACKED_MASKS[unpack->frame_bits];
*unpack->cur |= this;
unpack->cur++;
}
unpack->bits_cur = next;
unpack->bytes++;
}
return 0;
}
/*!
\brief pack data into a bitpack object's buffer
\param pack the pack/unpack object
\param in a 1 byte int with 1 packet worth of bits
\return -1 if the buffer is full otherwise 0
*/
static inline int8_t switch_bitpack_in(switch_bitpack_t *pack, switch_byte_t in)
{
int next = pack->bits_cur + pack->frame_bits;
if (pack->cur - pack->buf > pack->buflen) {
return -1;
}
pack->bits_tot += pack->frame_bits;
if (next > SWITCH_BITS_PER_BYTE) {
int a = 0, b = 0, rem, nxt;
rem = SWITCH_BITS_PER_BYTE - pack->bits_cur;
nxt = pack->frame_bits - rem ;
if (pack->mode == SWITCH_BITPACK_MODE_RFC3551) {
a = in & SWITCH_BITPACKED_MASKS[rem];
b = in >> rem;
a <<= pack->shiftby;
*pack->cur |= a;
pack->cur++;
*pack->cur |= b;
pack->bits_cur = pack->shiftby = nxt;
} else {
a = in >> nxt;
b = in & SWITCH_BITPACKED_MASKS[nxt];
*pack->cur <<= rem;
*pack->cur |= a;
pack->cur++;
*pack->cur |= b;
pack->bits_cur = nxt;
}
pack->bytes++;
} else {
if (pack->mode == SWITCH_BITPACK_MODE_RFC3551) {
in <<= pack->shiftby;
*pack->cur |= in;
pack->shiftby += pack->frame_bits;
} else {
*pack->cur <<= pack->frame_bits;
*pack->cur |= in;
}
if (next == SWITCH_BITS_PER_BYTE) {
pack->cur++;
pack->bytes++;
pack->bits_cur = pack->shiftby = 0;
} else {
pack->bits_cur = next;
}
}
return 0;
}
///\}
END_EXTERN_C
#endif
...@@ -72,6 +72,32 @@ BEGIN_EXTERN_C ...@@ -72,6 +72,32 @@ BEGIN_EXTERN_C
#define SWITCH_HTDOCS_DIR SWITCH_PREFIX_DIR SWITCH_PATH_SEPARATOR "htdocs" #define SWITCH_HTDOCS_DIR SWITCH_PREFIX_DIR SWITCH_PATH_SEPARATOR "htdocs"
#endif #endif
#define SWITCH_BITS_PER_BYTE 8
typedef uint8_t switch_byte_t;
typedef enum {
SWITCH_BITPACK_MODE_RFC3551,
SWITCH_BITPACK_MODE_AAL2
} switch_bitpack_mode_t;
typedef struct {
switch_byte_t *buf;
uint32_t buflen;
switch_byte_t *cur;
uint32_t bytes;
uint32_t bits_tot;
switch_byte_t bits_cur;
switch_byte_t bits_rem;
switch_byte_t frame_bits;
switch_byte_t shiftby;
switch_byte_t this;
switch_byte_t under;
switch_byte_t over;
switch_bitpack_mode_t mode;
} switch_bitpack_t;
struct switch_directories { struct switch_directories {
char *base_dir; char *base_dir;
char *mod_dir; char *mod_dir;
...@@ -417,6 +443,7 @@ SWITCH_CODEC_FLAG_SILENCE_START = (1 << 2) - Start period of silence ...@@ -417,6 +443,7 @@ SWITCH_CODEC_FLAG_SILENCE_START = (1 << 2) - Start period of silence
SWITCH_CODEC_FLAG_SILENCE_STOP = (1 << 3) - End period of silence SWITCH_CODEC_FLAG_SILENCE_STOP = (1 << 3) - End period of silence
SWITCH_CODEC_FLAG_SILENCE = (1 << 4) - Silence SWITCH_CODEC_FLAG_SILENCE = (1 << 4) - Silence
SWITCH_CODEC_FLAG_FREE_POOL = (1 << 5) - Free codec's pool on destruction SWITCH_CODEC_FLAG_FREE_POOL = (1 << 5) - Free codec's pool on destruction
SWITCH_CODEC_FLAG_AAL2 = (1 << 6) - USE AAL2 Bitpacking
</pre> </pre>
*/ */
typedef enum { typedef enum {
...@@ -426,7 +453,7 @@ typedef enum { ...@@ -426,7 +453,7 @@ typedef enum {
SWITCH_CODEC_FLAG_SILENCE_STOP = (1 << 3), SWITCH_CODEC_FLAG_SILENCE_STOP = (1 << 3),
SWITCH_CODEC_FLAG_SILENCE = (1 << 4), SWITCH_CODEC_FLAG_SILENCE = (1 << 4),
SWITCH_CODEC_FLAG_FREE_POOL = (1 << 5), SWITCH_CODEC_FLAG_FREE_POOL = (1 << 5),
SWITCH_CODEC_FLAG_AAL2 = (1 << 6)
} switch_codec_flag_t; } switch_codec_flag_t;
......
...@@ -5,7 +5,7 @@ all: depends $(MODNAME).$(DYNAMIC_LIB_EXTEN) ...@@ -5,7 +5,7 @@ all: depends $(MODNAME).$(DYNAMIC_LIB_EXTEN)
depends: depends:
MAKE=$(MAKE) $(BASE)/build/buildlib.sh $(BASE) install codec/g726 --prefix=$(PREFIX) MAKE=$(MAKE) $(BASE)/build/buildlib.sh $(BASE) install codec/g726 --prefix=$(PREFIX)
$(MODNAME).$(DYNAMIC_LIB_EXTEN): $(MODNAME).c $(MODNAME).$(DYNAMIC_LIB_EXTEN): $(MODNAME).c ../../../include/switch_bitpack.h
$(CC) $(CFLAGS) -fPIC -c $(MODNAME).c -o $(MODNAME).o $(CC) $(CFLAGS) -fPIC -c $(MODNAME).c -o $(MODNAME).o
$(CC) $(SOLINK) $(MODNAME).o -o $(MODNAME).$(DYNAMIC_LIB_EXTEN) $(LDFLAGS) $(CC) $(SOLINK) $(MODNAME).o -o $(MODNAME).$(DYNAMIC_LIB_EXTEN) $(LDFLAGS)
......
...@@ -125,6 +125,7 @@ struct sofia_profile { ...@@ -125,6 +125,7 @@ struct sofia_profile {
su_root_t *s_root; su_root_t *s_root;
sip_alias_node_t *aliases; sip_alias_node_t *aliases;
switch_payload_t te; switch_payload_t te;
uint32_t codec_flags;
}; };
...@@ -300,7 +301,7 @@ static void set_local_sdp(private_object_t *tech_pvt) ...@@ -300,7 +301,7 @@ static void set_local_sdp(private_object_t *tech_pvt)
for (i = 0; i < tech_pvt->num_codecs; i++) { for (i = 0; i < tech_pvt->num_codecs; i++) {
const switch_codec_implementation_t *imp = tech_pvt->codecs[i]; const switch_codec_implementation_t *imp = tech_pvt->codecs[i];
snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "a=rtpmap:%d %s/%d\n", imp->ianacode, imp->iananame, imp->samples_per_second); snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "a=rtpmap:%d %s/%d\n", imp->ianacode, imp->iananame, imp->samples_per_second);
snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "a=ptime:%d", imp->microseconds_per_frame / 1000); snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "a=ptime:%d\n", imp->microseconds_per_frame / 1000);
} }
} }
...@@ -607,7 +608,7 @@ static switch_status_t tech_set_codec(private_object_t *tech_pvt) ...@@ -607,7 +608,7 @@ static switch_status_t tech_set_codec(private_object_t *tech_pvt)
tech_pvt->rm_rate, tech_pvt->rm_rate,
tech_pvt->codec_ms, tech_pvt->codec_ms,
1, 1,
SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE | tech_pvt->profile->codec_flags,
NULL, NULL,
switch_core_session_get_pool(tech_pvt->session)) != SWITCH_STATUS_SUCCESS) { switch_core_session_get_pool(tech_pvt->session)) != SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't load codec?\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't load codec?\n");
...@@ -619,7 +620,7 @@ static switch_status_t tech_set_codec(private_object_t *tech_pvt) ...@@ -619,7 +620,7 @@ static switch_status_t tech_set_codec(private_object_t *tech_pvt)
tech_pvt->rm_rate, tech_pvt->rm_rate,
tech_pvt->codec_ms, tech_pvt->codec_ms,
1, 1,
SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE | tech_pvt->profile->codec_flags,
NULL, NULL,
switch_core_session_get_pool(tech_pvt->session)) != SWITCH_STATUS_SUCCESS) { switch_core_session_get_pool(tech_pvt->session)) != SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't load codec?\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't load codec?\n");
...@@ -1683,6 +1684,10 @@ static switch_status_t config_sofia(int reload) ...@@ -1683,6 +1684,10 @@ static switch_status_t config_sofia(int reload)
profile->sipdomain = switch_core_strdup(profile->pool, val); profile->sipdomain = switch_core_strdup(profile->pool, val);
} else if (!strcmp(var, "ext-sip-ip")) { } else if (!strcmp(var, "ext-sip-ip")) {
profile->extsipip = switch_core_strdup(profile->pool, val); profile->extsipip = switch_core_strdup(profile->pool, val);
} else if (!strcmp(var, "bitpacking")) {
if (!strcasecmp(val, "aal2")) {
profile->codec_flags = SWITCH_CODEC_FLAG_AAL2;
}
} else if (!strcmp(var, "username")) { } else if (!strcmp(var, "username")) {
profile->username = switch_core_strdup(profile->pool, val); profile->username = switch_core_strdup(profile->pool, val);
} else if (!strcmp(var, "context")) { } else if (!strcmp(var, "context")) {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论