From 04ce66fdfecc67434bd491ae60ec540f2cd12fe2 Mon Sep 17 00:00:00 2001 From: LittleSam129 <1qwe432@gmail.com> Date: Mon, 27 Jul 2026 13:46:01 +0300 Subject: [PATCH] Lab028: add video packetization and CRC reassembly --- PROJECT_LOG.md | 23 +- .../lab028/lab028_overhead_efficiency.png | Bin 0 -> 71841 bytes .../lab028/lab028_packet_payload_results.csv | 6 + .../lab028/lab028_packets_wire_bitrate.png | Bin 0 -> 109952 bytes data/processed/lab028/lab028_report.txt | 52 ++ protocol/video_packet.py | 416 +++++++++ tests/lab028_video_packetization.py | 869 ++++++++++++++++++ 7 files changed, 1365 insertions(+), 1 deletion(-) create mode 100644 data/processed/lab028/lab028_overhead_efficiency.png create mode 100644 data/processed/lab028/lab028_packet_payload_results.csv create mode 100644 data/processed/lab028/lab028_packets_wire_bitrate.png create mode 100644 data/processed/lab028/lab028_report.txt create mode 100644 protocol/video_packet.py create mode 100644 tests/lab028_video_packetization.py diff --git a/PROJECT_LOG.md b/PROJECT_LOG.md index 513ae58..cfa2fbb 100644 --- a/PROJECT_LOG.md +++ b/PROJECT_LOG.md @@ -32,4 +32,25 @@ 1. Проверена установленная версия Git: ```text -git version 2.51.1.windows.1 \ No newline at end of file +git version 2.51.1.windows.1 +``` + +--- + +# Запись 002 + +## Дата + +27 июля 2026 года + +## Тема + +Завершение Lab028: пакетирование синхронного BASE + ROI. + +## Выполнено + +- Реализован фиксированный бинарный заголовок размером 32 байта. +- Добавлены packet CRC32 для заголовка и payload и object CRC32 для полного JPEG. +- Исследованы размеры payload 64, 128, 256, 512 и 1024 байта. +- Размер payload 512 байт принят как рабочий кандидат. +- Окончательный выбор размера пакета перенесён в Lab029. diff --git a/data/processed/lab028/lab028_overhead_efficiency.png b/data/processed/lab028/lab028_overhead_efficiency.png new file mode 100644 index 0000000000000000000000000000000000000000..ee131dfc2812deccba370a6aeb52dd8c65e88583 GIT binary patch literal 71841 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 Zv)eDpJ@4@9M>l9sfv2mV%Q~loCIANSrvm^0 literal 0 HcmV?d00001 diff --git a/data/processed/lab028/lab028_packet_payload_results.csv b/data/processed/lab028/lab028_packet_payload_results.csv new file mode 100644 index 0000000..c93cca5 --- /dev/null +++ b/data/processed/lab028/lab028_packet_payload_results.csv @@ -0,0 +1,6 @@ +max_payload_bytes,composite_frames,mean_base_packets_per_frame,mean_roi_packets_per_frame,mean_total_packets_per_frame,max_total_packets_per_frame,packets_per_second,jpeg_payload_bytes,jpeg_payload_bitrate_kbps,header_bytes_per_second,header_bitrate_kbps,wire_bytes,wire_bitrate_kbps,service_data_percent,efficiency_percent,mean_wire_packet_bytes,p95_wire_packet_bytes,max_wire_packet_bytes +64,63,36.428571,66.174603,102.603175,117,311.268058,409544,157.769759,9960.577849,79.684623,616392,237.454382,33.557866,66.442134,95.357673,96.000000,96 +128,63,18.428571,33.269841,51.698413,59,156.837881,409544,157.769759,5018.812199,40.150498,513768,197.920257,20.286199,79.713801,157.742708,160.000000,160 +256,63,9.428571,16.920635,26.349206,30,79.935795,409544,157.769759,2557.945425,20.463563,462664,178.233323,11.481334,88.518666,278.713253,288.000000,288 +512,63,5.000000,8.682540,13.682540,15,41.508828,409544,157.769759,1328.282504,10.626260,437128,168.396019,6.310280,93.689720,507.109049,544.000000,544 +1024,63,3.000000,4.587302,7.587302,8,23.017657,409544,157.769759,736.565008,5.892520,424840,163.662279,3.600414,96.399586,888.786611,1056.000000,1056 diff --git a/data/processed/lab028/lab028_packets_wire_bitrate.png b/data/processed/lab028/lab028_packets_wire_bitrate.png new file mode 100644 index 0000000000000000000000000000000000000000..d5c19eae5c39b5825d52472b966d13c1c1b87b45 GIT binary patch literal 109952 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 KelF{r5}E*wv|CRA literal 0 HcmV?d00001 diff --git a/data/processed/lab028/lab028_report.txt b/data/processed/lab028/lab028_report.txt new file mode 100644 index 0000000..95609ea --- /dev/null +++ b/data/processed/lab028/lab028_report.txt @@ -0,0 +1,52 @@ +Lab028. Пакетирование синхронного BASE + ROI + +Профиль и исходные данные +- Видео: data\raw\lab026_rover_source.mp4 +- Источник: 1280x720, 30.000000 fps, 623 кадров, 20.766667 с. +- ROI: x=0.20...0.80, y=0.42...1.00; пиксели x=256...1024, y=302...720. +- Синхронные составные кадры: 63 при 3.000 fps. +- BASE: 240x135, grayscale JPEG Q23; средний размер 2296.016 B, min/max 2122/2476 B. +- ROI: 320x180, grayscale JPEG Q33; средний размер 4204.683 B, min/max 3457/4938 B. +- BASE и ROI формируются из одного source frame и имеют общий composite_frame_id. + +Бинарный заголовок +- struct format: !4sBBHIHHHHIII +- Размер: 32 байта; network byte order; padding нет. +- Layout: magic[4] @0, version:u8 @4, object_type:u8 @5, header_size:u16 @6, composite_frame_id:u32 @8, fragment_index:u16 @12, fragment_count:u16 @14, payload_length:u16 @16, flags:u16 @18, jpeg_size:u32 @20, object_crc32:u32 @24, packet_crc32:u32 @28. +- object_type: 1=BASE, 2=ROI; flags зарезервирован и равен 0. + +CRC32 +- object_crc32 = zlib.crc32(полный JPEG) & 0xFFFFFFFF; значение помещается во все фрагменты объекта и проверяется после полной сборки. +- packet_crc32: сначала поле packet_crc32 заголовка обнуляется, затем CRC считается как zlib.crc32(header_with_zero_crc + payload) & 0xFFFFFFFF. +- Таким образом packet CRC защищает все поля заголовка и payload. + +Функциональные проверки +- PASS header_serialization_round_trip: fixed 32-byte header round trip is exact +- PASS ordered_lossless_transfer: BASE and ROI match original JPEG bytes +- PASS random_packet_order: arbitrary packet order reconstructed correctly +- PASS exact_duplicate_packets: 2 exact duplicates ignored +- PASS packet_crc_corruption: payload bit flip rejected; composite not emitted +- PASS missing_fragment: ROI fragment 10 reported missing +- PASS object_crc_corruption: valid packet CRCs still failed full-object CRC +- PASS adjacent_frame_isolation: two interleaved frame IDs remained independent +- PASS base_without_roi_atomicity: complete BASE retained while composite stayed unpublished + +Результаты размеров packet payload +payload | BASE pkt/frame | ROI pkt/frame | all pkt/frame | max pkt/frame | pkt/s | JPEG kbit/s | headers B/s | wire kbit/s | service % | efficiency % | packet mean/p95/max +-------:|---------------:|--------------:|--------------:|--------------:|------:|------------:|------------:|------------:|----------:|-------------:|--------------------: +64 | 36.429 | 66.175 | 102.603 | 117 | 311.268 | 157.770 | 9960.578 | 237.454 | 33.558 | 66.442 | 95.4/96.0/96 +128 | 18.429 | 33.270 | 51.698 | 59 | 156.838 | 157.770 | 5018.812 | 197.920 | 20.286 | 79.714 | 157.7/160.0/160 +256 | 9.429 | 16.921 | 26.349 | 30 | 79.936 | 157.770 | 2557.945 | 178.233 | 11.481 | 88.519 | 278.7/288.0/288 +512 | 5.000 | 8.683 | 13.683 | 15 | 41.509 | 157.770 | 1328.283 | 168.396 | 6.310 | 93.690 | 507.1/544.0/544 +1024 | 3.000 | 4.587 | 7.587 | 8 | 23.018 | 157.770 | 736.565 | 163.662 | 3.600 | 96.400 | 888.8/1056.0/1056 + +JPEG payload bitrate одинаков для всех строк, потому что исходные JPEG не меняются при выборе размера фрагмента. +Wire bitrate включает только JPEG payload и 32-байтные заголовки каждого пакета. +Wire bitrate пока НЕ включает FEC, преамбулу, синхронизацию, модуляцию, интервалы, повторные передачи, команды управления и телеметрию. +Лучший размер packet payload автоматически не выбирается: таблица показывает только транспортный компромисс. + +Артефакты +- CSV: data\processed\lab028\lab028_packet_payload_results.csv +- Overhead/efficiency: data\processed\lab028\lab028_overhead_efficiency.png +- Packet count/wire bitrate: data\processed\lab028\lab028_packets_wire_bitrate.png +- Промежуточные JPEG и пакеты сохранялись только в памяти; бинарные дампы не создавались. diff --git a/protocol/video_packet.py b/protocol/video_packet.py new file mode 100644 index 0000000..cf4399f --- /dev/null +++ b/protocol/video_packet.py @@ -0,0 +1,416 @@ +""" +Transport packets for synchronous BASE + ROI JPEG composite frames. + +The wire header has a fixed 32-byte, padding-free network-byte-order layout:: + + !4sBBHIHHHHIII + + Offset Size Field + 0 4 magic (b"SRV1") + 4 1 version + 5 1 object_type (1=BASE, 2=ROI) + 6 2 header_size + 8 4 composite_frame_id + 12 2 fragment_index + 14 2 fragment_count + 16 2 payload_length + 18 2 flags (reserved, must be zero) + 20 4 jpeg_size + 24 4 object_crc32 + 28 4 packet_crc32 + +packet_crc32 is calculated over the complete header with packet_crc32 set to +zero, followed by the packet payload. object_crc32 is calculated over the +complete JPEG before fragmentation and checked after reassembly. +""" + +from __future__ import annotations + +from dataclasses import dataclass, field +from enum import IntEnum +import struct +import zlib + + +MAGIC = b"SRV1" +VERSION = 1 +HEADER_FORMAT = "!4sBBHIHHHHIII" +HEADER_SIZE = struct.calcsize(HEADER_FORMAT) +MAX_PAYLOAD_LENGTH = 0xFFFF +MAX_FRAGMENT_COUNT = 0xFFFF +MAX_JPEG_SIZE = 0xFFFFFFFF + + +class ObjectType(IntEnum): + """JPEG object carried by a packet.""" + + BASE = 1 + ROI = 2 + + +class VideoPacketError(ValueError): + """Base class for video transport validation errors.""" + + +class PacketCRCError(VideoPacketError): + """The packet header or payload failed its CRC32 check.""" + + +class ObjectCRCError(VideoPacketError): + """A completely reassembled JPEG failed its CRC32 check.""" + + +class ObjectConsistencyError(VideoPacketError): + """Fragments for one object contain inconsistent metadata or data.""" + + +@dataclass(frozen=True) +class VideoPacket: + """Decoded and CRC-checked transport packet.""" + + composite_frame_id: int + object_type: ObjectType + fragment_index: int + fragment_count: int + jpeg_size: int + object_crc32: int + payload: bytes + packet_crc32: int = 0 + + +@dataclass(frozen=True) +class CompositeFrame: + """Atomically reassembled BASE and ROI JPEGs for one source update.""" + + composite_frame_id: int + base_jpeg: bytes + roi_jpeg: bytes + + +def crc32(data: bytes) -> int: + """Return an unsigned IEEE CRC32.""" + + return zlib.crc32(data) & 0xFFFFFFFF + + +def _validate_packet_fields(packet: VideoPacket) -> None: + if not 0 <= packet.composite_frame_id <= 0xFFFFFFFF: + raise VideoPacketError("composite_frame_id is outside uint32") + if packet.object_type not in (ObjectType.BASE, ObjectType.ROI): + raise VideoPacketError("unsupported object_type") + if not 1 <= packet.fragment_count <= MAX_FRAGMENT_COUNT: + raise VideoPacketError("fragment_count is outside uint16") + if not 0 <= packet.fragment_index < packet.fragment_count: + raise VideoPacketError("fragment_index is outside fragment_count") + if not 1 <= len(packet.payload) <= MAX_PAYLOAD_LENGTH: + raise VideoPacketError("payload length is outside uint16") + if not 1 <= packet.jpeg_size <= MAX_JPEG_SIZE: + raise VideoPacketError("jpeg_size is outside uint32") + if len(packet.payload) > packet.jpeg_size: + raise VideoPacketError("payload is larger than the JPEG object") + if not 0 <= packet.object_crc32 <= 0xFFFFFFFF: + raise VideoPacketError("object_crc32 is outside uint32") + + +def _pack_header(packet: VideoPacket, packet_crc32: int) -> bytes: + return struct.pack( + HEADER_FORMAT, + MAGIC, + VERSION, + int(packet.object_type), + HEADER_SIZE, + packet.composite_frame_id, + packet.fragment_index, + packet.fragment_count, + len(packet.payload), + 0, + packet.jpeg_size, + packet.object_crc32, + packet_crc32, + ) + + +def encode_packet(packet: VideoPacket) -> bytes: + """Serialize a packet and calculate its packet CRC32.""" + + if not isinstance(packet, VideoPacket): + raise TypeError("packet must be VideoPacket") + _validate_packet_fields(packet) + header_with_zero_crc = _pack_header(packet, 0) + packet_crc32 = crc32(header_with_zero_crc + packet.payload) + return _pack_header(packet, packet_crc32) + packet.payload + + +def decode_packet(wire_packet: bytes) -> VideoPacket: + """Deserialize a packet and validate its fixed header and packet CRC32.""" + + if not isinstance(wire_packet, (bytes, bytearray)): + raise TypeError("wire_packet must be bytes or bytearray") + wire_packet = bytes(wire_packet) + if len(wire_packet) < HEADER_SIZE + 1: + raise VideoPacketError("packet is shorter than header plus payload") + + ( + magic, + version, + object_type_value, + header_size, + composite_frame_id, + fragment_index, + fragment_count, + payload_length, + flags, + jpeg_size, + object_crc32, + received_packet_crc32, + ) = struct.unpack(HEADER_FORMAT, wire_packet[:HEADER_SIZE]) + + if magic != MAGIC: + raise VideoPacketError("invalid packet magic") + if version != VERSION: + raise VideoPacketError("unsupported packet version") + if header_size != HEADER_SIZE: + raise VideoPacketError("invalid fixed header size") + if flags != 0: + raise VideoPacketError("reserved flags must be zero") + try: + object_type = ObjectType(object_type_value) + except ValueError as error: + raise VideoPacketError("unsupported object_type") from error + + if len(wire_packet) != HEADER_SIZE + payload_length: + raise VideoPacketError("packet length does not match payload_length") + + packet = VideoPacket( + composite_frame_id=composite_frame_id, + object_type=object_type, + fragment_index=fragment_index, + fragment_count=fragment_count, + jpeg_size=jpeg_size, + object_crc32=object_crc32, + payload=wire_packet[HEADER_SIZE:], + packet_crc32=received_packet_crc32, + ) + _validate_packet_fields(packet) + calculated_packet_crc32 = crc32( + _pack_header(packet, 0) + packet.payload + ) + if calculated_packet_crc32 != received_packet_crc32: + raise PacketCRCError( + "packet CRC mismatch: " + f"received 0x{received_packet_crc32:08X}, " + f"calculated 0x{calculated_packet_crc32:08X}" + ) + return packet + + +def packetize_jpeg( + jpeg: bytes, + composite_frame_id: int, + object_type: ObjectType, + max_payload_length: int, +) -> list[bytes]: + """Split one non-empty JPEG object into serialized packets.""" + + if not isinstance(jpeg, (bytes, bytearray)): + raise TypeError("jpeg must be bytes or bytearray") + jpeg = bytes(jpeg) + if not jpeg: + raise ValueError("JPEG object must not be empty") + if len(jpeg) > MAX_JPEG_SIZE: + raise ValueError("JPEG object is larger than uint32") + if not 1 <= max_payload_length <= MAX_PAYLOAD_LENGTH: + raise ValueError("max_payload_length is outside uint16") + if not 0 <= composite_frame_id <= 0xFFFFFFFF: + raise ValueError("composite_frame_id is outside uint32") + try: + object_type = ObjectType(object_type) + except ValueError as error: + raise ValueError("unsupported object_type") from error + + fragment_count = ( + len(jpeg) + max_payload_length - 1 + ) // max_payload_length + if fragment_count > MAX_FRAGMENT_COUNT: + raise ValueError("JPEG needs more than 65535 fragments") + + object_crc32 = crc32(jpeg) + packets = [] + for fragment_index in range(fragment_count): + start = fragment_index * max_payload_length + payload = jpeg[start:start + max_payload_length] + packets.append( + encode_packet( + VideoPacket( + composite_frame_id=composite_frame_id, + object_type=object_type, + fragment_index=fragment_index, + fragment_count=fragment_count, + jpeg_size=len(jpeg), + object_crc32=object_crc32, + payload=payload, + ) + ) + ) + return packets + + +@dataclass +class _ObjectAssembly: + composite_frame_id: int + object_type: ObjectType + fragment_count: int + jpeg_size: int + object_crc32: int + fragments: dict[int, bytes] = field(default_factory=dict) + + @classmethod + def from_packet(cls, packet: VideoPacket) -> "_ObjectAssembly": + return cls( + composite_frame_id=packet.composite_frame_id, + object_type=packet.object_type, + fragment_count=packet.fragment_count, + jpeg_size=packet.jpeg_size, + object_crc32=packet.object_crc32, + ) + + def add(self, packet: VideoPacket) -> bool: + metadata = ( + packet.composite_frame_id, + packet.object_type, + packet.fragment_count, + packet.jpeg_size, + packet.object_crc32, + ) + expected = ( + self.composite_frame_id, + self.object_type, + self.fragment_count, + self.jpeg_size, + self.object_crc32, + ) + if metadata != expected: + raise ObjectConsistencyError( + "fragment metadata conflicts with object assembly" + ) + + existing = self.fragments.get(packet.fragment_index) + if existing is not None: + if existing != packet.payload: + raise ObjectConsistencyError( + "different payload for an existing fragment index" + ) + return False + self.fragments[packet.fragment_index] = packet.payload + return True + + def missing_fragments(self) -> tuple[int, ...]: + return tuple( + index + for index in range(self.fragment_count) + if index not in self.fragments + ) + + def assemble_if_complete(self) -> bytes | None: + if self.missing_fragments(): + return None + jpeg = b"".join( + self.fragments[index] + for index in range(self.fragment_count) + ) + if len(jpeg) != self.jpeg_size: + raise ObjectConsistencyError( + "reassembled JPEG length does not match jpeg_size" + ) + calculated_object_crc32 = crc32(jpeg) + if calculated_object_crc32 != self.object_crc32: + raise ObjectCRCError( + "object CRC mismatch: " + f"received 0x{self.object_crc32:08X}, " + f"calculated 0x{calculated_object_crc32:08X}" + ) + return jpeg + + +class CompositeReassembler: + """Reassemble interleaved BASE/ROI packets and publish atomic frames.""" + + def __init__(self) -> None: + self._objects: dict[ + tuple[int, ObjectType], _ObjectAssembly + ] = {} + self._completed: dict[ + int, dict[ObjectType, bytes] + ] = {} + self._finalized_frame_ids: set[int] = set() + self.duplicate_packets = 0 + + def ingest(self, wire_packet: bytes) -> CompositeFrame | None: + """Accept one packet and return a frame only when BASE and ROI exist.""" + + packet = decode_packet(wire_packet) + if packet.composite_frame_id in self._finalized_frame_ids: + self.duplicate_packets += 1 + return None + + key = (packet.composite_frame_id, packet.object_type) + assembly = self._objects.get(key) + if assembly is None: + assembly = _ObjectAssembly.from_packet(packet) + self._objects[key] = assembly + + if not assembly.add(packet): + self.duplicate_packets += 1 + return None + + jpeg = assembly.assemble_if_complete() + if jpeg is None: + return None + + frame_parts = self._completed.setdefault( + packet.composite_frame_id, {} + ) + frame_parts[packet.object_type] = jpeg + if not all( + object_type in frame_parts + for object_type in (ObjectType.BASE, ObjectType.ROI) + ): + return None + + frame = CompositeFrame( + composite_frame_id=packet.composite_frame_id, + base_jpeg=frame_parts[ObjectType.BASE], + roi_jpeg=frame_parts[ObjectType.ROI], + ) + self._finalized_frame_ids.add(packet.composite_frame_id) + self._completed.pop(packet.composite_frame_id, None) + for object_type in (ObjectType.BASE, ObjectType.ROI): + self._objects.pop( + (packet.composite_frame_id, object_type), None + ) + return frame + + def missing_fragments( + self, + composite_frame_id: int, + object_type: ObjectType, + ) -> tuple[int, ...] | None: + """Return missing indexes, or None if this object has not started.""" + + assembly = self._objects.get( + (composite_frame_id, ObjectType(object_type)) + ) + if assembly is None: + return None + return assembly.missing_fragments() + + def object_is_complete( + self, + composite_frame_id: int, + object_type: ObjectType, + ) -> bool: + """Report whether one CRC-validated object awaits its counterpart.""" + + return ObjectType(object_type) in self._completed.get( + composite_frame_id, {} + ) diff --git a/tests/lab028_video_packetization.py b/tests/lab028_video_packetization.py new file mode 100644 index 0000000..3119b12 --- /dev/null +++ b/tests/lab028_video_packetization.py @@ -0,0 +1,869 @@ +""" +Lab028. Packetization of synchronous BASE + ROI JPEG video objects. + +The laboratory forms the selected Lab027E profile directly from the source +video, keeps every JPEG and packet in memory, verifies the transport layer, +and writes only aggregate CSV/report/plot artifacts. +""" + +from __future__ import annotations + +import csv +from dataclasses import dataclass +from pathlib import Path +import random +from typing import Callable + +import cv2 +import matplotlib +import numpy as np + +matplotlib.use("Agg") +import matplotlib.pyplot as plt + +from protocol.video_packet import ( + CompositeFrame, + CompositeReassembler, + HEADER_FORMAT, + HEADER_SIZE, + ObjectCRCError, + ObjectType, + PacketCRCError, + VideoPacket, + decode_packet, + encode_packet, + packetize_jpeg, +) + + +SOURCE_VIDEO_PATH = Path("data/raw/lab026_rover_source.mp4") +OUTPUT_DIRECTORY = Path("data/processed/lab028") +CSV_PATH = OUTPUT_DIRECTORY / "lab028_packet_payload_results.csv" +REPORT_PATH = OUTPUT_DIRECTORY / "lab028_report.txt" +OVERHEAD_PLOT_PATH = ( + OUTPUT_DIRECTORY / "lab028_overhead_efficiency.png" +) +TRAFFIC_PLOT_PATH = ( + OUTPUT_DIRECTORY / "lab028_packets_wire_bitrate.png" +) + +COMPOSITE_FPS = 3.0 +BASE_WIDTH = 240 +BASE_HEIGHT = 135 +BASE_QUALITY = 23 +ROI_WIDTH = 320 +ROI_HEIGHT = 180 +ROI_QUALITY = 33 +ROI_X_MIN = 0.20 +ROI_X_MAX = 0.80 +ROI_Y_MIN = 0.42 +ROI_Y_MAX = 1.00 +PAYLOAD_LENGTHS = (64, 128, 256, 512, 1024) +FRAME_TIME_EPSILON_SECONDS = 1e-9 + +CSV_FIELDS = [ + "max_payload_bytes", + "composite_frames", + "mean_base_packets_per_frame", + "mean_roi_packets_per_frame", + "mean_total_packets_per_frame", + "max_total_packets_per_frame", + "packets_per_second", + "jpeg_payload_bytes", + "jpeg_payload_bitrate_kbps", + "header_bytes_per_second", + "header_bitrate_kbps", + "wire_bytes", + "wire_bitrate_kbps", + "service_data_percent", + "efficiency_percent", + "mean_wire_packet_bytes", + "p95_wire_packet_bytes", + "max_wire_packet_bytes", +] + + +@dataclass(frozen=True) +class VideoMetadata: + width: int + height: int + fps: float + frame_count: int + duration_seconds: float + + +@dataclass(frozen=True) +class EncodedComposite: + composite_frame_id: int + source_frame_index: int + base_jpeg: bytes + roi_jpeg: bytes + + +@dataclass(frozen=True) +class PayloadMetrics: + max_payload_bytes: int + composite_frames: int + mean_base_packets_per_frame: float + mean_roi_packets_per_frame: float + mean_total_packets_per_frame: float + max_total_packets_per_frame: int + packets_per_second: float + jpeg_payload_bytes: int + jpeg_payload_bitrate_kbps: float + header_bytes_per_second: float + header_bitrate_kbps: float + wire_bytes: int + wire_bitrate_kbps: float + service_data_percent: float + efficiency_percent: float + mean_wire_packet_bytes: float + p95_wire_packet_bytes: float + max_wire_packet_bytes: int + + +@dataclass(frozen=True) +class TestResult: + name: str + passed: bool + detail: str + + +def normalized_roi_to_pixels( + width: int, + height: int, +) -> tuple[int, int, int, int]: + """Use the normalized ROI coordinates from Lab027 through Lab027E.""" + + coordinates = ( + int(round(width * ROI_X_MIN)), + int(round(height * ROI_Y_MIN)), + int(round(width * ROI_X_MAX)), + int(round(height * ROI_Y_MAX)), + ) + x_min, y_min, x_max, y_max = coordinates + if not ( + 0 <= x_min < x_max <= width + and 0 <= y_min < y_max <= height + ): + raise RuntimeError("calculated ROI is outside the source frame") + return coordinates + + +def encode_grayscale_jpeg(image: np.ndarray, quality: int) -> bytes: + """Encode one grayscale image to an in-memory JPEG.""" + + encoded, buffer = cv2.imencode( + ".jpg", + image, + [int(cv2.IMWRITE_JPEG_QUALITY), int(quality)], + ) + if not encoded: + raise RuntimeError("OpenCV could not encode JPEG") + jpeg = buffer.tobytes() + if not jpeg: + raise RuntimeError("OpenCV produced an empty JPEG") + return jpeg + + +def encode_composite( + source_frame: np.ndarray, + source_roi: tuple[int, int, int, int], + composite_frame_id: int, + source_frame_index: int, +) -> EncodedComposite: + """Form synchronous BASE and ROI JPEGs from exactly one source frame.""" + + grayscale = cv2.cvtColor(source_frame, cv2.COLOR_BGR2GRAY) + base = cv2.resize( + grayscale, + (BASE_WIDTH, BASE_HEIGHT), + interpolation=cv2.INTER_AREA, + ) + x_min, y_min, x_max, y_max = source_roi + roi = grayscale[y_min:y_max, x_min:x_max] + if roi.size == 0: + raise RuntimeError("source ROI is empty") + roi = cv2.resize( + roi, + (ROI_WIDTH, ROI_HEIGHT), + interpolation=cv2.INTER_AREA, + ) + return EncodedComposite( + composite_frame_id=composite_frame_id, + source_frame_index=source_frame_index, + base_jpeg=encode_grayscale_jpeg(base, BASE_QUALITY), + roi_jpeg=encode_grayscale_jpeg(roi, ROI_QUALITY), + ) + + +def load_video_profile( + source_path: Path, +) -> tuple[VideoMetadata, list[EncodedComposite]]: + """Read the video sequentially and select synchronous updates at 3 fps.""" + + if not source_path.exists(): + raise FileNotFoundError(f"source video is missing: {source_path}") + capture = cv2.VideoCapture(str(source_path)) + if not capture.isOpened(): + raise RuntimeError(f"OpenCV could not open {source_path}") + + width = int(capture.get(cv2.CAP_PROP_FRAME_WIDTH)) + height = int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT)) + fps = float(capture.get(cv2.CAP_PROP_FPS)) + declared_frame_count = int( + capture.get(cv2.CAP_PROP_FRAME_COUNT) + ) + if width <= 0 or height <= 0 or fps <= 0.0: + capture.release() + raise RuntimeError("invalid source video metadata") + + source_roi = normalized_roi_to_pixels(width, height) + selected: list[EncodedComposite] = [] + source_frame_index = 0 + next_composite_time = 0.0 + try: + while True: + frame_read, source_frame = capture.read() + if not frame_read or source_frame is None: + break + source_time = source_frame_index / fps + if ( + source_time + FRAME_TIME_EPSILON_SECONDS + >= next_composite_time + ): + selected.append( + encode_composite( + source_frame, + source_roi, + len(selected), + source_frame_index, + ) + ) + next_composite_time += 1.0 / COMPOSITE_FPS + source_frame_index += 1 + finally: + capture.release() + + if source_frame_index <= 0 or not selected: + raise RuntimeError("source video did not yield frames") + if ( + declared_frame_count > 0 + and source_frame_index != declared_frame_count + ): + raise RuntimeError( + "decoded frame count differs from video metadata: " + f"{source_frame_index} != {declared_frame_count}" + ) + metadata = VideoMetadata( + width=width, + height=height, + fps=fps, + frame_count=source_frame_index, + duration_seconds=source_frame_index / fps, + ) + return metadata, selected + + +def packets_for_composite( + composite: EncodedComposite, + max_payload_bytes: int, +) -> tuple[list[bytes], list[bytes]]: + """Packetize BASE and ROI separately with one composite frame ID.""" + + base_packets = packetize_jpeg( + composite.base_jpeg, + composite.composite_frame_id, + ObjectType.BASE, + max_payload_bytes, + ) + roi_packets = packetize_jpeg( + composite.roi_jpeg, + composite.composite_frame_id, + ObjectType.ROI, + max_payload_bytes, + ) + return base_packets, roi_packets + + +def calculate_payload_metrics( + composites: list[EncodedComposite], + duration_seconds: float, + max_payload_bytes: int, +) -> PayloadMetrics: + """Calculate actual packet and bitrate statistics for one payload limit.""" + + base_counts: list[int] = [] + roi_counts: list[int] = [] + total_counts: list[int] = [] + wire_packet_sizes: list[int] = [] + for composite in composites: + base_packets, roi_packets = packets_for_composite( + composite, max_payload_bytes + ) + base_counts.append(len(base_packets)) + roi_counts.append(len(roi_packets)) + total_counts.append(len(base_packets) + len(roi_packets)) + wire_packet_sizes.extend( + len(packet) for packet in base_packets + roi_packets + ) + + jpeg_payload_bytes = sum( + len(composite.base_jpeg) + len(composite.roi_jpeg) + for composite in composites + ) + packet_count = len(wire_packet_sizes) + header_bytes = packet_count * HEADER_SIZE + wire_bytes = jpeg_payload_bytes + header_bytes + return PayloadMetrics( + max_payload_bytes=max_payload_bytes, + composite_frames=len(composites), + mean_base_packets_per_frame=float(np.mean(base_counts)), + mean_roi_packets_per_frame=float(np.mean(roi_counts)), + mean_total_packets_per_frame=float(np.mean(total_counts)), + max_total_packets_per_frame=max(total_counts), + packets_per_second=packet_count / duration_seconds, + jpeg_payload_bytes=jpeg_payload_bytes, + jpeg_payload_bitrate_kbps=( + jpeg_payload_bytes * 8.0 / duration_seconds / 1000.0 + ), + header_bytes_per_second=header_bytes / duration_seconds, + header_bitrate_kbps=( + header_bytes * 8.0 / duration_seconds / 1000.0 + ), + wire_bytes=wire_bytes, + wire_bitrate_kbps=( + wire_bytes * 8.0 / duration_seconds / 1000.0 + ), + service_data_percent=header_bytes / wire_bytes * 100.0, + efficiency_percent=jpeg_payload_bytes / wire_bytes * 100.0, + mean_wire_packet_bytes=float(np.mean(wire_packet_sizes)), + p95_wire_packet_bytes=float( + np.percentile(wire_packet_sizes, 95) + ), + max_wire_packet_bytes=max(wire_packet_sizes), + ) + + +def feed_packets( + packets: list[bytes], + reassembler: CompositeReassembler | None = None, +) -> tuple[list[CompositeFrame], CompositeReassembler]: + """Feed packets and collect every atomically published frame.""" + + receiver = reassembler or CompositeReassembler() + completed = [] + for packet in packets: + frame = receiver.ingest(packet) + if frame is not None: + completed.append(frame) + return completed, receiver + + +def assert_frame_matches( + frame: CompositeFrame, + expected: EncodedComposite, +) -> None: + if frame.composite_frame_id != expected.composite_frame_id: + raise AssertionError("composite frame ID differs") + if frame.base_jpeg != expected.base_jpeg: + raise AssertionError("BASE JPEG differs byte-for-byte") + if frame.roi_jpeg != expected.roi_jpeg: + raise AssertionError("ROI JPEG differs byte-for-byte") + + +def run_functional_tests( + composites: list[EncodedComposite], +) -> list[TestResult]: + """Run header and all mandatory Lab028 transport checks.""" + + if len(composites) < 2: + raise RuntimeError("functional checks need two video frames") + first = composites[0] + second = composites[1] + base_packets, roi_packets = packets_for_composite(first, 256) + all_packets = base_packets + roi_packets + tests: list[tuple[str, Callable[[], str]]] = [] + + def header_round_trip() -> str: + parsed = decode_packet(all_packets[0]) + rebuilt = encode_packet( + VideoPacket( + composite_frame_id=parsed.composite_frame_id, + object_type=parsed.object_type, + fragment_index=parsed.fragment_index, + fragment_count=parsed.fragment_count, + jpeg_size=parsed.jpeg_size, + object_crc32=parsed.object_crc32, + payload=parsed.payload, + ) + ) + if rebuilt != all_packets[0]: + raise AssertionError("serialized bytes changed after round trip") + return f"fixed {HEADER_SIZE}-byte header round trip is exact" + + def ordered_lossless() -> str: + frames, _ = feed_packets(all_packets) + if len(frames) != 1: + raise AssertionError("ordered transfer did not emit one frame") + assert_frame_matches(frames[0], first) + return "BASE and ROI match original JPEG bytes" + + def shuffled_packets() -> str: + shuffled = list(all_packets) + random.Random(28001).shuffle(shuffled) + frames, _ = feed_packets(shuffled) + if len(frames) != 1: + raise AssertionError("shuffled transfer did not emit one frame") + assert_frame_matches(frames[0], first) + return "arbitrary packet order reconstructed correctly" + + def duplicate_packets() -> str: + duplicated = list(all_packets) + duplicated.extend( + [all_packets[0], all_packets[len(base_packets)]] + ) + random.Random(28002).shuffle(duplicated) + frames, receiver = feed_packets(duplicated) + if len(frames) != 1: + raise AssertionError("duplicates changed publication count") + assert_frame_matches(frames[0], first) + if receiver.duplicate_packets < 2: + raise AssertionError("exact duplicates were not counted") + return f"{receiver.duplicate_packets} exact duplicates ignored" + + def packet_crc_corruption() -> str: + corrupted = bytearray(all_packets[0]) + corrupted[-1] ^= 0x01 + receiver = CompositeReassembler() + try: + receiver.ingest(bytes(corrupted)) + except PacketCRCError: + pass + else: + raise AssertionError("corrupted packet passed packet CRC") + frames, _ = feed_packets(all_packets[1:], receiver) + if frames: + raise AssertionError("frame emitted despite rejected packet") + return "payload bit flip rejected; composite not emitted" + + def missing_fragment() -> str: + missing_packet = roi_packets[len(roi_packets) // 2] + missing_index = decode_packet(missing_packet).fragment_index + remaining = [ + packet + for packet in all_packets + if packet is not missing_packet + ] + frames, receiver = feed_packets(remaining) + if frames: + raise AssertionError("frame emitted with a missing fragment") + missing = receiver.missing_fragments( + first.composite_frame_id, ObjectType.ROI + ) + if missing is None or missing_index not in missing: + raise AssertionError("missing fragment was not reported") + return f"ROI fragment {missing_index} reported missing" + + def object_crc_corruption() -> str: + target_position = len(base_packets) + parsed = decode_packet(all_packets[target_position]) + changed_payload = bytearray(parsed.payload) + changed_payload[0] ^= 0x01 + altered = encode_packet( + VideoPacket( + composite_frame_id=parsed.composite_frame_id, + object_type=parsed.object_type, + fragment_index=parsed.fragment_index, + fragment_count=parsed.fragment_count, + jpeg_size=parsed.jpeg_size, + object_crc32=parsed.object_crc32, + payload=bytes(changed_payload), + ) + ) + formally_valid = list(all_packets) + formally_valid[target_position] = altered + receiver = CompositeReassembler() + emitted = [] + object_error_seen = False + for packet in formally_valid: + try: + frame = receiver.ingest(packet) + except ObjectCRCError: + object_error_seen = True + continue + if frame is not None: + emitted.append(frame) + if not object_error_seen: + raise AssertionError("object CRC did not detect changed JPEG") + if emitted: + raise AssertionError("frame emitted after object CRC failure") + return "valid packet CRCs still failed full-object CRC" + + def adjacent_frames_do_not_mix() -> str: + first_packets = sum(packets_for_composite(first, 256), []) + second_packets = sum(packets_for_composite(second, 256), []) + interleaved = first_packets + second_packets + random.Random(28003).shuffle(interleaved) + frames, _ = feed_packets(interleaved) + by_id = {frame.composite_frame_id: frame for frame in frames} + if set(by_id) != { + first.composite_frame_id, + second.composite_frame_id, + }: + raise AssertionError("adjacent frames were lost or mixed") + assert_frame_matches(by_id[first.composite_frame_id], first) + assert_frame_matches(by_id[second.composite_frame_id], second) + return "two interleaved frame IDs remained independent" + + def base_only_is_not_atomic() -> str: + frames, receiver = feed_packets(base_packets) + if frames: + raise AssertionError("BASE-only input emitted a composite") + if not receiver.object_is_complete( + first.composite_frame_id, ObjectType.BASE + ): + raise AssertionError("complete BASE object was not retained") + return "complete BASE retained while composite stayed unpublished" + + tests.extend( + [ + ("header_serialization_round_trip", header_round_trip), + ("ordered_lossless_transfer", ordered_lossless), + ("random_packet_order", shuffled_packets), + ("exact_duplicate_packets", duplicate_packets), + ("packet_crc_corruption", packet_crc_corruption), + ("missing_fragment", missing_fragment), + ("object_crc_corruption", object_crc_corruption), + ("adjacent_frame_isolation", adjacent_frames_do_not_mix), + ("base_without_roi_atomicity", base_only_is_not_atomic), + ] + ) + + results = [] + for name, test in tests: + try: + detail = test() + except Exception as error: + results.append(TestResult(name, False, str(error))) + else: + results.append(TestResult(name, True, detail)) + failed = [result for result in results if not result.passed] + if failed: + details = "; ".join( + f"{result.name}: {result.detail}" for result in failed + ) + raise RuntimeError(f"functional transport tests failed: {details}") + return results + + +def save_csv(metrics: list[PayloadMetrics]) -> None: + OUTPUT_DIRECTORY.mkdir(parents=True, exist_ok=True) + with CSV_PATH.open("w", encoding="utf-8", newline="") as csv_file: + writer = csv.DictWriter(csv_file, fieldnames=CSV_FIELDS) + writer.writeheader() + for item in metrics: + row = {} + for field_name in CSV_FIELDS: + value = getattr(item, field_name) + row[field_name] = ( + f"{value:.6f}" + if isinstance(value, float) + else value + ) + writer.writerow(row) + + +def save_plots(metrics: list[PayloadMetrics]) -> None: + payloads = [item.max_payload_bytes for item in metrics] + + figure, axis = plt.subplots(figsize=(9, 5.5)) + axis.plot( + payloads, + [item.service_data_percent for item in metrics], + marker="o", + linewidth=2, + label="Service data (header / wire)", + ) + axis.plot( + payloads, + [item.efficiency_percent for item in metrics], + marker="s", + linewidth=2, + label="Efficiency (JPEG / wire)", + ) + axis.set_xscale("log", base=2) + axis.set_xticks(payloads) + axis.set_xticklabels([str(value) for value in payloads]) + axis.set_xlabel("Maximum packet payload, bytes") + axis.set_ylabel("Share, %") + axis.set_title("Lab028 packet overhead and efficiency") + axis.grid(True, alpha=0.3) + axis.legend() + figure.tight_layout() + figure.savefig(OVERHEAD_PLOT_PATH, dpi=160) + plt.close(figure) + + figure, packet_axis = plt.subplots(figsize=(9, 5.5)) + bitrate_axis = packet_axis.twinx() + packet_line = packet_axis.plot( + payloads, + [item.packets_per_second for item in metrics], + color="tab:blue", + marker="o", + linewidth=2, + label="Packets/s", + ) + bitrate_lines = bitrate_axis.plot( + payloads, + [item.wire_bitrate_kbps for item in metrics], + color="tab:red", + marker="s", + linewidth=2, + label="Wire bitrate", + ) + bitrate_axis.plot( + payloads, + [item.jpeg_payload_bitrate_kbps for item in metrics], + color="tab:green", + linestyle="--", + linewidth=2, + label="JPEG payload bitrate", + ) + packet_axis.set_xscale("log", base=2) + packet_axis.set_xticks(payloads) + packet_axis.set_xticklabels([str(value) for value in payloads]) + packet_axis.set_xlabel("Maximum packet payload, bytes") + packet_axis.set_ylabel("Packets per second", color="tab:blue") + bitrate_axis.set_ylabel("Bitrate, kbit/s", color="tab:red") + packet_axis.set_title("Lab028 packet rate and wire bitrate") + packet_axis.grid(True, alpha=0.3) + lines = packet_line + bitrate_lines + bitrate_axis.lines[1:] + packet_axis.legend( + lines, + [line.get_label() for line in lines], + loc="best", + ) + figure.tight_layout() + figure.savefig(TRAFFIC_PLOT_PATH, dpi=160) + plt.close(figure) + + +def metrics_table(metrics: list[PayloadMetrics]) -> list[str]: + lines = [ + ( + "payload | BASE pkt/frame | ROI pkt/frame | all pkt/frame | " + "max pkt/frame | pkt/s | JPEG kbit/s | headers B/s | " + "wire kbit/s | service % | efficiency % | packet mean/p95/max" + ), + ( + "-------:|---------------:|--------------:|--------------:|" + "--------------:|------:|------------:|------------:|" + "------------:|----------:|-------------:|--------------------:" + ), + ] + for item in metrics: + lines.append( + f"{item.max_payload_bytes} | " + f"{item.mean_base_packets_per_frame:.3f} | " + f"{item.mean_roi_packets_per_frame:.3f} | " + f"{item.mean_total_packets_per_frame:.3f} | " + f"{item.max_total_packets_per_frame} | " + f"{item.packets_per_second:.3f} | " + f"{item.jpeg_payload_bitrate_kbps:.3f} | " + f"{item.header_bytes_per_second:.3f} | " + f"{item.wire_bitrate_kbps:.3f} | " + f"{item.service_data_percent:.3f} | " + f"{item.efficiency_percent:.3f} | " + f"{item.mean_wire_packet_bytes:.1f}/" + f"{item.p95_wire_packet_bytes:.1f}/" + f"{item.max_wire_packet_bytes}" + ) + return lines + + +def write_report( + metadata: VideoMetadata, + composites: list[EncodedComposite], + metrics: list[PayloadMetrics], + test_results: list[TestResult], +) -> None: + source_roi = normalized_roi_to_pixels( + metadata.width, metadata.height + ) + base_sizes = [len(item.base_jpeg) for item in composites] + roi_sizes = [len(item.roi_jpeg) for item in composites] + lines = [ + "Lab028. Пакетирование синхронного BASE + ROI", + "", + "Профиль и исходные данные", + f"- Видео: {SOURCE_VIDEO_PATH}", + ( + f"- Источник: {metadata.width}x{metadata.height}, " + f"{metadata.fps:.6f} fps, {metadata.frame_count} кадров, " + f"{metadata.duration_seconds:.6f} с." + ), + ( + f"- ROI: x={ROI_X_MIN:.2f}...{ROI_X_MAX:.2f}, " + f"y={ROI_Y_MIN:.2f}...{ROI_Y_MAX:.2f}; " + f"пиксели x={source_roi[0]}...{source_roi[2]}, " + f"y={source_roi[1]}...{source_roi[3]}." + ), + ( + f"- Синхронные составные кадры: {len(composites)} " + f"при {COMPOSITE_FPS:.3f} fps." + ), + ( + f"- BASE: {BASE_WIDTH}x{BASE_HEIGHT}, grayscale JPEG Q" + f"{BASE_QUALITY}; средний размер {np.mean(base_sizes):.3f} B, " + f"min/max {min(base_sizes)}/{max(base_sizes)} B." + ), + ( + f"- ROI: {ROI_WIDTH}x{ROI_HEIGHT}, grayscale JPEG Q" + f"{ROI_QUALITY}; средний размер {np.mean(roi_sizes):.3f} B, " + f"min/max {min(roi_sizes)}/{max(roi_sizes)} B." + ), + ( + "- BASE и ROI формируются из одного source frame и имеют " + "общий composite_frame_id." + ), + "", + "Бинарный заголовок", + f"- struct format: {HEADER_FORMAT}", + f"- Размер: {HEADER_SIZE} байта; network byte order; padding нет.", + ( + "- Layout: magic[4] @0, version:u8 @4, object_type:u8 @5, " + "header_size:u16 @6, composite_frame_id:u32 @8, " + "fragment_index:u16 @12, fragment_count:u16 @14, " + "payload_length:u16 @16, flags:u16 @18, jpeg_size:u32 @20, " + "object_crc32:u32 @24, packet_crc32:u32 @28." + ), + "- object_type: 1=BASE, 2=ROI; flags зарезервирован и равен 0.", + "", + "CRC32", + ( + "- object_crc32 = zlib.crc32(полный JPEG) & 0xFFFFFFFF; " + "значение помещается во все фрагменты объекта и проверяется " + "после полной сборки." + ), + ( + "- packet_crc32: сначала поле packet_crc32 заголовка " + "обнуляется, затем CRC считается как " + "zlib.crc32(header_with_zero_crc + payload) & 0xFFFFFFFF." + ), + "- Таким образом packet CRC защищает все поля заголовка и payload.", + "", + "Функциональные проверки", + ] + lines.extend( + f"- {'PASS' if item.passed else 'FAIL'} {item.name}: {item.detail}" + for item in test_results + ) + lines.extend( + [ + "", + "Результаты размеров packet payload", + *metrics_table(metrics), + "", + ( + "JPEG payload bitrate одинаков для всех строк, потому что " + "исходные JPEG не меняются при выборе размера фрагмента." + ), + ( + "Wire bitrate включает только JPEG payload и 32-байтные " + "заголовки каждого пакета." + ), + ( + "Wire bitrate пока НЕ включает FEC, преамбулу, " + "синхронизацию, модуляцию, интервалы, повторные передачи, " + "команды управления и телеметрию." + ), + ( + "Лучший размер packet payload автоматически не выбирается: " + "таблица показывает только транспортный компромисс." + ), + "", + "Артефакты", + f"- CSV: {CSV_PATH}", + f"- Overhead/efficiency: {OVERHEAD_PLOT_PATH}", + f"- Packet count/wire bitrate: {TRAFFIC_PLOT_PATH}", + ( + "- Промежуточные JPEG и пакеты сохранялись только в памяти; " + "бинарные дампы не создавались." + ), + "", + ] + ) + REPORT_PATH.write_text("\n".join(lines), encoding="utf-8") + + +def validate_outputs(metrics: list[PayloadMetrics]) -> None: + if len(metrics) != len(PAYLOAD_LENGTHS): + raise RuntimeError("not all payload sizes were measured") + if [item.max_payload_bytes for item in metrics] != list( + PAYLOAD_LENGTHS + ): + raise RuntimeError("payload result order differs") + if any( + abs( + item.service_data_percent + + item.efficiency_percent + - 100.0 + ) > 1e-9 + for item in metrics + ): + raise RuntimeError("overhead and efficiency do not sum to 100%") + for path in ( + CSV_PATH, + REPORT_PATH, + OVERHEAD_PLOT_PATH, + TRAFFIC_PLOT_PATH, + ): + if not path.exists() or path.stat().st_size <= 0: + raise RuntimeError(f"missing or empty output: {path}") + + +def main() -> None: + print("Lab028: loading and JPEG-encoding the Lab027E profile...") + metadata, composites = load_video_profile(SOURCE_VIDEO_PATH) + print( + f" source={metadata.width}x{metadata.height}, " + f"{metadata.fps:.3f} fps, frames={metadata.frame_count}" + ) + print(f" synchronous composite frames={len(composites)}") + + print("Running functional transport checks...") + test_results = run_functional_tests(composites) + for result in test_results: + print(f" PASS {result.name}: {result.detail}") + + print("Measuring packet payload sizes...") + metrics = [ + calculate_payload_metrics( + composites, + metadata.duration_seconds, + payload_length, + ) + for payload_length in PAYLOAD_LENGTHS + ] + for item in metrics: + print( + f" payload={item.max_payload_bytes:4d} B: " + f"{item.packets_per_second:.3f} packet/s, " + f"wire={item.wire_bitrate_kbps:.3f} kbit/s, " + f"service={item.service_data_percent:.3f}%" + ) + + OUTPUT_DIRECTORY.mkdir(parents=True, exist_ok=True) + save_csv(metrics) + save_plots(metrics) + write_report(metadata, composites, metrics, test_results) + validate_outputs(metrics) + print(f"CSV: {CSV_PATH}") + print(f"Report: {REPORT_PATH}") + print(f"Plots: {OVERHEAD_PLOT_PATH}, {TRAFFIC_PLOT_PATH}") + print("Lab028 completed successfully.") + + +if __name__ == "__main__": + main()