Browse Source

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.

Pavel Machek 10 months ago
parent
commit
b77064dda0
1 changed files with 45 additions and 12 deletions
  1. 45 12
      mpegize.py

+ 45 - 12
mpegize.py

@@ -48,8 +48,8 @@ def gst_convert(mega_dir, out_file, use_jpeg):
                 return
             t = audio.get_time()
             #print("Audio: ", name, " need ", data, t)
-            audio.pop()
             buffer, caps = sa_read(name, t)
+            os.unlink(name)
             appsrc.set_property("caps", caps)
             appsrc.emit("push-buffer", buffer)
 
@@ -69,19 +69,23 @@ def gst_convert(mega_dir, out_file, use_jpeg):
     class grwBase:
         def init(m, dir):
             m.dir = dir
-            m.list = os.listdir(dir)
-            m.list.sort()
             m.slen = len(m.suffix)
             m.start_time = 0
-            m.length = len(m.list)
+            m.scan()
             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):
             s = m.get_name()
             if s: return m.dir + s
             return s
 
         def get_name(m):
+            m.scan()
             #print("Get path -- ")
             while True:
                 if (len(m.list)) == 0:
@@ -95,15 +99,22 @@ def gst_convert(mega_dir, out_file, use_jpeg):
         def get_time(m):
             s = m.get_name()
             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):
             m.list = m.list[1:]
 
         def progress(m):
-            i = len(m.list) / m.length
-            i = 1-i
-            print("Message: %.0f%%" % (100*i))
+            i = len(m.list)
+            print("Message: %d" % i)
             sys.stdout.flush()
 
     class grwVideo(grwBase):
@@ -164,8 +175,8 @@ def gst_convert(mega_dir, out_file, use_jpeg):
             t = movie.get_time()
             #print("Video: ", name, t)
             movie.progress()
-            movie.pop()
             buffer, caps = grw_read(name, t)
+            os.unlink(name)
             appsrc.set_property("caps", caps)
             appsrc.emit("push-buffer", buffer)
 
@@ -213,8 +224,8 @@ def gst_convert(mega_dir, out_file, use_jpeg):
                 return
             t = movie.get_time()
             #print("Video: ", name, t)
-            movie.pop()
             buffer, caps = jpeg_read(name, t)
+            os.unlink(name)
             appsrc.set_property("caps", caps)
             appsrc.emit("push-buffer", buffer)
 
@@ -410,15 +421,37 @@ class Mpegize:
         if len(argv) > 2:
             m.base = argv[2]
             mode = argv[1]
+            fps = argv[4]
+            ext = argv[5]
             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
             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%%")
                 sys.stdout.flush()
                 m.prepare()
                 m.jpegize()
-                print("Phase 2: mpegize -- ", argv[3])
+                print("Phase 2: mpegize -- ", argv[3], file=sys.stderr)
                 print("Message: enc")
                 sys.stdout.flush()
                 gst_convert(m.base, argv[3], argv[4]=="dng")