@java.lang.Override
    public boolean equals(final java.lang.Object obj) {
        if (obj == this) {
            return true;
        }
        if (!(obj instanceof RTPStats other)) {
            return super.equals(obj);
        }

        if (hasStartTime() != other.hasStartTime()) {
            return false;
        }
        if (hasStartTime()) {
            if (!getStartTime().equals(other.getStartTime())) {
                return false;
            }
        }
        if (hasEndTime() != other.hasEndTime()) {
            return false;
        }
        if (hasEndTime()) {
            if (!getEndTime().equals(other.getEndTime())) {
                return false;
            }
        }
        if (java.lang.Double.doubleToLongBits(getDuration()) != java.lang.Double
                .doubleToLongBits(other.getDuration())) {
            return false;
        }
        if (getPackets() != other.getPackets()) {
            return false;
        }
        if (java.lang.Double.doubleToLongBits(getPacketRate()) != java.lang.Double
                .doubleToLongBits(other.getPacketRate())) {
            return false;
        }
        if (getBytes() != other.getBytes()) {
            return false;
        }
        if (getHeaderBytes() != other.getHeaderBytes()) {
            return false;
        }
        if (java.lang.Double.doubleToLongBits(getBitrate()) != java.lang.Double
                .doubleToLongBits(other.getBitrate())) {
            return false;
        }
        if (getPacketsLost() != other.getPacketsLost()) {
            return false;
        }
        if (java.lang.Double.doubleToLongBits(getPacketLossRate()) != java.lang.Double
                .doubleToLongBits(other.getPacketLossRate())) {
            return false;
        }
        if (java.lang.Float.floatToIntBits(getPacketLossPercentage()) != java.lang.Float
                .floatToIntBits(other.getPacketLossPercentage())) {
            return false;
        }
        if (getPacketsDuplicate() != other.getPacketsDuplicate()) {
            return false;
        }
        if (java.lang.Double.doubleToLongBits(getPacketDuplicateRate()) != java.lang.Double
                .doubleToLongBits(other.getPacketDuplicateRate())) {
            return false;
        }
        if (getBytesDuplicate() != other.getBytesDuplicate()) {
            return false;
        }
        if (getHeaderBytesDuplicate() != other.getHeaderBytesDuplicate()) {
            return false;
        }
        if (java.lang.Double.doubleToLongBits(getBitrateDuplicate()) != java.lang.Double
                .doubleToLongBits(other.getBitrateDuplicate())) {
            return false;
        }
        if (getPacketsPadding() != other.getPacketsPadding()) {
            return false;
        }
        if (java.lang.Double.doubleToLongBits(getPacketPaddingRate()) != java.lang.Double
                .doubleToLongBits(other.getPacketPaddingRate())) {
            return false;
        }
        if (getBytesPadding() != other.getBytesPadding()) {
            return false;
        }
        if (getHeaderBytesPadding() != other.getHeaderBytesPadding()) {
            return false;
        }
        if (java.lang.Double.doubleToLongBits(getBitratePadding()) != java.lang.Double
                .doubleToLongBits(other.getBitratePadding())) {
            return false;
        }
        if (getPacketsOutOfOrder() != other.getPacketsOutOfOrder()) {
            return false;
        }
        if (getFrames() != other.getFrames()) {
            return false;
        }
        if (java.lang.Double.doubleToLongBits(getFrameRate()) != java.lang.Double
                .doubleToLongBits(other.getFrameRate())) {
            return false;
        }
        if (java.lang.Double.doubleToLongBits(getJitterCurrent()) != java.lang.Double
                .doubleToLongBits(other.getJitterCurrent())) {
            return false;
        }
        if (java.lang.Double.doubleToLongBits(getJitterMax()) != java.lang.Double
                .doubleToLongBits(other.getJitterMax())) {
            return false;
        }
        if (!internalGetGapHistogram().equals(other.internalGetGapHistogram())) {
            return false;
        }
        if (getNacks() != other.getNacks()) {
            return false;
        }
        if (getNackAcks() != other.getNackAcks()) {
            return false;
        }
        if (getNackMisses() != other.getNackMisses()) {
            return false;
        }
        if (getNackRepeated() != other.getNackRepeated()) {
            return false;
        }
        if (getPlis() != other.getPlis()) {
            return false;
        }
        if (hasLastPli() != other.hasLastPli()) {
            return false;
        }
        if (hasLastPli()) {
            if (!getLastPli().equals(other.getLastPli())) {
                return false;
            }
        }
        if (getFirs() != other.getFirs()) {
            return false;
        }
        if (hasLastFir() != other.hasLastFir()) {
            return false;
        }
        if (hasLastFir()) {
            if (!getLastFir().equals(other.getLastFir())) {
                return false;
            }
        }
        if (getRttCurrent() != other.getRttCurrent()) {
            return false;
        }
        if (getRttMax() != other.getRttMax()) {
            return false;
        }
        if (getKeyFrames() != other.getKeyFrames()) {
            return false;
        }
        if (hasLastKeyFrame() != other.hasLastKeyFrame()) {
            return false;
        }
        if (hasLastKeyFrame()) {
            if (!getLastKeyFrame().equals(other.getLastKeyFrame())) {
                return false;
            }
        }
        if (getLayerLockPlis() != other.getLayerLockPlis()) {
            return false;
        }
        if (hasLastLayerLockPli() != other.hasLastLayerLockPli()) {
            return false;
        }
        if (hasLastLayerLockPli()) {
            if (!getLastLayerLockPli().equals(other.getLastLayerLockPli())) {
                return false;
            }
        }
        if (hasPacketDrift() != other.hasPacketDrift()) {
            return false;
        }
        if (hasPacketDrift()) {
            if (!getPacketDrift().equals(other.getPacketDrift())) {
                return false;
            }
        }
        if (hasReportDrift() != other.hasReportDrift()) {
            return false;
        }
        if (hasReportDrift()) {
            if (!getReportDrift().equals(other.getReportDrift())) {
                return false;
            }
        }
        if (hasRebasedReportDrift() != other.hasRebasedReportDrift()) {
            return false;
        }
        if (hasRebasedReportDrift()) {
            if (!getRebasedReportDrift().equals(other.getRebasedReportDrift())) {
                return false;
            }
        }
        return getUnknownFields().equals(other.getUnknownFields());
    }
<pre>
NEXT_ID: 47
</pre>

<code>.livekit.RTPDrift rebased_report_drift = 46;</code>
turms-plugins/turms-plugin-livekit/src/main/java/im/turms/plugin/livekit/core/proto/models/RTPStats.java