In NVENC samples, where does the hardcoded "nExtraOutputDelay = 3" come from?

With the exception of the Low Latency sample, most, if not all, of the samples either leave this defaulted constructor argument as 3, or explicitly pass in 3.

Then, inside NvEncoder::CreateEncoder we have these lines:

m_nEncoderBuffer = m_encodeConfig.frameIntervalP + m_encodeConfig.rcParams.lookaheadDepth + m_nExtraOutputDelay;
m_nOutputDelay = m_nEncoderBuffer - 1;

I would like to better understand where this value 3 comes from and whether it is necessary, because it would seem that the above calculation already takes into account the GOP structure and lookahead.

Why, when encoding do we need to delay for an additional 3 input frames before receiving an output frame/packet?

Can anyone help?