feat: node-to-node MJPEG streaming CLIs and shared V4L2 format header

Add stream_send_cli (V4L2 capture → TCP → VIDEO_FRAME) and
stream_recv_cli (TCP → threaded frame slot → GLFW display) to
exercise end-to-end streaming between two nodes on the same machine
or across the network.

Add include/stream_stats.h (header-only rolling-window fps/Mbps tracker)
and include/v4l2_fmt.h (header-only V4L2 format enumeration shared between
v4l2_view_cli and stream_send_cli). Refactor v4l2_view_cli to use the
shared header.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-28 22:31:54 +00:00
parent 611376dbc1
commit 61c81398bb
8 changed files with 889 additions and 165 deletions

View File

@@ -23,7 +23,9 @@ CLI_SRCS = \
query_cli.c \
test_image_cli.c \
xorg_cli.c \
v4l2_view_cli.c
v4l2_view_cli.c \
stream_send_cli.c \
stream_recv_cli.c
CLI_OBJS = $(CLI_SRCS:%.c=$(CLI_BUILD)/%.o)
@@ -39,7 +41,9 @@ all: \
$(CLI_BUILD)/query_cli \
$(CLI_BUILD)/test_image_cli \
$(CLI_BUILD)/xorg_cli \
$(CLI_BUILD)/v4l2_view_cli
$(CLI_BUILD)/v4l2_view_cli \
$(CLI_BUILD)/stream_send_cli \
$(CLI_BUILD)/stream_recv_cli
# Module objects delegate to their sub-makes.
$(COMMON_OBJ): ; $(MAKE) -C $(ROOT)/src/modules/common
@@ -88,6 +92,12 @@ $(CLI_BUILD)/xorg_cli: $(CLI_BUILD)/xorg_cli.o $(TEST_IMAGE_OBJ) $(XORG_OBJ)
$(CLI_BUILD)/v4l2_view_cli: $(CLI_BUILD)/v4l2_view_cli.o $(XORG_OBJ)
$(CC) $(CFLAGS) -o $@ $^ $(PKG_LDFLAGS)
$(CLI_BUILD)/stream_send_cli: $(CLI_BUILD)/stream_send_cli.o $(COMMON_OBJ) $(SERIAL_OBJ) $(TRANSPORT_OBJ) $(PROTOCOL_OBJ)
$(CC) $(CFLAGS) -o $@ $^ -lpthread
$(CLI_BUILD)/stream_recv_cli: $(CLI_BUILD)/stream_recv_cli.o $(COMMON_OBJ) $(SERIAL_OBJ) $(TRANSPORT_OBJ) $(PROTOCOL_OBJ) $(XORG_OBJ)
$(CC) $(CFLAGS) -o $@ $^ -lpthread $(PKG_LDFLAGS)
$(CLI_BUILD):
mkdir -p $@
@@ -104,6 +114,8 @@ clean:
$(CLI_BUILD)/query_cli \
$(CLI_BUILD)/test_image_cli \
$(CLI_BUILD)/xorg_cli \
$(CLI_BUILD)/v4l2_view_cli
$(CLI_BUILD)/v4l2_view_cli \
$(CLI_BUILD)/stream_send_cli \
$(CLI_BUILD)/stream_recv_cli
-include $(CLI_OBJS:%.o=%.d)