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:
parent
19e7a8db59
commit
755820d540
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue