Start encoding while the recording is running in the YUV case. This

allows "unlimited" video length. PinePhone OG is able to do the
encoding with ~180% CPU use.
This commit is contained in:
Pavel Machek
2024-05-09 21:58:12 +02:00
parent 1395f823a0
commit b77064dda0

View File

@@ -48,8 +48,8 @@ def gst_convert(mega_dir, out_file, use_jpeg):
return return
t = audio.get_time() t = audio.get_time()
#print("Audio: ", name, " need ", data, t) #print("Audio: ", name, " need ", data, t)
audio.pop()
buffer, caps = sa_read(name, t) buffer, caps = sa_read(name, t)
os.unlink(name)
appsrc.set_property("caps", caps) appsrc.set_property("caps", caps)
appsrc.emit("push-buffer", buffer) appsrc.emit("push-buffer", buffer)
@@ -69,19 +69,23 @@ def gst_convert(mega_dir, out_file, use_jpeg):
class grwBase: class grwBase:
def init(m, dir): def init(m, dir):
m.dir = dir m.dir = dir
m.list = os.listdir(dir)
m.list.sort()
m.slen = len(m.suffix) m.slen = len(m.suffix)
m.start_time = 0 m.start_time = 0
m.length = len(m.list) m.scan()
print("Movie", len(m.list)) print("Movie", len(m.list))
def scan(m):
m.list = os.listdir(m.dir)
m.list.sort()
m.length = len(m.list)
def get_path(m): def get_path(m):
s = m.get_name() s = m.get_name()
if s: return m.dir + s if s: return m.dir + s
return s return s
def get_name(m): def get_name(m):
m.scan()
#print("Get path -- ") #print("Get path -- ")
while True: while True:
if (len(m.list)) == 0: if (len(m.list)) == 0:
@@ -95,15 +99,22 @@ def gst_convert(mega_dir, out_file, use_jpeg):
def get_time(m): def get_time(m):
s = m.get_name() s = m.get_name()
s = s[:-m.slen] s = s[:-m.slen]
return int(s) * 1000 - m.start_time t = int(s)
res = t * 1000 - m.start_time
t = t / (1000*1000.)
while (time.time() - t < 1):
print("Too fast: ", time.time(), t, file=sys.stderr)
print("Message: WA")
sys.stdout.flush()
time.sleep(.1)
return res
def pop(m): def pop(m):
m.list = m.list[1:] m.list = m.list[1:]
def progress(m): def progress(m):
i = len(m.list) / m.length i = len(m.list)
i = 1-i print("Message: %d" % i)
print("Message: %.0f%%" % (100*i))
sys.stdout.flush() sys.stdout.flush()
class grwVideo(grwBase): class grwVideo(grwBase):
@@ -164,8 +175,8 @@ def gst_convert(mega_dir, out_file, use_jpeg):
t = movie.get_time() t = movie.get_time()
#print("Video: ", name, t) #print("Video: ", name, t)
movie.progress() movie.progress()
movie.pop()
buffer, caps = grw_read(name, t) buffer, caps = grw_read(name, t)
os.unlink(name)
appsrc.set_property("caps", caps) appsrc.set_property("caps", caps)
appsrc.emit("push-buffer", buffer) appsrc.emit("push-buffer", buffer)
@@ -213,8 +224,8 @@ def gst_convert(mega_dir, out_file, use_jpeg):
return return
t = movie.get_time() t = movie.get_time()
#print("Video: ", name, t) #print("Video: ", name, t)
movie.pop()
buffer, caps = jpeg_read(name, t) buffer, caps = jpeg_read(name, t)
os.unlink(name)
appsrc.set_property("caps", caps) appsrc.set_property("caps", caps)
appsrc.emit("push-buffer", buffer) appsrc.emit("push-buffer", buffer)
@@ -410,15 +421,37 @@ class Mpegize:
if len(argv) > 2: if len(argv) > 2:
m.base = argv[2] m.base = argv[2]
mode = argv[1] mode = argv[1]
fps = argv[4]
ext = argv[5]
if mode == "start": if mode == "start":
print("Phase 0: start, mode ", ext, file=sys.stderr)
if ext!="grw":
return
print("Phase 0: wait", file=sys.stderr)
print("Message: W1")
sys.stdout.flush()
time.sleep(1)
print("Phase 1: parallel fun", file=sys.stderr)
print("Message: proc")
sys.stdout.flush()
gst_convert(m.base, argv[3], argv[4]=="dng")
return return
if mode == "convert" or mode == "stop": if mode == "convert" or mode == "stop":
print("Phase 1: jpegize") if ext=="grw":
# FIXME: need to wait for other mpegize!
time.sleep(200)
return
print("Phase 1: jpegize", file=sys.stderr)
print("Message: 0%%") print("Message: 0%%")
sys.stdout.flush() sys.stdout.flush()
m.prepare() m.prepare()
m.jpegize() m.jpegize()
print("Phase 2: mpegize -- ", argv[3]) print("Phase 2: mpegize -- ", argv[3], file=sys.stderr)
print("Message: enc") print("Message: enc")
sys.stdout.flush() sys.stdout.flush()
gst_convert(m.base, argv[3], argv[4]=="dng") gst_convert(m.base, argv[3], argv[4]=="dng")