export: allow exporting subtitles to sidecar files

This commit is contained in:
itsmattkc
2022-07-23 15:22:57 -07:00
parent 3948b77543
commit 12f9b1acfc
13 changed files with 183 additions and 39 deletions
+47 -7
View File
@@ -58,7 +58,14 @@ bool ExportTask::Run()
params_.SetFilename(FileFunctions::GetSafeTemporaryFilename(real_filename));
}
encoder_ = Encoder::CreateFromID(params_.encoder(), params_);
// If we're exporting to a sidecar subtitle file, disable the subtitles in the main encoder
bool subtitles_enabled = params_.subtitles_enabled();
ExportParams sidecar_params = params_;
if (subtitles_enabled && params_.subtitles_are_sidecar()) {
params_.DisableSubtitles();
}
encoder_ = std::shared_ptr<Encoder>(Encoder::CreateFromParams(params_));
if (!encoder_) {
SetError(tr("Failed to create encoder"));
@@ -67,10 +74,38 @@ bool ExportTask::Run()
if (!encoder_->Open()) {
SetError(tr("Failed to open file: %1").arg(encoder_->GetError()));
encoder_->deleteLater();
return false;
}
if (subtitles_enabled && params_.subtitles_are_sidecar()) {
// Construct sidecar params
sidecar_params.DisableVideo();
sidecar_params.DisableAudio();
QString sidecar_filename;
{
QFileInfo fi(real_filename);
sidecar_filename = fi.completeBaseName();
sidecar_filename.append('.');
sidecar_filename.append(ExportFormat::GetExtension(sidecar_params.subtitle_sidecar_fmt()));
sidecar_filename = fi.dir().filePath(sidecar_filename);
}
sidecar_params.SetFilename(sidecar_filename);
subtitle_encoder_ = std::shared_ptr<Encoder>(Encoder::CreateFromFormat(sidecar_params.subtitle_sidecar_fmt(), sidecar_params));
if (!subtitle_encoder_) {
SetError(tr("Failed to create subtitle encoder"));
return false;
}
if (!subtitle_encoder_->Open()) {
SetError(tr("Failed to open subtitle sidecar file: %1").arg(sidecar_filename));
return false;
}
} else {
subtitle_encoder_ = encoder_;
}
if (params_.has_custom_range()) {
// Render custom range only
range = params_.custom_range();
@@ -121,7 +156,7 @@ bool ExportTask::Run()
audio_range = {range};
}
if (params_.subtitles_enabled()) {
if (subtitles_enabled) {
subtitle_range = range;
}
@@ -132,13 +167,18 @@ bool ExportTask::Run()
bool success = true;
encoder_->Close();
if (!encoder_->GetError().isEmpty()) {
SetError(encoder_->GetError());
success = false;
}
delete encoder_;
if (subtitle_encoder_ != encoder_) {
subtitle_encoder_->Close();
if (!subtitle_encoder_->GetError().isEmpty()) {
SetError(subtitle_encoder_->GetError());
success = false;
}
}
// If cancelled, delete the file we made, which is always a file we created since we write to a
// temp file during the actual encoding process
@@ -209,8 +249,8 @@ bool ExportTask::AudioDownloaded(const TimeRange &range, const SampleBuffer &sam
bool ExportTask::EncodeSubtitle(const SubtitleBlock *sub)
{
if (!encoder_->WriteSubtitle(sub)) {
SetError(encoder_->GetError());
if (!subtitle_encoder_->WriteSubtitle(sub)) {
SetError(subtitle_encoder_->GetError());
return false;
} else {
return true;