in FFmpegInterop/Source/FFmpegInteropMSS.cpp [695:736]
void FFmpegInteropMSS::OnStarting(MediaStreamSource ^sender, MediaStreamSourceStartingEventArgs ^args)
{
MediaStreamSourceStartingRequest^ request = args->Request;
// Perform seek operation when MediaStreamSource received seek event from MediaElement
if (request->StartPosition && request->StartPosition->Value.Duration <= mediaDuration.Duration)
{
// Select the first valid stream either from video or audio
int streamIndex = videoStreamIndex >= 0 ? videoStreamIndex : audioStreamIndex >= 0 ? audioStreamIndex : -1;
if (streamIndex >= 0)
{
// Convert TimeSpan unit to AV_TIME_BASE
int64_t seekTarget = static_cast<int64_t>(request->StartPosition->Value.Duration / (av_q2d(avFormatCtx->streams[streamIndex]->time_base) * 10000000));
if (av_seek_frame(avFormatCtx, streamIndex, seekTarget, AVSEEK_FLAG_BACKWARD) < 0)
{
DebugMessage(L" - ### Error while seeking\n");
}
else
{
// Add deferral
// Flush the AudioSampleProvider
if (audioSampleProvider != nullptr)
{
audioSampleProvider->Flush();
avcodec_flush_buffers(avAudioCodecCtx);
}
// Flush the VideoSampleProvider
if (videoSampleProvider != nullptr)
{
videoSampleProvider->Flush();
avcodec_flush_buffers(avVideoCodecCtx);
}
}
}
request->SetActualStartPosition(request->StartPosition->Value);
}
}