diff --git a/src/lerobot/datasets/dataset_metadata.py b/src/lerobot/datasets/dataset_metadata.py index 03fea8509..fc764c8ef 100644 --- a/src/lerobot/datasets/dataset_metadata.py +++ b/src/lerobot/datasets/dataset_metadata.py @@ -609,7 +609,7 @@ class LeRobotDatasetMetadata: Args: video_key: If provided, only update this video key. Otherwise update all video keys in the dataset. - camera_encoder: Encoder configuration used to produce the + video_encoder: Encoder configuration used to produce the videos. When provided, its fields are recorded as ``video.`` entries alongside the stream-derived ``video.*`` entries (see :func:`get_video_info`). diff --git a/src/lerobot/datasets/dataset_tools.py b/src/lerobot/datasets/dataset_tools.py index adbb841c4..c32724793 100644 --- a/src/lerobot/datasets/dataset_tools.py +++ b/src/lerobot/datasets/dataset_tools.py @@ -1331,7 +1331,7 @@ def _estimate_frame_size_via_calibration( imgs_dir=calibration_dir, video_path=calibration_video_path, fps=fps, - camera_encoder=camera_encoder, + video_encoder=camera_encoder, overwrite=True, ) @@ -1815,7 +1815,7 @@ def convert_image_to_video_dataset( imgs_dir=imgs_dir, video_path=video_path, fps=fps, - camera_encoder=camera_encoder, + video_encoder=camera_encoder, overwrite=True, ) @@ -1862,7 +1862,7 @@ def convert_image_to_video_dataset( video_key=img_key, chunk_index=0, file_index=0 ) new_meta.info.features[img_key]["info"] = get_video_info( - video_path, camera_encoder=camera_encoder + video_path, video_encoder=camera_encoder ) write_info(new_meta.info, new_meta.root) @@ -1960,7 +1960,7 @@ def reencode_dataset( # Refresh video info in metadata for every video key. for vid_key in meta.video_keys: video_path = meta.root / meta.get_video_file_path(0, vid_key) - meta.info.features[vid_key]["info"] = get_video_info(video_path, camera_encoder=camera_encoder) + meta.info.features[vid_key]["info"] = get_video_info(video_path, video_encoder=camera_encoder) write_info(meta.info, meta.root) logging.info("Dataset metadata updated.") diff --git a/src/lerobot/datasets/video_utils.py b/src/lerobot/datasets/video_utils.py index 9f34bf529..91bd7c250 100644 --- a/src/lerobot/datasets/video_utils.py +++ b/src/lerobot/datasets/video_utils.py @@ -494,7 +494,7 @@ def encode_video_frames( def reencode_video( input_video_path: Path | str, output_video_path: Path | str, - camera_encoder: VideoEncoderConfig | None = None, + video_encoder: VideoEncoderConfig | None = None, encoder_threads: int | None = None, log_level: int | None = av.logging.WARNING, overwrite: bool = False, @@ -504,13 +504,13 @@ def reencode_video( Args: input_video_path: Existing video file to read. output_video_path: Path for the re-encoded file. - camera_encoder: Encoder configuration. Defaults to :func:`camera_encoder_defaults`. + video_encoder: Encoder configuration. Defaults to :func:`camera_encoder_defaults`. encoder_threads: Optional thread count forwarded to :meth:`VideoEncoderConfig.get_codec_options`. log_level: libav log level while encoding, or ``None`` to leave logging unchanged. Defaults to WARNING. overwrite: When ``False`` and ``output_video_path`` already exists, skip and log a warning. """ - camera_encoder = camera_encoder or camera_encoder_defaults() + video_encoder = video_encoder or camera_encoder_defaults() output_video_path = Path(output_video_path) @@ -520,9 +520,9 @@ def reencode_video( output_video_path.parent.mkdir(parents=True, exist_ok=True) - video_options = camera_encoder.get_codec_options(encoder_threads, as_strings=True) - vcodec = camera_encoder.vcodec - pix_fmt = camera_encoder.pix_fmt + video_options = video_encoder.get_codec_options(encoder_threads, as_strings=True) + vcodec = video_encoder.vcodec + pix_fmt = video_encoder.pix_fmt with tempfile.NamedTemporaryFile(suffix=".mp4", delete=False) as tmp_named_file: tmp_output_video_path = tmp_named_file.name diff --git a/tests/datasets/test_dataset_tools.py b/tests/datasets/test_dataset_tools.py index d36312920..865649326 100644 --- a/tests/datasets/test_dataset_tools.py +++ b/tests/datasets/test_dataset_tools.py @@ -1360,7 +1360,7 @@ def test_reencode_dataset_multi_key_multiprocessing( target_cfg = VideoEncoderConfig(vcodec="h264", g=6, crf=23, pix_fmt="yuv420p") - result = reencode_dataset(dataset, camera_encoder=target_cfg, num_workers=2) + result = reencode_dataset(dataset, video_encoder=target_cfg, num_workers=2) assert result is dataset diff --git a/tests/datasets/test_datasets.py b/tests/datasets/test_datasets.py index 19c314fd6..1c10e978a 100644 --- a/tests/datasets/test_datasets.py +++ b/tests/datasets/test_datasets.py @@ -1516,10 +1516,15 @@ def test_valid_video_codecs_constant(): assert "h264" in VALID_VIDEO_CODECS assert "hevc" in VALID_VIDEO_CODECS assert "libsvtav1" in VALID_VIDEO_CODECS + assert "ffv1" in VALID_VIDEO_CODECS assert "auto" in VALID_VIDEO_CODECS assert "h264_videotoolbox" in VALID_VIDEO_CODECS assert "h264_nvenc" in VALID_VIDEO_CODECS - assert len(VALID_VIDEO_CODECS) == 10 + assert "h264_vaapi" in VALID_VIDEO_CODECS + assert "h264_qsv" in VALID_VIDEO_CODECS + assert "hevc_videotoolbox" in VALID_VIDEO_CODECS + assert "hevc_nvenc" in VALID_VIDEO_CODECS + assert len(VALID_VIDEO_CODECS) == 11 def test_delta_timestamps_with_episodes_filter(tmp_path, empty_lerobot_dataset_factory): diff --git a/tests/datasets/test_image_writer.py b/tests/datasets/test_image_writer.py index 916b8f017..348291c9c 100644 --- a/tests/datasets/test_image_writer.py +++ b/tests/datasets/test_image_writer.py @@ -94,7 +94,7 @@ def test_image_array_to_pil_image_pytorch_format(img_array_factory): def test_image_array_to_pil_image_single_channel(img_array_factory): img_array = img_array_factory(channels=1) - with pytest.raises(NotImplementedError): + with pytest.raises(ValueError, match="Unsupported single-channel image dtype"): image_array_to_pil_image(img_array) diff --git a/tests/datasets/test_video_encoding.py b/tests/datasets/test_video_encoding.py index 37ab473e8..ca735b77c 100644 --- a/tests/datasets/test_video_encoding.py +++ b/tests/datasets/test_video_encoding.py @@ -493,14 +493,14 @@ class TestReencodeVideo: src = TEST_ARTIFACTS_DIR / "clip_4frames.mp4" out = tmp_path / "reencoded.mp4" cfg = VideoEncoderConfig(vcodec="h264", g=6, crf=23, pix_fmt="yuv444p") - reencode_video(src, out, camera_encoder=cfg, overwrite=True) + reencode_video(src, out, video_encoder=cfg, overwrite=True) assert out.exists() with av.open(str(out)) as container: n_frames = sum(1 for _ in container.decode(video=0)) assert n_frames == 4 - info = get_video_info(out, camera_encoder=cfg) + info = get_video_info(out, video_encoder=cfg) assert info["video.codec"] == "h264" assert info["video.pix_fmt"] == "yuv444p" assert info["video.height"] == 64