media: implement importing SRT files
This commit is contained in:
@@ -518,6 +518,7 @@ void OpenGLRenderer::Blit(QVariant s, ShaderJob job, Texture *destination, Video
|
||||
case NodeValue::kFile:
|
||||
case NodeValue::kVideoParams:
|
||||
case NodeValue::kAudioParams:
|
||||
case NodeValue::kSubtitleParams:
|
||||
case NodeValue::kBezier:
|
||||
case NodeValue::kNone:
|
||||
case NodeValue::kDataTypeCount:
|
||||
|
||||
@@ -22,6 +22,8 @@
|
||||
|
||||
#include <QCoreApplication>
|
||||
|
||||
#include "common/xmlutils.h"
|
||||
|
||||
namespace olive {
|
||||
|
||||
QString SubtitleParams::GenerateASSHeader()
|
||||
@@ -106,4 +108,56 @@ QString SubtitleParams::GenerateASSHeader()
|
||||
return ass_code;
|
||||
}
|
||||
|
||||
void SubtitleParams::Load(QXmlStreamReader *reader)
|
||||
{
|
||||
this->clear();
|
||||
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("streamindex")) {
|
||||
set_stream_index(reader->readElementText().toInt());
|
||||
} else if (reader->name() == QStringLiteral("enabled")) {
|
||||
set_enabled(reader->readElementText().toInt());
|
||||
} else if (reader->name() == QStringLiteral("subtitles")) {
|
||||
while (XMLReadNextStartElement(reader)) {
|
||||
if (reader->name() == QStringLiteral("subtitle")) {
|
||||
rational in, out;
|
||||
QString text;
|
||||
|
||||
XMLAttributeLoop(reader, attr) {
|
||||
if (attr.name() == QStringLiteral("in")) {
|
||||
in = rational::fromString(attr.value().toString());
|
||||
} else if (attr.name() == QStringLiteral("out")) {
|
||||
out = rational::fromString(attr.value().toString());
|
||||
}
|
||||
}
|
||||
|
||||
text = reader->readElementText();
|
||||
|
||||
this->push_back(Subtitle(TimeRange(in, out), text));
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
reader->skipCurrentElement();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SubtitleParams::Save(QXmlStreamWriter *writer) const
|
||||
{
|
||||
writer->writeTextElement(QStringLiteral("streamindex"), QString::number(stream_index_));
|
||||
writer->writeTextElement(QStringLiteral("enabled"), QString::number(enabled_));
|
||||
|
||||
writer->writeStartElement(QStringLiteral("subtitles"));
|
||||
for (auto it=this->cbegin(); it!=this->cend(); it++) {
|
||||
writer->writeStartElement(QStringLiteral("subtitle"));
|
||||
writer->writeAttribute(QStringLiteral("in"), it->time().in().toString());
|
||||
writer->writeAttribute(QStringLiteral("out"), it->time().out().toString());
|
||||
writer->writeCharacters(it->text());
|
||||
writer->writeEndElement(); // subtitle
|
||||
}
|
||||
writer->writeEndElement(); // subtitles
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -21,16 +21,84 @@
|
||||
#ifndef SUBTITLEPARAMS_H
|
||||
#define SUBTITLEPARAMS_H
|
||||
|
||||
#include <QRect>
|
||||
#include <QString>
|
||||
#include <QXmlStreamReader>
|
||||
#include <QXmlStreamWriter>
|
||||
|
||||
#include "common/timerange.h"
|
||||
|
||||
namespace olive {
|
||||
|
||||
class SubtitleParams {
|
||||
class Subtitle
|
||||
{
|
||||
public:
|
||||
Subtitle() = default;
|
||||
|
||||
Subtitle(const TimeRange &time, const QString &text) :
|
||||
range_(time),
|
||||
text_(text)
|
||||
{
|
||||
}
|
||||
|
||||
const TimeRange &time() const { return range_; }
|
||||
void set_time(const TimeRange &t) { range_ = t; }
|
||||
|
||||
const QString &text() const { return text_; }
|
||||
void set_text(const QString &t) { text_ = t; }
|
||||
|
||||
private:
|
||||
TimeRange range_;
|
||||
|
||||
QString text_;
|
||||
|
||||
};
|
||||
|
||||
class SubtitleParams : public std::vector<Subtitle>
|
||||
{
|
||||
public:
|
||||
SubtitleParams()
|
||||
{
|
||||
stream_index_ = 0;
|
||||
enabled_ = true;
|
||||
}
|
||||
|
||||
static QString GenerateASSHeader();
|
||||
|
||||
void Load(QXmlStreamReader* reader);
|
||||
|
||||
void Save(QXmlStreamWriter* writer) const;
|
||||
|
||||
bool is_valid() const
|
||||
{
|
||||
return !this->empty();
|
||||
}
|
||||
|
||||
rational duration() const
|
||||
{
|
||||
if (this->empty()) {
|
||||
return 0;
|
||||
} else {
|
||||
return back().time().out();
|
||||
}
|
||||
}
|
||||
|
||||
int stream_index() const { return stream_index_; }
|
||||
void set_stream_index(int i) { stream_index_ = i; }
|
||||
|
||||
bool enabled() const { return enabled_; }
|
||||
void set_enabled(bool e) { enabled_ = e; }
|
||||
|
||||
private:
|
||||
int stream_index_;
|
||||
|
||||
bool enabled_;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
Q_DECLARE_METATYPE(olive::Subtitle)
|
||||
Q_DECLARE_METATYPE(olive::SubtitleParams)
|
||||
|
||||
#endif // SUBTITLEPARAMS_H
|
||||
|
||||
Reference in New Issue
Block a user