def __init__(self, parent=None):
        super().__init__(parent)
        if os.path.exists(valkka_fs_dirname):
            try:
                ValkkaFS.checkDirectory(valkka_fs_dirname)
            except Exception as e:
                print(
                    "Can't init ValkkaFileSystem.  Consider removing directory %s"
                    % (valkka_fs_dirname))
                raise (e)
        else:
            print("creating ValkkaFS for %i MBytes",
                  blocksize_default / 1024 / 1024)
            ValkkaFS.newFromDirectory(dirname=valkka_fs_dirname,
                                      blocksize=blocksize_default,
                                      n_blocks=n_blocks_default,
                                      verbose=True)

        self.fs_config = ValkkaFSConfig(
            valkka_fs_dirname,
            parent=self)  # filesystem metadata in "fs_directory" subdir
        self.lay.addWidget(self.fs_config.main_widget)
Beispiel #2
0
    def setupUi(self):
        self.setGeometry(QtCore.QRect(100, 100, 800, 800))

        self.valkkafs = ValkkaFS.loadFromDirectory(
            dirname="/home/sampsa/tmp/testvalkkafs")
        self.manager = ValkkaFSManager(self.valkkafs)
        self.manager.setOutput_(925412, 1)  # id => slot

        gpu_handler = GPUHandler()

        pvc = PlayVideoContainerNxM(n_dim=3,
                                    m_dim=3,
                                    valkkafsmanager=self.manager,
                                    gpu_handler=gpu_handler,
                                    filterchain_group=None)

        # dummy window
        self.w = QtWidgets.QWidget(self)
        self.setCentralWidget(self.w)
        self.lay = QtWidgets.QVBoxLayout(self.w)
Beispiel #3
0
    def setupUi(self):
        self.setGeometry(QtCore.QRect(100, 100, 800, 800))
        self.w = QtWidgets.QWidget(self)
        self.setCentralWidget(self.w)
        self.lay = QtWidgets.QVBoxLayout(self.w)

        self.timelinewidget = TimeLineWidget(datetime.date.today(),
                                             parent=self.w)
        self.timelinewidget.setLogLevel(logging.DEBUG)
        self.lay.addWidget(self.timelinewidget)

        self.calendarwidget = CalendarWidget(datetime.date.today(),
                                             parent=self.w)

        self.buttons = QtWidgets.QWidget(self.w)
        self.buttons_lay = QtWidgets.QHBoxLayout(self.buttons)
        self.play_button = QtWidgets.QPushButton("play", self.buttons)
        self.stop_button = QtWidgets.QPushButton("stop", self.buttons)
        self.buttons_lay.addWidget(self.play_button)
        self.buttons_lay.addWidget(self.stop_button)

        self.lay.addWidget(self.buttons)
        self.lay.addWidget(self.calendarwidget)

        self.valkkafs = ValkkaFS.loadFromDirectory(
            dirname="/home/sampsa/tmp/testvalkkafs")
        self.manager = ValkkaFSManager(self.valkkafs)

        self.manager.setOutput_(925412, 1)  # id => slot

        self.playback_controller = PlaybackController(
            calendar_widget=self.calendarwidget,
            timeline_widget=self.timelinewidget,
            valkkafs_manager=self.manager,
            play_button=self.play_button,
            stop_button=self.stop_button)
        """
                                       setPyCallback  : [int] current mstime, freq: 500 ms
                                       setPyCallback2 : [tuple] (min mstimestamp, max mstimestamp)
"""
#</hide>
"""<rtf>
Same imports as before:
<rtf>"""
import time
from valkka.core import *
from valkka.api2 import ValkkaFS, loglevel_debug, loglevel_normal

