@@ -784,7 +784,7 @@ void VideoEncoder::initializeEncoder(
784784 auto tensorDevice = frames_.device ();
785785 StableDevice stableDevice (
786786 static_cast <StableDeviceType>(tensorDevice.type ()), tensorDevice.index ());
787- // The default CUDA interface is decode-only; encoders need the FFmpeg-based
787+ // The NVDEC CUDA interface is decode-only; encoders need the FFmpeg-based
788788 // one.
789789 deviceInterface_ = createDeviceInterface (
790790 stableDevice, stableDevice.type () == kStableCUDA ? " ffmpeg" : " default" );
@@ -1055,8 +1055,12 @@ MultiStreamEncoder::~MultiStreamEncoder() {
10551055 close ();
10561056}
10571057
1058- MultiStreamEncoder::MultiStreamEncoder (std::string_view fileName ) {
1058+ MultiStreamEncoder::MultiStreamEncoder () {
10591059 setFFmpegLogLevel ();
1060+ }
1061+
1062+ void MultiStreamEncoder::open (std::string_view fileName) {
1063+ STD_TORCH_CHECK (!headerWritten_, " open() was already called." );
10601064
10611065 AVFormatContext* avFormatContext = nullptr ;
10621066 int status = avformat_alloc_output_context2 (
@@ -1078,13 +1082,17 @@ MultiStreamEncoder::MultiStreamEncoder(std::string_view fileName) {
10781082 fileName,
10791083 " , make sure it's a valid path? " ,
10801084 getFFMPEGErrorStringFromErrorCode (status));
1085+
1086+ openStreamsAndWriteHeader ();
10811087}
10821088
1083- MultiStreamEncoder::MultiStreamEncoder (
1089+ void MultiStreamEncoder::open (
10841090 std::string_view formatName,
1085- std::unique_ptr<AVIOContextHolder> avioContextHolder)
1086- : avioContextHolder_(std::move(avioContextHolder)) {
1087- setFFmpegLogLevel ();
1091+ std::unique_ptr<AVIOContextHolder> avioContextHolder) {
1092+ STD_TORCH_CHECK (!headerWritten_, " open() was already called." );
1093+
1094+ avioContextHolder_ = std::move (avioContextHolder);
1095+
10881096 // Map mkv -> matroska when used as format name
10891097 formatName = (formatName == " mkv" ) ? " matroska" : formatName;
10901098 AVFormatContext* avFormatContext = nullptr ;
@@ -1101,6 +1109,8 @@ MultiStreamEncoder::MultiStreamEncoder(
11011109 avFormatContext_.reset (avFormatContext);
11021110
11031111 avFormatContext_->pb = avioContextHolder_->getAVIOContext ();
1112+
1113+ openStreamsAndWriteHeader ();
11041114}
11051115
11061116void MultiStreamEncoder::addVideoStream (
@@ -1121,7 +1131,7 @@ void MultiStreamEncoder::addVideoStream(
11211131 STD_TORCH_CHECK (frameRate > 0 , " frame_rate must be > 0, got " , frameRate);
11221132 videoStream_ = VideoStream{};
11231133 StableDevice stableDevice (std::move (device));
1124- // The default CUDA interface is decode-only; encoders need the FFmpeg-based
1134+ // The NVDEC CUDA interface is decode-only; encoders need the FFmpeg-based
11251135 // one.
11261136 videoStream_->deviceInterface = createDeviceInterface (
11271137 stableDevice, stableDevice.type () == kStableCUDA ? " ffmpeg" : " default" );
@@ -1383,8 +1393,7 @@ void MultiStreamEncoder::initializeAudioStream() {
13831393 audioStream.avAudioFifo .reset (avAudioFifo);
13841394}
13851395
1386- void MultiStreamEncoder::open () {
1387- STD_TORCH_CHECK (!headerWritten_, " open() was already called." );
1396+ void MultiStreamEncoder::openStreamsAndWriteHeader () {
13881397 STD_TORCH_CHECK (
13891398 videoStream_.has_value () || audioStream_.has_value (),
13901399 " Call addVideoStream() or addAudioStream() before open()." );
0 commit comments