Skip to content

Commit

Permalink
Add support for hardburn subtitle
Browse files Browse the repository at this point in the history
  • Loading branch information
CineEncoder committed Jul 30, 2023
1 parent e8b4053 commit 7ccfc8d
Show file tree
Hide file tree
Showing 7 changed files with 177 additions and 58 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# Ignored folders:
/builddir
cmake-build-debug/
.idea/

# Ignored files:
*.pro.user
Expand Down
5 changes: 3 additions & 2 deletions app/constants.h
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,8 @@ namespace Constants {
struct Data {
enum StreamCheck {
audioChecks, externAudioChecks, subtChecks, externSubtChecks,
audioDef, externAudioDef, subtDef, externSubtDef
audioDef, externAudioDef, subtDef, externSubtDef,
subtBurn, externSubtBurn
};
enum StreamField {
audioFormats, audioChannels, audioChLayouts, audioDuration,
Expand All @@ -138,7 +139,7 @@ namespace Constants {
externSubtTitles, externSubtPath
};

static const int CHECKS_COUNT = 8;
static const int CHECKS_COUNT = 10;
static const int FIELDS_COUNT = 22;

QVector<QString> videoMetadata;
Expand Down
118 changes: 71 additions & 47 deletions app/encoder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@ void Encoder::initEncoding(const QString &temp_file,
_error_message = "";
_flag_two_pass = false;
_flag_hdr = false;
_burn_subtitle = false;
_mux_mode = false;
*fr_count = 0;

Expand Down Expand Up @@ -271,6 +272,22 @@ void Encoder::initEncoding(const QString &temp_file,
}

/**************************************** Subtitles **************************************/
QString burn_subt_vf;
Q_LOOP(k, 0, CHECKS(subtBurn).size()) {
if (CHECKS(subtBurn)[k]) {
_burn_subtitle = true;
QString _input_file(input_file);
burn_subt_vf = QString("subtitles='%1':stream_index=%2").arg(_input_file/*.replace(" ", "\\ ")*/, numToStr(k));
break;
}
}
Q_LOOP(k, 0, CHECKS(externSubtBurn).size()) {
if (CHECKS(externSubtBurn)[k]) {
_burn_subtitle = true;
burn_subt_vf = QString("subtitles='%1'").arg(FIELDS(externSubtPath)[k]);
break;
}
}

QVector<QString> subtitleLang(CHECKS(subtChecks).size(), ""),
subtitleTitle(CHECKS(subtChecks).size(), ""),
Expand All @@ -280,19 +297,21 @@ void Encoder::initEncoding(const QString &temp_file,
_subtitleMetadataParam("");
int subtNum = 0;

Q_LOOP(k, 0, CHECKS(subtChecks).size()) {
if (CHECKS(subtChecks)[k] == true) {
subtitleMap[k] = QString("-map 0:s:%1? ").arg(numToStr(k));
subtitleLang[k] = QString("-metadata:s:s:%1 language=%2 ")
.arg(numToStr(subtNum), FIELDS(subtLangs)[k].replace(" ", "\u00A0"));
subtitleTitle[k] = QString("-metadata:s:s:%1 title=%2 ")
.arg(numToStr(subtNum), FIELDS(subtTitles)[k].replace(" ", "\u00A0"));
subtitleDef[k] = QString("-disposition:s:%1 %2 ")
.arg(numToStr(subtNum), CHECKS(subtDef)[k] ? "default" : "0");
subtNum++;
if (!_burn_subtitle) {
Q_LOOP(k, 0, CHECKS(subtChecks).size()) {
if (CHECKS(subtChecks)[k] == true) {
subtitleMap[k] = QString("-map 0:s:%1? ").arg(numToStr(k));
subtitleLang[k] = QString("-metadata:s:s:%1 language=%2 ")
.arg(numToStr(subtNum), FIELDS(subtLangs)[k].replace(" ", "\u00A0"));
subtitleTitle[k] = QString("-metadata:s:s:%1 title=%2 ")
.arg(numToStr(subtNum), FIELDS(subtTitles)[k].replace(" ", "\u00A0"));
subtitleDef[k] = QString("-disposition:s:%1 %2 ")
.arg(numToStr(subtNum), CHECKS(subtDef)[k] ? "default" : "0");
subtNum++;
}
_subtitleMapParam += subtitleMap[k];
_subtitleMetadataParam += subtitleLang[k] + subtitleTitle[k] + subtitleDef[k];
}
_subtitleMapParam += subtitleMap[k];
_subtitleMetadataParam += subtitleLang[k] + subtitleTitle[k] + subtitleDef[k];
}

/****************************** External Subtitle streams *********************************/
Expand All @@ -302,21 +321,23 @@ void Encoder::initEncoding(const QString &temp_file,
extSubMap(CHECKS(externSubtChecks).size(), ""),
extSubDef(CHECKS(externSubtChecks).size(), "");

Q_LOOP(k, 0, CHECKS(externSubtChecks).size()) {
if (CHECKS(externSubtChecks)[k] == true) {
_extSubPaths << "-i" << FIELDS(externSubtPath)[k];
extSubMap[k] = QString("-map %1:s? ").arg(numToStr(extTrackNum));
extSubLang[k] = QString("-metadata:s:s:%1 language=%2 ")
.arg(numToStr(subtNum), FIELDS(externSubtLangs)[k].replace(" ", "\u00A0"));
extSubTitle[k] = QString("-metadata:s:s:%1 title=%2 ")
.arg(numToStr(subtNum), FIELDS(externSubtTitles)[k].replace(" ", "\u00A0"));
extSubDef[k] = QString("-disposition:s:%1 %2 ")
.arg(numToStr(subtNum), CHECKS(externSubtDef)[k] ? "default" : "0");
subtNum++;
extTrackNum++;
if (!_burn_subtitle) {
Q_LOOP(k, 0, CHECKS(externSubtChecks).size()) {
if (CHECKS(externSubtChecks)[k] == true) {
_extSubPaths << "-i" << FIELDS(externSubtPath)[k];
extSubMap[k] = QString("-map %1:s? ").arg(numToStr(extTrackNum));
extSubLang[k] = QString("-metadata:s:s:%1 language=%2 ")
.arg(numToStr(subtNum), FIELDS(externSubtLangs)[k].replace(" ", "\u00A0"));
extSubTitle[k] = QString("-metadata:s:s:%1 title=%2 ")
.arg(numToStr(subtNum), FIELDS(externSubtTitles)[k].replace(" ", "\u00A0"));
extSubDef[k] = QString("-disposition:s:%1 %2 ")
.arg(numToStr(subtNum), CHECKS(externSubtDef)[k] ? "default" : "0");
subtNum++;
extTrackNum++;
}
_subtitleMapParam += extSubMap[k];
_subtitleMetadataParam += extSubLang[k] + extSubTitle[k] + extSubDef[k];
}
_subtitleMapParam += extSubMap[k];
_subtitleMetadataParam += extSubLang[k] + extSubTitle[k] + extSubDef[k];
}

/************************************* Codec module ***************************************/
Expand Down Expand Up @@ -464,28 +485,30 @@ void Encoder::initEncoding(const QString &temp_file,
/************************************ Subtitle module *************************************/

QString sub_param("");
if (container == "mkv") {
_sub_mux_param = QString("-c:s ass");
}
else
if (container == "webm") {
_sub_mux_param = QString("-c:s webvtt");
}
else
if (container == "mp4" || container == "mov") {
_sub_mux_param = QString("-c:s mov_text");
}
else {
_sub_mux_param = QString("-sn");
emit onEncodingError(tr("Container \'%1\' will be transcoded without subtitles.")
.arg(container), true);
}

if (_flag_hdr) {
sub_param = QString(" -c:s ass");
}
else {
if (_burn_subtitle) {
_sub_mux_param = QString("-sn");
sub_param = QString(" ") + _sub_mux_param;
} else {
if (container == "mkv") {
_sub_mux_param = QString("-c:s ass");
} else
if (container == "webm") {
_sub_mux_param = QString("-c:s webvtt");
} else
if (container == "mp4" || container == "mov") {
_sub_mux_param = QString("-c:s mov_text");
} else {
_sub_mux_param = QString("-sn");
emit onEncodingError(tr("Container \'%1\' will be transcoded without subtitles.")
.arg(container), true);
}

if (_flag_hdr) {
sub_param = QString(" -c:s ass");
} else {
sub_param = QString(" ") + _sub_mux_param;
}
}

/************************************* Color module ***************************************/
Expand Down Expand Up @@ -626,14 +649,15 @@ void Encoder::initEncoding(const QString &temp_file,
}
}

const int vf_size = 6;
const int vf_size = 7;
const QString vf_transform_arr[vf_size] = {
hwaccel_filter_vf,
fps_vf,
resize_vf,
colorprim_vf,
colormatrix_vf,
transfer_vf,
burn_subt_vf
};

QString vf = "";
Expand Down
1 change: 1 addition & 0 deletions app/encoder.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ class Encoder : public QObject
private:
bool _flag_two_pass,
_flag_hdr,
_burn_subtitle,
_mux_mode;

int *fr_count;
Expand Down
2 changes: 2 additions & 0 deletions app/mainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1863,6 +1863,7 @@ void MainWindow::openFiles(const QStringList &openFileNames) // Open files
_FIELDS(numRows, subtTitles).push_back(SINFO(size_t(j), "Title"));
const QString deflt = SINFO(size_t(j), "Default");
_CHECKS(numRows, subtDef).push_back(deflt == "Yes" ? true : false);
_CHECKS(numRows, subtBurn).push_back(false);
} else {
break;
}
Expand Down Expand Up @@ -2214,6 +2215,7 @@ void MainWindow::onAddExtStream()
_FIELDS(m_row, externSubtTitles).push_back(SINFO(0, "Title"));
_FIELDS(m_row, externSubtPath).push_back(path);
_CHECKS(m_row, externSubtDef).push_back(false);
_CHECKS(m_row, externSubtBurn).push_back(false);
}
} else {
showInfoMessage(tr("File: \'%1\' is not subtitle file!").arg(path));
Expand Down
Loading

0 comments on commit 7ccfc8d

Please sign in to comment.