export: allow exporting subtitles to sidecar files
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -60,7 +60,9 @@ private:
|
||||
|
||||
ExportParams params_;
|
||||
|
||||
Encoder* encoder_;
|
||||
std::shared_ptr<Encoder> encoder_;
|
||||
|
||||
std::shared_ptr<Encoder> subtitle_encoder_;
|
||||
|
||||
ColorProcessorPtr color_processor_;
|
||||
|
||||
|
||||
@@ -28,16 +28,6 @@ ExportParams::ExportParams() :
|
||||
{
|
||||
}
|
||||
|
||||
const Encoder::Type &ExportParams::encoder() const
|
||||
{
|
||||
return encoder_id_;
|
||||
}
|
||||
|
||||
void ExportParams::set_encoder(const Encoder::Type &id)
|
||||
{
|
||||
encoder_id_ = id;
|
||||
}
|
||||
|
||||
bool ExportParams::has_custom_range() const
|
||||
{
|
||||
return has_custom_range_;
|
||||
@@ -104,8 +94,6 @@ void ExportParams::Save(QXmlStreamWriter *writer) const
|
||||
{
|
||||
writer->writeStartElement(QStringLiteral("export"));
|
||||
|
||||
writer->writeTextElement(QStringLiteral("encoder"), QString::number(encoder_id_));
|
||||
|
||||
writer->writeTextElement(QStringLiteral("vscale"), QString::number(video_scaling_method_));
|
||||
|
||||
writer->writeTextElement(QStringLiteral("range"), QString::number(has_custom_range_));
|
||||
|
||||
@@ -39,9 +39,6 @@ public:
|
||||
|
||||
ExportParams();
|
||||
|
||||
const Encoder::Type& encoder() const;
|
||||
void set_encoder(const Encoder::Type& id);
|
||||
|
||||
bool has_custom_range() const;
|
||||
const TimeRange& custom_range() const;
|
||||
void set_custom_range(const TimeRange& custom_range);
|
||||
@@ -59,8 +56,6 @@ public:
|
||||
virtual void Save(QXmlStreamWriter* writer) const override;
|
||||
|
||||
private:
|
||||
Encoder::Type encoder_id_;
|
||||
|
||||
VideoScalingMethod video_scaling_method_;
|
||||
|
||||
bool has_custom_range_;
|
||||
|
||||
@@ -95,8 +95,7 @@ bool RenderTask::Render(ColorManager* manager,
|
||||
|
||||
// Subtitle loop, loops over all blocks in sequence on all tracks
|
||||
if (!subtitle_range.length().isNull()) {
|
||||
Sequence *sequence = dynamic_cast<Sequence*>(viewer_);
|
||||
if (sequence) {
|
||||
if (Sequence *sequence = dynamic_cast<Sequence*>(viewer_)) {
|
||||
TrackList *list = sequence->track_list(Track::kSubtitle);
|
||||
QVector<int> block_indexes(list->GetTrackCount(), 0);
|
||||
|
||||
@@ -106,6 +105,10 @@ bool RenderTask::Render(ColorManager* manager,
|
||||
|
||||
for (int i=0; i<block_indexes.size(); i++) {
|
||||
Track *this_track = list->GetTrackAt(i);
|
||||
if (this_track->IsMuted()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
int &this_block_index = block_indexes[i];
|
||||
if (this_block_index >= this_track->Blocks().size()) {
|
||||
continue;
|
||||
|
||||
Reference in New Issue
Block a user