these aren't the droids you're looking for....

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@4591 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Anthony Minessale 2007-03-14 18:53:32 +00:00
parent c99d8c9b08
commit e93047ad81
7 changed files with 127 additions and 38 deletions

View File

@ -1,3 +1,4 @@
BASE=../../../..
MODNAME=mod_shout MODNAME=mod_shout
LAME=lame-3.97 LAME=lame-3.97
SHOUT=libshout-2.2.2 SHOUT=libshout-2.2.2
@ -12,7 +13,7 @@ SHOUTLA=$(SHOUT_DIR)/src/libshout.la
CURLLA=$(CURL_DIR)/lib/libcurl.la CURLLA=$(CURL_DIR)/lib/libcurl.la
LOCAL_CFLAGS=-I$(CURL_DIR)/include -I$(SHOUT_DIR)/include -I$(LAME_DIR)/include LOCAL_CFLAGS=-I$(CURL_DIR)/include -I$(SHOUT_DIR)/include -I$(LAME_DIR)/include
LOCAL_LIBADD=$(LAMELA) $(SHOUTLA) $(CURLLA) LOCAL_LIBADD=$(LAMELA) $(SHOUTLA) -lcurl
MP3OBJS=common.o dct64_i386.o decode_ntom.o layer3.o tabinit.o interface.o MP3OBJS=common.o dct64_i386.o decode_ntom.o layer3.o tabinit.o interface.o
LOCAL_OBJS=$(MP3OBJS) LOCAL_OBJS=$(MP3OBJS)

View File

