blob: 766308553b002d109ba07f40eebdd82168f44ee5 [file] [log] [blame]
/*
* Copyright (C) 2018 Igalia S.L.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#include "MediaEngineConfigurationFactoryMock.h"
#include "ContentType.h"
#include "MediaCapabilitiesDecodingInfo.h"
#include "MediaCapabilitiesEncodingInfo.h"
#include "MediaDecodingConfiguration.h"
#include "MediaEncodingConfiguration.h"
namespace WebCore {
static bool canDecodeMedia(const MediaDecodingConfiguration& configuration)
{
// The mock implementation supports only local file playback.
if (configuration.type == MediaDecodingType::MediaSource)
return false;
// Maxing out video decoding support at 720P.
auto videoConfig = configuration.video;
if (videoConfig && videoConfig->width > 1280 && videoConfig->height > 720)
return false;
// Only the "mock-with-alpha" codec supports alphaChannel
if (videoConfig && videoConfig->alphaChannel && videoConfig->alphaChannel.value()) {
if (ContentType(videoConfig->contentType).parameter(ContentType::codecsParameter()) != "mock-with-alpha"_s)
return false;
}
// Only the "mock-with-hdr" codec supports HDR)
if (videoConfig && (videoConfig->colorGamut || videoConfig->hdrMetadataType || videoConfig->transferFunction)) {
if (ContentType(videoConfig->contentType).parameter(ContentType::codecsParameter()) != "mock-with-hdr"_s)
return false;
}
// Audio decoding support limited to audio/mp4.
auto audioConfig = configuration.audio;
if (audioConfig) {
if (ContentType(audioConfig->contentType).containerType() != "audio/mp4"_s)
return false;
// Can only support spatial rendering of tracks with multichannel audio:
if (audioConfig->spatialRendering.value_or(false) && audioConfig->channels.toDouble() <= 2)
return false;
}
return true;
}
static bool canSmoothlyDecodeMedia(const MediaDecodingConfiguration& configuration)
{
auto videoConfig = configuration.video;
if (videoConfig && videoConfig->framerate > 30)
return false;
auto audioConfig = configuration.audio;
if (audioConfig && !audioConfig->channels.isNull())
return audioConfig->channels == "2"_s;
return true;
}
static bool canPowerEfficientlyDecodeMedia(const MediaDecodingConfiguration& configuration)
{
auto videoConfig = configuration.video;
if (videoConfig && ContentType(videoConfig->contentType).containerType() != "video/mp4"_s)
return false;
auto audioConfig = configuration.audio;
if (audioConfig && audioConfig->bitrate)
return audioConfig->bitrate.value() <= 1000;
return true;
}
static bool canEncodeMedia(const MediaEncodingConfiguration& configuration)
{
ASSERT(configuration.type == MediaEncodingType::Record);
if (configuration.type != MediaEncodingType::Record)
return false;
// Maxing out video encoding support at 720P.
auto videoConfig = configuration.video;
if (videoConfig && videoConfig->width > 1280 && videoConfig->height > 720)
return false;
// Only the "mock-with-alpha" codec supports alphaChannel
if (videoConfig && videoConfig->alphaChannel && videoConfig->alphaChannel.value()) {
if (ContentType(videoConfig->contentType).parameter(ContentType::codecsParameter()) != "mock-with-alpha"_s)
return false;
}
// Audio encoding support limited to audio/mp4.
auto audioConfig = configuration.audio;
if (audioConfig && ContentType(audioConfig->contentType).containerType() != "audio/mp4"_s)
return false;
return true;
}
static bool canSmoothlyEncodeMedia(const MediaEncodingConfiguration& configuration)
{
auto videoConfig = configuration.video;
if (videoConfig && videoConfig->framerate > 30)
return false;
auto audioConfig = configuration.audio;
if (audioConfig && !audioConfig->channels.isNull() && audioConfig->channels != "2"_s)
return false;
return true;
}
static bool canPowerEfficientlyEncodeMedia(const MediaEncodingConfiguration& configuration)
{
auto videoConfig = configuration.video;
if (videoConfig && ContentType(videoConfig->contentType).containerType() != "video/mp4"_s)
return false;
auto audioConfig = configuration.audio;
if (audioConfig && audioConfig->bitrate && audioConfig->bitrate.value() > 1000)
return false;
return true;
}
void MediaEngineConfigurationFactoryMock::createDecodingConfiguration(MediaDecodingConfiguration&& configuration, DecodingConfigurationCallback&& callback)
{
if (!canDecodeMedia(configuration)) {
MediaCapabilitiesDecodingInfo info { WTFMove(configuration) };
callback(WTFMove(info));
return;
}
callback({{ true, canSmoothlyDecodeMedia(configuration), canPowerEfficientlyDecodeMedia(configuration) }, WTFMove(configuration)});
}
void MediaEngineConfigurationFactoryMock::createEncodingConfiguration(MediaEncodingConfiguration&& configuration, EncodingConfigurationCallback&& callback)
{
if (!canEncodeMedia(configuration)) {
callback({{ }, WTFMove(configuration) });
return;
}
callback({{ true, canSmoothlyEncodeMedia(configuration), canPowerEfficientlyEncodeMedia(configuration) }, WTFMove(configuration)});
}
} // namespace WebCore