diff --git a/common_types.cc b/common_types.cc index 35987a0d65..0b262a6ab9 100644 --- a/common_types.cc +++ b/common_types.cc @@ -20,6 +20,52 @@ namespace webrtc { +bool VideoCodecVP8::operator==(const VideoCodecVP8& other) const { + // Doesn't compare the tl_factory pointers, which are constructed + // based on other members. + return (complexity == other.complexity && + resilience == other.resilience && + 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 && + resilienceOn == other.resilienceOn && + 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), diff --git a/common_types.h b/common_types.h index ee4ddf7b91..482cb0475c 100644 --- a/common_types.h +++ b/common_types.h @@ -422,6 +422,10 @@ enum VP8ResilienceMode { class TemporalLayersFactory; // VP8 specific struct VideoCodecVP8 { + bool operator==(const VideoCodecVP8& other) const; + bool operator!=(const VideoCodecVP8& other) const { + return !(*this == other); + } VideoCodecComplexity complexity; VP8ResilienceMode resilience; unsigned char numberOfTemporalLayers; @@ -434,6 +438,10 @@ struct VideoCodecVP8 { // VP9 specific. struct VideoCodecVP9 { + bool operator==(const VideoCodecVP9& other) const; + bool operator!=(const VideoCodecVP9& other) const { + return !(*this == other); + } VideoCodecComplexity complexity; bool resilienceOn; unsigned char numberOfTemporalLayers; @@ -461,6 +469,10 @@ enum Profile { // H264 specific. struct VideoCodecH264 { + bool operator==(const VideoCodecH264& other) const; + bool operator!=(const VideoCodecH264& other) const { + return !(*this == other); + } bool frameDroppingOn; int keyFrameInterval; // These are NULL/0 if not externally negotiated. @@ -496,6 +508,9 @@ union VideoCodecUnion { }; struct SpatialLayer { + bool operator==(const SpatialLayer& other) const; + bool operator!=(const SpatialLayer& other) const { return !(*this == other); } + unsigned short width; unsigned short height; unsigned char numberOfTemporalLayers; diff --git a/modules/video_coding/encoder_database.cc b/modules/video_coding/encoder_database.cc index 80716df5c1..a514e14fb8 100644 --- a/modules/video_coding/encoder_database.cc +++ b/modules/video_coding/encoder_database.cc @@ -138,23 +138,23 @@ bool VCMEncoderDataBase::RequiresEncoderReset( switch (new_send_codec.codecType) { case kVideoCodecVP8: - if (memcmp(&new_send_codec.VP8(), send_codec_.VP8(), - sizeof(new_send_codec.VP8())) != 0) { + if (new_send_codec.VP8() != *send_codec_.VP8()) { return true; } break; + case kVideoCodecVP9: - if (memcmp(&new_send_codec.VP9(), send_codec_.VP9(), - sizeof(new_send_codec.VP9())) != 0) { + if (new_send_codec.VP9() != *send_codec_.VP9()) { return true; } break; + case kVideoCodecH264: - if (memcmp(&new_send_codec.H264(), send_codec_.H264(), - sizeof(new_send_codec.H264())) != 0) { + if (new_send_codec.H264() != *send_codec_.H264()) { return true; } break; + case kVideoCodecGeneric: break; // Known codecs without payload-specifics @@ -169,15 +169,9 @@ bool VCMEncoderDataBase::RequiresEncoderReset( return true; } - if (new_send_codec.numberOfSimulcastStreams > 0) { - for (unsigned char i = 0; i < new_send_codec.numberOfSimulcastStreams; - ++i) { - if (memcmp(&new_send_codec.simulcastStream[i], - &send_codec_.simulcastStream[i], - sizeof(new_send_codec.simulcastStream[i])) != 0) { - return true; - } - } + for (unsigned char i = 0; i < new_send_codec.numberOfSimulcastStreams; ++i) { + if (new_send_codec.simulcastStream[i] != send_codec_.simulcastStream[i]) + return true; } return false; }