|
|
@ -10,7 +10,6 @@ import time |
|
|
|
import cereal.messaging as messaging |
|
|
|
import cereal.messaging as messaging |
|
|
|
from cereal.visionipc import VisionIpcServer, VisionStreamType |
|
|
|
from cereal.visionipc import VisionIpcServer, VisionStreamType |
|
|
|
|
|
|
|
|
|
|
|
W, H = 1928, 1208 |
|
|
|
|
|
|
|
V4L2_BUF_FLAG_KEYFRAME = 8 |
|
|
|
V4L2_BUF_FLAG_KEYFRAME = 8 |
|
|
|
|
|
|
|
|
|
|
|
ENCODE_SOCKETS = { |
|
|
|
ENCODE_SOCKETS = { |
|
|
@ -19,10 +18,11 @@ ENCODE_SOCKETS = { |
|
|
|
VisionStreamType.VISION_STREAM_DRIVER: "driverEncodeData", |
|
|
|
VisionStreamType.VISION_STREAM_DRIVER: "driverEncodeData", |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
def decoder(addr, vipc_server, vst, nvidia, debug=False): |
|
|
|
def decoder(addr, vipc_server, vst, nvidia, W, H, debug=False): |
|
|
|
sock_name = ENCODE_SOCKETS[vst] |
|
|
|
sock_name = ENCODE_SOCKETS[vst] |
|
|
|
if debug: |
|
|
|
if debug: |
|
|
|
print("start decoder for %s" % sock_name) |
|
|
|
print("start decoder for %s" % sock_name) |
|
|
|
|
|
|
|
|
|
|
|
if nvidia: |
|
|
|
if nvidia: |
|
|
|
os.environ["NV_LOW_LATENCY"] = "3" # both bLowLatency and CUVID_PKT_ENDOFPICTURE |
|
|
|
os.environ["NV_LOW_LATENCY"] = "3" # both bLowLatency and CUVID_PKT_ENDOFPICTURE |
|
|
|
sys.path += os.environ["LD_LIBRARY_PATH"].split(":") |
|
|
|
sys.path += os.environ["LD_LIBRARY_PATH"].split(":") |
|
|
@ -99,16 +99,28 @@ def decoder(addr, vipc_server, vst, nvidia, debug=False): |
|
|
|
% (len(msgs), evta.idx.encodeId, evt.logMonoTime/1e9, evta.idx.timestampEof/1e6, frame_latency, |
|
|
|
% (len(msgs), evta.idx.encodeId, evt.logMonoTime/1e9, evta.idx.timestampEof/1e6, frame_latency, |
|
|
|
process_latency, network_latency, pc_latency, process_latency+network_latency+pc_latency ), len(evta.data), sock_name) |
|
|
|
process_latency, network_latency, pc_latency, process_latency+network_latency+pc_latency ), len(evta.data), sock_name) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class CompressedVipc: |
|
|
|
class CompressedVipc: |
|
|
|
def __init__(self, addr, vision_streams, nvidia=False, debug=False): |
|
|
|
def __init__(self, addr, vision_streams, nvidia=False, debug=False): |
|
|
|
|
|
|
|
print("getting frame sizes") |
|
|
|
|
|
|
|
os.environ["ZMQ"] = "1" |
|
|
|
|
|
|
|
messaging.context = messaging.Context() |
|
|
|
|
|
|
|
sm = messaging.SubMaster([ENCODE_SOCKETS[s] for s in vision_streams], addr=addr) |
|
|
|
|
|
|
|
while min(sm.rcv_frame.values()) == 0: |
|
|
|
|
|
|
|
sm.update(100) |
|
|
|
|
|
|
|
os.environ.pop("ZMQ") |
|
|
|
|
|
|
|
messaging.context = messaging.Context() |
|
|
|
|
|
|
|
|
|
|
|
self.vipc_server = VisionIpcServer("camerad") |
|
|
|
self.vipc_server = VisionIpcServer("camerad") |
|
|
|
for vst in vision_streams: |
|
|
|
for vst in vision_streams: |
|
|
|
self.vipc_server.create_buffers(vst, 4, False, W, H) |
|
|
|
ed = sm[ENCODE_SOCKETS[vst]] |
|
|
|
|
|
|
|
self.vipc_server.create_buffers(vst, 4, False, ed.width, ed.height) |
|
|
|
self.vipc_server.start_listener() |
|
|
|
self.vipc_server.start_listener() |
|
|
|
|
|
|
|
|
|
|
|
self.procs = [] |
|
|
|
self.procs = [] |
|
|
|
for vst in vision_streams: |
|
|
|
for vst in vision_streams: |
|
|
|
p = multiprocessing.Process(target=decoder, args=(addr, self.vipc_server, vst, nvidia, debug)) |
|
|
|
ed = sm[ENCODE_SOCKETS[vst]] |
|
|
|
|
|
|
|
p = multiprocessing.Process(target=decoder, args=(addr, self.vipc_server, vst, nvidia, debug, ed.width, ed.height)) |
|
|
|
p.start() |
|
|
|
p.start() |
|
|
|
self.procs.append(p) |
|
|
|
self.procs.append(p) |
|
|
|
|
|
|
|
|
|
|
|