コード例 #1
0
ファイル: DemuxerThr.cpp プロジェクト: biddyweb/QMPlay2
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;
		}
	}
}