|  | /* | 
|  | *  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 "api/video_codecs/video_codec.h" | 
|  |  | 
|  | #include <string.h> | 
|  | #include <algorithm> | 
|  | #include <limits> | 
|  | #include <string> | 
|  | #include <type_traits> | 
|  |  | 
|  | #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(VideoCodecMode::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* 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; | 
|  | // 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(), kPayloadNameMultiplex)) | 
|  | return kVideoCodecMultiplex; | 
|  | return kVideoCodecGeneric; | 
|  | } | 
|  |  | 
|  | }  // namespace webrtc |