
There is currently an error reported about unsupported formats for most users when an WebRTC connection is setup. This CL changes the error to a warning. The reason is that some H264 profiles are supported in hardware but not in software. When the decoder is created we will try to create pair of both software and hardware decoders for the union of supported formats. The creation of the software decoder will then fail. There is a small risk that this leads to errors later but only in rare circumstances. Most of the time this log line only confuses consumers as well as developers. Bug: none Change-Id: Ib2119016fa91bc270437a2bcf7892e9fdd7c419c Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/196645 Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org> Commit-Queue: Johannes Kron <kron@webrtc.org> Cr-Commit-Position: refs/heads/master@{#32800}
79 lines
2.7 KiB
C++
79 lines
2.7 KiB
C++
/*
|
|
* Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#include "media/engine/internal_decoder_factory.h"
|
|
|
|
#include "absl/strings/match.h"
|
|
#include "api/video_codecs/sdp_video_format.h"
|
|
#include "media/base/codec.h"
|
|
#include "media/base/media_constants.h"
|
|
#include "modules/video_coding/codecs/av1/libaom_av1_decoder.h"
|
|
#include "modules/video_coding/codecs/h264/include/h264.h"
|
|
#include "modules/video_coding/codecs/vp8/include/vp8.h"
|
|
#include "modules/video_coding/codecs/vp9/include/vp9.h"
|
|
#include "rtc_base/checks.h"
|
|
#include "rtc_base/logging.h"
|
|
|
|
namespace webrtc {
|
|
|
|
namespace {
|
|
|
|
bool IsFormatSupported(
|
|
const std::vector<webrtc::SdpVideoFormat>& supported_formats,
|
|
const webrtc::SdpVideoFormat& format) {
|
|
for (const webrtc::SdpVideoFormat& supported_format : supported_formats) {
|
|
if (cricket::IsSameCodec(format.name, format.parameters,
|
|
supported_format.name,
|
|
supported_format.parameters)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
} // namespace
|
|
|
|
std::vector<SdpVideoFormat> InternalDecoderFactory::GetSupportedFormats()
|
|
const {
|
|
std::vector<SdpVideoFormat> formats;
|
|
formats.push_back(SdpVideoFormat(cricket::kVp8CodecName));
|
|
for (const SdpVideoFormat& format : SupportedVP9DecoderCodecs())
|
|
formats.push_back(format);
|
|
for (const SdpVideoFormat& h264_format : SupportedH264Codecs())
|
|
formats.push_back(h264_format);
|
|
if (kIsLibaomAv1DecoderSupported)
|
|
formats.push_back(SdpVideoFormat(cricket::kAv1CodecName));
|
|
return formats;
|
|
}
|
|
|
|
std::unique_ptr<VideoDecoder> InternalDecoderFactory::CreateVideoDecoder(
|
|
const SdpVideoFormat& format) {
|
|
if (!IsFormatSupported(GetSupportedFormats(), format)) {
|
|
RTC_LOG(LS_WARNING) << "Trying to create decoder for unsupported format. "
|
|
<< format.ToString();
|
|
return nullptr;
|
|
}
|
|
|
|
if (absl::EqualsIgnoreCase(format.name, cricket::kVp8CodecName))
|
|
return VP8Decoder::Create();
|
|
if (absl::EqualsIgnoreCase(format.name, cricket::kVp9CodecName))
|
|
return VP9Decoder::Create();
|
|
if (absl::EqualsIgnoreCase(format.name, cricket::kH264CodecName))
|
|
return H264Decoder::Create();
|
|
if (kIsLibaomAv1DecoderSupported &&
|
|
absl::EqualsIgnoreCase(format.name, cricket::kAv1CodecName))
|
|
return CreateLibaomAv1Decoder();
|
|
|
|
RTC_NOTREACHED();
|
|
return nullptr;
|
|
}
|
|
|
|
} // namespace webrtc
|