versatica / mediasoup

Cutting Edge WebRTC Video Conferencing
https://mediasoup.org
ISC License
6.15k stars 1.12k forks source link

There are mosaics on video when switching layers #408

Closed penguinol closed 3 years ago

penguinol commented 4 years ago

Hi, guys

I found that there are mosaics on video when switching layers, as follow: 20200525144353

I captured packet. It seems because we did not finish sending the last lower layer frame packets when the higher layer i-frame came. consumer packets: 20200525151113

producer packets: 20200525152112

In consumer packets, there is serial sequence number and the timestamp of two frame is the same. This might cause the mosics.

ibc commented 4 years ago

Please provide info about codec, producer encodings, etc.

penguinol commented 4 years ago

We are using chrome with ExternalCodec. The orginal log was missed, but it should be something like this:

{
    "id": "aJQ9NMBCTbCdh2k09pLT_Q==",
    "kind": "video",
    "paused": false,
    "rtpMapping": {
        "codecs": [{
            "mappedPayloadType": 102,
            "payloadType": 107
        }, {
            "mappedPayloadType": 101,
            "payloadType": 125
        }],
        "encodings": [{
            "mappedSsrc": 871957488,
            "rid": "l",
            "ssrc": null
        }, {
            "mappedSsrc": 871957489,
            "rid": "m",
            "ssrc": null
        }, {
            "mappedSsrc": 871957490,
            "rid": "h",
            "ssrc": null
        }]
    },
    "rtpParameters": {
        "codecs": [{
            "clockRate": 90000,
            "mimeType": "video/H264",
            "parameters": {
                "level-asymmetry-allowed": 1,
                "packetization-mode": 1,
                "profile-level-id": "42e01f"
            },
            "payloadType": 125,
            "rtcpFeedback": [{
                "type": "goog-remb"
            }, {
                "type": "transport-cc"
            }, {
                "parameter": "fir",
                "type": "ccm"
            }, {
                "type": "nack"
            }, {
                "parameter": "pli",
                "type": "nack"
            }]
        }, {
            "clockRate": 90000,
            "mimeType": "video/rtx",
            "parameters": {
                "apt": 125
            },
            "payloadType": 107,
            "rtcpFeedback": []
        }],
        "encodings": [{
            "codecPayloadType": 125,
            "ksvc": false,
            "rid": "l",
            "scalabilityMode": "S1T3",
            "spatialLayers": 1,
            "temporalLayers": 3
        }, {
            "codecPayloadType": 125,
            "ksvc": false,
            "rid": "m",
            "scalabilityMode": "S1T3",
            "spatialLayers": 1,
            "temporalLayers": 3
        }, {
            "codecPayloadType": 125,
            "ksvc": false,
            "rid": "h",
            "scalabilityMode": "S1T3",
            "spatialLayers": 1,
            "temporalLayers": 3
        }],
        "headerExtensions": [{
            "encrypt": false,
            "id": 4,
            "parameters": {},
            "uri": "urn:ietf:params:rtp-hdrext:sdes:mid"
        }, {
            "encrypt": false,
            "id": 5,
            "parameters": {},
            "uri": "urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id"
        }, {
            "encrypt": false,
            "id": 6,
            "parameters": {},
            "uri": "urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id"
        }, {
            "encrypt": false,
            "id": 2,
            "parameters": {},
            "uri": "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time"
        }, {
            "encrypt": false,
            "id": 3,
            "parameters": {},
            "uri": "http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01"
        }, {
            "encrypt": false,
            "id": 8,
            "parameters": {},
            "uri": "http://tools.ietf.org/html/draft-ietf-avtext-framemarking-07"
        }, {
            "encrypt": false,
            "id": 13,
            "parameters": {},
            "uri": "urn:3gpp:video-orientation"
        }, {
            "encrypt": false,
            "id": 14,
            "parameters": {},
            "uri": "urn:ietf:params:rtp-hdrext:toffset"
        }],
        "rtcp": {
            "cname": "HZ270SjEfbtnWyVO",
            "reducedSize": true
        }
    },
    "rtpStreams": [{
        "params": {
            "clockRate": 90000,
            "cname": "HZ270SjEfbtnWyVO",
            "mimeType": "video/H264",
            "payloadType": 125,
            "rid": "m",
            "rtxPayloadType": 107,
            "rtxSsrc": 1478239160,
            "spatialLayers": 1,
            "ssrc": 159984670,
            "temporalLayers": 3,
            "useDtx": false,
            "useFir": true,
            "useInBandFec": false,
            "useNack": true,
            "usePli": true
        },
        "rtxStream": {
            "params": {
                "clockRate": 90000,
                "cname": "HZ270SjEfbtnWyVO",
                "mimeType": "video/rtx",
                "payloadType": 107,
                "rrid": "m",
                "ssrc": 1478239160
            }
        },
        "score": 10
    }, {
        "params": {
            "clockRate": 90000,
            "cname": "HZ270SjEfbtnWyVO",
            "mimeType": "video/H264",
            "payloadType": 125,
            "rid": "l",
            "rtxPayloadType": 107,
            "rtxSsrc": 1639204714,
            "spatialLayers": 1,
            "ssrc": 668485325,
            "temporalLayers": 3,
            "useDtx": false,
            "useFir": true,
            "useInBandFec": false,
            "useNack": true,
            "usePli": true
        },
        "rtxStream": {
            "params": {
                "clockRate": 90000,
                "cname": "HZ270SjEfbtnWyVO",
                "mimeType": "video/rtx",
                "payloadType": 107,
                "rrid": "l",
                "ssrc": 1639204714
            }
        },
        "score": 10
    }, {
        "params": {
            "clockRate": 90000,
            "cname": "HZ270SjEfbtnWyVO",
            "mimeType": "video/H264",
            "payloadType": 125,
            "rid": "h",
            "rtxPayloadType": 107,
            "rtxSsrc": 1846198098,
            "spatialLayers": 1,
            "ssrc": 2801259313,
            "temporalLayers": 3,
            "useDtx": false,
            "useFir": true,
            "useInBandFec": false,
            "useNack": true,
            "usePli": true
        },
        "rtxStream": {
            "params": {
                "clockRate": 90000,
                "cname": "HZ270SjEfbtnWyVO",
                "mimeType": "video/rtx",
                "payloadType": 107,
                "rrid": "h",
                "ssrc": 1846198098
            }
        },
        "score": 10
    }],
    "traceEventTypes": "",
    "type": "simulcast"
}
ibc commented 4 years ago

So this is H264. Ok, the theory in mediasoup is the following:

Taking this theory into account, perhaps the problem is the SUPER PAINFUL keyframe detection in H264. This does not happen at all in VP8, right?

penguinol commented 4 years ago

We have not tested vp8, casue we need to be compatible with some old devices which do not support vp8.

ibc commented 4 years ago

Yep, I understand. What I mean is that, in theory the only issue could be a wrong (or too optimistic) keyframe detection:

https://github.com/versatica/mediasoup/blob/v3/worker/src/RTC/Codecs/H264.cpp#L14

penguinol commented 4 years ago

The frame we sent when switching layer looks like idr frame in wireshark, so i think the keyframe detection is right in this case.

jmillan commented 4 years ago

Is it reproducible @penguinol? Have you checked the chrome logs?

