FFProbe generated data don't seem to agree with calculated data using ffmpeg libraries

Using ffmpeg library avformat I am trying to check if the ffprobe generated data agrees with the data generated by the library. The code objective is to try to seek to the nearest key frame. When trying to seek at 100 frame or less, the codes returns 0 all the time. When trying to seek at 200 frame, the codes returns 4 all the time. But the result ie 4th frame don't seem to be right. Where am I wrong? Is my time_base conversion to actual frame faulty?

The test result using ffprobe

Filename = test.mp4  
Duration = 00:00:10.56 
Fps = 25
Total frames = 256   
The key frames pkt_pts_time are at 2.120000  and 0.000000 (using -skip_frame nokey )
Corresponding pkt_duration_time: 0.040000 and 0.040000 (  same, why?)

Abstract of the code:

// Objective: seek to the nearest key frame
frameIndex = 200;
int64_t timeBase = (int64_t(pCodecCtx->time_base.num) * AV_TIME_BASE) / int64_t(pCodecCtx->time_base.den);  
int64_t seekTarget = int64_t(frameIndex) * timeBase;

if (av_seek_frame(pFormatCtx, -1, seekTarget, AVSEEK_FLAG_FRAME | AVSEEK_FLAG_BACKWARD) < 0) return -1;

//convert the time_base to actual frame
auto time2frame = [&](int64_t tb) {
    return tb * int64_t(pCodecCtx->time_base.den) / (int64_t(pCodecCtx->time_base.num) * AV_TIME_BASE);
};

AVPacket avPacket;
int result = av_read_frame(pFormatCtx, &avPacket);
if (result == 0) {

    auto dts = avPacket.dts;
    auto pts = avPacket.pts;
    auto idx = avPacket.stream_index;
    auto f = time2frame(pts); // expecting the actual frame here
    std::cout << dts << pts << idx << f;
}