@@ -958,6 +958,26 @@ SINT readNextPacket(
958958}
959959} // namespace
960960
961+ bool SoundSourceFFmpeg::deepFlushBuffers () {
962+ bool ret = false ;
963+ AVCodecParameters* pParams = avcodec_parameters_alloc ();
964+ if (!pParams) {
965+ return false ;
966+ }
967+ avcodec_parameters_from_context (pParams, m_pavCodecContext);
968+ const AVCodec* pCodec = m_pavCodecContext->codec ;
969+ AVCodecContextPtr pavCodecContext = AVCodecContextPtr::alloc (pCodec);
970+ if (pavCodecContext) {
971+ avcodec_parameters_to_context (pavCodecContext, pParams);
972+ if (avcodec_open2 (pavCodecContext, pCodec, nullptr ) == 0 ) {
973+ m_pavCodecContext = std::move (pavCodecContext);
974+ ret = true ;
975+ }
976+ }
977+ avcodec_parameters_free (&pParams);
978+ return ret;
979+ }
980+
961981bool SoundSourceFFmpeg::adjustCurrentPosition (SINT startIndex) {
962982 DEBUG_ASSERT (frameIndexRange ().containsIndex (startIndex));
963983
@@ -989,9 +1009,11 @@ bool SoundSourceFFmpeg::adjustCurrentPosition(SINT startIndex) {
9891009 // was limited to -661 instead of -2111. The workaround here is to reopen
9901010 // the codec which initializes all buffers with zero.
9911011 // Slow: 43 us (Core Ultra 5 125U)
992- const AVCodec* pCodec = m_pavCodecContext->codec ;
993- avcodec_close (m_pavCodecContext);
994- avcodec_open2 (m_pavCodecContext, pCodec, nullptr );
1012+ if (!deepFlushBuffers ()) {
1013+ kLogger .warning () << " deepFlushBuffers failed" ;
1014+ m_frameBuffer.invalidate ();
1015+ return false ;
1016+ }
9951017 }
9961018
9971019 // Seek to new position
0 commit comments