📄 mediafmt.cxx
字号:
m_value(value)
{
if (m_value >= count)
m_value = count;
}
PObject * OpalMediaOptionEnum::Clone() const
{
return new OpalMediaOptionEnum(*this);
}
void OpalMediaOptionEnum::PrintOn(ostream & strm) const
{
if (m_value < m_enumerations.GetSize())
strm << m_enumerations[m_value];
else
strm << m_value;
}
void OpalMediaOptionEnum::ReadFrom(istream & strm)
{
PCaselessString str;
while (strm.good()) {
char ch;
strm.get(ch);
str += ch;
for (PINDEX i = 0; i < m_enumerations.GetSize(); i++) {
if (str == m_enumerations[i]) {
m_value = i;
return;
}
}
}
m_value = m_enumerations.GetSize();
#ifdef __USE_STL__
strm.setstate(ios::badbit);
#else
strm.setf(ios::badbit , ios::badbit);
#endif
}
PObject::Comparison OpalMediaOptionEnum::CompareValue(const OpalMediaOption & option) const
{
const OpalMediaOptionEnum * otherOption = PDownCast(const OpalMediaOptionEnum, &option);
if (otherOption == NULL)
return GreaterThan;
if (m_value > otherOption->m_value)
return GreaterThan;
if (m_value < otherOption->m_value)
return LessThan;
return EqualTo;
}
void OpalMediaOptionEnum::Assign(const OpalMediaOption & option)
{
const OpalMediaOptionEnum * otherOption = PDownCast(const OpalMediaOptionEnum, &option);
if (otherOption != NULL)
m_value = otherOption->m_value;
}
void OpalMediaOptionEnum::SetValue(PINDEX value)
{
if (value < m_enumerations.GetSize())
m_value = value;
else
m_value = m_enumerations.GetSize();
}
OpalMediaOptionString::OpalMediaOptionString(const char * name, bool readOnly)
: OpalMediaOption(name, readOnly, MinMerge)
{
}
OpalMediaOptionString::OpalMediaOptionString(const char * name, bool readOnly, const PString & value)
: OpalMediaOption(name, readOnly, MinMerge),
m_value(value)
{
}
PObject * OpalMediaOptionString::Clone() const
{
OpalMediaOptionString * newObj = new OpalMediaOptionString(*this);
newObj->m_value.MakeUnique();
return newObj;
}
void OpalMediaOptionString::PrintOn(ostream & strm) const
{
strm << m_value.ToLiteral();
}
void OpalMediaOptionString::ReadFrom(istream & strm)
{
char c;
strm >> c; // Skip whitespace
if (c != '"') {
strm.putback(c);
strm >> m_value; // If no " then read to end of line.
}
else {
// If there was a '"' then assume it is a C style literal string with \ escapes etc
PINDEX count = 0;
PStringStream str;
str << '"';
while (strm.get(c).good()) {
str << c;
// Keep reading till get a '"' that is not preceded by a '\' that is not itself preceded by a '\'
if (c == '"' && count > 0 && (str[count] != '\\' || !(count > 1 && str[count-1] == '\\')))
break;
count++;
}
m_value = PString(PString::Literal, (const char *)str);
}
}
PObject::Comparison OpalMediaOptionString::CompareValue(const OpalMediaOption & option) const
{
const OpalMediaOptionString * otherOption = PDownCast(const OpalMediaOptionString, &option);
if (otherOption == NULL)
return GreaterThan;
return m_value.Compare(otherOption->m_value);
}
void OpalMediaOptionString::Assign(const OpalMediaOption & option)
{
const OpalMediaOptionString * otherOption = PDownCast(const OpalMediaOptionString, &option);
if (otherOption != NULL) {
m_value = otherOption->m_value;
m_value.MakeUnique();
}
}
void OpalMediaOptionString::SetValue(const PString & value)
{
m_value = value;
m_value.MakeUnique();
}
/////////////////////////////////////////////////////////////////////////////
const char * const OpalMediaFormat::NeedsJitterOption = "Needs Jitter";
const char * const OpalMediaFormat::MaxBitRateOption = "Max Bit Rate";
const char * const OpalMediaFormat::MaxFrameSizeOption = "Max Frame Size";
const char * const OpalMediaFormat::FrameTimeOption = "Frame Time";
const char * const OpalMediaFormat::ClockRateOption = "Clock Rate";
OpalMediaFormat::OpalMediaFormat()
{
rtpPayloadType = RTP_DataFrame::IllegalPayloadType;
rtpEncodingName = NULL;
defaultSessionID = 0;
}
OpalMediaFormat::OpalMediaFormat(RTP_DataFrame::PayloadTypes pt, unsigned clockRate, const char * name)
{
PWaitAndSignal mutex(GetMediaFormatsListMutex());
const OpalMediaFormatList & registeredFormats = GetMediaFormatsList();
PINDEX idx = registeredFormats.FindFormat(pt, clockRate, name);
if (idx != P_MAX_INDEX)
*this = registeredFormats[idx];
else
*this = OpalMediaFormat();
}
OpalMediaFormat::OpalMediaFormat(const char * wildcard)
{
operator=(PString(wildcard));
}
OpalMediaFormat::OpalMediaFormat(const PString & wildcard)
{
operator=(wildcard);
}
OpalMediaFormat::OpalMediaFormat(const char * fullName,
unsigned dsid,
RTP_DataFrame::PayloadTypes pt,
const char * en,
BOOL nj,
unsigned bw,
PINDEX fs,
unsigned ft,
unsigned cr)
: PCaselessString(fullName)
{
PINDEX i;
PWaitAndSignal mutex(GetMediaFormatsListMutex());
OpalMediaFormatList & registeredFormats = GetMediaFormatsList();
if ((i = registeredFormats.GetValuesIndex(*this)) != P_MAX_INDEX) {
*this = registeredFormats[i]; // Already registered, use previous values
return;
}
rtpPayloadType = pt;
rtpEncodingName = en;
defaultSessionID = dsid;
if (nj)
AddOption(new OpalMediaOptionBoolean(NeedsJitterOption, true, OpalMediaOption::OrMerge, true));
AddOption(new OpalMediaOptionInteger(MaxBitRateOption, true, OpalMediaOption::MinMerge, bw, 100));
if (fs > 0)
AddOption(new OpalMediaOptionInteger(MaxFrameSizeOption, true, OpalMediaOption::NoMerge, fs));
if (ft > 0)
AddOption(new OpalMediaOptionInteger(FrameTimeOption, true, OpalMediaOption::NoMerge, ft));
if (cr > 0)
AddOption(new OpalMediaOptionInteger(ClockRateOption, true, OpalMediaOption::AlwaysMerge, cr));
// assume non-dynamic payload types are correct and do not need deconflicting
if (rtpPayloadType < RTP_DataFrame::DynamicBase || rtpPayloadType == RTP_DataFrame::MaxPayloadType) {
registeredFormats.OpalMediaFormatBaseList::Append(this);
return;
}
// find the next unused dynamic number, and find anything with the new
// rtp payload type if it is explicitly required
OpalMediaFormat * match = NULL;
RTP_DataFrame::PayloadTypes nextUnused = RTP_DataFrame::DynamicBase;
do {
for (i = 0; i < registeredFormats.GetSize(); i++) {
if (registeredFormats[i].GetPayloadType() == nextUnused) {
nextUnused = (RTP_DataFrame::PayloadTypes)(nextUnused + 1);
break;
}
if ((rtpPayloadType >= RTP_DataFrame::DynamicBase) &&
(registeredFormats[i].GetPayloadType() == rtpPayloadType))
match = ®isteredFormats[i];
}
} while (i < registeredFormats.GetSize());
// if new format requires a specific payload type in the dynamic range,
// then move the old format to the next unused format
if (match != NULL)
match->rtpPayloadType = nextUnused;
else
rtpPayloadType = nextUnused;
registeredFormats.OpalMediaFormatBaseList::Append(this);
}
OpalMediaFormat & OpalMediaFormat::operator=(RTP_DataFrame::PayloadTypes pt)
{
PWaitAndSignal mutex(GetMediaFormatsListMutex());
const OpalMediaFormatList & registeredFormats = GetMediaFormatsList();
PINDEX idx = registeredFormats.FindFormat(pt);
if (idx != P_MAX_INDEX)
*this = registeredFormats[idx];
else
*this = OpalMediaFormat();
return *this;
}
OpalMediaFormat & OpalMediaFormat::operator=(const char * wildcard)
{
return operator=(PString(wildcard));
}
OpalMediaFormat & OpalMediaFormat::operator=(const PString & wildcard)
{
PWaitAndSignal mutex(GetMediaFormatsListMutex());
const OpalMediaFormatList & registeredFormats = GetMediaFormatsList();
PINDEX idx = registeredFormats.FindFormat(wildcard);
if (idx != P_MAX_INDEX)
*this = registeredFormats[idx];
else
*this = OpalMediaFormat();
return *this;
}
PObject * OpalMediaFormat::Clone() const
{
return new OpalMediaFormat(*this);
}
bool OpalMediaFormat::Merge(const OpalMediaFormat & mediaFormat)
{
PWaitAndSignal auto_signal(GetMediaFormatsListMutex());
for (PINDEX i = 0; i < options.GetSize(); i++) {
OpalMediaOption * option = mediaFormat.FindOption(options[i].GetName());
if (option != NULL && !options[i].Merge(*option))
return false;
}
return true;
}
bool OpalMediaFormat::GetOptionValue(const PString & name, PString & value) const
{
OpalMediaOption * option = FindOption(name);
if (option == NULL)
return false;
value = option->AsString();
return true;
}
bool OpalMediaFormat::SetOptionValue(const PString & name, const PString & value)
{
options.MakeUnique();
OpalMediaOption * option = FindOption(name);
if (option == NULL)
return false;
return option->FromString(value);
}
bool OpalMediaFormat::GetOptionBoolean(const PString & name, bool dflt) const
{
OpalMediaOption * option = FindOption(name);
if (option == NULL)
return dflt;
return PDownCast(OpalMediaOptionBoolean, option)->GetValue();
}
bool OpalMediaFormat::SetOptionBoolean(const PString & name, bool value)
{
options.MakeUnique();
OpalMediaOption * option = FindOption(name);
if (option == NULL)
return false;
PDownCast(OpalMediaOptionBoolean, option)->SetValue(value);
return true;
}
int OpalMediaFormat::GetOptionInteger(const PString & name, int dflt) const
{
OpalMediaOption * option = FindOption(name);
if (option == NULL)
return dflt;
return PDownCast(OpalMediaOptionInteger, option)->GetValue();
}
bool OpalMediaFormat::SetOptionInteger(const PString & name, int value)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -