diff --git a/src/lerobot/datasets/lerobot_dataset.py b/src/lerobot/datasets/lerobot_dataset.py index af53bb87f..ea1cfc424 100644 --- a/src/lerobot/datasets/lerobot_dataset.py +++ b/src/lerobot/datasets/lerobot_dataset.py @@ -624,8 +624,8 @@ class LeRobotDataset(torch.utils.data.Dataset): image_writer_processes: int = 0, image_writer_threads: int = 0, video_backend: str | None = None, - camera_encoder_config: VideoEncoderConfig | None = None, batch_encoding_size: int = 1, + camera_encoder_config: VideoEncoderConfig | None = None, metadata_buffer_size: int = 10, streaming_encoding: bool = False, encoder_queue_maxsize: int = 30, diff --git a/src/lerobot/datasets/pyav_utils.py b/src/lerobot/datasets/pyav_utils.py index 4f18b5dec..c13c66b89 100644 --- a/src/lerobot/datasets/pyav_utils.py +++ b/src/lerobot/datasets/pyav_utils.py @@ -113,21 +113,19 @@ def _check_option_value(vcodec: str, label: str, value: Any, opt: av.option.Opti # Check numeric range compatibility lo, hi = float(opt.min), float(opt.max) if lo < hi and not (lo <= num_val <= hi): - raise ValueError(f"{label}={num_val} is out of range for codec {vcodec!r}; must be in [{lo}, {hi}]") + raise ValueError( + f"{label}={num_val} is out of range for codec {vcodec!r}; must be in [{lo}, {hi}]" + ) elif type_name == "STRING": if isinstance(value, bool): - raise ValueError( - f"{label}={value!r} is not a valid string value for codec {vcodec!r}." - ) + raise ValueError(f"{label}={value!r} is not a valid string value for codec {vcodec!r}.") if isinstance(value, str): str_val = value elif isinstance(value, (int, float)): str_val = str(value) else: - raise ValueError( - f"{label}={value!r} has unsupported type for STRING option on codec {vcodec!r}" - ) + raise ValueError(f"{label}={value!r} has unsupported type for STRING option on codec {vcodec!r}") # Check string choice compatibility choices = [c.name for c in (opt.choices or [])] @@ -149,9 +147,7 @@ def _check_pixel_format(vcodec: str, pix_fmt: str) -> None: ) -def _check_codec_options( - vcodec: str, codec_options: dict[str, Any], config: VideoEncoderConfig -) -> None: +def _check_codec_options(vcodec: str, codec_options: dict[str, Any], config: VideoEncoderConfig) -> None: """Validate merged encoder options (typed) against the codec's published AVOptions.""" supported_options = _get_codec_options_by_name(vcodec) for key, value in codec_options.items(): diff --git a/src/lerobot/datasets/video_utils.py b/src/lerobot/datasets/video_utils.py index e3ab200e2..244c7d8c3 100644 --- a/src/lerobot/datasets/video_utils.py +++ b/src/lerobot/datasets/video_utils.py @@ -73,10 +73,10 @@ class VideoEncoderConfig: codec (``crf`` for software, ``qp`` for NVENC/VAAPI, ``q:v`` for VideoToolbox, ``global_quality`` for QSV). preset: Speed/quality preset. Accepted type is per-codec. - fast_decode: Fast-decode tuning. For ``libsvtav1`` this is a level (0-2) - embedded in ``svtav1-params``. For ``h264`` and ``hevc`` non-zero values + fast_decode: Fast-decode tuning. For ``libsvtav1`` this is a level (0-2) + embedded in ``svtav1-params``. For ``h264`` and ``hevc`` non-zero values set ``tune=fastdecode``. Ignored for other codecs. - video_backend: Python library driving FFmpeg for encoding. Only ``"pyav"`` + video_backend: Python library driving FFmpeg for encoding. Only ``"pyav"`` is currently supported. extra_options: Free-form dictionary of additional FFmpeg options (e.g. ``{"tune": "film", "profile:v": "high", "bf": 2}``). @@ -139,15 +139,17 @@ class VideoEncoderConfig: return raise ValueError(f"Unsupported video codec: {self.vcodec} with video backend {self.video_backend}") - def get_codec_options(self, encoder_threads: int | None = None, as_strings: bool = False) -> dict[str, str]: + def get_codec_options( + self, encoder_threads: int | None = None, as_strings: bool = False + ) -> dict[str, str]: """Translate the tuning fields to codec-specific FFmpeg options. ``VideoEncoderConfig.extra_options`` are merged last but never override a structured field. Args: - encoder_threads: Number of encoder threads set globally for all VideoEncoderConfigs. - For libsvtav1, this is mapped to ``lp`` via ``svtav1-params``. - For h264/hevc, this is mapped to ``threads``. + encoder_threads: Number of encoder threads set globally for all VideoEncoderConfigs. + For libsvtav1, this is mapped to ``lp`` via ``svtav1-params``. + For h264/hevc, this is mapped to ``threads``. Hardware encoders ignore this parameter. as_strings: If ``True``, casts values to strings. """ @@ -165,7 +167,7 @@ class VideoEncoderConfig: set_if("preset", self.preset) svtav1_parts: list[str] = [] if self.fast_decode is not None: - svtav1_parts.append(f"fast-decode={max(0, min(2, self.fast_decode))}") + svtav1_parts.append(f"fast-decode={max(0, min(2, self.fast_decode))}") if encoder_threads is not None: svtav1_parts.append(f"lp={encoder_threads}") if svtav1_parts: diff --git a/src/lerobot/scripts/lerobot_record.py b/src/lerobot/scripts/lerobot_record.py index 94ee2a0d9..b571bd5c3 100644 --- a/src/lerobot/scripts/lerobot_record.py +++ b/src/lerobot/scripts/lerobot_record.py @@ -105,10 +105,8 @@ from lerobot.configs import parser from lerobot.configs.dataset import DatasetRecordConfig from lerobot.datasets import ( LeRobotDataset, - VideoEncoderConfig, VideoEncodingManager, aggregate_pipeline_dataset_features, - camera_encoder_defaults, create_initial_features, safe_stop_image_writer, )