Skip to content

Commit

Permalink
Converting RGB8888 to ARGB32_Premultiplied (for performance reasons)
Browse files Browse the repository at this point in the history
  • Loading branch information
jonoomph committed Oct 13, 2020
1 parent 91945f0 commit 9405982
Show file tree
Hide file tree
Showing 9 changed files with 22 additions and 27 deletions.
2 changes: 1 addition & 1 deletion src/CacheDisk.cpp
Expand Up @@ -235,7 +235,7 @@ std::shared_ptr<Frame> CacheDisk::GetFrame(int64_t frame_number)
image->load(frame_path);

// Set pixel formatimage->
image = std::shared_ptr<QImage>(new QImage(image->convertToFormat(QImage::Format_RGBA8888)));
image = std::shared_ptr<QImage>(new QImage(image->convertToFormat(QImage::Format_ARGB32_Premultiplied)));

// Create frame object
std::shared_ptr<Frame> frame(new Frame());
Expand Down
4 changes: 2 additions & 2 deletions src/FFmpegReader.cpp
Expand Up @@ -1363,7 +1363,7 @@ void FFmpegReader::ProcessVideoPacket(int64_t requested_frame) {
scale_mode = SWS_BICUBIC;
}
SwsContext *img_convert_ctx = sws_getContext(info.width, info.height, AV_GET_CODEC_PIXEL_FORMAT(pStream, pCodecCtx), width,
height, PIX_FMT_RGBA, scale_mode, NULL, NULL, NULL);
height, AV_PIX_FMT_RGB32, scale_mode, NULL, NULL, NULL);