@ -88,7 +88,7 @@ int decode_header(struct frame *fr,unsigned long newhead)
fr->lay = 4-((newhead>>17)&3); fr->lay = 4-((newhead>>17)&3);
if( ((newhead>>10)&0x3) == 0x3) { if( ((newhead>>10)&0x3) == 0x3) {
//printf("Stream error\n"); debug_printf("%d Stream error\n", __LINE__);
return (0); return (0);
} }
if(fr->mpeg25) { if(fr->mpeg25) {
@ -114,7 +114,7 @@ int decode_header(struct frame *fr,unsigned long newhead)
if(!fr->bitrate_index) if(!fr->bitrate_index)
{ {
//printf("Free format not supported.\n"); debug_printf("%d Free format not supported.\n", __LINE__);
return (0); return (0);
} }
@ -129,7 +129,7 @@ int decode_header(struct frame *fr,unsigned long newhead)
fr->framesize /= freqs[fr->sampling_frequency]; fr->framesize /= freqs[fr->sampling_frequency];
fr->framesize = ((fr->framesize+fr->padding)<<2)-4; fr->framesize = ((fr->framesize+fr->padding)<<2)-4;
#else #else
//printf("Layer 1 not supported!\n"); debug_printf("%d Layer 1 not supported!\n", __LINE__);
#endif #endif
break; break;
case 2: case 2:
@ -142,7 +142,7 @@ int decode_header(struct frame *fr,unsigned long newhead)
fr->framesize /= freqs[fr->sampling_frequency]; fr->framesize /= freqs[fr->sampling_frequency];
fr->framesize += fr->padding - 4; fr->framesize += fr->padding - 4;
#else #else
//printf("Layer 2 not supported!\n"); debug_printf("%d Layer 2 not supported!\n", __LINE__);
#endif #endif
break; break;
case 3: case 3:
@ -163,7 +163,7 @@ int decode_header(struct frame *fr,unsigned long newhead)
fr->framesize = fr->framesize + fr->padding - 4; fr->framesize = fr->framesize + fr->padding - 4;
break; break;
default: default:
//printf("Sorry, unknown layer type.\n"); debug_printf("%d Sorry, unknown layer type.\n", __LINE__);
return (0); return (0);
} }
return 1; return 1;
@ -175,15 +175,15 @@ void print_header(struct frame *fr)
static char *modes[4] = { "Stereo", "Joint-Stereo", "Dual-Channel", "Single-Channel" }; static char *modes[4] = { "Stereo", "Joint-Stereo", "Dual-Channel", "Single-Channel" };
static char *layers[4] = { "Unknown" , "I", "II", "III" }; static char *layers[4] = { "Unknown" , "I", "II", "III" };
//printf("MPEG %s, Layer: %s, Freq: %ld, mode: %s, modext: %d, BPF : %d\n", debug_printf("MPEG %s, Layer: %s, Freq: %ld, mode: %s, modext: %d, BPF : %d\n",
fr->mpeg25 ? "2.5" : (fr->lsf ? "2.0" : "1.0"), fr->mpeg25 ? "2.5" : (fr->lsf ? "2.0" : "1.0"),
layers[fr->lay],freqs[fr->sampling_frequency], layers[fr->lay],freqs[fr->sampling_frequency],
modes[fr->mode],fr->mode_ext,fr->framesize+4); modes[fr->mode],fr->mode_ext,fr->framesize+4);
//printf("Channels: %d, copyright: %s, original: %s, CRC: %s, emphasis: %d.\n", debug_printf("Channels: %d, copyright: %s, original: %s, CRC: %s, emphasis: %d.\n",
fr->stereo,fr->copyright?"Yes":"No", fr->stereo,fr->copyright?"Yes":"No",
fr->original?"Yes":"No",fr->error_protection?"Yes":"No", fr->original?"Yes":"No",fr->error_protection?"Yes":"No",
fr->emphasis); fr->emphasis);
//printf("Bitrate: %d Kbits/s, Extension value: %d\n", debug_printf("Bitrate: %d Kbits/s, Extension value: %d\n",
tabsel_123[fr->lsf][fr->lay-1][fr->bitrate_index],fr->extension); tabsel_123[fr->lsf][fr->lay-1][fr->bitrate_index],fr->extension);
} }
@ -192,7 +192,7 @@ void print_header_compact(struct frame *fr)
static char *modes[4] = { "stereo", "joint-stereo", "dual-channel", "mono" }; static char *modes[4] = { "stereo", "joint-stereo", "dual-channel", "mono" };
static char *layers[4] = { "Unknown" , "I", "II", "III" }; static char *layers[4] = { "Unknown" , "I", "II", "III" };
//printf("MPEG %s layer %s, %d kbit/s, %ld Hz %s\n", debug_printf("MPEG %s layer %s, %d kbit/s, %ld Hz %s\n",
fr->mpeg25 ? "2.5" : (fr->lsf ? "2.0" : "1.0"), fr->mpeg25 ? "2.5" : (fr->lsf ? "2.0" : "1.0"),
layers[fr->lay], layers[fr->lay],
tabsel_123[fr->lsf][fr->lay-1][fr->bitrate_index], tabsel_123[fr->lsf][fr->lay-1][fr->bitrate_index],

View File

