faery 0.2.0__cp313-none-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- faery/__init__.py +61 -0
- faery/__main__.py +43 -0
- faery/cli/__init__.py +13 -0
- faery/cli/convert.py +150 -0
- faery/cli/init.py +67 -0
- faery/cli/inline.py +664 -0
- faery/cli/render.py +11 -0
- faery/cli/run.py +21 -0
- faery/events_filter.py +488 -0
- faery/events_input.py +86 -0
- faery/events_stream.py +586 -0
- faery/extension.cp313-win_amd64.pyd +0 -0
- faery/file_decoder.py +325 -0
- faery/file_encoder.py +161 -0
- faery/file_type.py +74 -0
- faery/frame_stream.py +6 -0
- faery/stream.py +182 -0
- faery/timestamp.py +73 -0
- faery/types/aedat.pyi +86 -0
- faery/types/csv.pyi +51 -0
- faery/types/dat.pyi +64 -0
- faery/types/event_stream.pyi +64 -0
- faery/types/evt.pyi +47 -0
- faery/udp_decoder.py +133 -0
- faery/udp_encoder.py +53 -0
- faery-0.2.0.dist-info/METADATA +79 -0
- faery-0.2.0.dist-info/RECORD +30 -0
- faery-0.2.0.dist-info/WHEEL +4 -0
- faery-0.2.0.dist-info/entry_points.txt +2 -0
- faery-0.2.0.dist-info/licenses/LICENSE +164 -0
faery/__init__.py
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import importlib.metadata
|
|
2
|
+
import typing
|
|
3
|
+
|
|
4
|
+
__version__ = importlib.metadata.version("faery")
|
|
5
|
+
|
|
6
|
+
from .file_decoder import CsvProperties as CsvProperties
|
|
7
|
+
from .events_filter import EVENTS_DTYPE as EVENTS_DTYPE
|
|
8
|
+
from .events_input import events_stream_from_array as events_stream_from_array
|
|
9
|
+
from .events_input import events_stream_from_file as events_stream_from_file
|
|
10
|
+
from .events_input import events_stream_from_stdin as events_stream_from_stdin
|
|
11
|
+
from .events_input import events_stream_from_udp as events_stream_from_udp
|
|
12
|
+
from .events_stream import EventsStream as EventsStream
|
|
13
|
+
from .events_stream import FiniteEventsStream as FiniteEventsStream
|
|
14
|
+
from .events_stream import RegularEventsStream as RegularEventsStream
|
|
15
|
+
from .events_stream import FiniteRegularEventsStream as FiniteRegularEventsStream
|
|
16
|
+
from .file_type import FileType as FileType
|
|
17
|
+
from .stream import TransposeAction as TransposeAction
|
|
18
|
+
from .timestamp import Time as Time
|
|
19
|
+
from .timestamp import parse_timestamp as parse_timestamp
|
|
20
|
+
from .timestamp import timestamp_to_timecode as timestamp_to_timecode
|
|
21
|
+
from .timestamp import timestamp_to_seconds as timestamp_to_seconds
|
|
22
|
+
from . import cli as cli
|
|
23
|
+
|
|
24
|
+
if typing.TYPE_CHECKING:
|
|
25
|
+
from .types import aedat # type: ignore
|
|
26
|
+
from .types import csv # type: ignore
|
|
27
|
+
from .types import dat # type: ignore
|
|
28
|
+
from .types import event_stream # type: ignore
|
|
29
|
+
from .types import evt # type: ignore
|
|
30
|
+
else:
|
|
31
|
+
from .extension import aedat
|
|
32
|
+
from .extension import csv
|
|
33
|
+
from .extension import dat
|
|
34
|
+
from .extension import event_stream
|
|
35
|
+
from .extension import evt
|
|
36
|
+
|
|
37
|
+
__all__ = [
|
|
38
|
+
"__version__",
|
|
39
|
+
"CsvProperties",
|
|
40
|
+
"EVENTS_DTYPE",
|
|
41
|
+
"events_stream_from_array",
|
|
42
|
+
"events_stream_from_file",
|
|
43
|
+
"events_stream_from_stdin",
|
|
44
|
+
"events_stream_from_udp",
|
|
45
|
+
"EventsStream",
|
|
46
|
+
"FiniteEventsStream",
|
|
47
|
+
"RegularEventsStream",
|
|
48
|
+
"FiniteRegularEventsStream",
|
|
49
|
+
"FileType",
|
|
50
|
+
"TransposeAction",
|
|
51
|
+
"Time",
|
|
52
|
+
"parse_timestamp",
|
|
53
|
+
"timestamp_to_timecode",
|
|
54
|
+
"timestamp_to_seconds",
|
|
55
|
+
"aedat",
|
|
56
|
+
"csv",
|
|
57
|
+
"dat",
|
|
58
|
+
"event_stream",
|
|
59
|
+
"evt",
|
|
60
|
+
"cli",
|
|
61
|
+
]
|
faery/__main__.py
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
def main():
|
|
2
|
+
|
|
3
|
+
import argparse
|
|
4
|
+
import textwrap
|
|
5
|
+
|
|
6
|
+
import faery
|
|
7
|
+
|
|
8
|
+
parser = argparse.ArgumentParser(
|
|
9
|
+
prog="faery",
|
|
10
|
+
formatter_class=argparse.RawTextHelpFormatter,
|
|
11
|
+
description=textwrap.dedent(
|
|
12
|
+
rf"""
|
|
13
|
+
__ __ _____
|
|
14
|
+
/ \ / \ | ___|_ _ ___ _ __ _ _
|
|
15
|
+
| ( \___/ ) | | |_ / _` |/ _ \ '__| | | |
|
|
16
|
+
\__/ \__/ | _| (_| | __/ | | |_| |
|
|
17
|
+
_\___/_ |_| \__,_|\___|_| \__, |
|
|
18
|
+
(_/ \_) |___/
|
|
19
|
+
|
|
20
|
+
Faery converts Neuromorphic camera data (events) between formats.
|
|
21
|
+
It can also generate videos, spectrograms, and event rate curves.
|
|
22
|
+
"""
|
|
23
|
+
),
|
|
24
|
+
)
|
|
25
|
+
parser.add_argument(
|
|
26
|
+
"-v", "--version", action="version", version=f"Faery {faery.__version__}"
|
|
27
|
+
)
|
|
28
|
+
subparsers = parser.add_subparsers(dest="command")
|
|
29
|
+
faery.cli.convert.add_to_subparsers(subparsers)
|
|
30
|
+
faery.cli.render.add_to_subparsers(subparsers)
|
|
31
|
+
faery.cli.init.add_to_subparsers(subparsers)
|
|
32
|
+
faery.cli.run.add_to_subparsers(subparsers)
|
|
33
|
+
faery.cli.inline.add_to_subparsers(subparsers)
|
|
34
|
+
args = parser.parse_args()
|
|
35
|
+
|
|
36
|
+
if args.command is None:
|
|
37
|
+
parser.print_help()
|
|
38
|
+
else:
|
|
39
|
+
getattr(faery.cli, args.command).run(args)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
if __name__ == "__main__":
|
|
43
|
+
main()
|
faery/cli/__init__.py
ADDED
faery/cli/convert.py
ADDED
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import argparse
|
|
2
|
+
import sys
|
|
3
|
+
|
|
4
|
+
import faery
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def add_to_subparsers(subparsers: argparse._SubParsersAction):
|
|
8
|
+
parser: argparse.ArgumentParser = subparsers.add_parser(
|
|
9
|
+
"convert", help="convert between event formats"
|
|
10
|
+
)
|
|
11
|
+
parser.add_argument(
|
|
12
|
+
"input", help='Path of the input file (use "stdin" for standard input)'
|
|
13
|
+
)
|
|
14
|
+
parser.add_argument(
|
|
15
|
+
"-f",
|
|
16
|
+
"--input-format",
|
|
17
|
+
choices=[
|
|
18
|
+
"aedat",
|
|
19
|
+
"csv",
|
|
20
|
+
"dat",
|
|
21
|
+
"es",
|
|
22
|
+
"evt",
|
|
23
|
+
],
|
|
24
|
+
help="input format, required if the input is standard input",
|
|
25
|
+
)
|
|
26
|
+
parser.add_argument(
|
|
27
|
+
"-i",
|
|
28
|
+
"--track-id",
|
|
29
|
+
type=int,
|
|
30
|
+
help="set the track id for edat files (defaults to the first event stream)",
|
|
31
|
+
)
|
|
32
|
+
parser.add_argument(
|
|
33
|
+
"-j",
|
|
34
|
+
"--input-version",
|
|
35
|
+
choices=["dat1", "dat2", "evt2", "evt2.1", "evt3"],
|
|
36
|
+
help="set the version for evt (.raw) or dat files",
|
|
37
|
+
)
|
|
38
|
+
parser.add_argument(
|
|
39
|
+
"-x",
|
|
40
|
+
"--width",
|
|
41
|
+
type=int,
|
|
42
|
+
help="input width, required if the input format is csv",
|
|
43
|
+
)
|
|
44
|
+
parser.add_argument(
|
|
45
|
+
"-y",
|
|
46
|
+
"--height",
|
|
47
|
+
type=int,
|
|
48
|
+
help="input height, required if the input format is csv",
|
|
49
|
+
)
|
|
50
|
+
parser.add_argument(
|
|
51
|
+
"-t",
|
|
52
|
+
"--t0",
|
|
53
|
+
default=0,
|
|
54
|
+
help="set t0 for Event Stream files (defaults to 0)",
|
|
55
|
+
)
|
|
56
|
+
parser.add_argument(
|
|
57
|
+
"output", help='Path of the input file (use "stdout" for standard input)'
|
|
58
|
+
)
|
|
59
|
+
parser.add_argument(
|
|
60
|
+
"-g",
|
|
61
|
+
"--output-format",
|
|
62
|
+
choices=[
|
|
63
|
+
"aedat",
|
|
64
|
+
"csv",
|
|
65
|
+
"dat",
|
|
66
|
+
"es",
|
|
67
|
+
"evt",
|
|
68
|
+
],
|
|
69
|
+
help="output format, required if the output is standard output",
|
|
70
|
+
)
|
|
71
|
+
parser.add_argument(
|
|
72
|
+
"-k",
|
|
73
|
+
"--output-version",
|
|
74
|
+
choices=["dat1", "dat2", "evt2", "evt2.1", "evt3"],
|
|
75
|
+
help="set the version for evt (.raw) or dat files",
|
|
76
|
+
)
|
|
77
|
+
parser.add_argument(
|
|
78
|
+
"-z",
|
|
79
|
+
"--zero-t0",
|
|
80
|
+
action="store_true",
|
|
81
|
+
help="offset the output's timestamps so that the first one is zero",
|
|
82
|
+
)
|
|
83
|
+
parser.add_argument(
|
|
84
|
+
"-p",
|
|
85
|
+
"--print-t0",
|
|
86
|
+
action="store_true",
|
|
87
|
+
help="print the output's original t0 (before offset if -z/--zero-t0 is set)",
|
|
88
|
+
)
|
|
89
|
+
parser.add_argument(
|
|
90
|
+
"-c",
|
|
91
|
+
"--compression-type",
|
|
92
|
+
choices=["lz4", "zstd"],
|
|
93
|
+
default="lz4",
|
|
94
|
+
help='set the compression algorithm for aedat files (defaults to "lz4")',
|
|
95
|
+
)
|
|
96
|
+
parser.add_argument(
|
|
97
|
+
"-d",
|
|
98
|
+
"--compression-level",
|
|
99
|
+
type=int,
|
|
100
|
+
default=1,
|
|
101
|
+
help="set the compression level for aedat files (defaults to 1)",
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def run(args: argparse.Namespace):
|
|
106
|
+
if (args.width is None) != (args.height is None):
|
|
107
|
+
sys.stderr.write(
|
|
108
|
+
"only one of width (-x/--width) and height (-y/--height) was provided (either both or neither should be provided)\n"
|
|
109
|
+
)
|
|
110
|
+
sys.exit(1)
|
|
111
|
+
|
|
112
|
+
# @TODO add support for udp
|
|
113
|
+
if args.input == "stdin":
|
|
114
|
+
assert args.input_format is not None
|
|
115
|
+
assert args.input_format == "csv" # only supported stdin format at the moment
|
|
116
|
+
assert args.width is not None
|
|
117
|
+
assert args.height is not None
|
|
118
|
+
stream = faery.events_stream_from_stdin(dimensions=(args.width, args.height))
|
|
119
|
+
else:
|
|
120
|
+
if args.width is not None and args.height is not None:
|
|
121
|
+
stream = faery.events_stream_from_file(
|
|
122
|
+
path=args.input,
|
|
123
|
+
track_id=args.track_id,
|
|
124
|
+
dimensions_fallback=(args.width, args.height),
|
|
125
|
+
version_fallback=args.input_version,
|
|
126
|
+
t0=args.t0,
|
|
127
|
+
file_type=args.input_format,
|
|
128
|
+
)
|
|
129
|
+
else:
|
|
130
|
+
stream = faery.events_stream_from_file(
|
|
131
|
+
path=args.input,
|
|
132
|
+
track_id=args.track_id,
|
|
133
|
+
version_fallback=args.input_version,
|
|
134
|
+
t0=args.t0,
|
|
135
|
+
file_type=args.input_format,
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
if args.output == "stdout":
|
|
139
|
+
assert args.output_format == "csv" # only supported stdout format at the moment
|
|
140
|
+
stream.to_stdout()
|
|
141
|
+
else:
|
|
142
|
+
t0 = stream.to_file(
|
|
143
|
+
path=args.output,
|
|
144
|
+
version=args.output_version,
|
|
145
|
+
zero_t0=args.zero_t0,
|
|
146
|
+
compression=(args.compression_type, args.compression_level),
|
|
147
|
+
file_type=args.output_format,
|
|
148
|
+
)
|
|
149
|
+
if args.print_t0:
|
|
150
|
+
print(t0)
|
faery/cli/init.py
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import argparse
|
|
2
|
+
import os
|
|
3
|
+
import pathlib
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def add_to_subparsers(subparsers: argparse._SubParsersAction):
|
|
7
|
+
parser: argparse.ArgumentParser = subparsers.add_parser(
|
|
8
|
+
"init", help="initialize a script to render multiple files"
|
|
9
|
+
)
|
|
10
|
+
parser.add_argument(
|
|
11
|
+
"-c",
|
|
12
|
+
"--configuration",
|
|
13
|
+
default=str(pathlib.Path(os.getcwd()) / "faery_configuration.py"),
|
|
14
|
+
help="path of the configuration file",
|
|
15
|
+
)
|
|
16
|
+
parser.add_argument(
|
|
17
|
+
"-s",
|
|
18
|
+
"--scan",
|
|
19
|
+
default=str(pathlib.Path(os.getcwd()) / "recordings"),
|
|
20
|
+
help="**/*.",
|
|
21
|
+
)
|
|
22
|
+
parser.add_argument(
|
|
23
|
+
"-f",
|
|
24
|
+
"--input-format",
|
|
25
|
+
choices=[
|
|
26
|
+
"aedat",
|
|
27
|
+
"csv",
|
|
28
|
+
"dat",
|
|
29
|
+
"es",
|
|
30
|
+
"evt",
|
|
31
|
+
],
|
|
32
|
+
help="input format, required if the input is standard input",
|
|
33
|
+
)
|
|
34
|
+
parser.add_argument(
|
|
35
|
+
"-i",
|
|
36
|
+
"--track-id",
|
|
37
|
+
type=int,
|
|
38
|
+
help="set the track id for edat files (defaults to the first event stream)",
|
|
39
|
+
)
|
|
40
|
+
parser.add_argument(
|
|
41
|
+
"-j",
|
|
42
|
+
"--input-version",
|
|
43
|
+
choices=["dat1", "dat2", "evt2", "evt2.1", "evt3"],
|
|
44
|
+
help="set the version for evt (.raw) or dat files",
|
|
45
|
+
)
|
|
46
|
+
parser.add_argument(
|
|
47
|
+
"-x",
|
|
48
|
+
"--width",
|
|
49
|
+
type=int,
|
|
50
|
+
help="input width, required if the input format is csv",
|
|
51
|
+
)
|
|
52
|
+
parser.add_argument(
|
|
53
|
+
"-y",
|
|
54
|
+
"--height",
|
|
55
|
+
type=int,
|
|
56
|
+
help="input height, required if the input format is csv",
|
|
57
|
+
)
|
|
58
|
+
parser.add_argument(
|
|
59
|
+
"-t",
|
|
60
|
+
"--t0",
|
|
61
|
+
default=0,
|
|
62
|
+
help="set t0 for Event Stream files (defaults to 0)",
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def run(args: argparse.Namespace):
|
|
67
|
+
pass
|