From 7f624adcc51a01bc21e4f27cbbc5ffded9cfc1e1 Mon Sep 17 00:00:00 2001 From: CarolinePascal Date: Fri, 24 Apr 2026 17:10:30 +0200 Subject: [PATCH] chore(duplicate): removing duplicate get_codec_options definition --- src/lerobot/datasets/video_utils.py | 122 +++++++++++----------------- 1 file changed, 49 insertions(+), 73 deletions(-) diff --git a/src/lerobot/datasets/video_utils.py b/src/lerobot/datasets/video_utils.py index 7ef097d88..aa72d52e8 100644 --- a/src/lerobot/datasets/video_utils.py +++ b/src/lerobot/datasets/video_utils.py @@ -145,20 +145,59 @@ class VideoEncoderConfig: def get_codec_options(self, encoder_threads: int | None = None) -> dict[str, str]: - """Build codec-specific FFmpeg options from the tuning fields. + """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``. Hardware encoders ignore this. """ - return _get_codec_options( - self.vcodec, - g=self.g, - crf=self.crf, - preset=self.preset, - fast_decode=self.fast_decode, - encoder_threads=encoder_threads, - extra_options=self.extra_options, - ) + opts: dict[str, str] = {} + + def set_if(key: str, value: Any) -> None: + if value is not None: + opts[key] = str(value) + + if self.vcodec == "libsvtav1": + set_if("g", self.g) + set_if("crf", self.crf) + set_if("preset", self.preset) + svtav1_parts: list[str] = [] + if self.fast_decode: + svtav1_parts.append(f"fast-decode={self.fast_decode}") + if encoder_threads is not None: + svtav1_parts.append(f"lp={encoder_threads}") + if svtav1_parts: + opts["svtav1-params"] = ":".join(svtav1_parts) + elif self.vcodec in ("h264", "hevc"): + set_if("g", self.g) + set_if("crf", self.crf) + set_if("preset", self.preset) + if self.fast_decode: + opts["tune"] = "fastdecode" + set_if("threads", encoder_threads) + elif self.vcodec in ("h264_videotoolbox", "hevc_videotoolbox"): + set_if("g", self.g) + if self.crf is not None: + opts["q:v"] = str(max(1, min(100, 100 - self.crf * 2))) + elif self.vcodec in ("h264_nvenc", "hevc_nvenc"): + opts["rc"] = "constqp" + set_if("qp", self.crf) + set_if("preset", self.preset) + elif self.vcodec == "h264_vaapi": + set_if("qp", self.crf) + elif self.vcodec == "h264_qsv": + set_if("global_quality", self.crf) + set_if("preset", self.preset) + else: + set_if("g", self.g) + set_if("crf", self.crf) + set_if("preset", self.preset) + + for k, v in self.extra_options.items(): + opts.setdefault(k, str(v)) + + return opts def camera_encoder_defaults() -> VideoEncoderConfig: @@ -166,69 +205,6 @@ def camera_encoder_defaults() -> VideoEncoderConfig: return VideoEncoderConfig() -def _get_codec_options( - vcodec: str, - *, - g: int | None, - crf: int | None, - preset: int | str | None, - fast_decode: int, - encoder_threads: int | None, - extra_options: dict[str, Any] | None = None, -) -> dict[str, str]: - """Translate tuning options to FFmpeg codec options. - - ``extra_options`` are merged last and take precedence over the named fields. - """ - opts: dict[str, str] = {} - - def set_if(key: str, value: Any) -> None: - if value is not None: - opts[key] = str(value) - - if vcodec == "libsvtav1": - set_if("g", g) - set_if("crf", crf) - set_if("preset", preset) - svtav1_parts: list[str] = [] - if fast_decode: - svtav1_parts.append(f"fast-decode={fast_decode}") - if encoder_threads is not None: - svtav1_parts.append(f"lp={encoder_threads}") - if svtav1_parts: - opts["svtav1-params"] = ":".join(svtav1_parts) - elif vcodec in ("h264", "hevc"): - set_if("g", g) - set_if("crf", crf) - set_if("preset", preset) - if fast_decode: - opts["tune"] = "fastdecode" - set_if("threads", encoder_threads) - elif vcodec in ("h264_videotoolbox", "hevc_videotoolbox"): - set_if("g", g) - if crf is not None: - opts["q:v"] = str(max(1, min(100, 100 - crf * 2))) - elif vcodec in ("h264_nvenc", "hevc_nvenc"): - opts["rc"] = "constqp" - set_if("qp", crf) - set_if("preset", preset) - elif vcodec == "h264_vaapi": - set_if("qp", crf) - elif vcodec == "h264_qsv": - set_if("global_quality", crf) - set_if("preset", preset) - else: - set_if("g", g) - set_if("crf", crf) - set_if("preset", preset) - - if extra_options: - for k, v in extra_options.items(): - opts.setdefault(k, str(v)) - - return opts - - def decode_video_frames( video_path: Path | str, timestamps: list[float],