$ chromeBinary --enable-logging --vmodule=*/webrtc/*=9,*=-2
penguinol commented 4 years ago

Yes, it's reproducible. Switch layer for about 10~20 times will appear once. I only tested in H.264. I'll check the chrome logs later. I tried to make a skip on rtp sequence number between two frames when previous frame was not send completely. It seems can fix the problem. I guess it's because when seq num is continuous, and the decoder receive the packet of next frame, it will try to decode previous frame, although the frame is incomplete. When the seq num is discontinuous, the decoder might know previous is incomplete, so it will drop the frame. But i'm not sure whether there is any side effect.

jmillan commented 4 years ago

Are you using the mediasoup demo? Because I'm unable to reproduce it there? Can you repro there?

penguinol commented 4 years ago

No, we are using our own web app, but it also repro in mediasoup-demo. Also you need to switch spatial layers. By the way my chrome version is: 83.0.4103.61 It's easier to reproduce when switching between high spatial layers, beacuse there are more rtp packets in one frame.

20200527133550 20200527134014

Here is my encoding config:

 routerOptions :
                {
                        mediaCodecs :
                        [
                                {
                                        kind      : 'audio',
                                        mimeType  : 'audio/opus',
                                        clockRate : 48000,
                                        channels  : 2
                                },
                                {
                                        kind       : 'video',
                                        mimeType   : 'video/h264',
                                        clockRate  : 90000,
                                        parameters :
                                        {
                                                'packetization-mode'      : 1,
                                                'profile-level-id'        : '42e032',
                                                'level-asymmetry-allowed' : 1,
                                                'x-google-start-bitrate'  : 1000
                                        }
                                }
                        ]
                },
penguinol commented 4 years ago

Here is the way i fix it. https://github.com/penguinol/mediasoup/commit/de2ed3f9a8a1a36e7ca5b392390fb44da30f4341

ibc commented 4 years ago

Interesting. Let's please some days to handle this (terribly busy).

nazar-pc commented 4 years ago

I also experience a somewhat similar issue. In 100% reproducible case with simulcast VP8 stream from Chromium sent to GStreamer, but only during initial start of the stream (changing spatial or temporal layer seems to fix it).

With @penguinol's fork I no longer see such issues (and from code changes they are not codec-specific indeed).

ibc commented 4 years ago

Interesting. @penguinol may you please rename lastSentPacketHasMarker to lastSentRtpPacketHasMarker and provide a PR for this?

jmillan commented 4 years ago

Since a video frame is carried by one or more RTP packets sharing the same RTP timestamp, I would say it would be more accurate making a timestamp jump instead of making a sequence number one.

So instead of modifying SeqManager to increase the base by one, we could decrease by one tsOffset in SimulcastConsumer. I find this change more reliable.

Could you please try it @penguinol?

ibc commented 4 years ago

Actually we already take care of NOT sending timestamp in the keyframe of the switching stream equal or less than the timestamp sent in the last packet sent (belonging to the previous simulcast stream). Look for shouldSwitchCurrentSpatialLayer in SimulcastConsimer.cpp. This should avoid the problem.

@penguinol @nazar-pc can you enable simulcast log tag in the worker and see if, when the "mosaics" happen, there is this log?

giving up on proper stream switching after got a requested keyframe for which still too high RTP timestamp extra offset is needed

penguinol commented 4 years ago

@ibc @jmillan Ok, I'll try it later.

nazar-pc commented 4 years ago

Here is my log:

``` mediasoup createWorker() +0ms mediasoup:Worker constructor() +0ms mediasoup:Worker spawning worker process: .../node_modules/mediasoup/worker/out/Release/mediasoup-worker --logLevel=debug --logTag=info --logTag=ice --logTag=dtls --logTag=rtp --logTag=srtp --logTag=rtcp --logTag=rtx --logTag=bwe --logTag=score --logTag=simulcast --logTag=svc --logTag=sctp --rtcMinPort=40000 --rtcMaxPort=40999 +0ms mediasoup:Channel constructor() +0ms mediasoup:Channel [pid:1813609] mediasoup-worker::main() | starting mediasoup-worker process [version:3.5.15] +1ms mediasoup:Channel [pid:1813609] mediasoup-worker::main() | little-endian CPU detected +0ms mediasoup:Channel [pid:1813609] mediasoup-worker::main() | 64 bits architecture detected +1ms mediasoup:Channel [pid:1813609] Settings::PrintConfiguration() | +0ms mediasoup:Channel [pid:1813609] Settings::PrintConfiguration() | logLevel : debug +1ms mediasoup:Channel [pid:1813609] Settings::PrintConfiguration() | logTags : info,ice,dtls,rtp,srtp,rtcp,rtx,bwe,score,simulcast,svc,sctp +0ms mediasoup:Channel [pid:1813609] Settings::PrintConfiguration() | rtcMinPort : 40000 +0ms mediasoup:Channel [pid:1813609] Settings::PrintConfiguration() | rtcMaxPort : 40999 +0ms mediasoup:Channel [pid:1813609] Settings::PrintConfiguration() | +0ms mediasoup:Channel [pid:1813609] DepLibUV::PrintVersion() | libuv version: "1.38.0" +0ms mediasoup:Channel [pid:1813609] DepOpenSSL::ClassInit() | openssl version: "OpenSSL 1.1.1d 10 Sep 2019" +0ms mediasoup:Channel [pid:1813609] DepLibSRTP::ClassInit() | libsrtp version: "libsrtp 2.3.0" +0ms mediasoup:Channel [pid:1813609] DepUsrSCTP::ClassInit() | usrsctp +1ms mediasoup:Channel [pid:1813609] webrtc::FieldTrial::InitFieldTrialsFromString() | Setting field trial string: WebRTC-Pacer-MinPacketLimitMs/Enabled,100/ +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::CreateSslCtx() | setting SRTP cryptoSuites for DTLS: SRTP_AEAD_AES_256_GCM:SRTP_AEAD_AES_128_GCM:SRTP_AES128_CM_SHA1_80:SRTP_AES128_CM_SHA1_32 +1ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::GenerateFingerprints() | sha-1 fingerprint: 3A:D1:4C:B7:DF:C5:D1:F4:E5:E6:87:65:FD:7B:66:64:33:BA:B1:AF +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::GenerateFingerprints() | sha-224 fingerprint: 14:32:90:EF:8D:A0:00:79:BA:01:97:F1:59:A5:CF:BD:94:68:60:7A:62:6E:58:C8:D7:10:55:E4 +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::GenerateFingerprints() | sha-256 fingerprint: D1:8F:05:F9:C3:62:B1:8D:0E:B6:37:45:08:63:21:78:2E:A7:CB:65:C5:97:1D:24:C4:4F:45:F0:A5:26:58:C5 +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::GenerateFingerprints() | sha-384 fingerprint: D4:5F:5D:55:5D:24:FC:54:66:FF:CF:5B:11:B7:B3:EE:9F:12:86:84:8B:17:A6:54:03:DA:58:C4:38:9E:19:20:E2:F3:9C:32:FB:C8:CD:65:13:BC:21:96:FF:7C:B0:04 +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::GenerateFingerprints() | sha-512 fingerprint: CA:A4:13:BA:ED:9C:FC:03:EA:33:6D:00:C7:AB:D1:EF:C7:67:08:20:B3:71:EA:FA:68:55:05:91:D2:DF:DA:65:C4:9C:BA:DB:D6:C8:D7:0E:A7:2A:D6:5A:AF:13:5F:04:96:E9:A6:CF:63:3A:8F:49:B1:4A:9B:08:17:1D:D9:FF +0ms mediasoup:Worker worker process running [pid:1813609] +6ms mediasoup:Worker createRouter() +6s mediasoup:Channel request() [method:worker.createRouter, id:1] +6s mediasoup:Channel request succeeded [method:worker.createRouter, id:1] +2ms mediasoup:Router constructor() +0ms mediasoup:Router createWebRtcTransport() +0ms mediasoup:Channel request() [method:router.createWebRtcTransport, id:2] +0ms mediasoup:Channel request succeeded [method:router.createWebRtcTransport, id:2] +1ms mediasoup:Transport constructor() +0ms mediasoup:WebRtcTransport constructor() +0ms mediasoup:Router createWebRtcTransport() +1ms mediasoup:Channel request() [method:router.createWebRtcTransport, id:3] +0ms mediasoup:Channel request succeeded [method:router.createWebRtcTransport, id:3] +1ms mediasoup:Transport constructor() +1ms mediasoup:WebRtcTransport constructor() +1ms mediasoup:Router createWebRtcTransport() +1ms mediasoup:Channel request() [method:router.createWebRtcTransport, id:4] +0ms mediasoup:Channel request succeeded [method:router.createWebRtcTransport, id:4] +0ms mediasoup:Transport constructor() +0ms mediasoup:WebRtcTransport constructor() +0ms mediasoup:WebRtcTransport connect() +19ms mediasoup:Channel request() [method:transport.connect, id:5] +19ms mediasoup:Channel request succeeded [method:transport.connect, id:5] +0ms mediasoup:Channel [pid:1813609] RTC::IceServer::HandleTuple() | transition from state 'new' to 'connected' +5ms mediasoup:Channel [pid:1813609] RTC::WebRtcTransport::OnIceServerSelectedTuple() | ICE selected tuple +0ms mediasoup:Channel [pid:1813609] RTC::WebRtcTransport::OnIceServerConnected() | ICE connected +0ms mediasoup:Channel [pid:1813609] RTC::WebRtcTransport::MayRunDtlsTransport() | running DTLS transport in local role 'client' +0ms mediasoup:Channel [pid:1813609] RTC::WebRtcTransport::OnDtlsTransportConnecting() | DTLS connecting +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::Run() | running [role:client] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | DTLS handshake start +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'before SSL initialization'] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write client hello'] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | role: client, waiting:'SSLv3/TLS write client hello'] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write client hello'] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read server hello'] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read server certificate'] +0ms mediasoup:Transport produce() +25ms mediasoup:Channel request() [method:transport.produce, id:6] +2ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read server key exchange'] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read server certificate request'] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read server done'] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write client certificate'] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write client key exchange'] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write certificate verify'] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write change cipher spec'] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write finished'] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | role: client, waiting:'SSLv3/TLS write finished'] +0ms mediasoup:Channel request succeeded [method:transport.produce, id:6] +0ms mediasoup:Channel [pid:1813609] RTC::Transport::HandleRequest() | enabling TransportCongestionControlServer with transport-cc +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write finished'] +0ms mediasoup:Producer constructor() +0ms mediasoup:Transport consume() +2ms mediasoup:Channel request() [method:transport.consume, id:7] +1ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read change cipher spec'] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read finished'] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | DTLS handshake done +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::CheckRemoteFingerprint() | valid remote fingerprint +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::GetNegotiatedSrtpCryptoSuite() | chosen SRTP crypto suite: SRTP_AES128_CM_SHA1_80 +0ms mediasoup:Channel [pid:1813609] RTC::WebRtcTransport::OnDtlsTransportConnected() | DTLS connected +1ms mediasoup:Channel [pid:1813609] RTC::SimpleConsumer::CreateRtpStream() | [ssrc:323999509, payloadType:100] +0ms mediasoup:Channel [pid:1813609] RTC::SimpleConsumer::CreateRtpStream() | in band FEC enabled +0ms mediasoup:Channel request succeeded [method:transport.consume, id:7] +0ms mediasoup:Consumer constructor() +0ms mediasoup:Transport produce() +9ms mediasoup:Channel request() [method:transport.produce, id:8] +9ms mediasoup:Channel request succeeded [method:transport.produce, id:8] +1ms mediasoup:Producer constructor() +12ms mediasoup:Transport consume() +2ms mediasoup:Channel request() [method:transport.consume, id:9] +0ms mediasoup:Channel [pid:1813609] RTC::SimulcastConsumer::CreateRtpStream() | [ssrc:329050897, payloadType:101] +1ms mediasoup:Channel [pid:1813609] RTC::SimulcastConsumer::CreateRtpStream() | FIR supported +0ms mediasoup:Channel [pid:1813609] RTC::SimulcastConsumer::CreateRtpStream() | NACK supported +0ms mediasoup:Channel [pid:1813609] RTC::SimulcastConsumer::CreateRtpStream() | PLI supported +0ms mediasoup:Channel request succeeded [method:transport.consume, id:9] +1ms mediasoup:Consumer constructor() +12ms mediasoup:Channel [pid:1813609] RTC::Producer::CreateRtpStream() | [ssrc:3527918478, rid:, payloadType:111] +3ms mediasoup:Channel [pid:1813609] RTC::Producer::CreateRtpStream() | in band FEC enabled +0ms mediasoup:WebRtcTransport connect() +32ms mediasoup:Channel request() [method:transport.connect, id:10] +8ms mediasoup:Channel request succeeded [method:transport.connect, id:10] +0ms mediasoup:Consumer resume() +12ms mediasoup:Channel request() [method:consumer.resume, id:11] +1ms mediasoup:Channel request succeeded [method:consumer.resume, id:11] +0ms mediasoup:Consumer resume() +2ms mediasoup:Channel request() [method:consumer.resume, id:12] +2ms mediasoup:Channel request succeeded [method:consumer.resume, id:12] +0ms mediasoup:Channel [pid:1813609] RTC::IceServer::HandleTuple() | transition from state 'new' to 'completed' +15ms mediasoup:Channel [pid:1813609] RTC::WebRtcTransport::OnIceServerSelectedTuple() | ICE selected tuple +0ms mediasoup:Channel [pid:1813609] RTC::WebRtcTransport::OnIceServerCompleted() | ICE completed +1ms mediasoup:Channel [pid:1813609] RTC::WebRtcTransport::MayRunDtlsTransport() | running DTLS transport in local role 'server' +0ms mediasoup:Channel [pid:1813609] RTC::WebRtcTransport::OnDtlsTransportConnecting() | DTLS connecting +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::Run() | running [role:server] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | DTLS handshake start +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'before SSL initialization'] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | role: server, waiting:'before SSL initialization'] +0ms mediasoup:Channel [pid:1813609] RTC::IceServer::ProcessStunPacket() | STUN Binding Indication processed +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | role: server, waiting:'before SSL initialization'] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'before SSL initialization'] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS read client hello'] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS write server hello'] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS write certificate'] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS write key exchange'] +1ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS write certificate request'] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS write server done'] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | role: server, waiting:'SSLv3/TLS write server done'] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | role: server, waiting:'SSLv3/TLS write server done'] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | role: server, waiting:'SSLv3/TLS write server done'] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS write server done'] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | role: server, waiting:'SSLv3/TLS read client certificate'] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS read client certificate'] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | role: server, waiting:'SSLv3/TLS read client key exchange'] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS read client key exchange'] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS read certificate verify'] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS read change cipher spec'] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS read finished'] +1ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS write change cipher spec'] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS write finished'] +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::OnSslInfo() | DTLS handshake done +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::CheckRemoteFingerprint() | valid remote fingerprint +0ms mediasoup:Channel [pid:1813609] RTC::DtlsTransport::GetNegotiatedSrtpCryptoSuite() | chosen SRTP crypto suite: SRTP_AES128_CM_SHA1_80 +0ms mediasoup:Channel [pid:1813609] RTC::WebRtcTransport::OnDtlsTransportConnected() | DTLS connected +0ms mediasoup:Channel [pid:1813609] RTC::IceServer::HandleTuple() | transition from state 'connected' to 'completed' +0ms mediasoup:Channel [pid:1813609] RTC::WebRtcTransport::OnIceServerCompleted() | ICE completed +0ms mediasoup:Channel [pid:1813609] RTC::SimpleConsumer::SendRtpPacket() | sending sync packet [ssrc:323999509, seq:1, ts:2566285862] from original [seq:15999] +12ms mediasoup:Channel [pid:1813609] RTC::Producer::CreateRtpStream() | [ssrc:240780839, rid:r1, payloadType:96] +127ms mediasoup:Channel [pid:1813609] RTC::Producer::CreateRtpStream() | FIR supported +0ms mediasoup:Channel [pid:1813609] RTC::Producer::CreateRtpStream() | NACK supported +0ms mediasoup:Channel [pid:1813609] RTC::Producer::CreateRtpStream() | PLI supported +0ms mediasoup:Channel [pid:1813609] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:240780839, seq:23750] +0ms mediasoup:Channel [pid:1813609] RTC::SimulcastConsumer::UpdateTargetLayers() | using spatial layer 1 as RTP timestamp reference +0ms mediasoup:Channel [pid:1813609] RTC::SimulcastConsumer::UpdateTargetLayers() | target layers changed [spatial:1, temporal:2, consumerId:51f515bf-9c9d-402f-ad98-d6c79263e9b3] +0ms mediasoup:Channel [pid:1813609] RTC::SimulcastConsumer::SendRtpPacket() | sync key frame received +0ms mediasoup:Channel [pid:1813609] RTC::SimulcastConsumer::SendRtpPacket() | sending sync packet [ssrc:329050897, seq:1, ts:960057204] from original [ssrc:275472411, seq:23750, ts:960057204] +0ms mediasoup:Channel [pid:1813609] RTC::WebRtcTransport::OnIceServerSelectedTuple() | ICE selected tuple +10ms mediasoup:Channel [pid:1813609] RTC::Producer::CreateRtpStream() | [ssrc:1433598790, rid:r0, payloadType:96] +0ms mediasoup:Channel [pid:1813609] RTC::Producer::CreateRtpStream() | FIR supported +0ms mediasoup:Channel [pid:1813609] RTC::Producer::CreateRtpStream() | NACK supported +0ms mediasoup:Channel [pid:1813609] RTC::Producer::CreateRtpStream() | PLI supported +0ms mediasoup:Channel [pid:1813609] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:1433598790, seq:16420] +0ms mediasoup:WARN:Channel [pid:1813609] RTC::Transport::ReceiveRtpPacket() | no suitable Producer for received RTP packet [ssrc:1912553774, payloadType:97] +0ms mediasoup:WARN:Channel [pid:1813609] RTC::Transport::ReceiveRtpPacket() | no suitable Producer for received RTP packet [ssrc:1912553774, payloadType:97] +0ms mediasoup:WARN:Channel [pid:1813609] RTC::Transport::ReceiveRtpPacket() | no suitable Producer for received RTP packet [ssrc:1912553774, payloadType:97] +4ms mediasoup:WARN:Channel [pid:1813609] RTC::Transport::ReceiveRtpPacket() | no suitable Producer for received RTP packet [ssrc:1912553774, payloadType:97] +0ms mediasoup:WARN:Channel [pid:1813609] RTC::Transport::ReceiveRtpPacket() | no suitable Producer for received RTP packet [ssrc:1912553774, payloadType:97] +4ms mediasoup:WARN:Channel [pid:1813609] RTC::Transport::ReceiveRtpPacket() | no suitable Producer for received RTP packet [ssrc:1912553774, payloadType:97] +2ms mediasoup:WARN:Channel [pid:1813609] RTC::Transport::ReceiveRtpPacket() | no suitable Producer for received RTP packet [ssrc:1912553774, payloadType:97] +0ms mediasoup:WARN:Channel [pid:1813609] RTC::Transport::ReceiveRtpPacket() | no suitable Producer for received RTP packet [ssrc:1912553774, payloadType:97] +4ms mediasoup:WARN:Channel [pid:1813609] RTC::Transport::ReceiveRtpPacket() | no suitable Producer for received RTP packet [ssrc:1912553774, payloadType:97] +0ms mediasoup:WARN:Channel [pid:1813609] RTC::Transport::ReceiveRtpPacket() | no suitable Producer for received RTP packet [ssrc:1912553774, payloadType:97] +0ms mediasoup:WARN:Channel [pid:1813609] RTC::Transport::ReceiveRtpPacket() | no suitable Producer for received RTP packet [ssrc:1912553774, payloadType:97] +3ms mediasoup:WARN:Channel [pid:1813609] RTC::Transport::ReceiveRtpPacket() | no suitable Producer for received RTP packet [ssrc:1912553774, payloadType:97] +0ms mediasoup:WARN:Channel [pid:1813609] RTC::Transport::ReceiveRtpPacket() | no suitable Producer for received RTP packet [ssrc:1912553774, payloadType:97] +0ms mediasoup:Channel [pid:1813609] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:1433598790, seq:16424] +74ms mediasoup:Channel [pid:1813609] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:240780839, seq:23757] +7ms mediasoup:Channel [pid:1813609] RTC::Producer::CreateRtpStream() | [ssrc:1266794736, rid:r2, payloadType:96] +101ms mediasoup:Channel [pid:1813609] RTC::Producer::CreateRtpStream() | FIR supported +0ms mediasoup:Channel [pid:1813609] RTC::Producer::CreateRtpStream() | NACK supported +0ms mediasoup:Channel [pid:1813609] RTC::Producer::CreateRtpStream() | PLI supported +0ms mediasoup:Channel [pid:1813609] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:1266794736, seq:27722] +1ms mediasoup:Channel [pid:1813609] RTC::SimulcastConsumer::ProducerRtcpSenderReport() | first SenderReport [ssrc:1433598790] +133ms mediasoup:Channel [pid:1813609] RTC::SimulcastConsumer::ProducerRtcpSenderReport() | first SenderReport [ssrc:240780839] +0ms mediasoup:Channel [pid:1813609] RTC::SimulcastConsumer::ProducerRtcpSenderReport() | first SenderReport [ssrc:1266794736] +0ms mediasoup:Channel [pid:1813609] RTC::SimulcastConsumer::UpdateTargetLayers() | target layers changed [spatial:2, temporal:2, consumerId:51f515bf-9c9d-402f-ad98-d6c79263e9b3] +0ms mediasoup:Channel [pid:1813609] RTC::RtpStreamRecv::RequestKeyFrame() | sending PLI [ssrc:1266794736] +0ms mediasoup:Channel [pid:1813609] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:240780839, seq:23765] +36ms mediasoup:Channel [pid:1813609] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:1433598790, seq:16433] +0ms mediasoup:Channel [pid:1813609] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:1266794736, seq:27744] +5ms mediasoup:Channel [pid:1813609] RTC::SimulcastConsumer::SendRtpPacket() | sync key frame received +0ms mediasoup:Channel [pid:1813609] RTC::SimulcastConsumer::SendRtpPacket() | RTP timestamp extra offset generated for stream switching: 1 +0ms mediasoup:Channel [pid:1813609] RTC::SimulcastConsumer::SendRtpPacket() | sending sync packet [ssrc:329050897, seq:19, ts:960090235] from original [ssrc:275472412, seq:27744, ts:1359677943] +0ms ````

This is how decoded image looks like:

![](https://user-images.githubusercontent.com/928965/83516361-91dc0800-a4df-11ea-8f45-6dfd23c668ef.png)
jmillan commented 4 years ago

Wow @nazar-pc, it seems you can repro really easily (fast).

Is there any chance we can get the same logs with the following diff applied?

diff --git a/worker/src/RTC/SimulcastConsumer.cpp b/worker/src/RTC/SimulcastConsumer.cpp
index 36fdef49..8fdf922c 100644
--- a/worker/src/RTC/SimulcastConsumer.cpp
+++ b/worker/src/RTC/SimulcastConsumer.cpp
@@ -865,6 +865,19 @@ namespace RTC
                          origSeq,
                          origTimestamp);
                }
+               else
+               {
+                       MS_DEBUG_TAG(
+                         rtp,
+                         "sending packet [ssrc:%" PRIu32 ", seq:%" PRIu16 ", ts:%" PRIu32
+                         "] from original [ssrc:%" PRIu32 ", seq:%" PRIu16 ", ts:%" PRIu32 "]",
+                         packet->GetSsrc(),
+                         packet->GetSequenceNumber(),
+                         packet->GetTimestamp(),
+                         origSsrc,
+                         origSeq,
+                         origTimestamp);
+               }

                // Process the packet.
                if (this->rtpStream->ReceivePacket(packet))
nazar-pc commented 4 years ago

Sure, it happens right away for me and seems to fix itself on key frame or layers changing:

``` mediasoup createWorker() +0ms mediasoup:Worker constructor() +0ms mediasoup:Worker spawning worker process: .../node_modules/mediasoup/worker/out/Release/mediasoup-worker --logLevel=debug --logTag=info --logTag=ice --logTag=dtls --logTag=rtp --logTag=srtp --logTag=rtcp --logTag=rtx --logTag=bwe --logTag=score --logTag=simulcast --logTag=svc --logTag=sctp --rtcMinPort=40000 --rtcMaxPort=40999 +1ms mediasoup:Channel constructor() +0ms mediasoup:Channel [pid:1888368] mediasoup-worker::main() | starting mediasoup-worker process [version:3.5.15] +2ms mediasoup:Channel [pid:1888368] mediasoup-worker::main() | little-endian CPU detected +0ms mediasoup:Channel [pid:1888368] mediasoup-worker::main() | 64 bits architecture detected +0ms mediasoup:Channel [pid:1888368] Settings::PrintConfiguration() | +0ms mediasoup:Channel [pid:1888368] Settings::PrintConfiguration() | logLevel : debug +1ms mediasoup:Channel [pid:1888368] Settings::PrintConfiguration() | logTags : info,ice,dtls,rtp,srtp,rtcp,rtx,bwe,score,simulcast,svc,sctp +0ms mediasoup:Channel [pid:1888368] Settings::PrintConfiguration() | rtcMinPort : 40000 +0ms mediasoup:Channel [pid:1888368] Settings::PrintConfiguration() | rtcMaxPort : 40999 +0ms mediasoup:Channel [pid:1888368] Settings::PrintConfiguration() | +0ms mediasoup:Channel [pid:1888368] DepLibUV::PrintVersion() | libuv version: "1.38.0" +0ms mediasoup:Channel [pid:1888368] DepOpenSSL::ClassInit() | openssl version: "OpenSSL 1.1.1d 10 Sep 2019" +0ms mediasoup:Channel [pid:1888368] DepLibSRTP::ClassInit() | libsrtp version: "libsrtp 2.3.0" +0ms mediasoup:Channel [pid:1888368] DepUsrSCTP::ClassInit() | usrsctp +1ms mediasoup:Channel [pid:1888368] webrtc::FieldTrial::InitFieldTrialsFromString() | Setting field trial string: WebRTC-Pacer-MinPacketLimitMs/Enabled,100/ +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::CreateSslCtx() | setting SRTP cryptoSuites for DTLS: SRTP_AEAD_AES_256_GCM:SRTP_AEAD_AES_128_GCM:SRTP_AES128_CM_SHA1_80:SRTP_AES128_CM_SHA1_32 +2ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::GenerateFingerprints() | sha-1 fingerprint: 94:8C:18:C4:3F:FF:64:67:44:28:A6:21:EE:47:4A:DC:59:AD:F8:51 +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::GenerateFingerprints() | sha-224 fingerprint: A2:A6:D0:C2:95:0C:3B:E3:4E:CB:9B:42:FE:F7:F6:9E:C7:E6:C3:7D:73:F4:46:C5:CC:EB:DA:31 +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::GenerateFingerprints() | sha-256 fingerprint: B6:05:75:1B:56:F6:8E:0C:A8:3A:83:3C:6F:46:AD:9A:51:2E:0C:3F:21:95:68:79:6B:6A:13:FC:44:9B:89:18 +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::GenerateFingerprints() | sha-384 fingerprint: 74:8F:6F:3D:16:A7:9F:16:2B:B1:4B:EB:9B:E5:90:E8:12:D2:12:76:A4:5C:B3:5B:44:38:1B:37:FC:71:A4:14:A1:2B:CC:07:76:82:36:81:87:43:D5:9E:10:05:5A:56 +1ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::GenerateFingerprints() | sha-512 fingerprint: 9D:FE:23:50:67:ED:23:1C:03:0D:85:42:7B:19:57:17:65:2B:43:5E:CD:79:02:20:15:50:52:D6:A8:FC:C6:50:D0:67:3A:53:2E:D7:7D:50:5B:3F:CD:D2:56:49:AC:F5:86:8E:02:9C:02:4D:46:AB:42:9B:D6:33:CD:10:03:E6 +0ms mediasoup:Worker worker process running [pid:1888368] +8ms mediasoup:Worker createRouter() +5s mediasoup:Channel request() [method:worker.createRouter, id:1] +5s mediasoup:Channel request succeeded [method:worker.createRouter, id:1] +1ms mediasoup:Router constructor() +0ms mediasoup:Router createWebRtcTransport() +0ms mediasoup:Channel request() [method:router.createWebRtcTransport, id:2] +1ms mediasoup:Channel request succeeded [method:router.createWebRtcTransport, id:2] +0ms mediasoup:Transport constructor() +0ms mediasoup:WebRtcTransport constructor() +0ms mediasoup:Router createWebRtcTransport() +1ms mediasoup:Channel request() [method:router.createWebRtcTransport, id:3] +1ms mediasoup:Channel request succeeded [method:router.createWebRtcTransport, id:3] +0ms mediasoup:Transport constructor() +1ms mediasoup:WebRtcTransport constructor() +1ms mediasoup:Router createWebRtcTransport() +1ms mediasoup:Channel request() [method:router.createWebRtcTransport, id:4] +1ms mediasoup:Channel request succeeded [method:router.createWebRtcTransport, id:4] +0ms mediasoup:Transport constructor() +0ms mediasoup:WebRtcTransport constructor() +0ms mediasoup:WebRtcTransport connect() +18ms mediasoup:Channel request() [method:transport.connect, id:5] +18ms mediasoup:Channel request succeeded [method:transport.connect, id:5] +0ms mediasoup:Channel [pid:1888368] RTC::IceServer::HandleTuple() | transition from state 'new' to 'connected' +4ms mediasoup:Channel [pid:1888368] RTC::WebRtcTransport::OnIceServerSelectedTuple() | ICE selected tuple +0ms mediasoup:Channel [pid:1888368] RTC::WebRtcTransport::OnIceServerConnected() | ICE connected +0ms mediasoup:Channel [pid:1888368] RTC::WebRtcTransport::MayRunDtlsTransport() | running DTLS transport in local role 'client' +0ms mediasoup:Channel [pid:1888368] RTC::WebRtcTransport::OnDtlsTransportConnecting() | DTLS connecting +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::Run() | running [role:client] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | DTLS handshake start +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'before SSL initialization'] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write client hello'] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | role: client, waiting:'SSLv3/TLS write client hello'] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write client hello'] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read server hello'] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read server certificate'] +0ms mediasoup:Transport produce() +23ms mediasoup:Channel request() [method:transport.produce, id:6] +2ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read server key exchange'] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read server certificate request'] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read server done'] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write client certificate'] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write client key exchange'] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write certificate verify'] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write change cipher spec'] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write finished'] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | role: client, waiting:'SSLv3/TLS write finished'] +0ms mediasoup:Channel request succeeded [method:transport.produce, id:6] +0ms mediasoup:Channel [pid:1888368] RTC::Transport::HandleRequest() | enabling TransportCongestionControlServer with transport-cc +0ms mediasoup:Producer constructor() +0ms mediasoup:Transport consume() +2ms mediasoup:Channel request() [method:transport.consume, id:7] +1ms mediasoup:Channel [pid:1888368] RTC::SimpleConsumer::CreateRtpStream() | [ssrc:444175207, payloadType:100] +0ms mediasoup:Channel [pid:1888368] RTC::SimpleConsumer::CreateRtpStream() | in band FEC enabled +0ms mediasoup:Channel request succeeded [method:transport.consume, id:7] +1ms mediasoup:Consumer constructor() +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write finished'] +1ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read change cipher spec'] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read finished'] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | DTLS handshake done +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::CheckRemoteFingerprint() | valid remote fingerprint +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::GetNegotiatedSrtpCryptoSuite() | chosen SRTP crypto suite: SRTP_AES128_CM_SHA1_80 +0ms mediasoup:Channel [pid:1888368] RTC::WebRtcTransport::OnDtlsTransportConnected() | DTLS connected +1ms mediasoup:Transport produce() +13ms mediasoup:Channel request() [method:transport.produce, id:8] +10ms mediasoup:Channel request succeeded [method:transport.produce, id:8] +2ms mediasoup:Producer constructor() +16ms mediasoup:Transport consume() +2ms mediasoup:Channel request() [method:transport.consume, id:9] +0ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::CreateRtpStream() | [ssrc:865570604, payloadType:101] +1ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::CreateRtpStream() | FIR supported +0ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::CreateRtpStream() | NACK supported +0ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::CreateRtpStream() | PLI supported +0ms mediasoup:Channel request succeeded [method:transport.consume, id:9] +1ms mediasoup:Consumer constructor() +16ms mediasoup:Channel [pid:1888368] RTC::Producer::CreateRtpStream() | [ssrc:2381897066, rid:, payloadType:111] +2ms mediasoup:Channel [pid:1888368] RTC::Producer::CreateRtpStream() | in band FEC enabled +0ms mediasoup:Channel [pid:1888368] RTC::IceServer::HandleTuple() | transition from state 'connected' to 'completed' +26ms mediasoup:Channel [pid:1888368] RTC::WebRtcTransport::OnIceServerCompleted() | ICE completed +0ms mediasoup:WebRtcTransport connect() +82ms mediasoup:Channel request() [method:transport.connect, id:10] +30ms mediasoup:Channel request succeeded [method:transport.connect, id:10] +0ms mediasoup:Consumer resume() +58ms mediasoup:Channel request() [method:consumer.resume, id:11] +0ms mediasoup:Channel request succeeded [method:consumer.resume, id:11] +1ms mediasoup:Consumer resume() +3ms mediasoup:Channel request() [method:consumer.resume, id:12] +2ms mediasoup:Channel request succeeded [method:consumer.resume, id:12] +0ms mediasoup:Channel [pid:1888368] RTC::IceServer::HandleTuple() | transition from state 'new' to 'completed' +14ms mediasoup:Channel [pid:1888368] RTC::WebRtcTransport::OnIceServerSelectedTuple() | ICE selected tuple +0ms mediasoup:Channel [pid:1888368] RTC::WebRtcTransport::OnIceServerCompleted() | ICE completed +0ms mediasoup:Channel [pid:1888368] RTC::WebRtcTransport::MayRunDtlsTransport() | running DTLS transport in local role 'server' +1ms mediasoup:Channel [pid:1888368] RTC::WebRtcTransport::OnDtlsTransportConnecting() | DTLS connecting +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::Run() | running [role:server] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | DTLS handshake start +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'before SSL initialization'] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | role: server, waiting:'before SSL initialization'] +0ms mediasoup:Channel [pid:1888368] RTC::IceServer::ProcessStunPacket() | STUN Binding Indication processed +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | role: server, waiting:'before SSL initialization'] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'before SSL initialization'] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS read client hello'] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS write server hello'] +1ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS write certificate'] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS write key exchange'] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS write certificate request'] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS write server done'] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | role: server, waiting:'SSLv3/TLS write server done'] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | role: server, waiting:'SSLv3/TLS write server done'] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | role: server, waiting:'SSLv3/TLS write server done'] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS write server done'] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | role: server, waiting:'SSLv3/TLS read client certificate'] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS read client certificate'] +1ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | role: server, waiting:'SSLv3/TLS read client key exchange'] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS read client key exchange'] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS read certificate verify'] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS read change cipher spec'] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS read finished'] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS write change cipher spec'] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS write finished'] +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::OnSslInfo() | DTLS handshake done +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::CheckRemoteFingerprint() | valid remote fingerprint +0ms mediasoup:Channel [pid:1888368] RTC::DtlsTransport::GetNegotiatedSrtpCryptoSuite() | chosen SRTP crypto suite: SRTP_AES128_CM_SHA1_80 +0ms mediasoup:Channel [pid:1888368] RTC::WebRtcTransport::OnDtlsTransportConnected() | DTLS connected +0ms mediasoup:Channel [pid:1888368] RTC::SimpleConsumer::SendRtpPacket() | sending sync packet [ssrc:444175207, seq:1, ts:3187033926] from original [seq:11395] +0ms mediasoup:Channel [pid:1888368] RTC::Producer::CreateRtpStream() | [ssrc:1259307845, rid:r1, payloadType:96] +91ms mediasoup:Channel [pid:1888368] RTC::Producer::CreateRtpStream() | FIR supported +0ms mediasoup:Channel [pid:1888368] RTC::Producer::CreateRtpStream() | NACK supported +0ms mediasoup:Channel [pid:1888368] RTC::Producer::CreateRtpStream() | PLI supported +0ms mediasoup:Channel [pid:1888368] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:1259307845, seq:10188] +1ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::UpdateTargetLayers() | using spatial layer 1 as RTP timestamp reference +0ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::UpdateTargetLayers() | target layers changed [spatial:1, temporal:2, consumerId:b1ae4122-3e4a-46f0-be37-6a9cdd0a52f5] +0ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sync key frame received +0ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending sync packet [ssrc:865570604, seq:1, ts:1600275644] from original [ssrc:289936824, seq:10188, ts:1600275644] +0ms mediasoup:Channel [pid:1888368] RTC::WebRtcTransport::OnIceServerSelectedTuple() | ICE selected tuple +9ms mediasoup:Channel [pid:1888368] RTC::Producer::CreateRtpStream() | [ssrc:1791943918, rid:r0, payloadType:96] +0ms mediasoup:Channel [pid:1888368] RTC::Producer::CreateRtpStream() | FIR supported +0ms mediasoup:Channel [pid:1888368] RTC::Producer::CreateRtpStream() | NACK supported +1ms mediasoup:Channel [pid:1888368] RTC::Producer::CreateRtpStream() | PLI supported +0ms mediasoup:Channel [pid:1888368] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:1791943918, seq:12730] +0ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending packet [ssrc:865570604, seq:2, ts:1600275644] from original [ssrc:289936824, seq:10189, ts:1600275644] +15ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending packet [ssrc:865570604, seq:3, ts:1600275644] from original [ssrc:289936824, seq:10190, ts:1600275644] +13ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending packet [ssrc:865570604, seq:4, ts:1600275644] from original [ssrc:289936824, seq:10191, ts:1600275644] +5ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending packet [ssrc:865570604, seq:5, ts:1600278884] from original [ssrc:289936824, seq:10192, ts:1600278884] +5ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending packet [ssrc:865570604, seq:6, ts:1600281764] from original [ssrc:289936824, seq:10193, ts:1600281764] +5ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending packet [ssrc:865570604, seq:7, ts:1600281764] from original [ssrc:289936824, seq:10194, ts:1600281764] +3ms mediasoup:WARN:Channel [pid:1888368] RTC::Transport::ReceiveRtpPacket() | no suitable Producer for received RTP packet [ssrc:904600929, payloadType:97] +0ms mediasoup:WARN:Channel [pid:1888368] RTC::Transport::ReceiveRtpPacket() | no suitable Producer for received RTP packet [ssrc:904600929, payloadType:97] +0ms mediasoup:WARN:Channel [pid:1888368] RTC::Transport::ReceiveRtpPacket() | no suitable Producer for received RTP packet [ssrc:904600929, payloadType:97] +4ms mediasoup:WARN:Channel [pid:1888368] RTC::Transport::ReceiveRtpPacket() | no suitable Producer for received RTP packet [ssrc:904600929, payloadType:97] +0ms mediasoup:WARN:Channel [pid:1888368] RTC::Transport::ReceiveRtpPacket() | no suitable Producer for received RTP packet [ssrc:904600929, payloadType:97] +4ms mediasoup:WARN:Channel [pid:1888368] RTC::Transport::ReceiveRtpPacket() | no suitable Producer for received RTP packet [ssrc:904600929, payloadType:97] +2ms mediasoup:WARN:Channel [pid:1888368] RTC::Transport::ReceiveRtpPacket() | no suitable Producer for received RTP packet [ssrc:904600929, payloadType:97] +1ms mediasoup:WARN:Channel [pid:1888368] RTC::Transport::ReceiveRtpPacket() | no suitable Producer for received RTP packet [ssrc:904600929, payloadType:97] +4ms mediasoup:WARN:Channel [pid:1888368] RTC::Transport::ReceiveRtpPacket() | no suitable Producer for received RTP packet [ssrc:904600929, payloadType:97] +0ms mediasoup:WARN:Channel [pid:1888368] RTC::Transport::ReceiveRtpPacket() | no suitable Producer for received RTP packet [ssrc:904600929, payloadType:97] +0ms mediasoup:WARN:Channel [pid:1888368] RTC::Transport::ReceiveRtpPacket() | no suitable Producer for received RTP packet [ssrc:904600929, payloadType:97] +3ms mediasoup:WARN:Channel [pid:1888368] RTC::Transport::ReceiveRtpPacket() | no suitable Producer for received RTP packet [ssrc:904600929, payloadType:97] +0ms mediasoup:WARN:Channel [pid:1888368] RTC::Transport::ReceiveRtpPacket() | no suitable Producer for received RTP packet [ssrc:904600929, payloadType:97] +0ms mediasoup:Channel [pid:1888368] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:1791943918, seq:12734] +28ms mediasoup:Channel [pid:1888368] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:1259307845, seq:10195] +7ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending packet [ssrc:865570604, seq:8, ts:1600284644] from original [ssrc:289936824, seq:10195, ts:1600284644] +0ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending packet [ssrc:865570604, seq:9, ts:1600284644] from original [ssrc:289936824, seq:10196, ts:1600284644] +6ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending packet [ssrc:865570604, seq:10, ts:1600284644] from original [ssrc:289936824, seq:10197, ts:1600284644] +3ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending packet [ssrc:865570604, seq:11, ts:1600284644] from original [ssrc:289936824, seq:10198, ts:1600284644] +2ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending packet [ssrc:865570604, seq:12, ts:1600287884] from original [ssrc:289936824, seq:10199, ts:1600287884] +59ms mediasoup:Channel [pid:1888368] RTC::Producer::CreateRtpStream() | [ssrc:3637030475, rid:r2, payloadType:96] +30ms mediasoup:Channel [pid:1888368] RTC::Producer::CreateRtpStream() | FIR supported +1ms mediasoup:Channel [pid:1888368] RTC::Producer::CreateRtpStream() | NACK supported +0ms mediasoup:Channel [pid:1888368] RTC::Producer::CreateRtpStream() | PLI supported +0ms mediasoup:Channel [pid:1888368] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:3637030475, seq:4507] +0ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending packet [ssrc:865570604, seq:13, ts:1600293644] from original [ssrc:289936824, seq:10200, ts:1600293644] +6ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending packet [ssrc:865570604, seq:14, ts:1600299764] from original [ssrc:289936824, seq:10201, ts:1600299764] +58ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending packet [ssrc:865570604, seq:15, ts:1600305524] from original [ssrc:289936824, seq:10202, ts:1600305524] +61ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::ProducerRtcpSenderReport() | first SenderReport [ssrc:1791943918] +11ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::ProducerRtcpSenderReport() | first SenderReport [ssrc:1259307845] +0ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::ProducerRtcpSenderReport() | first SenderReport [ssrc:3637030475] +0ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::UpdateTargetLayers() | target layers changed [spatial:2, temporal:2, consumerId:b1ae4122-3e4a-46f0-be37-6a9cdd0a52f5] +0ms mediasoup:Channel [pid:1888368] RTC::RtpStreamRecv::RequestKeyFrame() | sending PLI [ssrc:3637030475] +0ms mediasoup:Channel [pid:1888368] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:1259307845, seq:10203] +34ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending packet [ssrc:865570604, seq:16, ts:1600308764] from original [ssrc:289936824, seq:10203, ts:1600308764] +0ms mediasoup:Channel [pid:1888368] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:1791943918, seq:12743] +0ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending packet [ssrc:865570604, seq:17, ts:1600308764] from original [ssrc:289936824, seq:10204, ts:1600308764] +0ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending packet [ssrc:865570604, seq:18, ts:1600308764] from original [ssrc:289936824, seq:10205, ts:1600308764] +5ms mediasoup:Channel [pid:1888368] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:3637030475, seq:4528] +0ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sync key frame received +0ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | RTP timestamp extra offset generated for stream switching: 1 +1ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending sync packet [ssrc:865570604, seq:19, ts:1600308765] from original [ssrc:289936825, seq:4528, ts:2728670638] +0ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending packet [ssrc:865570604, seq:20, ts:1600308765] from original [ssrc:289936825, seq:4529, ts:2728670638] +4ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending packet [ssrc:865570604, seq:21, ts:1600308765] from original [ssrc:289936825, seq:4530, ts:2728670638] +1ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending packet [ssrc:865570604, seq:22, ts:1600308765] from original [ssrc:289936825, seq:4531, ts:2728670638] +0ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending packet [ssrc:865570604, seq:23, ts:1600308765] from original [ssrc:289936825, seq:4532, ts:2728670638] +5ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending packet [ssrc:865570604, seq:24, ts:1600308765] from original [ssrc:289936825, seq:4533, ts:2728670638] +0ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending packet [ssrc:865570604, seq:25, ts:1600308765] from original [ssrc:289936825, seq:4534, ts:2728670638] +0ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending packet [ssrc:865570604, seq:26, ts:1600308765] from original [ssrc:289936825, seq:4535, ts:2728670638] +5ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending packet [ssrc:865570604, seq:27, ts:1600308765] from original [ssrc:289936825, seq:4536, ts:2728670638] +0ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending packet [ssrc:865570604, seq:28, ts:1600308765] from original [ssrc:289936825, seq:4537, ts:2728670638] +0ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending packet [ssrc:865570604, seq:29, ts:1600311645] from original [ssrc:289936825, seq:4538, ts:2728673518] +5ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending packet [ssrc:865570604, seq:30, ts:1600311645] from original [ssrc:289936825, seq:4539, ts:2728673518] +0ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending packet [ssrc:865570604, seq:31, ts:1600311645] from original [ssrc:289936825, seq:4540, ts:2728673518] +0ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending packet [ssrc:865570604, seq:32, ts:1600311645] from original [ssrc:289936825, seq:4541, ts:2728673518] +5ms mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending packet [ssrc:865570604, seq:33, ts:1600314885] from original [ssrc:289936825, seq:4542, ts:2728676758] +30ms ```
jmillan commented 4 years ago

Thanks for the logs @nazar-pc,

Here the key:

  mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending packet [ssrc:865570604, seq:18, ts:1600308764] from original [ssrc:289936824, seq:10205, ts:1600308764] +5ms
  mediasoup:Channel [pid:1888368] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:3637030475, seq:4528] +0ms
  mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sync key frame received +0ms
  mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | RTP timestamp extra offset generated for stream switching: 1 +1ms
  mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending sync packet [ssrc:865570604, seq:19, ts:1600308765] from original [ssrc:289936825, seq:4528, ts:2728670638] +0ms
  mediasoup:Channel [pid:1888368] RTC::SimulcastConsumer::SendRtpPacket() | sending packet [ssrc:865570604, seq:20, ts:1600308765] from original [ssrc:289936825, seq:4529, ts:2728670638] +4ms

We are behaving as expected: when changing the source stream we increase the RTP timestamp in order to tell the encoder that this RTP packet contains a different frame than the previous one. Encoder should recognize it and encode it as a new fresh frame.

I wonder why the encoder does not recognize the payload of a RTP packet with different timestamp than the previous as a different frame. That behavior is not RFC compliant.

@penguinol solution will generate a missing RTP packet to the Receiver Reports and stats, because even if we receive a NACK for it , cannot resend a RTP packet that we never sent in the first place.

Without going further to encoders iplementations, probably the currently applied RTP timestamp difference (+1 unit) is not enough for the encoder to consider the payload a new frame. We could increase it the number of units corresponding to a new real frame. This could be made by calculating the offset in SimulcastConsumer.

BTW, I'm still no able to reproduce this :-(

penguinol commented 4 years ago

My opinion is that the decoder can recognize the new frame, cause if it doesn't, it should request a key frame after decoding failure, but there is no fir or pli in the packet, and the video is also clear. So the decoder can recognize the new frame, but it doesn't know the frame is incomplete, because the rtp seqnum is continuous and it try to decode the incomplete frame and the problem occures. Or the decoder does know the frame is incomplete (because there is no marker), but it will try to decode the frame in this situation. Making a skip in seq num will let the decoder know the frame is incomplete, and tell it do not try to decode the frame. It might be a decoder related problem, i also can't reproduce it with vp8. I have no idea about how to fix the NACK statistics info.

jmillan commented 4 years ago

@penguinol what you say makes sense.

Still I would love to be able to reproduce this. I've been able to see mosaics once in the mediasoup demo while applying download packet loss.

@nazar-pc any chance you could share how to reproduce it? Since you can reproduce it immediately in your scenario it would be really helpful trying it locally.

jmillan commented 4 years ago

@nazar-pc any chance you could share how to reproduce it? Since you can reproduce it immediately in your scenario it would be really helpful trying it locally.

Trying with mediasoup-demo locally for now.

nazar-pc commented 4 years ago

any chance you could share how to reproduce it?

It is a part of larger proprietary app that would be very non-trivial to reduce. Also it uses custom SDP serializer/parser for talking to GStreamer's webrtcbin (will hopefully replace with https://github.com/versatica/mediasoup-sdp-bridge at some point). You'd also need to build GStreamer from master branch. It is possible to do, but will take a long time to prepare a reproducible demo.

Other than that it is a regular procedure of creating WebRTC transport, consumer, exchanging SDP and resuming paused consumer as always.

jmillan commented 4 years ago

Would you @nazar-pc, @penguinol please try this branch?

It just adds a RTP timestamp offset equivalent to that which an encoder would add for a 30fps encoding for intraframe RTP packets instead of the current value of 1 that we set.

I would like to know if the decoders would consider the packet payload now a new frame due to the TS difference between this and the previous packet from a different layer.

Other that that, another option could be re-sending the last sent RTP packet but this time setting the marker bit to one, and only after that sending the RTP sync packet from the new layer.

Thanks

nazar-pc commented 4 years ago

Yes, seems to work fine for me with both 30fps and 60fps camera input :+1:

penguinol commented 4 years ago

Would you @nazar-pc, @penguinol please try this branch?

It just adds a RTP timestamp offset equivalent to that which an encoder would add for a 30fps encoding for intraframe RTP packets instead of the current value of 1 that we set.

I would like to know if the decoders would consider the packet payload now a new frame due to the TS difference between this and the previous packet from a different layer.

Other that that, another option could be re-sending the last sent RTP packet but this time setting the marker bit to one, and only after that sending the RTP sync packet from the new layer.

Thanks

It seems does not work for me.

20200604134731

penguinol commented 4 years ago

Here is a gif shows how to reproduce the problem. https://github.com/penguinol/mediasoup/blob/408/doc/3.gif

nazar-pc commented 4 years ago

@jmillan do you think changes from mentioned branch issue_408 are going to end up being merged? I'd love to see that.

nazar-pc commented 4 years ago

With slightly longer path I'm still able to reproduce issue with issue_408 branch. @penguinol's fork doesn't fix it either in that case.

Here is the log of it with @penguinol 's fork:

``` mediasoup createWorker() +0ms mediasoup:Worker constructor() +0ms mediasoup:Worker spawning worker process: /web/restream/streaming-webrtc-sfu/node_modules/mediasoup/worker/out/Release/mediasoup-worker --logLevel=debug --logTag=info --logTag=ice --logTag=dtls --logTag=rtp --logTag=srtp --logTag=rtcp --logTag=rtx --logTag=bwe --logTag=score --logTag=simulcast --logTag=svc --logTag=sctp --rtcMinPort=40000 --rtcMaxPort=40999 +0ms mediasoup:Channel constructor() +0ms mediasoup:PayloadChannel constructor() +0ms mediasoup:Channel [pid:1545612] mediasoup-worker::main() | starting mediasoup-worker process [version:3.6.4] +1ms mediasoup:Channel [pid:1545612] mediasoup-worker::main() | little-endian CPU detected +0ms mediasoup:Channel [pid:1545612] mediasoup-worker::main() | 64 bits architecture detected +0ms mediasoup:Channel [pid:1545612] Settings::PrintConfiguration() | +0ms mediasoup:Channel [pid:1545612] Settings::PrintConfiguration() | logLevel : debug +0ms mediasoup:Channel [pid:1545612] Settings::PrintConfiguration() | logTags : info,ice,dtls,rtp,srtp,rtcp,rtx,bwe,score,simulcast,svc,sctp +0ms mediasoup:Channel [pid:1545612] Settings::PrintConfiguration() | rtcMinPort : 40000 +0ms mediasoup:Channel [pid:1545612] Settings::PrintConfiguration() | rtcMaxPort : 40999 +0ms mediasoup:Channel [pid:1545612] Settings::PrintConfiguration() | +0ms mediasoup:Channel [pid:1545612] DepLibUV::PrintVersion() | libuv version: "1.38.0" +0ms mediasoup:Channel [pid:1545612] DepOpenSSL::ClassInit() | openssl version: "OpenSSL 1.1.1d 10 Sep 2019" +0ms mediasoup:Channel [pid:1545612] DepLibSRTP::ClassInit() | libsrtp version: "libsrtp 2.3.0" +1ms mediasoup:Channel [pid:1545612] DepUsrSCTP::ClassInit() | usrsctp +0ms mediasoup:Channel [pid:1545612] webrtc::FieldTrial::InitFieldTrialsFromString() | Setting field trial string: WebRTC-Pacer-MinPacketLimitMs/Enabled,100/ +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::CreateSslCtx() | setting SRTP cryptoSuites for DTLS: SRTP_AEAD_AES_256_GCM:SRTP_AEAD_AES_128_GCM:SRTP_AES128_CM_SHA1_80:SRTP_AES128_CM_SHA1_32 +2ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::GenerateFingerprints() | sha-1 fingerprint: C2:7C:81:40:9E:7C:7B:D7:51:F4:27:C1:FB:82:3F:2A:33:1A:81:03 +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::GenerateFingerprints() | sha-224 fingerprint: DC:DB:07:E9:75:EF:39:10:D2:04:2E:C9:56:7F:43:D7:9C:0E:19:F8:1F:E9:9E:8A:D9:01:80:AB +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::GenerateFingerprints() | sha-256 fingerprint: 31:4C:12:0B:4D:D5:3D:0E:E9:9A:27:3F:1B:66:69:CB:FC:D5:6E:18:25:A0:BC:45:1D:ED:5C:2D:EB:18:A7:91 +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::GenerateFingerprints() | sha-384 fingerprint: F9:61:58:ED:10:E3:68:81:3A:7B:7C:85:F8:53:63:8D:DB:DA:B8:6C:9F:5E:15:7D:25:E6:79:D9:E2:0A:AC:79:60:C5:23:F8:9B:41:B0:1B:4A:1C:61:10:97:33:19:73 +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::GenerateFingerprints() | sha-512 fingerprint: 33:18:10:1D:74:28:56:1E:BB:58:69:0E:7F:73:AB:E6:87:79:88:3B:A4:32:F9:DB:A3:72:96:53:3A:89:18:20:CD:64:B7:C5:6C:5C:F9:80:DE:87:78:EC:79:DD:11:C7:2B:96:1B:99:8F:5B:40:31:F4:BF:5D:06:D7:06:07:C5 +0ms mediasoup:Worker worker process running [pid:1545612] +6ms mediasoup:Worker createRouter() +3s mediasoup:Channel request() [method:worker.createRouter, id:1] +3s mediasoup:Channel request succeeded [method:worker.createRouter, id:1] +1ms mediasoup:Router constructor() +0ms mediasoup:Router createAudioLevelObserver() +0ms mediasoup:Channel request() [method:router.createAudioLevelObserver, id:2] +1ms mediasoup:Channel request succeeded [method:router.createAudioLevelObserver, id:2] +0ms mediasoup:RtpObserver constructor() +0ms mediasoup:Router createWebRtcTransport() +1ms mediasoup:Channel request() [method:router.createWebRtcTransport, id:3] +1ms mediasoup:Channel request succeeded [method:router.createWebRtcTransport, id:3] +0ms mediasoup:Transport constructor() +0ms mediasoup:WebRtcTransport constructor() +0ms mediasoup:Router createWebRtcTransport() +0ms mediasoup:Channel request() [method:router.createWebRtcTransport, id:4] +1ms mediasoup:Channel request succeeded [method:router.createWebRtcTransport, id:4] +0ms mediasoup:Transport constructor() +1ms mediasoup:WebRtcTransport constructor() +1ms mediasoup:WebRtcTransport connect() +149ms mediasoup:Channel request() [method:transport.connect, id:5] +149ms mediasoup:Channel request succeeded [method:transport.connect, id:5] +0ms mediasoup:Channel [pid:1545612] RTC::IceServer::HandleTuple() | transition from state 'new' to 'connected' +11ms mediasoup:Channel [pid:1545612] RTC::WebRtcTransport::OnIceServerSelectedTuple() | ICE selected tuple +0ms mediasoup:Channel [pid:1545612] RTC::WebRtcTransport::OnIceServerConnected() | ICE connected +0ms mediasoup:Channel [pid:1545612] RTC::WebRtcTransport::MayRunDtlsTransport() | running DTLS transport in local role 'client' +0ms mediasoup:Channel [pid:1545612] RTC::WebRtcTransport::OnDtlsTransportConnecting() | DTLS connecting +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::Run() | running [role:client] +1ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | DTLS handshake start +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'before SSL initialization'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write client hello'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | role: client, waiting:'SSLv3/TLS write client hello'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write client hello'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read server hello'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read server certificate'] +0ms mediasoup:Transport produce() +161ms mediasoup:Channel request() [method:transport.produce, id:6] +1ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read server key exchange'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read server certificate request'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read server done'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write client certificate'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write client key exchange'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write certificate verify'] +1ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write change cipher spec'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write finished'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | role: client, waiting:'SSLv3/TLS write finished'] +0ms mediasoup:Channel request succeeded [method:transport.produce, id:6] +0ms mediasoup:Channel [pid:1545612] RTC::Transport::HandleRequest() | enabling TransportCongestionControlServer with transport-cc +1ms mediasoup:Producer constructor() +0ms mediasoup:RtpObserver addProducer() +166ms mediasoup:Channel request() [method:rtpObserver.addProducer, id:7] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write finished'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read change cipher spec'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read finished'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | DTLS handshake done +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::CheckRemoteFingerprint() | valid remote fingerprint +1ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::GetNegotiatedSrtpCryptoSuite() | chosen SRTP crypto suite: SRTP_AES128_CM_SHA1_80 +0ms mediasoup:Channel [pid:1545612] RTC::WebRtcTransport::OnDtlsTransportConnected() | DTLS connected +0ms mediasoup:Channel request succeeded [method:rtpObserver.addProducer, id:7] +0ms mediasoup:Transport produce() +11ms mediasoup:Channel request() [method:transport.produce, id:8] +7ms mediasoup:Channel request succeeded [method:transport.produce, id:8] +2ms mediasoup:Producer constructor() +10ms mediasoup:Channel [pid:1545612] RTC::Producer::CreateRtpStream() | [ssrc:1481852567, rid:, payloadType:111] +7ms mediasoup:Channel [pid:1545612] RTC::Producer::CreateRtpStream() | in band FEC enabled +0ms mediasoup:Channel [pid:1545612] RTC::Producer::CreateRtpStream() | [ssrc:3980297567, rid:r0, payloadType:96] +10ms mediasoup:Channel [pid:1545612] RTC::Producer::CreateRtpStream() | FIR supported +0ms mediasoup:Channel [pid:1545612] RTC::Producer::CreateRtpStream() | NACK supported +0ms mediasoup:Channel [pid:1545612] RTC::Producer::CreateRtpStream() | PLI supported +0ms mediasoup:Channel [pid:1545612] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:3980297567, seq:25934] +0ms mediasoup:Channel [pid:1545612] RTC::IceServer::HandleTuple() | transition from state 'connected' to 'completed' +17ms mediasoup:Channel [pid:1545612] RTC::WebRtcTransport::OnIceServerCompleted() | ICE completed +0ms mediasoup:Channel [pid:1545612] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:3980297567, seq:25943] +138ms mediasoup:Channel [pid:1545612] RTC::WebRtcTransport::OnIceServerSelectedTuple() | ICE selected tuple +7ms mediasoup:Channel [pid:1545612] RTC::Producer::CreateRtpStream() | [ssrc:2784376046, rid:r1, payloadType:96] +100ms mediasoup:Channel [pid:1545612] RTC::Producer::CreateRtpStream() | FIR supported +0ms mediasoup:Channel [pid:1545612] RTC::Producer::CreateRtpStream() | NACK supported +0ms mediasoup:Channel [pid:1545612] RTC::Producer::CreateRtpStream() | PLI supported +0ms mediasoup:Channel [pid:1545612] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:2784376046, seq:16877] +0ms mediasoup:Channel [pid:1545612] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:3980297567, seq:25949] +8ms mediasoup:Router createWebRtcTransport() +2s mediasoup:Channel request() [method:router.createWebRtcTransport, id:9] +1s mediasoup:Channel request succeeded [method:router.createWebRtcTransport, id:9] +1ms mediasoup:Transport constructor() +2s mediasoup:WebRtcTransport constructor() +2s mediasoup:Transport consume() +0ms mediasoup:Channel request() [method:transport.consume, id:10] +0ms mediasoup:Transport consume() +0ms mediasoup:Channel request() [method:transport.consume, id:11] +1ms mediasoup:Channel [pid:1545612] RTC::SimpleConsumer::CreateRtpStream() | [ssrc:521379886, payloadType:100] +0ms mediasoup:Channel [pid:1545612] RTC::SimpleConsumer::CreateRtpStream() | in band FEC enabled +0ms mediasoup:Channel request succeeded [method:transport.consume, id:10] +0ms mediasoup:Consumer constructor() +0ms mediasoup:Channel [pid:1545612] RTC::SimulcastConsumer::CreateRtpStream() | [ssrc:137236521, payloadType:101] +1ms mediasoup:Channel [pid:1545612] RTC::SimulcastConsumer::CreateRtpStream() | FIR supported +0ms mediasoup:Channel [pid:1545612] RTC::SimulcastConsumer::CreateRtpStream() | NACK supported +0ms mediasoup:Channel [pid:1545612] RTC::SimulcastConsumer::CreateRtpStream() | PLI supported +0ms mediasoup:Channel request succeeded [method:transport.consume, id:11] +0ms mediasoup:Consumer constructor() +1ms mediasoup:WebRtcTransport connect() +115ms mediasoup:Channel request() [method:transport.connect, id:12] +114ms mediasoup:Channel request succeeded [method:transport.connect, id:12] +0ms mediasoup:Consumer resume() +114ms mediasoup:Channel request() [method:consumer.resume, id:13] +0ms mediasoup:Channel request succeeded [method:consumer.resume, id:13] +1ms mediasoup:Consumer resume() +3ms mediasoup:Channel request() [method:consumer.resume, id:14] +2ms mediasoup:Channel request succeeded [method:consumer.resume, id:14] +0ms mediasoup:Channel [pid:1545612] RTC::IceServer::HandleTuple() | transition from state 'new' to 'completed' +14ms mediasoup:Channel [pid:1545612] RTC::WebRtcTransport::OnIceServerSelectedTuple() | ICE selected tuple +0ms mediasoup:Channel [pid:1545612] RTC::WebRtcTransport::OnIceServerCompleted() | ICE completed +0ms mediasoup:Channel [pid:1545612] RTC::WebRtcTransport::MayRunDtlsTransport() | running DTLS transport in local role 'server' +0ms mediasoup:Channel [pid:1545612] RTC::WebRtcTransport::OnDtlsTransportConnecting() | DTLS connecting +1ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::Run() | running [role:server] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | DTLS handshake start +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'before SSL initialization'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | role: server, waiting:'before SSL initialization'] +0ms mediasoup:Channel [pid:1545612] RTC::IceServer::ProcessStunPacket() | STUN Binding Indication processed +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | role: server, waiting:'before SSL initialization'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'before SSL initialization'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS read client hello'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS write server hello'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS write certificate'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS write key exchange'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS write certificate request'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS write server done'] +1ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | role: server, waiting:'SSLv3/TLS write server done'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | role: server, waiting:'SSLv3/TLS write server done'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | role: server, waiting:'SSLv3/TLS write server done'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS write server done'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | role: server, waiting:'SSLv3/TLS read client certificate'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS read client certificate'] +1ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | role: server, waiting:'SSLv3/TLS read client key exchange'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS read client key exchange'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS read certificate verify'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS read change cipher spec'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS read finished'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS write change cipher spec'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS write finished'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | DTLS handshake done +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::CheckRemoteFingerprint() | valid remote fingerprint +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::GetNegotiatedSrtpCryptoSuite() | chosen SRTP crypto suite: SRTP_AES128_CM_SHA1_80 +0ms mediasoup:Channel [pid:1545612] RTC::WebRtcTransport::OnDtlsTransportConnected() | DTLS connected +0ms mediasoup:Channel [pid:1545612] RTC::SimulcastConsumer::UpdateTargetLayers() | using spatial layer 1 as RTP timestamp reference +0ms mediasoup:Channel [pid:1545612] RTC::SimulcastConsumer::UpdateTargetLayers() | target layers changed [spatial:1, temporal:2, consumerId:679d343b-f79b-4e4f-8238-b87d90e4c949] +0ms mediasoup:Channel [pid:1545612] RTC::RtpStreamRecv::RequestKeyFrame() | sending PLI [ssrc:2784376046] +0ms mediasoup:Channel [pid:1545612] RTC::SimpleConsumer::SendRtpPacket() | sending sync packet [ssrc:521379886, seq:1, ts:2273322697] from original [seq:20920] +5ms mediasoup:Channel [pid:1545612] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:3980297567, seq:26005] +20ms mediasoup:Channel [pid:1545612] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:2784376046, seq:17146] +5ms mediasoup:Channel [pid:1545612] RTC::SimulcastConsumer::SendRtpPacket() | sync key frame received +1ms mediasoup:Channel [pid:1545612] RTC::SimulcastConsumer::SendRtpPacket() | sending sync packet [ssrc:137236521, seq:1, ts:2226527266] from original [ssrc:964269805, seq:17146, ts:2226527266] +0ms mediasoup:Transport close() +3s mediasoup:Channel request() [method:transport.close, id:15] +3s mediasoup:Transport close() +0ms mediasoup:Channel request() [method:transport.close, id:16] +0ms mediasoup:Producer transportClosed() +5s mediasoup:Producer transportClosed() +1ms mediasoup:Channel request succeeded [method:transport.close, id:15] +3ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | sending DTLS warning alert: close notify +0ms mediasoup:Channel request succeeded [method:transport.close, id:16] +0ms mediasoup:Channel [pid:1545612] RTC::Transport::HandleRtcpPacket() | no Consumer found for received Receiver Report [ssrc:137236521] +1s mediasoup:Channel [pid:1545612] RTC::Transport::HandleRtcpPacket() | no Consumer found for received Receiver Report [ssrc:521379886] +0ms mediasoup:Router createWebRtcTransport() +5s mediasoup:Channel request() [method:router.createWebRtcTransport, id:17] +823ms mediasoup:Channel request succeeded [method:router.createWebRtcTransport, id:17] +1ms mediasoup:Transport constructor() +2s mediasoup:WebRtcTransport constructor() +5s mediasoup:Router createWebRtcTransport() +1ms mediasoup:Channel request() [method:router.createWebRtcTransport, id:18] +0ms mediasoup:Channel request succeeded [method:router.createWebRtcTransport, id:18] +1ms mediasoup:Transport constructor() +1ms mediasoup:WebRtcTransport constructor() +1ms mediasoup:WebRtcTransport connect() +142ms mediasoup:Channel request() [method:transport.connect, id:19] +142ms mediasoup:Channel request succeeded [method:transport.connect, id:19] +1ms mediasoup:Channel [pid:1545612] RTC::IceServer::HandleTuple() | transition from state 'new' to 'connected' +3ms mediasoup:Channel [pid:1545612] RTC::WebRtcTransport::OnIceServerSelectedTuple() | ICE selected tuple +0ms mediasoup:Channel [pid:1545612] RTC::WebRtcTransport::OnIceServerConnected() | ICE connected +0ms mediasoup:Channel [pid:1545612] RTC::WebRtcTransport::MayRunDtlsTransport() | running DTLS transport in local role 'client' +0ms mediasoup:Channel [pid:1545612] RTC::WebRtcTransport::OnDtlsTransportConnecting() | DTLS connecting +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::Run() | running [role:client] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | DTLS handshake start +1ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'before SSL initialization'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write client hello'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | role: client, waiting:'SSLv3/TLS write client hello'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write client hello'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read server hello'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read server certificate'] +0ms mediasoup:Transport produce() +147ms mediasoup:Channel request() [method:transport.produce, id:20] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read server key exchange'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read server certificate request'] +1ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read server done'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write client certificate'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write client key exchange'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write certificate verify'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write change cipher spec'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write finished'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | role: client, waiting:'SSLv3/TLS write finished'] +0ms mediasoup:Channel request succeeded [method:transport.produce, id:20] +0ms mediasoup:Channel [pid:1545612] RTC::Transport::HandleRequest() | enabling TransportCongestionControlServer with transport-cc +0ms mediasoup:Producer constructor() +2s mediasoup:Transport consume() +2ms mediasoup:Channel request() [method:transport.consume, id:21] +1ms mediasoup:RtpObserver addProducer() +7s mediasoup:Channel request() [method:rtpObserver.addProducer, id:22] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write finished'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read change cipher spec'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read finished'] +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::OnSslInfo() | DTLS handshake done +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::CheckRemoteFingerprint() | valid remote fingerprint +0ms mediasoup:Channel [pid:1545612] RTC::DtlsTransport::GetNegotiatedSrtpCryptoSuite() | chosen SRTP crypto suite: SRTP_AES128_CM_SHA1_80 +0ms mediasoup:Channel [pid:1545612] RTC::WebRtcTransport::OnDtlsTransportConnected() | DTLS connected +0ms mediasoup:Channel [pid:1545612] RTC::SimpleConsumer::CreateRtpStream() | [ssrc:381995156, payloadType:100] +0ms mediasoup:Channel [pid:1545612] RTC::SimpleConsumer::CreateRtpStream() | in band FEC enabled +0ms mediasoup:Channel request succeeded [method:transport.consume, id:21] +0ms mediasoup:Channel request succeeded [method:rtpObserver.addProducer, id:22] +0ms mediasoup:Consumer constructor() +5s mediasoup:Consumer resume() +3ms mediasoup:Channel request() [method:consumer.resume, id:23] +4ms mediasoup:Channel request succeeded [method:consumer.resume, id:23] +0ms mediasoup:Transport produce() +8ms mediasoup:Channel request() [method:transport.produce, id:24] +4ms mediasoup:Channel request succeeded [method:transport.produce, id:24] +1ms mediasoup:Producer constructor() +10ms mediasoup:Transport consume() +1ms mediasoup:Channel request() [method:transport.consume, id:25] +0ms mediasoup:Channel [pid:1545612] RTC::SimulcastConsumer::CreateRtpStream() | [ssrc:790029638, payloadType:101] +1ms mediasoup:Channel [pid:1545612] RTC::SimulcastConsumer::CreateRtpStream() | FIR supported +0ms mediasoup:Channel [pid:1545612] RTC::SimulcastConsumer::CreateRtpStream() | NACK supported +0ms mediasoup:Channel [pid:1545612] RTC::SimulcastConsumer::CreateRtpStream() | PLI supported +0ms mediasoup:Channel request succeeded [method:transport.consume, id:25] +1ms mediasoup:Consumer constructor() +7ms mediasoup:Consumer resume() +3ms mediasoup:Channel request() [method:consumer.resume, id:26] +3ms mediasoup:Channel request succeeded [method:consumer.resume, id:26] +1ms mediasoup:Channel [pid:1545612] RTC::Producer::CreateRtpStream() | [ssrc:4217963690, rid:, payloadType:111] +2ms mediasoup:Channel [pid:1545612] RTC::Producer::CreateRtpStream() | in band FEC enabled +0ms mediasoup:Channel [pid:1545612] RTC::SimpleConsumer::SendRtpPacket() | sending sync packet [ssrc:381995156, seq:1, ts:637233692] from original [seq:30392] +0ms mediasoup:Channel [pid:1545612] RTC::IceServer::HandleTuple() | transition from state 'connected' to 'completed' +28ms mediasoup:Channel [pid:1545612] RTC::WebRtcTransport::OnIceServerCompleted() | ICE completed +1ms mediasoup:Channel [pid:1545612] RTC::Producer::CreateRtpStream() | [ssrc:3560447887, rid:r0, payloadType:96] +1ms mediasoup:Channel [pid:1545612] RTC::Producer::CreateRtpStream() | FIR supported +0ms mediasoup:Channel [pid:1545612] RTC::Producer::CreateRtpStream() | NACK supported +0ms mediasoup:Channel [pid:1545612] RTC::Producer::CreateRtpStream() | PLI supported +0ms mediasoup:Channel [pid:1545612] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:3560447887, seq:10797] +0ms mediasoup:Channel [pid:1545612] RTC::SimulcastConsumer::UpdateTargetLayers() | using spatial layer 0 as RTP timestamp reference +1ms mediasoup:Channel [pid:1545612] RTC::SimulcastConsumer::UpdateTargetLayers() | target layers changed [spatial:0, temporal:2, consumerId:df4aaf35-982d-4827-aab1-d27ef25d6426] +0ms mediasoup:Channel [pid:1545612] RTC::SimulcastConsumer::SendRtpPacket() | sync key frame received +0ms mediasoup:Channel [pid:1545612] RTC::SimulcastConsumer::SendRtpPacket() | sending sync packet [ssrc:790029638, seq:1, ts:1074660185] from original [ssrc:377672144, seq:10797, ts:1074660185] +0ms mediasoup:Channel [pid:1545612] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:3560447887, seq:10805] +117ms mediasoup:Channel [pid:1545612] RTC::WebRtcTransport::OnIceServerSelectedTuple() | ICE selected tuple +33ms mediasoup:Channel [pid:1545612] RTC::Producer::CreateRtpStream() | [ssrc:3714329598, rid:r1, payloadType:96] +77ms mediasoup:Channel [pid:1545612] RTC::Producer::CreateRtpStream() | FIR supported +0ms mediasoup:Channel [pid:1545612] RTC::Producer::CreateRtpStream() | NACK supported +0ms mediasoup:Channel [pid:1545612] RTC::Producer::CreateRtpStream() | PLI supported +0ms mediasoup:Channel [pid:1545612] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:3714329598, seq:19032] +0ms mediasoup:Channel [pid:1545612] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:3560447887, seq:10811] +8ms mediasoup:Channel [pid:1545612] RTC::SimulcastConsumer::ProducerRtcpSenderReport() | first SenderReport [ssrc:3560447887] +227ms mediasoup:Channel [pid:1545612] RTC::SimulcastConsumer::ProducerRtcpSenderReport() | first SenderReport [ssrc:3714329598] +0ms mediasoup:Channel [pid:1545612] RTC::SimulcastConsumer::UpdateTargetLayers() | target layers changed [spatial:1, temporal:2, consumerId:df4aaf35-982d-4827-aab1-d27ef25d6426] +0ms mediasoup:Channel [pid:1545612] RTC::RtpStreamRecv::RequestKeyFrame() | sending PLI [ssrc:3714329598] +0ms mediasoup:Channel [pid:1545612] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:3560447887, seq:10822] +32ms mediasoup:Channel [pid:1545612] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:3714329598, seq:19059] +0ms mediasoup:Channel [pid:1545612] RTC::SimulcastConsumer::SendRtpPacket() | sync key frame received +0ms mediasoup:Channel [pid:1545612] RTC::SimulcastConsumer::SendRtpPacket() | RTP timestamp extra offset generated for stream switching: 2970 +0ms mediasoup:Channel [pid:1545612] RTC::SimulcastConsumer::SendRtpPacket() | sending sync packet [ssrc:790029638, seq:27, ts:1074708155] from original [ssrc:377672145, seq:19059, ts:4264271109] +0ms mediasoup:Channel [pid:1545612] RTC::Transport::HandleRtcpPacket() | no Consumer found for received Receiver Report [ssrc:521379886] +4s ```

And here is log with issue_408 branch:

``` mediasoup createWorker() +0ms mediasoup:Worker constructor() +0ms mediasoup:Worker spawning worker process: /web/restream/streaming-webrtc-sfu/node_modules/mediasoup/worker/out/Release/mediasoup-worker --logLevel=debug --logTag=info --logTag=ice --logTag=dtls --logTag=rtp --logTag=srtp --logTag=rtcp --logTag=rtx --logTag=bwe --logTag=score --logTag=simulcast --logTag=svc --logTag=sctp --rtcMinPort=40000 --rtcMaxPort=40999 +0ms mediasoup:Channel constructor() +0ms mediasoup:PayloadChannel constructor() +0ms mediasoup:Channel [pid:1568244] mediasoup-worker::main() | starting mediasoup-worker process [version:3.6.4] +1ms mediasoup:Channel [pid:1568244] mediasoup-worker::main() | little-endian CPU detected +1ms mediasoup:Channel [pid:1568244] mediasoup-worker::main() | 64 bits architecture detected +0ms mediasoup:Channel [pid:1568244] Settings::PrintConfiguration() | +0ms mediasoup:Channel [pid:1568244] Settings::PrintConfiguration() | logLevel : debug +0ms mediasoup:Channel [pid:1568244] Settings::PrintConfiguration() | logTags : info,ice,dtls,rtp,srtp,rtcp,rtx,bwe,score,simulcast,svc,sctp +0ms mediasoup:Channel [pid:1568244] Settings::PrintConfiguration() | rtcMinPort : 40000 +0ms mediasoup:Channel [pid:1568244] Settings::PrintConfiguration() | rtcMaxPort : 40999 +0ms mediasoup:Channel [pid:1568244] Settings::PrintConfiguration() | +0ms mediasoup:Channel [pid:1568244] DepLibUV::PrintVersion() | libuv version: "1.38.0" +0ms mediasoup:Channel [pid:1568244] DepOpenSSL::ClassInit() | openssl version: "OpenSSL 1.1.1d 10 Sep 2019" +0ms mediasoup:Channel [pid:1568244] DepLibSRTP::ClassInit() | libsrtp version: "libsrtp 2.3.0" +0ms mediasoup:Channel [pid:1568244] DepUsrSCTP::ClassInit() | usrsctp +0ms mediasoup:Channel [pid:1568244] webrtc::FieldTrial::InitFieldTrialsFromString() | Setting field trial string: WebRTC-Pacer-MinPacketLimitMs/Enabled,100/ +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::CreateSslCtx() | setting SRTP cryptoSuites for DTLS: SRTP_AEAD_AES_256_GCM:SRTP_AEAD_AES_128_GCM:SRTP_AES128_CM_SHA1_80:SRTP_AES128_CM_SHA1_32 +2ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::GenerateFingerprints() | sha-1 fingerprint: 7A:7D:8E:2B:AC:18:E2:82:3D:77:9B:8F:5A:DB:97:4C:CC:18:E3:66 +1ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::GenerateFingerprints() | sha-224 fingerprint: D7:2B:00:73:5A:E3:7A:CF:78:5F:E6:50:89:D8:E1:BB:3F:A9:E8:DD:96:FF:97:1E:C7:FC:72:B9 +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::GenerateFingerprints() | sha-256 fingerprint: 20:1B:8A:A1:EE:44:26:00:2F:99:97:1E:89:42:3B:37:ED:D5:D9:B2:1E:7A:91:AD:EA:F4:90:6F:65:91:37:02 +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::GenerateFingerprints() | sha-384 fingerprint: C3:FF:88:28:EF:4F:5A:CF:77:85:44:74:8A:78:48:E5:B4:AB:9B:D6:CD:55:CD:2B:E9:B7:9D:0C:AE:E9:BA:59:A6:C4:A4:71:9B:07:97:95:45:8D:83:13:25:C7:4B:F8 +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::GenerateFingerprints() | sha-512 fingerprint: 65:D4:80:E1:AE:68:E5:8B:92:46:F2:BB:61:7C:DC:1B:6D:EB:85:72:78:05:7F:C7:62:E9:87:17:D4:F1:FD:3F:58:FF:96:98:59:43:58:14:02:80:FC:5C:7B:EA:B5:8E:4D:42:99:78:96:C6:B8:8A:61:6D:87:5B:58:AB:68:81 +0ms mediasoup:Worker worker process running [pid:1568244] +7ms mediasoup:Worker createRouter() +5s mediasoup:Channel request() [method:worker.createRouter, id:1] +5s mediasoup:Channel request succeeded [method:worker.createRouter, id:1] +2ms mediasoup:Router constructor() +0ms mediasoup:Router createAudioLevelObserver() +0ms mediasoup:Channel request() [method:router.createAudioLevelObserver, id:2] +1ms mediasoup:Channel request succeeded [method:router.createAudioLevelObserver, id:2] +0ms mediasoup:RtpObserver constructor() +0ms mediasoup:Router createWebRtcTransport() +2ms mediasoup:Channel request() [method:router.createWebRtcTransport, id:3] +1ms mediasoup:Channel request succeeded [method:router.createWebRtcTransport, id:3] +1ms mediasoup:Transport constructor() +0ms mediasoup:WebRtcTransport constructor() +0ms mediasoup:Router createWebRtcTransport() +1ms mediasoup:Channel request() [method:router.createWebRtcTransport, id:4] +1ms mediasoup:Channel request succeeded [method:router.createWebRtcTransport, id:4] +0ms mediasoup:Transport constructor() +1ms mediasoup:WebRtcTransport constructor() +1ms mediasoup:WebRtcTransport connect() +245ms mediasoup:Channel request() [method:transport.connect, id:5] +245ms mediasoup:Channel request succeeded [method:transport.connect, id:5] +0ms mediasoup:Channel [pid:1568244] RTC::IceServer::HandleTuple() | transition from state 'new' to 'connected' +21ms mediasoup:Channel [pid:1568244] RTC::WebRtcTransport::OnIceServerSelectedTuple() | ICE selected tuple +0ms mediasoup:Channel [pid:1568244] RTC::WebRtcTransport::OnIceServerConnected() | ICE connected +1ms mediasoup:Channel [pid:1568244] RTC::WebRtcTransport::MayRunDtlsTransport() | running DTLS transport in local role 'client' +0ms mediasoup:Channel [pid:1568244] RTC::WebRtcTransport::OnDtlsTransportConnecting() | DTLS connecting +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::Run() | running [role:client] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | DTLS handshake start +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'before SSL initialization'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write client hello'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | role: client, waiting:'SSLv3/TLS write client hello'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write client hello'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read server hello'] +0ms mediasoup:Transport produce() +268ms mediasoup:Channel request() [method:transport.produce, id:6] +2ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read server certificate'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read server key exchange'] +1ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read server certificate request'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read server done'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write client certificate'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write client key exchange'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write certificate verify'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write change cipher spec'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write finished'] +1ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | role: client, waiting:'SSLv3/TLS write finished'] +0ms mediasoup:Channel request succeeded [method:transport.produce, id:6] +2ms mediasoup:Channel [pid:1568244] RTC::Transport::HandleRequest() | enabling TransportCongestionControlServer with transport-cc +0ms mediasoup:Producer constructor() +0ms mediasoup:RtpObserver addProducer() +276ms mediasoup:Channel request() [method:rtpObserver.addProducer, id:7] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write finished'] +1ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read change cipher spec'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read finished'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | DTLS handshake done +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::CheckRemoteFingerprint() | valid remote fingerprint +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::GetNegotiatedSrtpCryptoSuite() | chosen SRTP crypto suite: SRTP_AES128_CM_SHA1_80 +0ms mediasoup:Channel [pid:1568244] RTC::WebRtcTransport::OnDtlsTransportConnected() | DTLS connected +0ms mediasoup:Channel request succeeded [method:rtpObserver.addProducer, id:7] +0ms mediasoup:Transport produce() +16ms mediasoup:Channel request() [method:transport.produce, id:8] +10ms mediasoup:Channel request succeeded [method:transport.produce, id:8] +1ms mediasoup:Producer constructor() +12ms mediasoup:Channel [pid:1568244] RTC::Producer::CreateRtpStream() | [ssrc:2917065242, rid:, payloadType:111] +8ms mediasoup:Channel [pid:1568244] RTC::Producer::CreateRtpStream() | in band FEC enabled +0ms mediasoup:Channel [pid:1568244] RTC::Producer::CreateRtpStream() | [ssrc:710686895, rid:r0, payloadType:96] +20ms mediasoup:Channel [pid:1568244] RTC::Producer::CreateRtpStream() | FIR supported +1ms mediasoup:Channel [pid:1568244] RTC::Producer::CreateRtpStream() | NACK supported +0ms mediasoup:Channel [pid:1568244] RTC::Producer::CreateRtpStream() | PLI supported +0ms mediasoup:Channel [pid:1568244] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:710686895, seq:25939] +0ms mediasoup:Channel [pid:1568244] RTC::IceServer::HandleTuple() | transition from state 'connected' to 'completed' +0ms mediasoup:Channel [pid:1568244] RTC::WebRtcTransport::OnIceServerCompleted() | ICE completed +0ms mediasoup:Channel [pid:1568244] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:710686895, seq:25947] +122ms mediasoup:Channel [pid:1568244] RTC::WebRtcTransport::OnIceServerSelectedTuple() | ICE selected tuple +28ms mediasoup:Channel [pid:1568244] RTC::Producer::CreateRtpStream() | [ssrc:272036597, rid:r1, payloadType:96] +88ms mediasoup:Channel [pid:1568244] RTC::Producer::CreateRtpStream() | FIR supported +0ms mediasoup:Channel [pid:1568244] RTC::Producer::CreateRtpStream() | NACK supported +0ms mediasoup:Channel [pid:1568244] RTC::Producer::CreateRtpStream() | PLI supported +0ms mediasoup:Channel [pid:1568244] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:272036597, seq:20463] +1ms mediasoup:Channel [pid:1568244] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:710686895, seq:25953] +9ms mediasoup:Router createWebRtcTransport() +4s mediasoup:Channel request() [method:router.createWebRtcTransport, id:9] +3s mediasoup:Channel request succeeded [method:router.createWebRtcTransport, id:9] +0ms mediasoup:Transport constructor() +3s mediasoup:WebRtcTransport constructor() +3s mediasoup:Transport consume() +0ms mediasoup:Channel request() [method:transport.consume, id:10] +1ms mediasoup:Transport consume() +1ms mediasoup:Channel request() [method:transport.consume, id:11] +0ms mediasoup:Channel [pid:1568244] RTC::SimpleConsumer::CreateRtpStream() | [ssrc:228730838, payloadType:100] +1ms mediasoup:Channel [pid:1568244] RTC::SimpleConsumer::CreateRtpStream() | in band FEC enabled +0ms mediasoup:Channel request succeeded [method:transport.consume, id:10] +0ms mediasoup:Consumer constructor() +0ms mediasoup:Channel [pid:1568244] RTC::SimulcastConsumer::CreateRtpStream() | [ssrc:616654477, payloadType:101] +1ms mediasoup:Channel [pid:1568244] RTC::SimulcastConsumer::CreateRtpStream() | FIR supported +0ms mediasoup:Channel [pid:1568244] RTC::SimulcastConsumer::CreateRtpStream() | NACK supported +0ms mediasoup:Channel [pid:1568244] RTC::SimulcastConsumer::CreateRtpStream() | PLI supported +0ms mediasoup:Channel request succeeded [method:transport.consume, id:11] +0ms mediasoup:Consumer constructor() +1ms mediasoup:WebRtcTransport connect() +37ms mediasoup:Channel request() [method:transport.connect, id:12] +34ms mediasoup:Channel request succeeded [method:transport.connect, id:12] +0ms mediasoup:Consumer resume() +34ms mediasoup:Channel request() [method:consumer.resume, id:13] +0ms mediasoup:Channel request succeeded [method:consumer.resume, id:13] +1ms mediasoup:Consumer resume() +3ms mediasoup:Channel request() [method:consumer.resume, id:14] +2ms mediasoup:Channel request succeeded [method:consumer.resume, id:14] +1ms mediasoup:Channel [pid:1568244] RTC::IceServer::HandleTuple() | transition from state 'new' to 'completed' +13ms mediasoup:Channel [pid:1568244] RTC::WebRtcTransport::OnIceServerSelectedTuple() | ICE selected tuple +0ms mediasoup:Channel [pid:1568244] RTC::WebRtcTransport::OnIceServerCompleted() | ICE completed +0ms mediasoup:Channel [pid:1568244] RTC::WebRtcTransport::MayRunDtlsTransport() | running DTLS transport in local role 'server' +0ms mediasoup:Channel [pid:1568244] RTC::WebRtcTransport::OnDtlsTransportConnecting() | DTLS connecting +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::Run() | running [role:server] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | DTLS handshake start +1ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'before SSL initialization'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | role: server, waiting:'before SSL initialization'] +0ms mediasoup:Channel [pid:1568244] RTC::IceServer::ProcessStunPacket() | STUN Binding Indication processed +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | role: server, waiting:'before SSL initialization'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'before SSL initialization'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS read client hello'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS write server hello'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS write certificate'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS write key exchange'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS write certificate request'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS write server done'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | role: server, waiting:'SSLv3/TLS write server done'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | role: server, waiting:'SSLv3/TLS write server done'] +1ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | role: server, waiting:'SSLv3/TLS write server done'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS write server done'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | role: server, waiting:'SSLv3/TLS read client certificate'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS read client certificate'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | role: server, waiting:'SSLv3/TLS read client key exchange'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS read client key exchange'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS read certificate verify'] +1ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS read change cipher spec'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS read finished'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS write change cipher spec'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:server, action:'SSLv3/TLS write finished'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | DTLS handshake done +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::CheckRemoteFingerprint() | valid remote fingerprint +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::GetNegotiatedSrtpCryptoSuite() | chosen SRTP crypto suite: SRTP_AES128_CM_SHA1_80 +0ms mediasoup:Channel [pid:1568244] RTC::WebRtcTransport::OnDtlsTransportConnected() | DTLS connected +0ms mediasoup:Channel [pid:1568244] RTC::SimulcastConsumer::UpdateTargetLayers() | using spatial layer 1 as RTP timestamp reference +0ms mediasoup:Channel [pid:1568244] RTC::SimulcastConsumer::UpdateTargetLayers() | target layers changed [spatial:1, temporal:2, consumerId:37104c90-a06b-425d-9ac4-2bce6a4fde80] +0ms mediasoup:Channel [pid:1568244] RTC::RtpStreamRecv::RequestKeyFrame() | sending PLI [ssrc:272036597] +0ms mediasoup:Channel [pid:1568244] RTC::SimpleConsumer::SendRtpPacket() | sending sync packet [ssrc:228730838, seq:1, ts:3241086217] from original [seq:11143] +7ms mediasoup:Channel [pid:1568244] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:710686895, seq:26074] +36ms mediasoup:Channel [pid:1568244] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:272036597, seq:21190] +0ms mediasoup:Channel [pid:1568244] RTC::SimulcastConsumer::SendRtpPacket() | sync key frame received +0ms mediasoup:Channel [pid:1568244] RTC::SimulcastConsumer::SendRtpPacket() | sending sync packet [ssrc:616654477, seq:1, ts:3534312948] from original [ssrc:518388979, seq:21190, ts:3534312948] +0ms mediasoup:Transport close() +4s mediasoup:Channel request() [method:transport.close, id:15] +4s mediasoup:Transport close() +0ms mediasoup:Channel request() [method:transport.close, id:16] +0ms mediasoup:Producer transportClosed() +7s mediasoup:Producer transportClosed() +0ms mediasoup:Channel request succeeded [method:transport.close, id:15] +1ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | sending DTLS warning alert: close notify +1ms mediasoup:Channel request succeeded [method:transport.close, id:16] +0ms mediasoup:Router createWebRtcTransport() +6s mediasoup:Channel request() [method:router.createWebRtcTransport, id:17] +2s mediasoup:Channel request succeeded [method:router.createWebRtcTransport, id:17] +1ms mediasoup:Transport constructor() +2s mediasoup:WebRtcTransport constructor() +6s mediasoup:Router createWebRtcTransport() +1ms mediasoup:Channel request() [method:router.createWebRtcTransport, id:18] +0ms mediasoup:Channel request succeeded [method:router.createWebRtcTransport, id:18] +0ms mediasoup:Transport constructor() +0ms mediasoup:WebRtcTransport constructor() +0ms mediasoup:WebRtcTransport connect() +146ms mediasoup:Channel request() [method:transport.connect, id:19] +146ms mediasoup:Channel request succeeded [method:transport.connect, id:19] +0ms mediasoup:Channel [pid:1568244] RTC::IceServer::HandleTuple() | transition from state 'new' to 'connected' +10ms mediasoup:Channel [pid:1568244] RTC::WebRtcTransport::OnIceServerSelectedTuple() | ICE selected tuple +0ms mediasoup:Channel [pid:1568244] RTC::WebRtcTransport::OnIceServerConnected() | ICE connected +0ms mediasoup:Channel [pid:1568244] RTC::WebRtcTransport::MayRunDtlsTransport() | running DTLS transport in local role 'client' +0ms mediasoup:Channel [pid:1568244] RTC::WebRtcTransport::OnDtlsTransportConnecting() | DTLS connecting +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::Run() | running [role:client] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | DTLS handshake start +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'before SSL initialization'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write client hello'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | role: client, waiting:'SSLv3/TLS write client hello'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write client hello'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read server hello'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read server certificate'] +0ms mediasoup:Transport produce() +156ms mediasoup:Channel request() [method:transport.produce, id:20] +1ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read server key exchange'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read server certificate request'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read server done'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write client certificate'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write client key exchange'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write certificate verify'] +1ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write change cipher spec'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write finished'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | role: client, waiting:'SSLv3/TLS write finished'] +0ms mediasoup:Channel request succeeded [method:transport.produce, id:20] +0ms mediasoup:Producer constructor() +2s mediasoup:Transport consume() +2ms mediasoup:Channel request() [method:transport.consume, id:21] +1ms mediasoup:RtpObserver addProducer() +10s mediasoup:Channel request() [method:rtpObserver.addProducer, id:22] +0ms mediasoup:Channel [pid:1568244] RTC::Transport::HandleRequest() | enabling TransportCongestionControlServer with transport-cc +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS write finished'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read change cipher spec'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | [role:client, action:'SSLv3/TLS read finished'] +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::OnSslInfo() | DTLS handshake done +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::CheckRemoteFingerprint() | valid remote fingerprint +0ms mediasoup:Channel [pid:1568244] RTC::DtlsTransport::GetNegotiatedSrtpCryptoSuite() | chosen SRTP crypto suite: SRTP_AES128_CM_SHA1_80 +0ms mediasoup:Channel [pid:1568244] RTC::WebRtcTransport::OnDtlsTransportConnected() | DTLS connected +0ms mediasoup:Channel [pid:1568244] RTC::SimpleConsumer::CreateRtpStream() | [ssrc:819837390, payloadType:100] +0ms mediasoup:Channel [pid:1568244] RTC::SimpleConsumer::CreateRtpStream() | in band FEC enabled +0ms mediasoup:Channel request succeeded [method:transport.consume, id:21] +0ms mediasoup:Consumer constructor() +6s mediasoup:Channel request succeeded [method:rtpObserver.addProducer, id:22] +1ms mediasoup:Consumer resume() +4ms mediasoup:Channel request() [method:consumer.resume, id:23] +3ms mediasoup:Channel request succeeded [method:consumer.resume, id:23] +1ms mediasoup:Transport produce() +10ms mediasoup:Channel request() [method:transport.produce, id:24] +4ms mediasoup:Channel request succeeded [method:transport.produce, id:24] +1ms mediasoup:Producer constructor() +11ms mediasoup:Transport consume() +1ms mediasoup:Channel request() [method:transport.consume, id:25] +0ms mediasoup:Channel [pid:1568244] RTC::SimulcastConsumer::CreateRtpStream() | [ssrc:644685985, payloadType:101] +1ms mediasoup:Channel [pid:1568244] RTC::SimulcastConsumer::CreateRtpStream() | FIR supported +0ms mediasoup:Channel [pid:1568244] RTC::SimulcastConsumer::CreateRtpStream() | NACK supported +0ms mediasoup:Channel [pid:1568244] RTC::SimulcastConsumer::CreateRtpStream() | PLI supported +0ms mediasoup:Channel request succeeded [method:transport.consume, id:25] +1ms mediasoup:Consumer constructor() +8ms mediasoup:Consumer resume() +3ms mediasoup:Channel request() [method:consumer.resume, id:26] +3ms mediasoup:Channel request succeeded [method:consumer.resume, id:26] +1ms mediasoup:Channel [pid:1568244] RTC::Producer::CreateRtpStream() | [ssrc:2527051272, rid:, payloadType:111] +6ms mediasoup:Channel [pid:1568244] RTC::Producer::CreateRtpStream() | in band FEC enabled +0ms mediasoup:Channel [pid:1568244] RTC::SimpleConsumer::SendRtpPacket() | sending sync packet [ssrc:819837390, seq:1, ts:3833368748] from original [seq:10151] +0ms mediasoup:Channel [pid:1568244] RTC::Producer::CreateRtpStream() | [ssrc:686703858, rid:r0, payloadType:96] +5ms mediasoup:Channel [pid:1568244] RTC::Producer::CreateRtpStream() | FIR supported +0ms mediasoup:Channel [pid:1568244] RTC::Producer::CreateRtpStream() | NACK supported +0ms mediasoup:Channel [pid:1568244] RTC::Producer::CreateRtpStream() | PLI supported +0ms mediasoup:Channel [pid:1568244] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:686703858, seq:28751] +0ms mediasoup:Channel [pid:1568244] RTC::SimulcastConsumer::UpdateTargetLayers() | using spatial layer 0 as RTP timestamp reference +0ms mediasoup:Channel [pid:1568244] RTC::SimulcastConsumer::UpdateTargetLayers() | target layers changed [spatial:0, temporal:2, consumerId:91125bc2-4b95-40ac-b46b-5b67550a6b9b] +0ms mediasoup:Channel [pid:1568244] RTC::SimulcastConsumer::SendRtpPacket() | sync key frame received +0ms mediasoup:Channel [pid:1568244] RTC::SimulcastConsumer::SendRtpPacket() | sending sync packet [ssrc:644685985, seq:1, ts:845243443] from original [ssrc:495406216, seq:28751, ts:845243443] +0ms mediasoup:Channel [pid:1568244] RTC::IceServer::HandleTuple() | transition from state 'connected' to 'completed' +18ms mediasoup:Channel [pid:1568244] RTC::WebRtcTransport::OnIceServerCompleted() | ICE completed +0ms mediasoup:Channel [pid:1568244] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:686703858, seq:28760] +136ms mediasoup:Channel [pid:1568244] RTC::WebRtcTransport::OnIceServerSelectedTuple() | ICE selected tuple +10ms mediasoup:Channel [pid:1568244] RTC::Producer::CreateRtpStream() | [ssrc:538838657, rid:r1, payloadType:96] +96ms mediasoup:Channel [pid:1568244] RTC::Producer::CreateRtpStream() | FIR supported +0ms mediasoup:Channel [pid:1568244] RTC::Producer::CreateRtpStream() | NACK supported +0ms mediasoup:Channel [pid:1568244] RTC::Producer::CreateRtpStream() | PLI supported +0ms mediasoup:Channel [pid:1568244] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:538838657, seq:20972] +0ms mediasoup:Channel [pid:1568244] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:686703858, seq:28766] +7ms mediasoup:Channel [pid:1568244] RTC::SimulcastConsumer::ProducerRtcpSenderReport() | first SenderReport [ssrc:686703858] +214ms mediasoup:Channel [pid:1568244] RTC::SimulcastConsumer::ProducerRtcpSenderReport() | first SenderReport [ssrc:538838657] +0ms mediasoup:Channel [pid:1568244] RTC::SimulcastConsumer::UpdateTargetLayers() | target layers changed [spatial:1, temporal:2, consumerId:91125bc2-4b95-40ac-b46b-5b67550a6b9b] +0ms mediasoup:Channel [pid:1568244] RTC::RtpStreamRecv::RequestKeyFrame() | sending PLI [ssrc:538838657] +0ms mediasoup:Channel [pid:1568244] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:686703858, seq:28776] +13ms mediasoup:Channel [pid:1568244] RTC::Producer::ReceiveRtpPacket() | key frame received [ssrc:538838657, seq:20997] +0ms mediasoup:Channel [pid:1568244] RTC::SimulcastConsumer::SendRtpPacket() | sync key frame received +0ms mediasoup:Channel [pid:1568244] RTC::SimulcastConsumer::SendRtpPacket() | RTP timestamp extra offset generated for stream switching: 90 +0ms mediasoup:Channel [pid:1568244] RTC::SimulcastConsumer::SendRtpPacket() | sending sync packet [ssrc:644685985, seq:28, ts:845288353] from original [ssrc:495406217, seq:20997, ts:480425667] +0ms mediasoup:Channel [pid:1568244] RTC::Transport::HandleRtcpPacket() | no Consumer found for received Receiver Report [ssrc:228730838] +3s ```

UPD: Workaround that works for me :trollface: :

await new Promise((resolve) => {
    setTimeout(resolve, 1000);
});
await consumer.resume();
jmillan commented 4 years ago

Hi @nazar-pc,

@jmillan do you think changes from mentioned branch issue_408 are going to end up being merged? I'd love to see that.

Branch issue_408 is a good attempt but it's not spec compliant and there's no guarantee that it fixes the problem (indeed you can reproduce the issue).

I think my changes are the way to go, at least by spec. I hardcoded a RTP Timestamp increment of 30pfs on the first RTP packet of the new spatial layer. I'll make this increment to be as high as possible in time (low as possible in fps) so it is applicable to scenarios with smaller fps.

jmillan commented 4 years ago

Could you give it a try to issue_408 @penguinol, @nazar-pc? I've increased the RTP timestamp difference as if the stream was sent at 13fps. Hopefully any encoder will consider this a new frame and we'll get rid of this ugly effect.

penguinol commented 4 years ago

Unfortunately,i can still reproduce the problem with issue_408 branch. And it's quite easy to reproduce. Skipping on sequece num works for me.

unclerunning commented 4 years ago

I believe this may related to this issue: https://bugs.chromium.org/p/webrtc/issues/detail?id=8423. There are chances that PacketBuffer::FindFrames may deliver incomplete H264 frames.

unclerunning commented 4 years ago

Set WebRTC-SpsPpsIdrIsH264Keyframe to true at receiver side should avoid this. Also, we let mediasoup hold the last packet of a frame(marker),then send it when almost other packets belongs to the same frame have been sent to receiver to reduce the probability of delivering incomplete H264 frames.

nazar-pc commented 4 years ago

This is not H264-specific, I see similar behavior with VP8 both with GStreamer WebRTC implementation and Chromium.

jmillan commented 4 years ago

And it's quite easy to reproduce.

Could you please indicate the environment to reproduce it?

I've been not able to reproduce it right now.

Skipping on sequece num works for me.

But still reproducible by @nazar-pc. The fact that this way of fixing is not standard compliant but implementation dependant makes me think that it may solve the issue depending on the decoder implementation we face, and I would not mark it as a final fix. But your findings are great and we may end up adding total or partially your fix. I just want to get to the root of the issue.

unclerunning commented 4 years ago

@penguinol PacketBuffer::FindFrames

        // In the case of H264 we don't have a frame_begin bit (yes,
        // |frame_begin| might be set to true but that is a lie). So instead
        // we traverese backwards as long as we have a previous packet and
        // the timestamp of that packet is the same as this one. This may cause
        // the PacketBuffer to hand out incomplete frames.
       if (is_h264 && (buffer_[start_index] == nullptr ||
                        buffer_[start_index]->timestamp != frame_timestamp)) {
          break;
        }

says it will traverese backwards as long as we have a previous packet and the timestamp of that packet is the same as this one. so in your case seq from 50717 to 50733 will be treated as a complete frame. @jmillan: Change TS does make sense.

jmillan commented 4 years ago

PacketBuffer::FindFrames

So this explains why increasing the sec number works for this specific implementation.

Thanks for checking it out @unclerunning

penguinol commented 4 years ago

I'm using meidasoup-demo with this option, nothing else changed. Consumer Chrome Version is 83.0.4103.106 Producer Chrome Version is 81.0.4044.138

Reproduce steps is as the gif shows https://github.com/penguinol/mediasoup/blob/408/doc/3.gif

                routerOptions :
                {
                        mediaCodecs :
                        [
                                {
                                        kind      : 'audio',
                                        mimeType  : 'audio/opus',
                                        clockRate : 48000,
                                        channels  : 2
                                },
                                {
                                        mimeType   : 'video/h264',
                                        clockRate  : 90000,
                                        parameters :
                                        {
                                                'packetization-mode'      : 1,
                                                'profile-level-id'        : '4d0032',
                                                'level-asymmetry-allowed' : 1,
                                                'x-google-start-bitrate'  : 1000
                                        }
                                },
                                {
                                        kind       : 'video',
                                        mimeType   : 'video/h264',
                                        clockRate  : 90000,
                                        parameters :
                                        {
                                                'packetization-mode'      : 1,
                                                'profile-level-id'        : '42e01f',
                                                'level-asymmetry-allowed' : 1,
                                                'x-google-start-bitrate'  : 1000
                                        }
                                }
                        ]
                },
penguinol commented 4 years ago

@penguinol PacketBuffer::FindFrames

        // In the case of H264 we don't have a frame_begin bit (yes,
        // |frame_begin| might be set to true but that is a lie). So instead
        // we traverese backwards as long as we have a previous packet and
        // the timestamp of that packet is the same as this one. This may cause
        // the PacketBuffer to hand out incomplete frames.
       if (is_h264 && (buffer_[start_index] == nullptr ||
                        buffer_[start_index]->timestamp != frame_timestamp)) {
          break;
        }

says it will traverese backwards as long as we have a previous packet and the timestamp of that packet is the same as this one. so in your case seq from 50717 to 50733 will be treated as a complete frame. @jmillan: Change TS does make sense.

I think this may explain why skip on seq num works.

        // If this is not a keyframe, make sure there are no gaps in the
        // packet sequence numbers up until this point.
        if (!is_h264_keyframe && missing_packets_.upper_bound(start_seq_num) !=
                                     missing_packets_.begin()) {
          uint16_t stop_index = (index + 1) % size_;
          while (start_index != stop_index) {
            sequence_buffer_[start_index].frame_created = false;
            start_index = (start_index + 1) % size_;
          }
          return found_frames;
        }
      }
penguinol commented 4 years ago

Increasing timestamp may help decoder differentiate two frames. But it does not tell the decoder the frame is not complete. So that's why i can still reproduce the issue after increase timestamp.

Skipping on seq num does not help decoder differentiate two frames. So the decoder will regard the two frames as one frame, but it finds the frame is incomplete(see the code in prev replay), so it will not create a new frame object. And later on, the decoder will recheck the packets, and recognize the i frame, because every time it loops from sequence_buffer_[seq_num % size_].

  std::vector<std::unique_ptr<RtpFrameObject>> found_frames;
  for (size_t i = 0; i < size_ && PotentialNewFrame(seq_num); ++i) {
    size_t index = seq_num % size_;
    sequence_buffer_[index].continuous = true;

This explains why skipping seq num without increaing timestamp can resolve the problem.

So maybe we should both increase timestamp(to differentiate two frames) and skip on seq num(to tell the decoder frame is incomplete).

nazar-pc commented 4 years ago

This turns out to be quite frequent issue in production setting when switching layers often. Any chance to have at least temporary workaround that works in mediasoup until proper solution is found?

jmillan commented 4 years ago

Indeed @nazar-pc,

A mix of both solutions (cseq and timestamp) will be a good compromise in the meantime. We'll apply it in the next days.

jmillan commented 4 years ago

We've applied the changes related to the RTP timestamp here

The reason why we haven't applied the changes in the cseq number is because this is a problem specific to Chrome H264 decoder implementation, and such a workaround in mediasoup would generate a false packet loss in the statistics every time we switch to a different layer.

@penguinol, please lets comment on the chrome bug tracker, within this issue or in a new one and push a fix in the decoder side, since they are not being spec compliant on the frames detection.

jmillan commented 4 years ago

and push a fix in the decoder side,

Here I just mean exposing the issue so they can fix it

ibc commented 4 years ago

Yes, please guys, give a start to the issue in libwebrtc.

nazar-pc commented 4 years ago

Mentioned issue in libwebrtc is about H264, while I'm having issues with VP8. Now I'm forced to use fork with both solutions suggested here applied at the same time, which works fine.

Can you confirm that it also applies to VP8? Otherwise there is still an issue to be fixed in mediasoup.

jmillan commented 4 years ago

The problem may be related to the packet buffer, that is agnostic (not 100% true) to the codec.

Can you please confirm whether with the cseq and timestamp fix we get a packet loss of one packet every time the spatial layer is changed? A main concern for avoiding such a solution is precisely that.