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

        if (!getIngressId().equals(other.getIngressId())) {
            return false;
        }
        if (!getName().equals(other.getName())) {
            return false;
        }
        if (!getStreamKey().equals(other.getStreamKey())) {
            return false;
        }
        if (!getUrl().equals(other.getUrl())) {
            return false;
        }
        if (inputType_ != other.inputType_) {
            return false;
        }
        if (getBypassTranscoding() != other.getBypassTranscoding()) {
            return false;
        }
        if (hasEnableTranscoding() != other.hasEnableTranscoding()) {
            return false;
        }
        if (hasEnableTranscoding()) {
            if (getEnableTranscoding() != other.getEnableTranscoding()) {
                return false;
            }
        }
        if (hasAudio() != other.hasAudio()) {
            return false;
        }
        if (hasAudio()) {
            if (!getAudio().equals(other.getAudio())) {
                return false;
            }
        }
        if (hasVideo() != other.hasVideo()) {
            return false;
        }
        if (hasVideo()) {
            if (!getVideo().equals(other.getVideo())) {
                return false;
            }
        }
        if (!getRoomName().equals(other.getRoomName())) {
            return false;
        }
        if (!getParticipantIdentity().equals(other.getParticipantIdentity())) {
            return false;
        }
        if (!getParticipantName().equals(other.getParticipantName())) {
            return false;
        }
        if (!getParticipantMetadata().equals(other.getParticipantMetadata())) {
            return false;
        }
        if (getReusable() != other.getReusable()) {
            return false;
        }
        if (hasState() != other.hasState()) {
            return false;
        }
        if (hasState()) {
            if (!getState().equals(other.getState())) {
                return false;
            }
        }
        return getUnknownFields().equals(other.getUnknownFields());
    }
<pre>
Description of error/stream non compliance and debug info for publisher otherwise (received bitrate, resolution, bandwidth)
</pre>

<code>.livekit.IngressState state = 12;</code>
turms-plugins/turms-plugin-livekit/src/main/java/im/turms/plugin/livekit/core/proto/ingress/IngressInfo.java