Update to new rfc5574.

remove old draft parameter
use correct mode format
set correct relationship between mode & configuration

git-svn-id: svn+ssh://svn.savannah.nongnu.org/linphone/trunk@507 3f6dc0c8-ddfe-455d-9043-3cd528dc4637
This commit is contained in:
aymeric 2009-06-28 17:18:27 +00:00
parent 06f329cb1a
commit 386d602b3d

View file

@ -25,7 +25,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include <malloc.h> /* for alloca */ #include <malloc.h> /* for alloca */
#endif #endif
typedef struct EncState{ typedef struct SpeexEncState{
int rate; int rate;
int bitrate; int bitrate;
int maxbitrate; int maxbitrate;
@ -37,16 +37,16 @@ typedef struct EncState{
void *state; void *state;
uint32_t ts; uint32_t ts;
MSBufferizer *bufferizer; MSBufferizer *bufferizer;
} EncState; } SpeexEncState;
static void enc_init(MSFilter *f){ static void enc_init(MSFilter *f){
EncState *s=(EncState *)ms_new(EncState,1); SpeexEncState *s=(SpeexEncState *)ms_new(SpeexEncState,1);
s->rate=8000; s->rate=8000;
s->bitrate=-1; s->bitrate=-1;
s->maxbitrate=-1; s->maxbitrate=-1;
s->ptime=0; s->ptime=0;
s->mode=0; s->mode=-1;
s->vbr=1; s->vbr=0;
s->cng=0; s->cng=0;
s->frame_size=0; s->frame_size=0;
s->state=0; s->state=0;
@ -56,7 +56,7 @@ static void enc_init(MSFilter *f){
} }
static void enc_uninit(MSFilter *f){ static void enc_uninit(MSFilter *f){
EncState *s=(EncState*)f->data; SpeexEncState *s=(SpeexEncState*)f->data;
if (s==NULL) if (s==NULL)
return; return;
ms_bufferizer_destroy(s->bufferizer); ms_bufferizer_destroy(s->bufferizer);
@ -66,7 +66,7 @@ static void enc_uninit(MSFilter *f){
} }
static void enc_preprocess(MSFilter *f){ static void enc_preprocess(MSFilter *f){
EncState *s=(EncState*)f->data; SpeexEncState *s=(SpeexEncState*)f->data;
const SpeexMode *mode=NULL; const SpeexMode *mode=NULL;
int _mode=0; int _mode=0;
@ -113,8 +113,19 @@ static void enc_preprocess(MSFilter *f){
} }
if (s->rate==8000){ if (s->rate==8000){
if (s->mode!=0){/* mode is set*/ //+------+---------------+-------------+
if (s->mode<=0 || s->mode>=9) //| mode | Speex quality | bit-rate |
//+------+---------------+-------------+
//| 1 | 0 | 2.15 kbit/s |
//| 2 | 2 | 5.95 kbit/s |
//| 3 | 3 or 4 | 8.00 kbit/s |
//| 4 | 5 or 6 | 11.0 kbit/s |
//| 5 | 7 or 8 | 15.0 kbit/s |
//| 6 | 9 | 18.2 kbit/s |
//| 7 | 10 | 24.6 kbit/s |
//| 8 | 1 | 3.95 kbit/s |
//+------+---------------+-------------+
if (s->mode<=0 || s->mode>8)
s->mode = 3; /* default mode */ s->mode = 3; /* default mode */
if (s->mode==1) if (s->mode==1)
@ -140,52 +151,31 @@ static void enc_preprocess(MSFilter *f){
} }
} }
} }
} else if (s->rate==16000 || s->rate==32000){
else if (s->rate==16000){ //+------+---------------+-------------------+------------------------+
if (s->mode!=0){ //| mode | Speex quality | wideband bit-rate | ultra wideband |
//| | | | bit-rate |
//+------+---------------+-------------------+------------------------+
//| 0 | 0 | 3.95 kbit/s | 5.75 kbit/s |
//| 1 | 1 | 5.75 kbit/s | 7.55 kbit/s |
//| 2 | 2 | 7.75 kbit/s | 9.55 kbit/s |
//| 3 | 3 | 9.80 kbit/s | 11.6 kbit/s |
//| 4 | 4 | 12.8 kbit/s | 14.6 kbit/s |
//| 5 | 5 | 16.8 kbit/s | 18.6 kbit/s |
//| 6 | 6 | 20.6 kbit/s | 22.4 kbit/s |
//| 7 | 7 | 23.8 kbit/s | 25.6 kbit/s |
//| 8 | 8 | 27.8 kbit/s | 29.6 kbit/s |
//| 9 | 9 | 34.2 kbit/s | 36.0 kbit/s |
//| 10 | 10 | 42.2 kbit/s | 44.0 kbit/s |
//+------+---------------+-------------------+------------------------+
int q=0; int q=0;
s->bitrate = -1; /* 28000; */ if (s->mode<0 || s->mode>10)
if (s->mode<=0 || s->mode>=8) s->mode = 8; /* default mode */
s->mode = 6; /* default mode */ q=s->mode;
/* no table exist for wide and ultra:
From libspeex/mode.c, those values seems to make sense... */
if (s->mode<=5)
q=5;
else if (s->mode==5)
q=6;
else if (s->mode==6)
q=8;
else if (s->mode>=7)
q=10;
if (speex_encoder_ctl(s->state,SPEEX_SET_QUALITY,&q)!=0){ if (speex_encoder_ctl(s->state,SPEEX_SET_QUALITY,&q)!=0){
ms_error("Could not set quality %i to speex encoder.",q); ms_error("Could not set quality %i to speex encoder.",q);
} }
} }
}
else
{
if (s->mode!=0){
int q=0;
s->bitrate = -1; /* 28000; */
if (s->mode<=0 || s->mode>=8)
s->mode = 6; /* default mode */
/* no table exist for wide and ultra:
From libspeex/mode.c, those values seems to make sense... */
if (s->mode<=5)
q=5;
else if (s->mode==5)
q=6;
else if (s->mode==6)
q=8;
else if (s->mode>=7)
q=10;
if (speex_encoder_ctl(s->state,SPEEX_SET_QUALITY,&q)!=0){
ms_error("Could not set quality %i to speex encoder.",q);
}
}
}
if (s->maxbitrate>0){ if (s->maxbitrate>0){
/* convert from network bitrate to codec bitrate:*/ /* convert from network bitrate to codec bitrate:*/
@ -204,7 +194,7 @@ static void enc_preprocess(MSFilter *f){
} }
static void enc_process(MSFilter *f){ static void enc_process(MSFilter *f){
EncState *s=(EncState*)f->data; SpeexEncState *s=(SpeexEncState*)f->data;
mblk_t *im; mblk_t *im;
int nbytes; int nbytes;
uint8_t *buf; uint8_t *buf;
@ -250,20 +240,20 @@ static void enc_process(MSFilter *f){
} }
static void enc_postprocess(MSFilter *f){ static void enc_postprocess(MSFilter *f){
EncState *s=(EncState*)f->data; SpeexEncState *s=(SpeexEncState*)f->data;
speex_encoder_destroy(s->state); speex_encoder_destroy(s->state);
s->state=NULL; s->state=NULL;
} }
static int enc_set_sr(MSFilter *f, void *arg){ static int enc_set_sr(MSFilter *f, void *arg){
EncState *s=(EncState*)f->data; SpeexEncState *s=(SpeexEncState*)f->data;
/* TODO: should be done with fmtp parameter */ /* TODO: should be done with fmtp parameter */
s->rate=((int*)arg)[0]; s->rate=((int*)arg)[0];
return 0; return 0;
} }
static int enc_set_br(MSFilter *f, void *arg){ static int enc_set_br(MSFilter *f, void *arg){
EncState *s=(EncState*)f->data; SpeexEncState *s=(SpeexEncState*)f->data;
s->maxbitrate=((int*)arg)[0]; s->maxbitrate=((int*)arg)[0];
return 0; return 0;
} }
@ -271,29 +261,7 @@ static int enc_set_br(MSFilter *f, void *arg){
static int enc_add_fmtp(MSFilter *f, void *arg){ static int enc_add_fmtp(MSFilter *f, void *arg){
char buf[64]; char buf[64];
const char *fmtp=(const char *)arg; const char *fmtp=(const char *)arg;
EncState *s=(EncState*)f->data; SpeexEncState *s=(SpeexEncState*)f->data;
memset(buf, '\0', sizeof(buf));
fmtp_get_value(fmtp, "sr", buf, sizeof(buf));
if (buf[0]=='\0'){
}
else {
s->rate = atoi(buf);
}
memset(buf, '\0', sizeof(buf));
fmtp_get_value(fmtp, "ebw", buf, sizeof(buf));
if (buf[0]=='\0'){
}
else if (strstr(buf,"narrow")!=NULL){
s->rate = 8000;
}
else if (strstr(buf,"wide")!=NULL){
s->rate = 16000;
}
else if (strstr(buf,"ultra")!=NULL){
s->rate = 32000;
}
memset(buf, '\0', sizeof(buf)); memset(buf, '\0', sizeof(buf));
fmtp_get_value(fmtp, "vbr", buf, sizeof(buf)); fmtp_get_value(fmtp, "vbr", buf, sizeof(buf));
@ -317,33 +285,37 @@ static int enc_add_fmtp(MSFilter *f, void *arg){
s->cng=0; s->cng=0;
} }
else if (strstr(buf,"on")!=NULL){ else if (strstr(buf,"on")!=NULL){
s->vbr=1; s->cng=1;
} }
memset(buf, '\0', sizeof(buf)); memset(buf, '\0', sizeof(buf));
fmtp_get_value(fmtp, "mode", buf, sizeof(buf)); fmtp_get_value(fmtp, "mode", buf, sizeof(buf));
if (buf[0]=='\0'){ if (buf[0]=='\0' || buf[1]=='\0'){
} }
else if (strstr(buf,"any")!=NULL){ else if (buf[0]=='0' || (buf[0]=='"' && buf[1]=='0')){
s->mode=10; s->mode=0;
}
else if (buf[0]=='"' && atoi(buf+1)>=0){
s->mode=atoi(buf+1);
}
else if (buf[0]!='"' && atoi(buf)>=0){
s->mode=atoi(buf);
} }
else { else {
s->mode = atoi(buf); s->mode = -1; /* deault mode */
if (s->mode<=0 || s->mode>=8)
s->mode = 3;
} }
return 0; return 0;
} }
static int enc_add_attr(MSFilter *f, void *arg){ static int enc_add_attr(MSFilter *f, void *arg){
const char *fmtp=(const char *)arg; const char *fmtp=(const char *)arg;
EncState *s=(EncState*)f->data; SpeexEncState *s=(SpeexEncState*)f->data;
if (strstr(fmtp,"ptime:10")!=NULL){ if (strstr(fmtp,"ptime:10")!=NULL){
s->ptime=20; s->ptime=20;
}else if (strstr(fmtp,"ptime:20")!=NULL){ }else if (strstr(fmtp,"ptime:20")!=NULL){
s->ptime=20; s->ptime=20;
}else if (strstr(fmtp,"ptime:30")!=NULL){ }else if (strstr(fmtp,"ptime:30")!=NULL){
s->ptime=40; /* not allowed */ s->ptime=40;
}else if (strstr(fmtp,"ptime:40")!=NULL){ }else if (strstr(fmtp,"ptime:40")!=NULL){
s->ptime=40; s->ptime=40;
}else if (strstr(fmtp,"ptime:50")!=NULL){ }else if (strstr(fmtp,"ptime:50")!=NULL){