📄 mediafmt.cxx
字号:
options.MakeUnique();
OpalMediaOption * option = FindOption(name);
if (option == NULL)
return false;
PDownCast(OpalMediaOptionInteger, option)->SetValue(value);
return true;
}
double OpalMediaFormat::GetOptionReal(const PString & name, double dflt) const
{
OpalMediaOption * option = FindOption(name);
if (option == NULL)
return dflt;
return PDownCast(OpalMediaOptionReal, option)->GetValue();
}
bool OpalMediaFormat::SetOptionReal(const PString & name, double value)
{
options.MakeUnique();
OpalMediaOption * option = FindOption(name);
if (option == NULL)
return false;
PDownCast(OpalMediaOptionReal, option)->SetValue(value);
return true;
}
PINDEX OpalMediaFormat::GetOptionEnum(const PString & name, PINDEX dflt) const
{
OpalMediaOption * option = FindOption(name);
if (option == NULL)
return dflt;
return PDownCast(OpalMediaOptionEnum, option)->GetValue();
}
bool OpalMediaFormat::SetOptionEnum(const PString & name, PINDEX value)
{
options.MakeUnique();
OpalMediaOption * option = FindOption(name);
if (option == NULL)
return false;
PDownCast(OpalMediaOptionEnum, option)->SetValue(value);
return true;
}
PString OpalMediaFormat::GetOptionString(const PString & name, const PString & dflt) const
{
OpalMediaOption * option = FindOption(name);
if (option == NULL)
return dflt;
return PDownCast(OpalMediaOptionString, option)->GetValue();
}
bool OpalMediaFormat::SetOptionString(const PString & name, const PString & value)
{
options.MakeUnique();
OpalMediaOption * option = FindOption(name);
if (option == NULL)
return false;
PDownCast(OpalMediaOptionString, option)->SetValue(value);
return true;
}
bool OpalMediaFormat::AddOption(OpalMediaOption * option)
{
PWaitAndSignal auto_signal(GetMediaFormatsListMutex());
if (PAssertNULL(option) == NULL)
return false;
if (options.GetValuesIndex(*option) != P_MAX_INDEX) {
delete option;
return false;
}
options.Append(option);
return true;
}
OpalMediaOption * OpalMediaFormat::FindOption(const PString & name) const
{
PWaitAndSignal auto_signal(GetMediaFormatsListMutex());
OpalMediaOptionString search(name, false);
PINDEX index = options.GetValuesIndex(search);
if (index == P_MAX_INDEX)
return NULL;
return &options[index];
}
OpalMediaFormatList OpalMediaFormat::GetAllRegisteredMediaFormats()
{
OpalMediaFormatList copy;
GetAllRegisteredMediaFormats(copy);
return copy;
}
void OpalMediaFormat::GetAllRegisteredMediaFormats(OpalMediaFormatList & copy)
{
PWaitAndSignal mutex(GetMediaFormatsListMutex());
const OpalMediaFormatList & registeredFormats = GetMediaFormatsList();
for (PINDEX i = 0; i < registeredFormats.GetSize(); i++)
copy.OpalMediaFormatBaseList::Append(registeredFormats[i].Clone());
}
bool OpalMediaFormat::SetRegisteredMediaFormat(const OpalMediaFormat & mediaFormat)
{
PWaitAndSignal mutex(GetMediaFormatsListMutex());
const OpalMediaFormatList & registeredFormats = GetMediaFormatsList();
for (PINDEX i = 0; i < registeredFormats.GetSize(); i++) {
if (registeredFormats[i] == mediaFormat) {
/* Yes, this looks a little odd as we just did equality above and seem to
be assigning the left hand side with exactly the same value. But what
is really happening is the above only compares the name, and below
copies all of the attributes (OpalMediaFormatOtions) across. */
registeredFormats[i] = mediaFormat;
return true;
}
}
return false;
}
///////////////////////////////////////////////////////////////////////////////
const char * const OpalAudioFormat::RxFramesPerPacketOption = "Rx Frames Per Packet";
const char * const OpalAudioFormat::TxFramesPerPacketOption = "Tx Frames Per Packet";
OpalAudioFormat::OpalAudioFormat(const char * fullName,
RTP_DataFrame::PayloadTypes rtpPayloadType,
const char * encodingName,
PINDEX frameSize,
unsigned frameTime,
unsigned rxFrames,
unsigned txFrames,
unsigned maxFrames,
unsigned clockRate)
: OpalMediaFormat(fullName,
OpalMediaFormat::DefaultAudioSessionID,
rtpPayloadType,
encodingName,
TRUE,
8*frameSize*clockRate/frameTime,
frameSize,
frameTime,
clockRate)
{
AddOption(new OpalMediaOptionInteger(RxFramesPerPacketOption, false, OpalMediaOption::MinMerge, rxFrames, 1, maxFrames));
AddOption(new OpalMediaOptionInteger(TxFramesPerPacketOption, false, OpalMediaOption::MinMerge, txFrames, 1, maxFrames));
}
///////////////////////////////////////////////////////////////////////////////
const char * const OpalVideoFormat::FrameWidthOption = "Frame Width";
const char * const OpalVideoFormat::FrameHeightOption = "Frame Height";
const char * const OpalVideoFormat::EncodingQualityOption = "Encoding Quality";
const char * const OpalVideoFormat::TargetBitRateOption = "Target Bit Rate";
const char * const OpalVideoFormat::DynamicVideoQualityOption = "Dynamic Video Quality";
const char * const OpalVideoFormat::AdaptivePacketDelayOption = "Adaptive Packet Delay";
OpalVideoFormat::OpalVideoFormat(const char * fullName,
RTP_DataFrame::PayloadTypes rtpPayloadType,
const char * encodingName,
unsigned frameWidth,
unsigned frameHeight,
unsigned frameRate,
unsigned bitRate)
: OpalMediaFormat(fullName,
OpalMediaFormat::DefaultVideoSessionID,
rtpPayloadType,
encodingName,
FALSE,
bitRate,
0,
OpalMediaFormat::VideoClockRate/frameRate,
OpalMediaFormat::VideoClockRate)
{
AddOption(new OpalMediaOptionInteger(FrameWidthOption, true, OpalMediaOption::MinMerge, frameWidth, 11, 32767));
AddOption(new OpalMediaOptionInteger(FrameHeightOption, true, OpalMediaOption::MinMerge, frameHeight, 9, 32767));
AddOption(new OpalMediaOptionInteger(EncodingQualityOption, false, OpalMediaOption::MinMerge, 15, 1, 31));
AddOption(new OpalMediaOptionInteger(TargetBitRateOption, false, OpalMediaOption::MinMerge, 64000, 1000));
AddOption(new OpalMediaOptionBoolean(DynamicVideoQualityOption, false, OpalMediaOption::NoMerge, false));
AddOption(new OpalMediaOptionBoolean(AdaptivePacketDelayOption, false, OpalMediaOption::NoMerge, false));
// For video the max bit rate and frame rate is adjustable by user
FindOption(MaxBitRateOption)->SetReadOnly(false);
FindOption(FrameTimeOption)->SetReadOnly(false);
FindOption(FrameTimeOption)->SetMerge(OpalMediaOption::MinMerge);
}
PObject * OpalVideoFormat::Clone() const
{
return new OpalVideoFormat(*this);
}
bool OpalVideoFormat::Merge(const OpalMediaFormat & mediaFormat)
{
if (!OpalMediaFormat::Merge(mediaFormat))
return false;
unsigned maxBitRate = GetOptionInteger(MaxBitRateOption);
unsigned targetBitRate = GetOptionInteger(TargetBitRateOption);
if (targetBitRate > maxBitRate)
SetOptionInteger(TargetBitRateOption, maxBitRate);
return true;
}
///////////////////////////////////////////////////////////////////////////////
OpalMediaFormatList::OpalMediaFormatList()
{
DisallowDeleteObjects();
}
OpalMediaFormatList::OpalMediaFormatList(const OpalMediaFormat & format)
{
DisallowDeleteObjects();
*this += format;
}
OpalMediaFormatList & OpalMediaFormatList::operator+=(const OpalMediaFormat & format)
{
if (!format) {
if (!HasFormat(format)) {
PWaitAndSignal mutex(GetMediaFormatsListMutex());
const OpalMediaFormatList & registeredFormats = GetMediaFormatsList();
PINDEX idx = registeredFormats.FindFormat(format);
if (idx != P_MAX_INDEX)
OpalMediaFormatBaseList::Append(®isteredFormats[idx]);
}
}
return *this;
}
OpalMediaFormatList & OpalMediaFormatList::operator+=(const OpalMediaFormatList & formats)
{
for (PINDEX i = 0; i < formats.GetSize(); i++)
*this += formats[i];
return *this;
}
OpalMediaFormatList & OpalMediaFormatList::operator-=(const OpalMediaFormat & format)
{
PINDEX idx = FindFormat(format);
if (idx != P_MAX_INDEX)
RemoveAt(idx);
return *this;
}
OpalMediaFormatList & OpalMediaFormatList::operator-=(const OpalMediaFormatList & formats)
{
for (PINDEX i = 0; i < formats.GetSize(); i++)
*this -= formats[i];
return *this;
}
void OpalMediaFormatList::Remove(const PStringArray & mask)
{
PINDEX i;
for (i = 0; i < mask.GetSize(); i++) {
PINDEX idx;
while ((idx = FindFormat(mask[i])) != P_MAX_INDEX)
RemoveAt(idx);
}
}
PINDEX OpalMediaFormatList::FindFormat(RTP_DataFrame::PayloadTypes pt, unsigned clockRate, const char * name) const
{
for (PINDEX idx = 0; idx < GetSize(); idx++) {
OpalMediaFormat & mediaFormat = (*this)[idx];
if (pt < RTP_DataFrame::DynamicBase && mediaFormat.GetPayloadType() == pt)
return idx;
if (name != NULL && *name != '\0') {
const char * otherName = mediaFormat.GetEncodingName();
if (otherName != NULL && strcasecmp(otherName, name) == 0
&& mediaFormat.GetClockRate() == clockRate)
return idx;
}
}
return P_MAX_INDEX;
}
static BOOL WildcardMatch(const PCaselessString & str, const PStringArray & wildcards)
{
if (wildcards.GetSize() == 1)
return str == wildcards[0];
PINDEX i;
PINDEX last = 0;
for (i = 0; i < wildcards.GetSize(); i++) {
PString wildcard = wildcards[i];
PINDEX next;
if (wildcard.IsEmpty())
next = last;
else {
next = str.Find(wildcard, last);
if (next == P_MAX_INDEX)
return FALSE;
}
// Check for having * at beginning of search string
if (i == 0 && next != 0 && !wildcard)
return FALSE;
last = next + wildcard.GetLength();
// Check for having * at end of search string
if (i == wildcards.GetSize()-1 && !wildcard && last != str.GetLength())
return FALSE;
}
return TRUE;
}
PINDEX OpalMediaFormatList::FindFormat(const PString & search) const
{
PStringArray wildcards = search.Tokenise('*', TRUE);
for (PINDEX idx = 0; idx < GetSize(); idx++) {
if (WildcardMatch((*this)[idx], wildcards))
return idx;
}
return P_MAX_INDEX;
}
void OpalMediaFormatList::Reorder(const PStringArray & order)
{
PINDEX nextPos = 0;
for (PINDEX i = 0; i < order.GetSize(); i++) {
PStringArray wildcards = order[i].Tokenise('*', TRUE);
PINDEX findPos = 0;
while (findPos < GetSize()) {
if (WildcardMatch((*this)[findPos], wildcards)) {
if (findPos > nextPos)
OpalMediaFormatBaseList::InsertAt(nextPos, RemoveAt(findPos));
nextPos++;
}
findPos++;
}
}
}
// End of File ///////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -