mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1142105 - Part 2: Move some stuff from JsepCodecDescription into /sdp r=mt
This commit is contained in:
parent
a908483c16
commit
4479ce2748
@ -7,8 +7,8 @@
|
||||
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <string.h>
|
||||
#include "signaling/src/sdp/SdpMediaSection.h"
|
||||
#include "signaling/src/sdp/SdpHelper.h"
|
||||
#include "nsCRT.h"
|
||||
|
||||
namespace mozilla {
|
||||
@ -42,47 +42,26 @@ struct JsepCodecDescription {
|
||||
virtual void AddFmtps(SdpFmtpAttributeList& fmtp) const = 0;
|
||||
virtual void AddRtcpFbs(SdpRtcpFbAttributeList& rtcpfb) const = 0;
|
||||
|
||||
// TODO(bug 1142105): This probably should be a helper function in
|
||||
// /sdp
|
||||
static bool
|
||||
GetPtAsInt(const std::string& ptString, uint16_t* ptOutparam)
|
||||
{
|
||||
char* end;
|
||||
unsigned long pt = strtoul(ptString.c_str(), &end, 10);
|
||||
size_t length = static_cast<size_t>(end - ptString.c_str());
|
||||
if ((pt > UINT16_MAX) || (length != ptString.size())) {
|
||||
return false;
|
||||
}
|
||||
*ptOutparam = pt;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
GetPtAsInt(uint16_t* ptOutparam) const
|
||||
{
|
||||
return GetPtAsInt(mDefaultPt, ptOutparam);
|
||||
return SdpHelper::GetPtAsInt(mDefaultPt, ptOutparam);
|
||||
}
|
||||
|
||||
virtual bool
|
||||
Matches(const std::string& fmt, const SdpMediaSection& remoteMsection) const
|
||||
{
|
||||
auto& attrs = remoteMsection.GetAttributeList();
|
||||
if (!attrs.HasAttribute(SdpAttribute::kRtpmapAttribute)) {
|
||||
if (mType != remoteMsection.GetMediaType()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const SdpRtpmapAttributeList& rtpmap = attrs.GetRtpmap();
|
||||
if (!rtpmap.HasEntry(fmt)) {
|
||||
return false;
|
||||
}
|
||||
const SdpRtpmapAttributeList::Rtpmap* entry(remoteMsection.FindRtpmap(fmt));
|
||||
|
||||
const SdpRtpmapAttributeList::Rtpmap& entry = rtpmap.GetEntry(fmt);
|
||||
|
||||
if (mType == remoteMsection.GetMediaType()
|
||||
&& !nsCRT::strcasecmp(mName.c_str(), entry.name.c_str())
|
||||
&& (mClock == entry.clock)
|
||||
&& (mChannels == entry.channels)) {
|
||||
return ParametersMatch(entry.pt, remoteMsection);
|
||||
if (entry
|
||||
&& !nsCRT::strcasecmp(mName.c_str(), entry->name.c_str())
|
||||
&& (mClock == entry->clock)
|
||||
&& (mChannels == entry->channels)) {
|
||||
return ParametersMatch(fmt, remoteMsection);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@ -100,25 +79,6 @@ struct JsepCodecDescription {
|
||||
return true;
|
||||
}
|
||||
|
||||
// TODO(bug 1142105): This probably should be a helper function in
|
||||
// /sdp
|
||||
static const SdpFmtpAttributeList::Parameters*
|
||||
FindParameters(const std::string& pt,
|
||||
const mozilla::SdpMediaSection& remoteMsection)
|
||||
{
|
||||
const SdpAttributeList& attrs = remoteMsection.GetAttributeList();
|
||||
|
||||
if (attrs.HasAttribute(SdpAttribute::kFmtpAttribute)) {
|
||||
const SdpFmtpAttributeList& fmtps = attrs.GetFmtp();
|
||||
for (auto i = fmtps.mFmtps.begin(); i != fmtps.mFmtps.end(); ++i) {
|
||||
if (i->format == pt && i->parameters) {
|
||||
return i->parameters.get();
|
||||
}
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
virtual bool LoadSendParameters(
|
||||
const mozilla::SdpMediaSection& remoteMsection)
|
||||
{
|
||||
@ -307,7 +267,7 @@ struct JsepVideoCodecDescription : public JsepCodecDescription {
|
||||
{
|
||||
// Will contain defaults if nothing else
|
||||
SdpFmtpAttributeList::H264Parameters result;
|
||||
auto* params = FindParameters(pt, msection);
|
||||
auto* params = msection.FindFmtp(pt);
|
||||
|
||||
if (params && params->codec_type == SdpRtpmapAttributeList::kH264) {
|
||||
result =
|
||||
@ -328,7 +288,7 @@ struct JsepVideoCodecDescription : public JsepCodecDescription {
|
||||
|
||||
// Will contain defaults if nothing else
|
||||
SdpFmtpAttributeList::VP8Parameters result(expectedType);
|
||||
auto* params = FindParameters(pt, msection);
|
||||
auto* params = msection.FindFmtp(pt);
|
||||
|
||||
if (params && params->codec_type == expectedType) {
|
||||
result =
|
||||
@ -338,31 +298,6 @@ struct JsepVideoCodecDescription : public JsepCodecDescription {
|
||||
return result;
|
||||
}
|
||||
|
||||
static bool
|
||||
HasRtcpFb(const SdpMediaSection& msection,
|
||||
const std::string& pt,
|
||||
SdpRtcpFbAttributeList::Type type,
|
||||
const std::string& subType)
|
||||
{
|
||||
const SdpAttributeList& attrs(msection.GetAttributeList());
|
||||
|
||||
if (!attrs.HasAttribute(SdpAttribute::kRtcpFbAttribute)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
for (auto& rtcpfb : attrs.GetRtcpFb().mFeedbacks) {
|
||||
if (rtcpfb.type == type) {
|
||||
if (rtcpfb.pt == "*" || rtcpfb.pt == pt) {
|
||||
if (rtcpfb.parameter == subType) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void
|
||||
NegotiateRtcpFb(const SdpMediaSection& remoteMsection,
|
||||
SdpRtcpFbAttributeList::Type type,
|
||||
@ -370,7 +305,7 @@ struct JsepVideoCodecDescription : public JsepCodecDescription {
|
||||
{
|
||||
std::vector<std::string> temp;
|
||||
for (auto& subType : *supportedTypes) {
|
||||
if (HasRtcpFb(remoteMsection, mDefaultPt, type, subType)) {
|
||||
if (remoteMsection.HasRtcpFb(mDefaultPt, type, subType)) {
|
||||
temp.push_back(subType);
|
||||
}
|
||||
}
|
||||
@ -691,20 +626,14 @@ struct JsepApplicationCodecDescription : public JsepCodecDescription {
|
||||
Matches(const std::string& fmt,
|
||||
const SdpMediaSection& remoteMsection) const override
|
||||
{
|
||||
auto& attrs = remoteMsection.GetAttributeList();
|
||||
if (!attrs.HasAttribute(SdpAttribute::kSctpmapAttribute)) {
|
||||
if (mType != remoteMsection.GetMediaType()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const SdpSctpmapAttributeList& sctpmap = attrs.GetSctpmap();
|
||||
if (!sctpmap.HasEntry(fmt)) {
|
||||
return false;
|
||||
}
|
||||
const SdpSctpmapAttributeList::Sctpmap* entry(
|
||||
remoteMsection.FindSctpmap(fmt));
|
||||
|
||||
const SdpSctpmapAttributeList::Sctpmap& entry = sctpmap.GetEntry(fmt);
|
||||
|
||||
if (mType == remoteMsection.GetMediaType() &&
|
||||
!nsCRT::strcasecmp(mName.c_str(), entry.name.c_str())) {
|
||||
if (entry && !nsCRT::strcasecmp(mName.c_str(), entry->name.c_str())) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -1762,7 +1762,7 @@ JsepSessionImpl::ParseSdp(const std::string& sdp, UniquePtr<Sdp>* parsedp)
|
||||
auto& formats = parsed->GetMediaSection(i).GetFormats();
|
||||
for (auto f = formats.begin(); f != formats.end(); ++f) {
|
||||
uint16_t pt;
|
||||
if (!JsepCodecDescription::GetPtAsInt(*f, &pt)) {
|
||||
if (!SdpHelper::GetPtAsInt(*f, &pt)) {
|
||||
JSEP_SET_ERROR("Payload type \""
|
||||
<< *f << "\" is not a 16-bit unsigned int at level "
|
||||
<< i);
|
||||
|
@ -10,8 +10,9 @@
|
||||
|
||||
#include "nsDebug.h"
|
||||
#include "nsError.h"
|
||||
#include "nspr/prprf.h"
|
||||
#include "prprf.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <set>
|
||||
|
||||
namespace mozilla {
|
||||
@ -590,6 +591,19 @@ SdpHelper::appendSdpParseErrors(
|
||||
*aErrorString += os.str();
|
||||
}
|
||||
|
||||
/* static */ bool
|
||||
SdpHelper::GetPtAsInt(const std::string& ptString, uint16_t* ptOutparam)
|
||||
{
|
||||
char* end;
|
||||
unsigned long pt = strtoul(ptString.c_str(), &end, 10);
|
||||
size_t length = static_cast<size_t>(end - ptString.c_str());
|
||||
if ((pt > UINT16_MAX) || (length != ptString.size())) {
|
||||
return false;
|
||||
}
|
||||
*ptOutparam = pt;
|
||||
return true;
|
||||
}
|
||||
|
||||
} // namespace mozilla
|
||||
|
||||
|
||||
|
@ -5,6 +5,8 @@
|
||||
#ifndef _SDPHELPER_H_
|
||||
#define _SDPHELPER_H_
|
||||
|
||||
#include "nsError.h"
|
||||
|
||||
#include "signaling/src/sdp/SdpMediaSection.h"
|
||||
#include "signaling/src/sdp/SdpAttribute.h"
|
||||
|
||||
@ -88,6 +90,8 @@ class SdpHelper {
|
||||
const std::vector<std::pair<size_t, std::string> >& aErrors,
|
||||
std::string* aErrorString);
|
||||
|
||||
static bool GetPtAsInt(const std::string& ptString, uint16_t* ptOutparam);
|
||||
|
||||
private:
|
||||
std::string& mLastError;
|
||||
|
||||
|
@ -148,6 +148,80 @@ public:
|
||||
GetAttributeList().SetAttribute(new SdpDirectionAttribute(direction));
|
||||
}
|
||||
|
||||
const SdpFmtpAttributeList::Parameters*
|
||||
FindFmtp(const std::string& pt) const
|
||||
{
|
||||
const SdpAttributeList& attrs = GetAttributeList();
|
||||
|
||||
if (attrs.HasAttribute(SdpAttribute::kFmtpAttribute)) {
|
||||
const SdpFmtpAttributeList& fmtps = attrs.GetFmtp();
|
||||
for (auto i = fmtps.mFmtps.begin(); i != fmtps.mFmtps.end(); ++i) {
|
||||
if (i->format == pt && i->parameters) {
|
||||
return i->parameters.get();
|
||||
}
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const SdpRtpmapAttributeList::Rtpmap*
|
||||
FindRtpmap(const std::string& pt) const
|
||||
{
|
||||
auto& attrs = GetAttributeList();
|
||||
if (!attrs.HasAttribute(SdpAttribute::kRtpmapAttribute)) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const SdpRtpmapAttributeList& rtpmap = attrs.GetRtpmap();
|
||||
if (!rtpmap.HasEntry(pt)) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return &rtpmap.GetEntry(pt);
|
||||
}
|
||||
|
||||
const SdpSctpmapAttributeList::Sctpmap*
|
||||
FindSctpmap(const std::string& pt) const
|
||||
{
|
||||
auto& attrs = GetAttributeList();
|
||||
if (!attrs.HasAttribute(SdpAttribute::kSctpmapAttribute)) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const SdpSctpmapAttributeList& sctpmap = attrs.GetSctpmap();
|
||||
if (!sctpmap.HasEntry(pt)) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return &sctpmap.GetEntry(pt);
|
||||
}
|
||||
|
||||
bool
|
||||
HasRtcpFb(const std::string& pt,
|
||||
SdpRtcpFbAttributeList::Type type,
|
||||
const std::string& subType) const
|
||||
{
|
||||
const SdpAttributeList& attrs(GetAttributeList());
|
||||
|
||||
if (!attrs.HasAttribute(SdpAttribute::kRtcpFbAttribute)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
for (auto& rtcpfb : attrs.GetRtcpFb().mFeedbacks) {
|
||||
if (rtcpfb.type == type) {
|
||||
if (rtcpfb.pt == "*" || rtcpfb.pt == pt) {
|
||||
if (rtcpfb.parameter == subType) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
private:
|
||||
size_t mLevel;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user