Added translator check function.

git-svn-id: http://yate.null.ro/svn/yate/trunk@380 acf43c95-373e-0410-b603-e72c3f656dc1
This commit is contained in:
paulc 2005-05-31 19:42:44 +00:00
parent 19e7a8db59
commit 755820d540
4 changed files with 36 additions and 2 deletions

View File

@ -559,6 +559,32 @@ String DataTranslator::destFormats(const DataFormat& sFormat)
return s;
}
bool DataTranslator::canConvert(const DataFormat& fmt1, const DataFormat& fmt2)
{
if (fmt1 == fmt2)
return true;
// check conversions provided by SimpleTranslator
if (((fmt1 == "slin") || (fmt1 == "alaw") || (fmt1 == "mulaw")) &&
((fmt2 == "slin") || (fmt2 == "alaw") || (fmt2 == "mulaw")))
return true;
bool ok1 = false, ok2 = false;
Lock lock(s_mutex);
ObjList *l = s_factories.skipNull();
for (; l; l=l->skipNext()) {
TranslatorFactory *f = static_cast<TranslatorFactory *>(l->get());
const TranslatorCaps *caps = f->getCapabilities();
for (; caps && caps->src && caps->dest; caps++) {
if ((!ok1) && (fmt1 == caps->src->name) && (fmt2 == caps->dest->name))
ok1 = true;
if ((!ok2) && (fmt2 == caps->src->name) && (fmt1 == caps->dest->name))
ok2 = true;
if (ok1 && ok2)
return true;
}
}
return false;
}
int DataTranslator::cost(const DataFormat& sFormat, const DataFormat& dFormat)
{
int c = -1;

View File

@ -215,7 +215,7 @@ void IAXEndPoint::Setup(void)
int frm = 0;
bool def = s_cfg.getBoolValue("formats","default",true);
for (int i = 0; dict_iaxformats[i].token; i++) {
if (s_cfg.getBoolValue("formats",dict_iaxformats[i].token,def)) {
if (s_cfg.getBoolValue("formats",dict_iaxformats[i].token,def && DataTranslator::canConvert(dict_iaxformats[i].token))) {
// TODO: check if we have a translator for this format
frm |= dict_iaxformats[i].value;
}

View File

@ -239,7 +239,7 @@ static void parseSDP(SDPBody* sdp, String& addr, String& port, String& formats)
var = -1;
tmp >> " " >> var;
const char* payload = lookup(var,dict_payloads);
if (payload && s_cfg.getBoolValue("codecs",payload,defcodecs)) {
if (payload && s_cfg.getBoolValue("codecs",payload,defcodecs && DataTranslator::canConvert(payload))) {
if (fmt)
fmt << ",";
fmt << payload;

View File

@ -518,6 +518,14 @@ public:
*/
static String destFormats(const DataFormat& sFormat = "slin");
/**
* Check if bidirectional conversion can be performed by installed translators
* @param fmt1 Name of the first data format
* @param fmt2 Name of the second data format
* @return True if translators can be created for both directions
*/
static bool canConvert(const DataFormat& fmt1, const DataFormat& fmt2 = "slin");
/**
* Finds the cost of a translator given the source and destination format names
* @param sFormat Name of the source format (data received from the consumer)