RealtimeMediaSourceCenterMac.cpp [plain text]
#include "config.h"
#if ENABLE(MEDIA_STREAM)
#include "RealtimeMediaSourceCenterMac.h"
#include "AVCaptureDeviceManager.h"
#include "Logging.h"
#include "MediaStreamPrivate.h"
#include <wtf/MainThread.h>
namespace WebCore {
RealtimeMediaSourceCenter& RealtimeMediaSourceCenter::platformCenter()
{
ASSERT(isMainThread());
static NeverDestroyed<RealtimeMediaSourceCenterMac> center;
return center;
}
RealtimeMediaSourceCenterMac::RealtimeMediaSourceCenterMac()
{
m_supportedConstraints.setSupportsWidth(true);
m_supportedConstraints.setSupportsHeight(true);
m_supportedConstraints.setSupportsAspectRatio(true);
m_supportedConstraints.setSupportsFrameRate(true);
m_supportedConstraints.setSupportsFacingMode(true);
m_supportedConstraints.setSupportsVolume(true);
m_supportedConstraints.setSupportsSampleRate(false);
m_supportedConstraints.setSupportsSampleSize(false);
m_supportedConstraints.setSupportsEchoCancellation(false);
m_supportedConstraints.setSupportsDeviceId(true);
m_supportedConstraints.setSupportsGroupId(true);
}
RealtimeMediaSourceCenterMac::~RealtimeMediaSourceCenterMac()
{
}
void RealtimeMediaSourceCenterMac::validateRequestConstraints(ValidConstraintsHandler validHandler, InvalidConstraintsHandler invalidHandler, const MediaConstraints& audioConstraints, const MediaConstraints& videoConstraints)
{
Vector<String> audioSourceUIDs;
Vector<String> videoSourceUIDs;
String invalidConstraint;
if (audioConstraints.isValid()) {
audioSourceUIDs = AVCaptureDeviceManager::singleton().bestSourcesForTypeAndConstraints(RealtimeMediaSource::Type::Audio, audioConstraints, invalidConstraint);
if (!invalidConstraint.isEmpty()) {
invalidHandler(invalidConstraint);
return;
}
}
if (videoConstraints.isValid()) {
videoSourceUIDs = AVCaptureDeviceManager::singleton().bestSourcesForTypeAndConstraints(RealtimeMediaSource::Type::Video, videoConstraints, invalidConstraint);
if (!invalidConstraint.isEmpty()) {
invalidHandler(invalidConstraint);
return;
}
}
validHandler(WTFMove(audioSourceUIDs), WTFMove(videoSourceUIDs));
}
void RealtimeMediaSourceCenterMac::createMediaStream(NewMediaStreamHandler completionHandler, const String& audioDeviceID, const String& videoDeviceID, const MediaConstraints* audioConstraints, const MediaConstraints* videoConstraints)
{
Vector<Ref<RealtimeMediaSource>> audioSources;
Vector<Ref<RealtimeMediaSource>> videoSources;
String invalidConstraint;
if (!audioDeviceID.isEmpty()) {
auto audioSource = AVCaptureDeviceManager::singleton().sourceWithUID(audioDeviceID, RealtimeMediaSource::Audio, audioConstraints, invalidConstraint);
#if !LOG_DISABLED
if (!invalidConstraint.isEmpty())
LOG(Media, "RealtimeMediaSourceCenterMac::createMediaStream(%p), audio constraints failed to apply: %s", this, invalidConstraint.utf8().data());
#endif
if (audioSource)
audioSources.append(audioSource.releaseNonNull());
}
if (!videoDeviceID.isEmpty()) {
auto videoSource = AVCaptureDeviceManager::singleton().sourceWithUID(videoDeviceID, RealtimeMediaSource::Video, videoConstraints, invalidConstraint);
#if !LOG_DISABLED
if (!invalidConstraint.isEmpty())
LOG(Media, "RealtimeMediaSourceCenterMac::createMediaStream(%p), video constraints failed to apply: %s", this, invalidConstraint.utf8().data());
#endif
if (videoSource)
videoSources.append(videoSource.releaseNonNull());
}
if (videoSources.isEmpty() && audioSources.isEmpty())
completionHandler(nullptr);
else
completionHandler(MediaStreamPrivate::create(audioSources, videoSources));
}
Vector<CaptureDevice> RealtimeMediaSourceCenterMac::getMediaStreamDevices()
{
return AVCaptureDeviceManager::singleton().getSourcesInfo();
}
}
#endif // ENABLE(MEDIA_STREAM)