// Resize / Convert to RGB
sws_scale(img_convert_ctx, my_frame->data, my_frame->linesize, 0,
Expand All @@ -1373,7 +1373,7 @@ void FFmpegReader::ProcessVideoPacket(int64_t requested_frame) {
std::shared_ptr<Frame> f = CreateFrame(current_frame);

// Add Image data to frame
f->AddImage(width, height, 4, QImage::Format_RGBA8888, buffer);
f->AddImage(width, height, 4, QImage::Format_ARGB32_Premultiplied, buffer);

// Update working cache
working_cache.Add(f);
Expand Down
28 changes: 14 additions & 14 deletions src/Frame.cpp
Expand Up @@ -231,7 +231,7 @@ std::shared_ptr<QImage> Frame::GetWaveform(int width, int height, int Red, int G
}

// Create blank image
wave_image = std::shared_ptr<QImage>(new QImage(total_width, total_height, QImage::Format_RGBA8888));
wave_image = std::shared_ptr<QImage>(new QImage(total_width, total_height, QImage::Format_ARGB32_Premultiplied));
wave_image->fill(QColor(0,0,0,0));

// Load QPainter with wave_image device
Expand Down Expand Up @@ -262,7 +262,7 @@ std::shared_ptr<QImage> Frame::GetWaveform(int width, int height, int Red, int G
else
{
// No audio samples present
wave_image = std::shared_ptr<QImage>(new QImage(width, height, QImage::Format_RGBA8888));
wave_image = std::shared_ptr<QImage>(new QImage(width, height, QImage::Format_ARGB32_Premultiplied));
wave_image->fill(QColor(QString::fromStdString("#000000")));
}

Expand Down Expand Up @@ -618,7 +618,7 @@ void Frame::Thumbnail(std::string path, int new_width, int new_height, std::stri
std::string background_color, bool ignore_aspect, std::string format, int quality, float rotate) {

// Create blank thumbnail image & fill background color
std::shared_ptr<QImage> thumbnail = std::shared_ptr<QImage>(new QImage(new_width, new_height, QImage::Format_RGBA8888));
std::shared_ptr<QImage> thumbnail = std::shared_ptr<QImage>(new QImage(new_width, new_height, QImage::Format_ARGB32_Premultiplied));
thumbnail->fill(QColor(QString::fromStdString(background_color)));

// Create painter
Expand Down Expand Up @@ -673,7 +673,7 @@ void Frame::Thumbnail(std::string path, int new_width, int new_height, std::stri
overlay->load(QString::fromStdString(overlay_path));

// Set pixel format
overlay = std::shared_ptr<QImage>(new QImage(overlay->convertToFormat(QImage::Format_RGBA8888)));
overlay = std::shared_ptr<QImage>(new QImage(overlay->convertToFormat(QImage::Format_ARGB32_Premultiplied)));

// Resize to fit
overlay = std::shared_ptr<QImage>(new QImage(overlay->scaled(new_width, new_height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation)));
Expand All @@ -691,7 +691,7 @@ void Frame::Thumbnail(std::string path, int new_width, int new_height, std::stri
mask->load(QString::fromStdString(mask_path));

// Set pixel format
mask = std::shared_ptr<QImage>(new QImage(mask->convertToFormat(QImage::Format_RGBA8888)));
mask = std::shared_ptr<QImage>(new QImage(mask->convertToFormat(QImage::Format_ARGB32_Premultiplied)));

// Resize to fit
mask = std::shared_ptr<QImage>(new QImage(mask->scaled(new_width, new_height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation)));
Expand Down Expand Up @@ -747,7 +747,7 @@ void Frame::AddColor(int new_width, int new_height, std::string new_color)
const GenericScopedLock<juce::CriticalSection> lock(addingImageSection);
#pragma omp critical (AddImage)
{
image = std::shared_ptr<QImage>(new QImage(new_width, new_height, QImage::Format_RGBA8888));
image = std::shared_ptr<QImage>(new QImage(new_width, new_height, QImage::Format_ARGB32_Premultiplied));

// Fill with solid color
image->fill(QColor(QString::fromStdString(color)));
Expand Down Expand Up @@ -775,8 +775,8 @@ void Frame::AddImage(int new_width, int new_height, int bytes_per_pixel, QImage:
image = std::shared_ptr<QImage>(new QImage(qbuffer, new_width, new_height, new_width * bytes_per_pixel, type, (QImageCleanupFunction) &openshot::Frame::cleanUpBuffer, (void*) qbuffer));

// Always convert to RGBA8888 (if different)
if (image->format() != QImage::Format_RGBA8888)
*image = image->convertToFormat(QImage::Format_RGBA8888);
if (image->format() != QImage::Format_ARGB32_Premultiplied)
*image = image->convertToFormat(QImage::Format_ARGB32_Premultiplied);

// Update height and width
width = image->width();
Expand All @@ -798,9 +798,9 @@ void Frame::AddImage(std::shared_ptr<QImage> new_image)
{
image = new_image;

// Always convert to RGBA8888 (if different)
if (image->format() != QImage::Format_RGBA8888)
*image = image->convertToFormat(QImage::Format_RGBA8888);
// Always convert to Format_ARGB32_Premultiplied (if different)
if (image->format() != QImage::Format_ARGB32_Premultiplied)
*image = image->convertToFormat(QImage::Format_ARGB32_Premultiplied);

// Update height and width
width = image->width();
Expand Down Expand Up @@ -830,8 +830,8 @@ void Frame::AddImage(std::shared_ptr<QImage> new_image, bool only_odd_lines)
if (image == new_image || image->size() != new_image->size()) {
ret = true;
}
else if (new_image->format() != image->format()) {
new_image = std::shared_ptr<QImage>(new QImage(new_image->convertToFormat(image->format())));
else if (new_image->format() != QImage::Format_ARGB32_Premultiplied) {
new_image = std::shared_ptr<QImage>(new QImage(new_image->convertToFormat(QImage::Format_ARGB32_Premultiplied)));
}
}
if (ret) {
Expand Down Expand Up @@ -970,7 +970,7 @@ void Frame::AddMagickImage(std::shared_ptr<Magick::Image> new_image)
MagickCore::ExportImagePixels(new_image->constImage(), 0, 0, new_image->columns(), new_image->rows(), "RGBA", Magick::CharPixel, buffer, &exception);

// Create QImage of frame data
image = std::shared_ptr<QImage>(new QImage(qbuffer, width, height, width * BPP, QImage::Format_RGBA8888, (QImageCleanupFunction) &cleanUpBuffer, (void*) qbuffer));
image = std::shared_ptr<QImage>(new QImage(qbuffer, width, height, width * BPP, QImage::Format_ARGB32_Premultiplied, (QImageCleanupFunction) &cleanUpBuffer, (void*) qbuffer));

// Update height and width
width = image->width();
Expand Down
2 changes: 1 addition & 1 deletion src/QtHtmlReader.cpp
Expand Up @@ -62,7 +62,7 @@ void QtHtmlReader::Open()
if (!is_open)
{
// create image
image = std::shared_ptr<QImage>(new QImage(width, height, QImage::Format_RGBA8888));
image = std::shared_ptr<QImage>(new QImage(width, height, QImage::Format_ARGB32_Premultiplied));
image->fill(QColor(background_color.c_str()));

//start painting
Expand Down
5 changes: 0 additions & 5 deletions src/QtImageReader.cpp
Expand Up @@ -104,9 +104,6 @@ void QtImageReader::Open()
throw InvalidFile("File could not be opened.", path.toStdString());
}

// Convert to proper format
image = std::shared_ptr<QImage>(new QImage(image->convertToFormat(QImage::Format_RGBA8888)));

// Update image properties
info.has_audio = false;
info.has_video = true;
Expand Down Expand Up @@ -257,8 +254,6 @@ std::shared_ptr<Frame> QtImageReader::GetFrame(int64_t requested_frame)
cached_image = std::shared_ptr<QImage>(new QImage(image->scaled(max_width, max_height, Qt::KeepAspectRatio, Qt::SmoothTransformation)));
}

cached_image = std::shared_ptr<QImage>(new QImage(cached_image->convertToFormat(QImage::Format_RGBA8888)));

// Set max size (to later determine if max_size is changed)
max_size.setWidth(max_width);
max_size.setHeight(max_height);
Expand Down
2 changes: 1 addition & 1 deletion src/QtTextReader.cpp
Expand Up @@ -67,7 +67,7 @@ void QtTextReader::Open()
if (!is_open)
{
// create image
image = std::shared_ptr<QImage>(new QImage(width, height, QImage::Format_RGBA8888));
image = std::shared_ptr<QImage>(new QImage(width, height, QImage::Format_ARGB32_Premultiplied));
image->fill(QColor(background_color.c_str()));

QPainter painter;
Expand Down
2 changes: 1 addition & 1 deletion src/effects/Bars.cpp
Expand Up @@ -68,7 +68,7 @@ std::shared_ptr<Frame> Bars::GetFrame(std::shared_ptr<Frame> frame, int64_t fram
std::shared_ptr<QImage> frame_image = frame->GetImage();

// Get bar color (and create small color image)
std::shared_ptr<QImage> tempColor = std::shared_ptr<QImage>(new QImage(frame_image->width(), 1, QImage::Format_RGBA8888));
std::shared_ptr<QImage> tempColor = std::shared_ptr<QImage>(new QImage(frame_image->width(), 1, QImage::Format_ARGB32_Premultiplied));
tempColor->fill(QColor(QString::fromStdString(color.GetColorHex(frame_number))));

// Get current keyframe values
Expand Down
2 changes: 1 addition & 1 deletion src/effects/Crop.cpp
Expand Up @@ -68,7 +68,7 @@ std::shared_ptr<Frame> Crop::GetFrame(std::shared_ptr<Frame> frame, int64_t fram
std::shared_ptr<QImage> frame_image = frame->GetImage();

// Get transparent color (and create small transparent image)
std::shared_ptr<QImage> tempColor = std::shared_ptr<QImage>(new QImage(frame_image->width(), 1, QImage::Format_RGBA8888));
std::shared_ptr<QImage> tempColor = std::shared_ptr<QImage>(new QImage(frame_image->width(), 1, QImage::Format_ARGB32_Premultiplied));
tempColor->fill(QColor(QString::fromStdString("transparent")));

// Get current keyframe values
Expand Down
2 changes: 1 addition & 1 deletion src/effects/Deinterlace.cpp
Expand Up @@ -73,7 +73,7 @@ std::shared_ptr<Frame> Deinterlace::GetFrame(std::shared_ptr<Frame> frame, int64
const unsigned char* pixels = image->bits();

// Create a smaller, new image
QImage deinterlaced_image(image->width(), image->height() / 2, QImage::Format_RGBA8888);
QImage deinterlaced_image(image->width(), image->height() / 2, QImage::Format_ARGB32_Premultiplied);
const unsigned char* deinterlaced_pixels = deinterlaced_image.bits();

// Loop through the scanlines of the image (even or odd)
Expand Down

0 comments on commit 9405982

Please sign in to comment.