@ -28,10 +28,10 @@ static unsigned long ntom_step = NTOM_MUL;
int synth_ntom_set_step(long m,long n) int synth_ntom_set_step(long m,long n)
{ {
if(param.verbose > 1) if(param.verbose > 1)
//printf("Init rate converter: %ld->%ld\n",m,n); debug_printf("Init rate converter: %ld->%ld\n",m,n);
if(n >= 96000 || m >= 96000 || m == 0 || n == 0) { if(n >= 96000 || m >= 96000 || m == 0 || n == 0) {
//printf("NtoM converter: illegal rates\n"); debug_printf("NtoM converter: %d illegal rates\n", __LINE__);
return (1); return (1);
} }
@ -39,7 +39,7 @@ int synth_ntom_set_step(long m,long n)
ntom_step = n / m; ntom_step = n / m;
if(ntom_step > 8*NTOM_MUL) { if(ntom_step > 8*NTOM_MUL) {
//printf("max. 1:8 conversion allowed!\n"); debug_printf("%d max. 1:8 conversion allowed!\n", __LINE__);
return (1); return (1);
} }

View File

@ -5,7 +5,6 @@
#include "mpg123.h" #include "mpg123.h"
#include "mpglib.h" #include "mpglib.h"
void InitMP3Constants(void) void InitMP3Constants(void)
{ {
init_layer3_const(); init_layer3_const();
@ -55,7 +54,7 @@ static struct buf *addbuf(struct mpstr *mp,char *buf,int size)
nbuf = malloc( sizeof(struct buf) ); nbuf = malloc( sizeof(struct buf) );
if(!nbuf) { if(!nbuf) {
//printf("Out of memory!\n"); debug_printf("%d Out of memory!\n", __LINE__);
return NULL; return NULL;
} }
nbuf->pnt = malloc(size); nbuf->pnt = malloc(size);
@ -109,7 +108,7 @@ static int read_buf_byte(int *error, struct mpstr *mp)
if(!mp->tail) { if(!mp->tail) {
/* We may pick up this error a few times*/ /* We may pick up this error a few times*/
/* But things have gone pear shaped */ /* But things have gone pear shaped */
//printf("Fatal Buffer error!\n"); debug_printf("%d Fatal Buffer error!\n", __LINE__);
*error = 1; *error = 1;
return (0); return (0);
} }
@ -190,7 +189,7 @@ int decodeMP3(struct mpstr *mp,char *in,int isize,char *out,
int down_sample_sblimit; int down_sample_sblimit;
if(osize < 4608) { if(osize < 4608) {
//printf("To less out space\n"); debug_printf("%d To less out space\n", __LINE__);
return MP3_ERR; return MP3_ERR;
} }
@ -211,7 +210,7 @@ int decodeMP3(struct mpstr *mp,char *in,int isize,char *out,
if(!head_check(mp->header) ) { if(!head_check(mp->header) ) {
int i; int i;
//printf("Junk at the beginning of frame %08lx\n",mp->header); debug_printf("Junk at the beginning of frame %08lx\n",mp->header);
/* step in byte steps through next 64K */ /* step in byte steps through next 64K */
for(i=0;i<65536;i++) { for(i=0;i<65536;i++) {
@ -225,7 +224,7 @@ int decodeMP3(struct mpstr *mp,char *in,int isize,char *out,
break; break;
} }
if(i == 65536) { if(i == 65536) {
//printf("Giving up searching valid MPEG header\n"); debug_printf("%d Giving up searching valid MPEG header\n", __LINE__);
return MP3_ERR; return MP3_ERR;
} }
} }
@ -305,7 +304,7 @@ int set_pointer(struct mpstr *mp, long backstep)
{ {
unsigned char *bsbufold; unsigned char *bsbufold;
if(mp->fsizeold < 0 && backstep > 0) { if(mp->fsizeold < 0 && backstep > 0) {
//printf("Can't step back %ld!\n",backstep); debug_printf("Can't step back %ld!\n",backstep);
return MP3_ERR; return MP3_ERR;
} }
bsbufold = mp->bsspace[mp->bsnum] + 512; bsbufold = mp->bsspace[mp->bsnum] + 512;

View File

@ -324,7 +324,7 @@ static int III_get_side_info_1(struct mpstr *mp, struct III_sideinfo *si,int ste
gr_info->part2_3_length = getbits(mp, 12); gr_info->part2_3_length = getbits(mp, 12);
gr_info->big_values = getbits_fast(mp, 9); gr_info->big_values = getbits_fast(mp, 9);
if(gr_info->big_values > 288) { if(gr_info->big_values > 288) {
//printf("big_values too large!\n"); debug_printf("%d big_values too large!\n", __LINE__);
gr_info->big_values = 288; gr_info->big_values = 288;
} }
gr_info->pow2gain = gainpow2+256 - getbits_fast(mp, 8) + powdiff; gr_info->pow2gain = gainpow2+256 - getbits_fast(mp, 8) + powdiff;
@ -348,7 +348,7 @@ static int III_get_side_info_1(struct mpstr *mp, struct III_sideinfo *si,int ste
gr_info->full_gain[i] = gr_info->pow2gain + (getbits_fast(mp, 3)<<3); gr_info->full_gain[i] = gr_info->pow2gain + (getbits_fast(mp, 3)<<3);
if(gr_info->block_type == 0) { if(gr_info->block_type == 0) {
//printf("Blocktype == 0 and window-switching == 1 not allowed.\n"); debug_printf("%d Blocktype == 0 and window-switching == 1 not allowed.\n", __LINE__);
return (1); return (1);
} }
/* region_count/start parameters are implicit in this case. */ /* region_count/start parameters are implicit in this case. */
@ -399,7 +399,7 @@ static int III_get_side_info_2(struct mpstr *mp, struct III_sideinfo *si,int ste
gr_info->part2_3_length = getbits(mp, 12); gr_info->part2_3_length = getbits(mp, 12);
gr_info->big_values = getbits_fast(mp, 9); gr_info->big_values = getbits_fast(mp, 9);
if(gr_info->big_values > 288) { if(gr_info->big_values > 288) {
//printf("big_values too large!\n"); debug_printf("%d big_values too large!\n", __LINE__);
gr_info->big_values = 288; gr_info->big_values = 288;
} }
gr_info->pow2gain = gainpow2+256 - getbits_fast(mp, 8) + powdiff; gr_info->pow2gain = gainpow2+256 - getbits_fast(mp, 8) + powdiff;
@ -423,7 +423,7 @@ static int III_get_side_info_2(struct mpstr *mp, struct III_sideinfo *si,int ste
gr_info->full_gain[i] = gr_info->pow2gain + (getbits_fast(mp, 3)<<3); gr_info->full_gain[i] = gr_info->pow2gain + (getbits_fast(mp, 3)<<3);
if(gr_info->block_type == 0) { if(gr_info->block_type == 0) {
//printf("Blocktype == 0 and window-switching == 1 not allowed.\n"); debug_printf("%d Blocktype == 0 and window-switching == 1 not allowed.\n", __LINE__);
return (1); return (1);
} }
/* region_count/start parameters are implicit in this case. */ /* region_count/start parameters are implicit in this case. */
@ -963,7 +963,7 @@ static int III_dequantize_sample(struct mpstr *mp, real xr[SBLIMIT][SSLIMIT],int
if(part2remain > 0) if(part2remain > 0)
getbits(mp, part2remain); getbits(mp, part2remain);
else if(part2remain < 0) { else if(part2remain < 0) {
//printf("mpg123: Can't rewind stream by %d bits!\n",-part2remain); debug_printf("mpg123: %d Can't rewind stream by %d bits!\n",-part2remain, __LINE__);
return 1; /* -> error */ return 1; /* -> error */
} }
return 0; return 0;
@ -1374,7 +1374,7 @@ static int III_dequantize_sample_ms(real xr[2][SBLIMIT][SSLIMIT],int *scf,
if(part2remain > 0 ) if(part2remain > 0 )
getbits(mp, part2remain); getbits(mp, part2remain);
else if(part2remain < 0) { else if(part2remain < 0) {
//printf("mpg123_ms: Can't rewind stream by %d bits!\n",-part2remain); debug_printf("mpg123_ms: %d: Can't rewind stream by %d bits!\n",-part2remain, __LINE__);
return 1; /* -> error */ return 1; /* -> error */
} }
return 0; return 0;
@ -1920,7 +1920,7 @@ int do_layer3(struct mpstr *mp,unsigned char *pcm_sample,int *pcm_point)
return (MP3_ERR); return (MP3_ERR);
#else #else
//printf("Not supported\n"); debug_printf("%d Not supported\n", __LINE__);
#endif #endif
} }
@ -1941,7 +1941,7 @@ int do_layer3(struct mpstr *mp,unsigned char *pcm_sample,int *pcm_point)
#ifdef MPEG1 #ifdef MPEG1
part2bits = III_get_scale_factors_1(mp, scalefacs,gr_info); part2bits = III_get_scale_factors_1(mp, scalefacs,gr_info);
#else #else
//printf("Not supported\n"); debug_printf("%d Not supported\n", __LINE__);
#endif #endif
} }
if(III_dequantize_sample(mp, hybridIn[0], scalefacs,gr_info,sfreq,part2bits)) if(III_dequantize_sample(mp, hybridIn[0], scalefacs,gr_info,sfreq,part2bits))
@ -1956,7 +1956,7 @@ int do_layer3(struct mpstr *mp,unsigned char *pcm_sample,int *pcm_point)
#ifdef MPEG1 #ifdef MPEG1
part2bits = III_get_scale_factors_1(mp, scalefacs,gr_info); part2bits = III_get_scale_factors_1(mp, scalefacs,gr_info);
#else #else
//printf("Not supported\n"); debug_printf("%d Not supported\n", __LINE__);
#endif #endif
} }

View File

@ -39,7 +39,8 @@
#define OUTSCALE 4096 #define OUTSCALE 4096
#define MP3BUFLEN OUTSCALE * 2 #define MP3_SCACHE 16384
#define MP3_DCACHE 8192
static const char modname[] = "mod_shout"; static const char modname[] = "mod_shout";
@ -51,10 +52,15 @@ struct shout_context {
lame_global_flags *gfp; lame_global_flags *gfp;
char *stream_url; char *stream_url;
switch_mutex_t *audio_mutex; switch_mutex_t *audio_mutex;
switch_mutex_t *mp3_mutex;
switch_buffer_t *audio_buffer; switch_buffer_t *audio_buffer;
switch_buffer_t *mp3_buffer;
switch_memory_pool_t *memory_pool; switch_memory_pool_t *memory_pool;
char decode_buf[MP3BUFLEN]; //char encode_buf[MP3_SCACHE];
char decode_buf[MP3_DCACHE];
struct mpstr mp; struct mpstr mp;
int err;
int dlen;
}; };
typedef struct shout_context shout_context_t; typedef struct shout_context shout_context_t;
@ -63,7 +69,13 @@ static inline void free_context(shout_context_t *context)
{ {
if (context) { if (context) {
if (context->audio_buffer) { if (context->audio_buffer) {
switch_mutex_lock(context->audio_mutex);
switch_buffer_destroy(&context->audio_buffer); switch_buffer_destroy(&context->audio_buffer);
switch_mutex_unlock(context->audio_mutex);
}
if (context->mp3_buffer) {
switch_buffer_destroy(&context->mp3_buffer);
} }
if (context->shout) { if (context->shout) {
@ -158,17 +170,65 @@ static void log_msg(char const *fmt, va_list ap)
} }
static int wtf = -1;
static size_t stream_callback(void *ptr, size_t size, size_t nmemb, void *data) static size_t stream_callback(void *ptr, size_t size, size_t nmemb, void *data)
{ {
register unsigned int realsize = (unsigned int)(size * nmemb); register unsigned int realsize = (unsigned int)(size * nmemb);
shout_context_t *context = data; shout_context_t *context = data;
int dlen; int rlen;
char grr[1024];
decodeMP3(&context->mp, data, realsize, context->decode_buf, sizeof(context->decode_buf), &dlen); char *ass;
int decode_status = 0;
int dlen = 0;
int offset = 0;
int x = 0;
char *in;
int inlen;
char *out;
int outlen;
int usedlen;
in = ptr;
inlen = realsize;
out = context->decode_buf;
outlen = sizeof(context->decode_buf);
usedlen = 0;
do {
decode_status = decodeMP3(&context->mp, in, inlen, out, outlen, &dlen);
if (!x) {
in = NULL;
inlen = 0;
x++;
}
if (decode_status == MP3_ERR) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Decoder Error!\n");
context->err++;
return 0;
}
usedlen += dlen;
out += dlen;
outlen -= dlen;
dlen = 0;
} while (decode_status != MP3_NEED_MORE);
printf("WRITE %d\n", usedlen);
switch_mutex_lock(context->audio_mutex); switch_mutex_lock(context->audio_mutex);
switch_buffer_write(context->audio_buffer, context->decode_buf, dlen); switch_buffer_write(context->audio_buffer, context->decode_buf, usedlen);
switch_mutex_unlock(context->audio_mutex); switch_mutex_unlock(context->audio_mutex);
out = context->decode_buf;
outlen = sizeof(context->decode_buf);
printf("doh\n");
return realsize; return realsize;
} }
@ -181,6 +241,7 @@ static void *SWITCH_THREAD_FUNC stream_thread(switch_thread_t *thread, void *obj
CURL *curl_handle = NULL; CURL *curl_handle = NULL;
shout_context_t *context = (shout_context_t *) obj; shout_context_t *context = (shout_context_t *) obj;
curl_handle = curl_easy_init();
curl_easy_setopt(curl_handle, CURLOPT_URL, context->stream_url); curl_easy_setopt(curl_handle, CURLOPT_URL, context->stream_url);
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, stream_callback); curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, stream_callback);
curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)context); curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)context);
@ -244,7 +305,12 @@ static switch_status_t shout_file_open(switch_file_handle_t *handle, char *path)
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Memory Error!\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Memory Error!\n");
goto error; goto error;
} }
if (switch_buffer_create_dynamic(&context->mp3_buffer, MY_BLOCK_SIZE, MY_BUF_LEN, 0) != SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Memory Error!\n");
goto error;
}
switch_mutex_init(&context->audio_mutex, SWITCH_MUTEX_NESTED, context->memory_pool); switch_mutex_init(&context->audio_mutex, SWITCH_MUTEX_NESTED, context->memory_pool);
switch_mutex_init(&context->mp3_mutex, SWITCH_MUTEX_NESTED, context->memory_pool);
InitMP3(&context->mp, OUTSCALE); InitMP3(&context->mp, OUTSCALE);
context->stream_url = switch_core_sprintf(context->memory_pool, "http://%s", path); context->stream_url = switch_core_sprintf(context->memory_pool, "http://%s", path);
launch_stream_thread(context); launch_stream_thread(context);
@ -354,13 +420,30 @@ static switch_status_t shout_file_seek(switch_file_handle_t *handle, unsigned in
static switch_status_t shout_file_read(switch_file_handle_t *handle, void *data, size_t *len) static switch_status_t shout_file_read(switch_file_handle_t *handle, void *data, size_t *len)
{ {
shout_context_t *context = handle->private_info; shout_context_t *context = handle->private_info;
size_t bytes = *len; size_t rb = 0, bytes = *len * sizeof(int16_t);
*len = 0;
switch_mutex_lock(context->audio_mutex); switch_mutex_lock(context->audio_mutex);
*len = switch_buffer_read(context->audio_buffer, data, bytes); if (context->audio_buffer) {
rb = switch_buffer_read(context->audio_buffer, data, bytes);
} else {
context->err++;
}
switch_mutex_unlock(context->audio_mutex); switch_mutex_unlock(context->audio_mutex);
return SWITCH_STATUS_FALSE; if (context->err) {
return SWITCH_STATUS_FALSE;
}
if (rb) {
*len = rb / sizeof(int16_t);
} else {
memset(data, 255, bytes);
*len = bytes / sizeof(int16_t);
}
return SWITCH_STATUS_SUCCESS;
} }
static switch_status_t shout_file_write(switch_file_handle_t *handle, void *data, size_t *len) static switch_status_t shout_file_write(switch_file_handle_t *handle, void *data, size_t *len)
@ -455,6 +538,7 @@ SWITCH_MOD_DECLARE(switch_status_t) switch_module_load(const switch_loadable_mod
*module_interface = &shout_module_interface; *module_interface = &shout_module_interface;
shout_init(); shout_init();
InitMP3Constants();
/* indicate that the module should continue to be loaded */ /* indicate that the module should continue to be loaded */
return SWITCH_STATUS_SUCCESS; return SWITCH_STATUS_SUCCESS;

View File

@ -1,3 +1,8 @@
#ifndef DEBUG_MP3
#define debug_printf(fmt,...) printf(fmt, ##__VA_ARGS__);
#else
#define debug_printf;
#endif
struct buf { struct buf {
unsigned char *pnt; unsigned char *pnt;