setLogLevel_filelogger(loglevel_debug)
"""<rtf>
Load ValkkaFS metadata:
<rtf>"""
valkkafs = ValkkaFS.loadFromDirectory(dirname="/home/sampsa/tmp/testvalkkafs")
"""<rtf>
Let's take a look at the blocktable:
<rtf>"""
a = valkkafs.getBlockTable()
print(a[:, 0:10])
"""<rtf>

Filterchain is going to look like this:

::

    (ValkkaFSReaderThread:readerthread) -->> (FileCacheThread:cacherthread) --> {InfoFrameFilter:out_filter}
                                                     |
                                                     $ 
                                       setPyCallback  : [int] current mstime, freq: 500 ms
Beispiel #5
0
from valkka.api2 import ValkkaFS
fs = ValkkaFS.loadFromDirectory("fs_directory")
fs.analyzer.dumpBlock(1)

Beispiel #6
0
    def openValkka(self):
        self.cpu_scheme = CPUScheme()
        
        # singleton.data_model.camera_collection
        try:
            memory_config = next(singleton.data_model.config_collection.get({"classname" : MemoryConfigRow.__name__}))
        except StopIteration:
            print(pre, "Using default mem config")
            singleton.data_model.writeDefaultMemoryConfig()
            memory_config = default.get_memory_config()

        try:
            valkkafs_config = next(singleton.data_model.valkkafs_collection.get({"classname" : ValkkaFSConfigRow.__name__}))
        except StopIteration:
            print(pre, "Using default valkkafs config")
            singleton.data_model.writeDefaultValkkaFSConfig()
            valkkafs_config = default.get_valkkafs_config()

        n_frames = round(memory_config["msbuftime"] * default.fps / 1000.) # accumulated frames per buffering time = n_frames

        if (memory_config["bind"]):
            self.cpu_scheme = CPUScheme()
        else:
            self.cpu_scheme = CPUScheme(n_cores = -1)

        self.gpu_handler = GPUHandler(
            n_720p  = memory_config["n_720p"] * n_frames, # n_cameras * n_frames
            n_1080p = memory_config["n_1080p"] * n_frames,
            n_1440p = memory_config["n_1440p"] * n_frames,
            n_4K    = memory_config["n_4K"] * n_frames,
            msbuftime = memory_config["msbuftime"],
            verbose = False,
            cpu_scheme = self.cpu_scheme
        )

        self.livethread = LiveThread(
            name = "live_thread",
            verbose = False,
            affinity = self.cpu_scheme.getLive()
        )
        
        self.usbthread = USBDeviceThread(
            name = "usb_thread",
            verbose = False,
            affinity = self.cpu_scheme.getUSB()
        )

        # see datamodel.row.ValkkaFSConfigRow
        blocksize = valkkafs_config["blocksize"]
        n_blocks  = valkkafs_config["n_blocks"]
        fs_flavor = valkkafs_config["fs_flavor"] 
        record    = valkkafs_config["record"]

        # TODO: activate this if ValkkaFS changed in config!
        if fs_flavor == "file":
            partition_uuid = None
        else:
            partition_uuid = valkkafs_config["partition_uuid"]
            
        create_new_fs = False

        if self.valkkafs is None: # first time
            create_new_fs = False # try to load initially from disk
        else:
            print("openValkka: checking ValkkaFS")
            create_new_fs = not self.valkkafs.is_same( # has changed, so must recreate
                partition_uuid = partition_uuid, # None or a string
                blocksize = blocksize * 1024*1024,
                n_blocks = n_blocks
            )
            if create_new_fs: print("openValkka: ValkkaFS changed!")
        
        if not create_new_fs: # let's try to load it
            print("openValkka: trying to load ValkkaFS")
            try:
                self.valkkafs = ValkkaFS.loadFromDirectory(
                    dirname = singleton.valkkafs_dir.get()
                )
            except ValkkaFSLoadError as e:
                print("openValkka: loading ValkkaFS failed with", e)
                create_new_fs = True # no luck, must recreate

        if create_new_fs:
            print("openValkka: (re)create ValkkaFS")
            self.valkkafs = ValkkaFS.newFromDirectory(
                dirname = singleton.valkkafs_dir.get(),
                blocksize = valkkafs_config["blocksize"] * 1024*1024, # MB
                n_blocks = valkkafs_config["n_blocks"],
                partition_uuid = partition_uuid,
                verbose = True
            )
            # to keep things consistent..
            singleton.data_model.valkkafs_collection.new(
                ValkkaFSConfigRow,
                {
                    # "dirname"    : default.valkkafs_config["dirname"], # not written to db for the moment
                    "n_blocks"       : default.get_valkkafs_config()["n_blocks"],
                    "blocksize"      : valkkafs_config["blocksize"],
                    "fs_flavor"      : valkkafs_config["fs_flavor"],
                    "record"         : record,
                    "partition_uuid" : partition_uuid
                })


        """
        else:
            self.valkkafs = None
        """

        # if no recording selected, set self.valkkafsmanager = None
        self.valkkafsmanager = ValkkaFSManager(
            self.valkkafs,
            write = record, # True or False
            read = record,
            cache = record
            )
        self.playback_controller = PlaybackController(valkkafs_manager = self.valkkafsmanager)

        self.filterchain_group = LiveFilterChainGroup(
            datamodel     = singleton.data_model, 
            livethread    = self.livethread, 
            usbthread     = self.usbthread,
            gpu_handler   = self.gpu_handler, 
            cpu_scheme    = self.cpu_scheme)
        self.filterchain_group.read()

        if record:
            print("openValkka: ValkkaFS **RECORDING ACTIVATED**")
            self.filterchain_group.setRecording(RecordType.always, self.valkkafsmanager)
        
        # self.filterchain_group.update() # TODO: use this once fixed
        
        self.filterchain_group_play = PlaybackFilterChainGroup(
            datamodel     = singleton.data_model,
            valkkafsmanager
                        = self.valkkafsmanager,
            gpu_handler   = self.gpu_handler, 
            cpu_scheme    = self.cpu_scheme)
        self.filterchain_group_play.read()

        try:
            from valkka.mvision import multiprocess
        except ImportError:
            pass
        """
