Skip to content

Commit

Permalink
Add encoding speed option
Browse files Browse the repository at this point in the history
This adds --speed option in kdynamicwallpaperbuilder, 0 - slowest speed,
10 - fastest. The encoding speed can potentially affect resulting file
size or encoding quality.

Example usage:

    kdynamicwallpaperbuilder --output foo.avif --speed 6 manifest.json
  • Loading branch information
zzag committed Jun 10, 2022
1 parent 2503718 commit 3e1b9d0
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 0 deletions.
21 changes: 21 additions & 0 deletions src/lib/kdynamicwallpaperwriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ class KDynamicWallpaperWriterPrivate
QString errorString;
QList<KDynamicWallpaperWriter::ImageView> images;
QList<KDynamicWallpaperMetaData> metaData;
std::optional<int> speed;
std::optional<int> maxThreadCount;
};

Expand Down Expand Up @@ -90,6 +91,7 @@ bool KDynamicWallpaperWriterPrivate::flush(QIODevice *device)

const QByteArray xmp = serializeMetaData(metaData);
avifEncoder *encoder = avifEncoderCreate();
encoder->speed = speed.value_or(AVIF_SPEED_DEFAULT);
encoder->maxThreads = maxThreadCount.value_or(QThread::idealThreadCount());
auto encoderCleanup = qScopeGuard([&encoder]() {
avifEncoderDestroy(encoder);
Expand Down Expand Up @@ -165,6 +167,25 @@ KDynamicWallpaperWriter::~KDynamicWallpaperWriter()
{
}

/*!
* Sets the encoding speed to \a speed. The speed value must be between 0 and 10, where
* 0 is the slowest speed, and 10 is the fastest speed. Encoding speed can affect encoding
* quality or file size.
*/
void KDynamicWallpaperWriter::setSpeed(int speed)
{
d->speed = qBound(0, speed, 10);
}

/*!
* Returns the encoding speed, between 0-10. If the encoding speed is not set, the encoder
* will choose the most optimal encoding speed.
*/
std::optional<int> KDynamicWallpaperWriter::speed() const
{
return d->speed;
}

void KDynamicWallpaperWriter::setMetaData(const QList<KDynamicWallpaperMetaData> &metaData)
{
d->metaData = metaData;
Expand Down
3 changes: 3 additions & 0 deletions src/lib/kdynamicwallpaperwriter.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@ class KDYNAMICWALLPAPER_EXPORT KDynamicWallpaperWriter
KDynamicWallpaperWriter();
~KDynamicWallpaperWriter();

void setSpeed(int speed);
std::optional<int> speed() const;

void setMetaData(const QList<KDynamicWallpaperMetaData> &metaData);
QList<KDynamicWallpaperMetaData> metaData() const;

Expand Down
14 changes: 14 additions & 0 deletions src/tools/builder/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@ int main(int argc, char **argv)
outputOption.setDescription(i18n("Write output to <file>"));
outputOption.setValueName(QStringLiteral("file"));

QCommandLineOption speedOption(QStringLiteral("speed"));
speedOption.setDescription(i18n("Encoding speed, 0 - slowest, 10 - fastest"));
speedOption.setValueName(QStringLiteral("speed"));

QCommandLineOption maxThreadsOption(QStringLiteral("max-threads"));
maxThreadsOption.setDescription(i18n("Maximum number of threads that can be used when encoding a wallpaper"));
maxThreadsOption.setValueName(QStringLiteral("max-threads"));
Expand All @@ -36,6 +40,7 @@ int main(int argc, char **argv)
parser.addPositionalArgument("json", i18n("Manifest file to use"));
parser.addOption(outputOption);
parser.addOption(maxThreadsOption);
parser.addOption(speedOption);
parser.process(app);

if (parser.positionalArguments().count() != 1)
Expand All @@ -61,6 +66,15 @@ int main(int argc, char **argv)
}
}

if (parser.isSet(speedOption)) {
bool ok;
if (const int speed = parser.value(speedOption).toInt(&ok); ok) {
writer.setSpeed(speed);
} else {
parser.showHelp(-1);
}
}

QString targetFileName = parser.value(outputOption);
if (targetFileName.isEmpty())
targetFileName = QStringLiteral("wallpaper.avif");
Expand Down

0 comments on commit 3e1b9d0

Please sign in to comment.