void DemuxerThr::seek(bool doDemuxerSeek) { if (!doDemuxerSeek && skipBufferSeek) return; if (playC.seekTo >= 0 || playC.seekTo == SEEK_STREAM_RELOAD) { AVThread *aThr = (AVThread *)playC.aThr, *vThr = (AVThread *)playC.vThr; emit playC.chText(tr("Seeking")); playC.canUpdatePos = false; bool seekInBuffer = !skipBufferSeek; if (playC.seekTo == SEEK_STREAM_RELOAD) //po zmianie strumienia audio, wideo lub napisów lub po ponownym uruchomieniu odtwarzania { playC.seekTo = playC.pos; seekInBuffer = false; } const bool backward = playC.seekTo < (int)playC.pos; bool flush = false, aLocked = false, vLocked = false; skipBufferSeek = false; if (seekInBuffer && (!localStream || !backward)) { playC.vPackets.lock(); playC.aPackets.lock(); playC.sPackets.lock(); if ( (playC.vPackets.packetsCount() || playC.aPackets.packetsCount()) && playC.vPackets.seekTo(playC.seekTo, backward) && playC.aPackets.seekTo(playC.seekTo, backward) && playC.sPackets.seekTo(playC.seekTo, backward) ) { doDemuxerSeek = false; flush = true; time = Functions::gettime() - updateBufferedTime; //zapewni, że updateBuffered będzie na "true"; if (aThr) aLocked = aThr->lock(); if (vThr) vLocked = vThr->lock(); } else { emit playC.updateBufferedRange(-1, -1); updateBufferedTime = 0.0; } playC.vPackets.unlock(); playC.aPackets.unlock(); playC.sPackets.unlock(); } if (doDemuxerSeek && demuxer->seek(playC.seekTo, backward)) flush = true; else if (!doDemuxerSeek && !flush) { skipBufferSeek = true; if (!localStream && !unknownLength) demuxer->abort(); //Abort only the Demuxer, not IOController } if (flush) { playC.endOfStream = false; if (doDemuxerSeek) clearBuffers(); else playC.flushAssEvents(); if (!aLocked && aThr) aLocked = aThr->lock(); if (!vLocked && vThr) vLocked = vThr->lock(); playC.skipAudioFrame = playC.audio_current_pts = 0.0; playC.flushVideo = playC.flushAudio = true; if (playC.pos < 0.0) //skok po rozpoczęciu odtwarzania po uruchomieniu programu emit playC.updatePos(playC.seekTo); //uaktualnia suwak na pasku do wskazanej pozycji if (aLocked) aThr->unlock(); if (vLocked) vThr->unlock(); } if (!skipBufferSeek) { playC.canUpdatePos = true; playC.seekTo = SEEK_NOWHERE; if (!playC.paused) emit playC.chText(tr("Playback")); else playC.paused = false; } } }