⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 alaw.c

📁 基于osip、eXosip、speex、ffmpeg的VoIP源代码
💻 C
字号:
/*mediastreamer2 library - modular sound and video processing and streamingCopyright (C) 2006  Simon MORLAT (simon.morlat@linphone.org)This program is free software; you can redistribute it and/ormodify it under the terms of the GNU General Public Licenseas published by the Free Software Foundation; either version 2of the License, or (at your option) any later version.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program; if not, write to the Free SoftwareFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.*/#include "mediastreamer2/msfilter.h"#include "g711common.h"typedef struct _AlawEncData{	MSBufferizer *bz;	int ptime;	uint32_t ts;} AlawEncData;static AlawEncData * alaw_enc_data_new(){	AlawEncData *obj=(AlawEncData *)ms_new(AlawEncData,1);	obj->bz=ms_bufferizer_new();	obj->ptime=0;	obj->ts=0;	return obj;}static void alaw_enc_data_destroy(AlawEncData *obj){	ms_bufferizer_destroy(obj->bz);	ms_free(obj);}static void alaw_enc_init(MSFilter *obj){	obj->data=alaw_enc_data_new();}static void alaw_enc_uninit(MSFilter *obj){	alaw_enc_data_destroy((AlawEncData*)obj->data);}static void alaw_enc_process(MSFilter *obj){	AlawEncData *dt=(AlawEncData*)obj->data;	MSBufferizer *bz=dt->bz;	uint8_t buffer[2240];	int frame_per_packet=2;	int size_of_pcm=320;	mblk_t *m;		if (dt->ptime>=10)	{		frame_per_packet = dt->ptime/10;	}	if (frame_per_packet<=0)		frame_per_packet=1;	if (frame_per_packet>14) /* 7*20 == 140 ms max */		frame_per_packet=14;	size_of_pcm = 160*frame_per_packet; /* ex: for 20ms -> 160*2==320 */	while((m=ms_queue_get(obj->inputs[0]))!=NULL){		ms_bufferizer_put(bz,m);	}	while (ms_bufferizer_read(bz,buffer,size_of_pcm)==size_of_pcm){		mblk_t *o=allocb(size_of_pcm/2,0);		int i;		for (i=0;i<size_of_pcm/2;i++){			*o->b_wptr=s16_to_alaw(((int16_t*)buffer)[i]);			o->b_wptr++;		}		mblk_set_timestamp_info(o,dt->ts);		dt->ts+=size_of_pcm/2;		ms_queue_put(obj->outputs[0],o);	}}static int enc_add_fmtp(MSFilter *f, void *arg){	const char *fmtp=(const char *)arg;	AlawEncData *s=(AlawEncData*)f->data;	char tmp[30];	if (fmtp_get_value(fmtp,"ptime",tmp,sizeof(tmp))){		s->ptime=atoi(tmp);		ms_message("MSAlawEnc: got ptime=%i",s->ptime);	}	return 0;}static int enc_add_attr(MSFilter *f, void *arg){	const char *fmtp=(const char *)arg;	AlawEncData *s=(AlawEncData*)f->data;	if (strstr(fmtp,"ptime:10")!=NULL){		s->ptime=10;	}else if (strstr(fmtp,"ptime:20")!=NULL){		s->ptime=20;	}else if (strstr(fmtp,"ptime:30")!=NULL){		s->ptime=30;	}else if (strstr(fmtp,"ptime:40")!=NULL){		s->ptime=40;	}else if (strstr(fmtp,"ptime:50")!=NULL){		s->ptime=50;	}else if (strstr(fmtp,"ptime:60")!=NULL){		s->ptime=60;	}else if (strstr(fmtp,"ptime:70")!=NULL){		s->ptime=70;	}else if (strstr(fmtp,"ptime:80")!=NULL){		s->ptime=80;	}else if (strstr(fmtp,"ptime:90")!=NULL){		s->ptime=90;	}else if (strstr(fmtp,"ptime:100")!=NULL){		s->ptime=100;	}else if (strstr(fmtp,"ptime:110")!=NULL){		s->ptime=110;	}else if (strstr(fmtp,"ptime:120")!=NULL){		s->ptime=120;	}else if (strstr(fmtp,"ptime:130")!=NULL){		s->ptime=130;	}else if (strstr(fmtp,"ptime:140")!=NULL){		s->ptime=140;	}	return 0;}static MSFilterMethod enc_methods[]={	{	MS_FILTER_ADD_ATTR		,	enc_add_attr},	{	MS_FILTER_ADD_FMTP		,	enc_add_fmtp},	{	0				,	NULL		}};#ifdef _MSC_VERMSFilterDesc ms_alaw_enc_desc={	MS_ALAW_ENC_ID,	"MSAlawEnc",	"ITU-G.711 alaw encoder",	MS_FILTER_ENCODER,	"pcma",	1,	1,	alaw_enc_init,	NULL,    alaw_enc_process,	NULL,    alaw_enc_uninit,	enc_methods};#elseMSFilterDesc ms_alaw_enc_desc={	.id=MS_ALAW_ENC_ID,	.name="MSAlawEnc",	.text="ITU-G.711 alaw encoder",	.category=MS_FILTER_ENCODER,	.enc_fmt="pcma",	.ninputs=1,	.noutputs=1,	.init=alaw_enc_init,	.process=alaw_enc_process,	.uninit=alaw_enc_uninit,	.methods=enc_methods};#endifstatic void alaw_dec_process(MSFilter *obj){	mblk_t *m;	while((m=ms_queue_get(obj->inputs[0]))!=NULL){		mblk_t *o;		msgpullup(m,-1);		o=allocb((m->b_wptr-m->b_rptr)*2,0);		for(;m->b_rptr<m->b_wptr;m->b_rptr++,o->b_wptr+=2){			*((int16_t*)(o->b_wptr))=alaw_to_s16(*m->b_rptr);		}		freemsg(m);		ms_queue_put(obj->outputs[0],o);	}}#ifdef _MSC_VERMSFilterDesc ms_alaw_dec_desc={	MS_ALAW_DEC_ID,	"MSAlawDec",	"ITU-G.711 alaw decoder",	MS_FILTER_DECODER,	"pcma",	1,	1,	NULL,    NULL,    alaw_dec_process,    NULL,    NULL};#elseMSFilterDesc ms_alaw_dec_desc={	.id=MS_ALAW_DEC_ID,	.name="MSAlawDec",	.text="ITU-G.711 alaw decoder",	.category=MS_FILTER_DECODER,	.enc_fmt="pcma",	.ninputs=1,	.noutputs=1,	.process=alaw_dec_process,};#endifMS_FILTER_DESC_EXPORT(ms_alaw_dec_desc)MS_FILTER_DESC_EXPORT(ms_alaw_enc_desc)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -