aboutsummaryrefslogtreecommitdiff
path: root/src/video_thread.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/video_thread.py')
-rw-r--r--src/video_thread.py44
1 files changed, 22 insertions, 22 deletions
diff --git a/src/video_thread.py b/src/video_thread.py
index 5a28beb..dc6db89 100644
--- a/src/video_thread.py
+++ b/src/video_thread.py
@@ -44,6 +44,7 @@ class Worker(QtCore.QObject):
self.settings = parent.settings
self.modules = parent.core.modules
parent.createVideo.connect(self.createVideo)
+ self.previewEnabled = type(parent.core).previewEnabled
#self.parent = parent
self.components = components
@@ -114,25 +115,23 @@ class Worker(QtCore.QObject):
for audioI in range(0, self.audioArrayLen, self.sampleSize):
self.compositeQueue.put(audioI)
- def previewDispatch(self):
+ def showPreview(self, frame):
'''
- Grabs frames from the previewQueue, adds them to the checkerboard
- and emits a final QImage to the MainWindow for the live preview
+ Receives a final frame that will be piped to FFmpeg,
+ adds it to the checkerboard and emits a final QImage
+ to the MainWindow for the live preview
'''
- background = Checkerboard(self.width, self.height)
-
- while not self.stopped:
- audioI, frame = self.previewQueue.get()
- if time.time() - self.lastPreview >= 0.06 or audioI == 0:
- image = Image.alpha_composite(background.copy(), frame)
- self.imageCreated.emit(QtGui.QImage(ImageQt(image)))
- self.lastPreview = time.time()
-
- self.previewQueue.task_done()
+ # We must store a reference to this QImage
+ # or else Qt will garbage-collect it on the C++ side
+ self.latestPreview = ImageQt(frame)
+ self.imageCreated.emit(QtGui.QImage(self.latestPreview))
+ self.lastPreview = time.time()
@pyqtSlot()
def createVideo(self):
log.debug("Video worker received signal to createVideo")
+ log.debug(
+ 'Video thread id: {}'.format(int(QtCore.QThread.currentThreadId())))
numpy.seterr(divide='ignore')
self.encoding.emit(True)
self.extraAudio = []
@@ -143,7 +142,6 @@ class Worker(QtCore.QObject):
self.compositeQueue.maxsize = 20
self.renderQueue = PriorityQueue()
self.renderQueue.maxsize = 20
- self.previewQueue = PriorityQueue()
self.reset()
progressBarValue = 0
@@ -305,15 +303,13 @@ class Worker(QtCore.QObject):
self.dispatchThread.daemon = True
self.dispatchThread.start()
- self.lastPreview = 0.0
- self.previewDispatch = Thread(
- target=self.previewDispatch, name="Render Dispatch Thread"
- )
- self.previewDispatch.daemon = True
- self.previewDispatch.start()
+ # Last time preview was drawn
+ self.lastPreview = time.time()
# Begin piping into ffmpeg!
- frameBuffer = {}
+ frameBuffer = {
+ # audioI: bytes ready to be piped
+ }
progressBarValue = 0
self.progressBarUpdate.emit(progressBarValue)
self.progressBarSetText.emit("Exporting video...")
@@ -331,9 +327,12 @@ class Worker(QtCore.QObject):
if self.canceled:
break
+ # Update live preview
+ if self.previewEnabled and time.time() - self.lastPreview > 0.5:
+ self.showPreview(frameBuffer[audioI])
+
try:
self.out_pipe.stdin.write(frameBuffer[audioI].tobytes())
- self.previewQueue.put([audioI, frameBuffer.pop(audioI)])
except Exception:
break
@@ -346,6 +345,7 @@ class Worker(QtCore.QObject):
"Exporting video: %s%%" % str(int(progressBarValue))
)
+
numpy.seterr(all='print')
self.closePipe()