@@ -37,11 +37,11 @@ TORCH_LIBRARY(torchcodec_ns, m) {
3737 m.def (
3838 " _encode_audio_to_file_like(Tensor samples, int sample_rate, str format, int file_like_context, int? bit_rate=None, int? num_channels=None, int? desired_sample_rate=None) -> ()" );
3939 m.def (
40- " encode_video_to_file(Tensor frames, int frame_rate, str filename, str? codec=None, str? pixel_format=None, float? crf=None, str? preset=None) -> ()" );
40+ " encode_video_to_file(Tensor frames, int frame_rate, str filename, str? codec=None, str? pixel_format=None, float? crf=None, str? preset=None, str[]? extra_options=None ) -> ()" );
4141 m.def (
42- " encode_video_to_tensor(Tensor frames, int frame_rate, str format, str? codec=None, str? pixel_format=None, float? crf=None, str? preset=None) -> Tensor" );
42+ " encode_video_to_tensor(Tensor frames, int frame_rate, str format, str? codec=None, str? pixel_format=None, float? crf=None, str? preset=None, str[]? extra_options=None ) -> Tensor" );
4343 m.def (
44- " _encode_video_to_file_like(Tensor frames, int frame_rate, str format, int file_like_context, str? codec=None, str? pixel_format=None, float? crf=None, str? preset=None) -> ()" );
44+ " _encode_video_to_file_like(Tensor frames, int frame_rate, str format, int file_like_context, str? codec=None, str? pixel_format=None, float? crf=None, str? preset=None, str[]? extra_options=None ) -> ()" );
4545 m.def (
4646 " create_from_tensor(Tensor video_tensor, str? seek_mode=None) -> Tensor" );
4747 m.def (
@@ -158,6 +158,16 @@ std::string quoteValue(const std::string& value) {
158158 return " \" " + value + " \" " ;
159159}
160160
161+ // Helper function to unflatten extra_options, alternating keys and values
162+ std::map<std::string, std::string> unflattenExtraOptions (
163+ const std::vector<std::string>& opts) {
164+ std::map<std::string, std::string> optionsMap;
165+ for (size_t i = 0 ; i < opts.size (); i += 2 ) {
166+ optionsMap[opts[i]] = opts[i + 1 ];
167+ }
168+ return optionsMap;
169+ }
170+
161171std::string mapToJson (const std::map<std::string, std::string>& metadataMap) {
162172 std::stringstream ss;
163173 ss << " {\n " ;
@@ -606,12 +616,19 @@ void encode_video_to_file(
606616 std::optional<std::string> codec = std::nullopt ,
607617 std::optional<std::string_view> pixel_format = std::nullopt ,
608618 std::optional<double > crf = std::nullopt ,
609- std::optional<std::string_view> preset = std::nullopt ) {
619+ std::optional<std::string_view> preset = std::nullopt ,
620+ std::optional<std::vector<std::string>> extra_options = std::nullopt ) {
610621 VideoStreamOptions videoStreamOptions;
611622 videoStreamOptions.codec = codec;
612623 videoStreamOptions.pixelFormat = pixel_format;
613624 videoStreamOptions.crf = crf;
614625 videoStreamOptions.preset = preset;
626+
627+ if (extra_options.has_value ()) {
628+ videoStreamOptions.extraOptions =
629+ unflattenExtraOptions (extra_options.value ());
630+ }
631+
615632 VideoEncoder (
616633 frames,
617634 validateInt64ToInt (frame_rate, " frame_rate" ),
@@ -627,13 +644,20 @@ at::Tensor encode_video_to_tensor(
627644 std::optional<std::string> codec = std::nullopt ,
628645 std::optional<std::string_view> pixel_format = std::nullopt ,
629646 std::optional<double > crf = std::nullopt ,
630- std::optional<std::string_view> preset = std::nullopt ) {
647+ std::optional<std::string_view> preset = std::nullopt ,
648+ std::optional<std::vector<std::string>> extra_options = std::nullopt ) {
631649 auto avioContextHolder = std::make_unique<AVIOToTensorContext>();
632650 VideoStreamOptions videoStreamOptions;
633651 videoStreamOptions.codec = codec;
634652 videoStreamOptions.pixelFormat = pixel_format;
635653 videoStreamOptions.crf = crf;
636654 videoStreamOptions.preset = preset;
655+
656+ if (extra_options.has_value ()) {
657+ videoStreamOptions.extraOptions =
658+ unflattenExtraOptions (extra_options.value ());
659+ }
660+
637661 return VideoEncoder (
638662 frames,
639663 validateInt64ToInt (frame_rate, " frame_rate" ),
@@ -651,7 +675,8 @@ void _encode_video_to_file_like(
651675 std::optional<std::string> codec = std::nullopt ,
652676 std::optional<std::string_view> pixel_format = std::nullopt ,
653677 std::optional<double > crf = std::nullopt ,
654- std::optional<std::string_view> preset = std::nullopt ) {
678+ std::optional<std::string_view> preset = std::nullopt ,
679+ std::optional<std::vector<std::string>> extra_options = std::nullopt ) {
655680 auto fileLikeContext =
656681 reinterpret_cast <AVIOFileLikeContext*>(file_like_context);
657682 TORCH_CHECK (
@@ -664,6 +689,11 @@ void _encode_video_to_file_like(
664689 videoStreamOptions.crf = crf;
665690 videoStreamOptions.preset = preset;
666691
692+ if (extra_options.has_value ()) {
693+ videoStreamOptions.extraOptions =
694+ unflattenExtraOptions (extra_options.value ());
695+ }
696+
667697 VideoEncoder encoder (
668698 frames,
669699 validateInt64ToInt (frame_rate, " frame_rate" ),
0 commit comments