|
1 | 1 | #include <sstream> |
2 | 2 |
|
3 | 3 | #include "src/torchcodec/_core/AVIOBytesContext.h" |
| 4 | +#include "src/torchcodec/_core/AVIOContextHolder.h" |
4 | 5 | #include "src/torchcodec/_core/Encoder.h" |
5 | 6 | #include "torch/types.h" |
6 | 7 |
|
@@ -148,6 +149,31 @@ AudioEncoder::AudioEncoder( |
148 | 149 | initializeEncoder(sampleRate, bitRate); |
149 | 150 | } |
150 | 151 |
|
| 152 | +// TODO this sucks, shouldn't need 2 separate constructors for AVIOContextHolder |
| 153 | +AudioEncoder::AudioEncoder( |
| 154 | + const torch::Tensor wf, |
| 155 | + int sampleRate, |
| 156 | + std::string_view formatName, |
| 157 | + std::unique_ptr<AVIOContextHolder> avioContextHolder, |
| 158 | + std::optional<int64_t> bitRate) |
| 159 | + : wf_(validateWf(wf)), avioContextHolderrrr_(std::move(avioContextHolder)) { |
| 160 | + setFFmpegLogLevel(); |
| 161 | + AVFormatContext* avFormatContext = nullptr; |
| 162 | + int status = avformat_alloc_output_context2( |
| 163 | + &avFormatContext, nullptr, formatName.data(), nullptr); |
| 164 | + |
| 165 | + TORCH_CHECK( |
| 166 | + avFormatContext != nullptr, |
| 167 | + "Couldn't allocate AVFormatContext. ", |
| 168 | + "Check the desired extension? ", |
| 169 | + getFFMPEGErrorStringFromErrorCode(status)); |
| 170 | + avFormatContext_.reset(avFormatContext); |
| 171 | + |
| 172 | + avFormatContext_->pb = avioContextHolderrrr_->getAVIOContext(); |
| 173 | + |
| 174 | + initializeEncoder(sampleRate, bitRate); |
| 175 | +} |
| 176 | + |
151 | 177 | void AudioEncoder::initializeEncoder( |
152 | 178 | int sampleRate, |
153 | 179 | std::optional<int64_t> bitRate) { |
|
0 commit comments