def _generate_video_if_not_exists(video, video_generator, format_): from os.path import isfile filename = "%s/%s.%s" % (_gen_video_cache_dir(), video, format_) if not isfile(filename): from _stbt.gst_utils import frames_to_video import tempfile sys.stderr.write( "Creating test video '%s'. This only has to happen once but may " "take some time...\n" % filename) # Create the video atomically to avoid serving invalid mp4s tf = tempfile.NamedTemporaryFile(prefix=filename, delete=False) frame_caps, frame_generator = video_generator[video] frames_to_video( tf.name, frame_generator(), caps=frame_caps, container=format_) os.rename(tf.name, filename) sys.stderr.write("Test video generation complete.\n") return filename
def main(argv): parser = argparse.ArgumentParser() parser.add_argument("socket", help="shmsrc socket") args = parser.parse_args(argv[1:]) cache_root = (os.environ.get("XDG_CACHE_HOME", None) or os.environ.get("HOME") + '/.cache') default_file = '%s/stbt/camera-video-cache/black.mp4' % cache_root if not os.path.exists(default_file): utils.mkdir_p(os.path.dirname(default_file)) gst_utils.frames_to_video( default_file, [(bytearray([0, 0, 0]) * 1280 * 720, 5 * Gst.SECOND)], 'video/x-raw,format=BGR,width=1280,height=720', 'mp4') default_uri = "file://" + default_file frame_bytes = 1280 * 720 * 3 next_video = [default_uri] def about_to_finish(playbin): playbin.set_property('uri', next_video[0]) next_video[0] = default_uri playbin.set_state(Gst.State.PLAYING) if USE_SHMSRC: pipeline_desc = ( """\ playbin name=pb audio-sink=fakesink uri=%s flags=0x00000791 \ video-sink="videoconvert \ ! video/x-raw,width=1280,height=720,format=RGB ! identity ! \ shmsink wait-for-connection=true shm-size=%i max-lateness=-1 \ qos=false socket-path=%s blocksize=%i sync=true \ buffer-time=100000000" """ % (default_uri, frame_bytes * 1000, args.socket, frame_bytes)) else: pipeline_desc = ( """playbin name=pb audio-sink=fakesink uri=%s flags=0x00000791 \ video-sink="videoconvert ! timeoverlay ! xvimagesink sync=true" """ % default_uri) playbin = Gst.parse_launch(pipeline_desc) playbin.connect("about-to-finish", about_to_finish) runner = gst_utils.PipelineRunner(playbin) gst_thread = threading.Thread(target=runner.run) gst_thread.daemon = True gst_thread.start() playbin.get_state(0) def set_uri(uri): print "=== Setting URI to", uri if uri == 'stop': next_video[0] = default_uri else: next_video[0] = uri playbin.seek( 1.0, Gst.Format.TIME, Gst.SeekFlags.FLUSH | Gst.SeekFlags.KEY_UNIT, Gst.SeekType.END, 0, Gst.SeekType.NONE, 0) while True: uri = sys.stdin.readline() if uri == '': break elif len(uri.strip()) > 0: set_uri(uri.strip())
def main(argv): parser = argparse.ArgumentParser() parser.add_argument("socket", help="shmsrc socket") args = parser.parse_args(argv[1:]) cache_root = (os.environ.get("XDG_CACHE_HOME", None) or os.environ.get("HOME") + '/.cache') default_file = '%s/stbt/camera-video-cache/black.mp4' % cache_root if not os.path.exists(default_file): utils.mkdir_p(os.path.dirname(default_file)) gst_utils.frames_to_video( default_file, [(bytearray([0, 0, 0]) * 1280 * 720, 5 * Gst.SECOND)], 'video/x-raw,format=BGR,width=1280,height=720', 'mp4') default_uri = "file://" + default_file frame_bytes = 1280 * 720 * 3 next_video = [default_uri] def about_to_finish(playbin): playbin.set_property('uri', next_video[0]) next_video[0] = default_uri playbin.set_state(Gst.State.PLAYING) if USE_SHMSRC: pipeline_desc = ( """\ playbin name=pb audio-sink=fakesink uri=%s flags=0x00000791 \ video-sink="videoconvert \ ! video/x-raw,width=1280,height=720,format=RGB ! identity ! \ shmsink wait-for-connection=true shm-size=%i max-lateness=-1 \ qos=false socket-path=%s blocksize=%i sync=true \ buffer-time=100000000" """ % (default_uri, frame_bytes * 1000, args.socket, frame_bytes)) else: pipeline_desc = ( """playbin name=pb audio-sink=fakesink uri=%s flags=0x00000791 \ video-sink="videoconvert ! timeoverlay ! xvimagesink sync=true" """ % default_uri) playbin = Gst.parse_launch(pipeline_desc) playbin.connect("about-to-finish", about_to_finish) runner = gst_utils.PipelineRunner(playbin) gst_thread = threading.Thread(target=runner.run) gst_thread.daemon = True gst_thread.start() playbin.get_state(0) def set_uri(uri): print "=== Setting URI to", uri if uri == 'stop': next_video[0] = default_uri else: next_video[0] = uri playbin.seek(1.0, Gst.Format.TIME, Gst.SeekFlags.FLUSH | Gst.SeekFlags.KEY_UNIT, Gst.SeekType.END, 0, Gst.SeekType.NONE, 0) while True: uri = sys.stdin.readline() if uri == '': break elif len(uri.strip()) > 0: set_uri(uri.strip())