/* * Copyright (c) 2012 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 "common_types.h" // NOLINT(build/include) #include #include #include #include #include "rtc_base/checks.h" #include "rtc_base/strings/string_builder.h" #include "rtc_base/stringutils.h" namespace webrtc { bool VideoCodecVP8::operator==(const VideoCodecVP8& other) const { return (complexity == other.complexity && numberOfTemporalLayers == other.numberOfTemporalLayers && denoisingOn == other.denoisingOn && automaticResizeOn == other.automaticResizeOn && frameDroppingOn == other.frameDroppingOn && keyFrameInterval == other.keyFrameInterval); } bool VideoCodecVP9::operator==(const VideoCodecVP9& other) const { return (complexity == other.complexity && numberOfTemporalLayers == other.numberOfTemporalLayers && denoisingOn == other.denoisingOn && frameDroppingOn == other.frameDroppingOn && keyFrameInterval == other.keyFrameInterval && adaptiveQpMode == other.adaptiveQpMode && automaticResizeOn == other.automaticResizeOn && numberOfSpatialLayers == other.numberOfSpatialLayers && flexibleMode == other.flexibleMode); } bool VideoCodecH264::operator==(const VideoCodecH264& other) const { return (frameDroppingOn == other.frameDroppingOn && keyFrameInterval == other.keyFrameInterval && spsLen == other.spsLen && ppsLen == other.ppsLen && profile == other.profile && (spsLen == 0 || memcmp(spsData, other.spsData, spsLen) == 0) && (ppsLen == 0 || memcmp(ppsData, other.ppsData, ppsLen) == 0)); } bool SpatialLayer::operator==(const SpatialLayer& other) const { return (width == other.width && height == other.height && numberOfTemporalLayers == other.numberOfTemporalLayers && maxBitrate == other.maxBitrate && targetBitrate == other.targetBitrate && minBitrate == other.minBitrate && qpMax == other.qpMax && active == other.active); } VideoCodec::VideoCodec() : codecType(kVideoCodecUnknown), plType(0), width(0), height(0), startBitrate(0), maxBitrate(0), minBitrate(0), targetBitrate(0), maxFramerate(0), active(true), qpMax(0), numberOfSimulcastStreams(0), simulcastStream(), spatialLayers(), mode(kRealtimeVideo), expect_encode_from_texture(false), timing_frame_thresholds({0, 0}), codec_specific_() {} VideoCodecVP8* VideoCodec::VP8() { RTC_DCHECK_EQ(codecType, kVideoCodecVP8); return &codec_specific_.VP8; } const VideoCodecVP8& VideoCodec::VP8() const { RTC_DCHECK_EQ(codecType, kVideoCodecVP8); return codec_specific_.VP8; } VideoCodecVP9* VideoCodec::VP9() { RTC_DCHECK_EQ(codecType, kVideoCodecVP9); return &codec_specific_.VP9; } const VideoCodecVP9& VideoCodec::VP9() const { RTC_DCHECK_EQ(codecType, kVideoCodecVP9); return codec_specific_.VP9; } VideoCodecH264* VideoCodec::H264() { RTC_DCHECK_EQ(codecType, kVideoCodecH264); return &codec_specific_.H264; } const VideoCodecH264& VideoCodec::H264() const { RTC_DCHECK_EQ(codecType, kVideoCodecH264); return codec_specific_.H264; } static const char* kPayloadNameVp8 = "VP8"; static const char* kPayloadNameVp9 = "VP9"; static const char* kPayloadNameH264 = "H264"; static const char* kPayloadNameI420 = "I420"; static const char* kPayloadNameRED = "RED"; static const char* kPayloadNameULPFEC = "ULPFEC"; static const char* kPayloadNameFlexfec = "flexfec-03"; static const char* kPayloadNameGeneric = "Generic"; static const char* kPayloadNameMultiplex = "Multiplex"; static bool CodecNamesEq(const char* name1, const char* name2) { return _stricmp(name1, name2) == 0; } const char* CodecTypeToPayloadString(VideoCodecType type) { switch (type) { case kVideoCodecVP8: return kPayloadNameVp8; case kVideoCodecVP9: return kPayloadNameVp9; case kVideoCodecH264: return kPayloadNameH264; case kVideoCodecI420: return kPayloadNameI420; case kVideoCodecRED: return kPayloadNameRED; case kVideoCodecULPFEC: return kPayloadNameULPFEC; case kVideoCodecFlexfec: return kPayloadNameFlexfec; // Other codecs default to generic. case kVideoCodecMultiplex: case kVideoCodecGeneric: case kVideoCodecUnknown: return kPayloadNameGeneric; } return kPayloadNameGeneric; } VideoCodecType PayloadStringToCodecType(const std::string& name) { if (CodecNamesEq(name.c_str(), kPayloadNameVp8)) return kVideoCodecVP8; if (CodecNamesEq(name.c_str(), kPayloadNameVp9)) return kVideoCodecVP9; if (CodecNamesEq(name.c_str(), kPayloadNameH264)) return kVideoCodecH264; if (CodecNamesEq(name.c_str(), kPayloadNameI420)) return kVideoCodecI420; if (CodecNamesEq(name.c_str(), kPayloadNameRED)) return kVideoCodecRED; if (CodecNamesEq(name.c_str(), kPayloadNameULPFEC)) return kVideoCodecULPFEC; if (CodecNamesEq(name.c_str(), kPayloadNameFlexfec)) return kVideoCodecFlexfec; if (CodecNamesEq(name.c_str(), kPayloadNameMultiplex)) return kVideoCodecMultiplex; return kVideoCodecGeneric; } } // namespace webrtc