void AsyncVideoProvider::ProcAsync(uint_fast32_t req_version, bool check_updated) {
	// Only actually produce the frame if there's no queued changes waiting
	if (req_version < version || frame_number < 0) return;

	std::vector<AssDialogueBase const*> visible_lines;
	for (auto const& line : subs->Events) {
		if (!line.Comment && !(line.Start > time || line.End <= time))
			visible_lines.push_back(&line);
	}

	if (check_updated && !NeedUpdate(visible_lines)) return;

	last_lines.clear();
	last_lines.reserve(visible_lines.size());
	for (auto line : visible_lines)
		last_lines.push_back(*line);
	last_rendered = frame_number;

	try {
		FrameReadyEvent *evt = new FrameReadyEvent(ProcFrame(frame_number, time), time);
		evt->SetEventType(EVT_FRAME_READY);
		parent->QueueEvent(evt);
	}
	catch (wxEvent const& err) {
		// Pass error back to parent thread
		parent->QueueEvent(err.Clone());
	}
}
示例#2
0
void *ThreadedFrameSource::Entry() {
	while (!TestDestroy()) {
		double time;
		int frameNum;
		std::unique_ptr<AssFile> newSubs;
		std::deque<std::pair<size_t, std::unique_ptr<AssEntry>>> updates;
		{
			wxMutexLocker jobLocker(jobMutex);

			if (!run)
				return EXIT_SUCCESS;

			if (nextTime == -1.) {
				jobReady.Wait();
				continue;
			}

			time = nextTime;
			frameNum = nextFrame;
			nextTime = -1.;
			newSubs = move(nextSubs);
			updates = move(changedSubs);
		}

		if (newSubs || updates.size()) {
			wxMutexLocker fileLocker(fileMutex);

			if (newSubs)
				subs = move(newSubs);

			if (updates.size()) {
				size_t i = 0;
				auto it = subs->Line.begin();
				// Replace each changed line in subs with the updated version
				for (auto& update : updates) {
					advance(it, update.first - i);
					i = update.first;
					subs->Line.insert(it, *update.second.release());
					delete &*it--;
				}
			}

			singleFrame = -1;
		}

		try {
			FrameReadyEvent *evt = new FrameReadyEvent(ProcFrame(frameNum, time), time);
			evt->SetEventType(EVT_FRAME_READY);
			parent->QueueEvent(evt);
		}
		catch (wxEvent const& err) {
			// Pass error back to parent thread
			parent->QueueEvent(err.Clone());
		}
	}

	return EXIT_SUCCESS;
}
void ThreadedFrameSource::ProcAsync(uint_fast32_t req_version) {
	// Only actually produce the frame if there's no queued changes waiting
	if (req_version < version || frame_number < 0) return;

	try {
		FrameReadyEvent *evt = new FrameReadyEvent(ProcFrame(frame_number, time), time);
		evt->SetEventType(EVT_FRAME_READY);
		parent->QueueEvent(evt);
	}
	catch (wxEvent const& err) {
		// Pass error back to parent thread
		parent->QueueEvent(err.Clone());
	}
}
void *ThreadedFrameSource::Entry() {
	while (!TestDestroy()) {
		double time;
		int frameNum;
		std::auto_ptr<AssFile> newSubs;
		{
			wxMutexLocker jobLocker(jobMutex);

			if (!run)
				return EXIT_SUCCESS;

			if (nextTime == -1.) {
				jobReady.Wait();
				continue;
			}

			time = nextTime;
			frameNum = nextFrame;
			nextTime = -1.;
			newSubs = nextSubs;
		}

		if (newSubs.get()) {
			wxMutexLocker fileLocker(fileMutex);
			subs = newSubs;
			singleFrame = -1;
		}

		try {
			FrameReadyEvent *evt = new FrameReadyEvent(ProcFrame(frameNum, time), time);
			evt->SetEventType(EVT_FRAME_READY);
			parent->QueueEvent(evt);
		}
		catch (wxEvent const& err) {
			// Pass error back to parent thread
			parent->QueueEvent(err.Clone());
		}
	}

	return EXIT_SUCCESS;
}