Figured that out after several days of debugging.
The thing was that browser handles webrtc packet loss in a weird way when using h264. When it detects a lost packet it just drops all following frames until the next keyframe.
In my infrastructure I constantly have a small percentage of udp packets loss, usually about 3%. And by default, my RTP stream encoded video with quite large delay between keyframes.
So when browser encountered lost package video stopped playing and continued only after next keyframe which comes in 2-3 seconds. That was the cause of blinking and I easily reproduced it locally inflicting package loss on the RTP stream source.
Unfortunately I'm not able to use the retransmission mechanisms here, 'cause keeping latency as low as possible is my priority goal.
So I solved it like that:
* In my Gstreamer source I disabled automatic adjusting of keyframes interval
* Set it to send keyframe each 0.33 second (1 keyframe to 2 usual frames in my case)
That worked good enough for me: blinking stopped, only a tiny freezes occur sometime when the network goes bad. Quality of video is slightly lower than before, but it's totally fine for my goals.