import time
from valkka.core import *
from valkka.api2 import ValkkaFS

rtsp = "rtsp://*****:*****@192.168.0.157"
rtime = 30

valkkafs = ValkkaFS.newFromDirectory(
    dirname="/home/sampsa/tmp/testvalkkafs",
    blocksize=1024 * 1024,  # mbps
    n_blocks=25,
    verbose=True)

writerthread = ValkkaFSWriterThread("writer", valkkafs.core)
livethread = LiveThread("livethread")

file_input_framefilter = writerthread.getFrameFilter()
ctx = LiveConnectionContext(LiveConnectionType_rtsp, rtsp, 1,
                            file_input_framefilter)

writerthread.startCall()
livethread.startCall()

writerthread.setSlotIdCall(1, 925412)

livethread.registerStreamCall(ctx)
livethread.playStreamCall(ctx)

time.sleep(rtime)

livethread.stopCall()
Beispiel #8
0
This will be our filtergraph:

::

    (LiveThread:livethread) -->> (ValkkaFSWriterThread:writerthread)

Let's import valkka level 1 API, and ValkkaFS from level 2 API
<rtf>"""
import time
from valkka.core import *
from valkka.api2 import ValkkaFS
"""<rtf>
ValkkaFS instance handles the metadata of the filesystem.  Let's create a new filesystem and save the metadata into directory */home/sampsa/tmp/testvalkkafs*
<rtf>"""
valkkafs = ValkkaFS.newFromDirectory(dirname="/home/sampsa/tmp/testvalkkafs",
                                     blocksize=512 * 1024,
                                     n_blocks=10,
                                     verbose=True)
"""<rtf>
One block holds 512 KBytes of data.  For a camera streaming 2048KBits per second, that'll be 2 seconds worth of frames.

The total size of the device file where frames are streamed, will be (512kB * 10) 5120 kB.

You could also skip the parameter *n_blocks* and instead define the device file size directly with *device_size = 5120*1024*.

For calculating device file sizes, see :ref:`ValkkaFS section <valkkafs>`

Now the directory has the following files:

::

    blockfile           Table of block timestamps.  Used for seeking, etc.