decoder: Load HEIC/x265 as plugin
Closes #85 Part-of: <https://gitlab.gnome.org/Incubator/loupe/-/merge_requests/123>
This commit is contained in:
parent
670c79bc1a
commit
ddf4b8c2fa
4 changed files with 57 additions and 7 deletions
5
Cargo.lock
generated
5
Cargo.lock
generated
|
|
@ -1801,12 +1801,13 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libheif-rs"
|
name = "libheif-rs"
|
||||||
version = "0.18.0"
|
version = "0.19.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "37d09b0d2d69da084eeeda9534662bc6b6096fbce3f307149750c0e572ad0ccd"
|
checksum = "7fcb2c12bbd85e40a36c704003f353f193f99476985fe89251423b6d0778f5c4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"enumn",
|
"enumn",
|
||||||
"four-cc",
|
"four-cc",
|
||||||
|
"libc",
|
||||||
"libheif-sys",
|
"libheif-sys",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ url = "2.3.1"
|
||||||
|
|
||||||
# decoders
|
# decoders
|
||||||
image-rs = { package = "image", version = "*", git = "https://github.com/image-rs/image.git" }
|
image-rs = { package = "image", version = "*", git = "https://github.com/image-rs/image.git" }
|
||||||
libheif-rs = "0.18.0"
|
libheif-rs = "0.19.0"
|
||||||
librsvg = { git = "https://gitlab.gnome.org/GNOME/librsvg.git" }
|
librsvg = { git = "https://gitlab.gnome.org/GNOME/librsvg.git" }
|
||||||
|
|
||||||
[dependencies.ashpd]
|
[dependencies.ashpd]
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,19 @@
|
||||||
"*.la",
|
"*.la",
|
||||||
"*.a"
|
"*.a"
|
||||||
],
|
],
|
||||||
|
"add-extensions": {
|
||||||
|
/* Exile HEIC (x265) codec into extension */
|
||||||
|
"org.gnome.Loupe.Devel.HEIC" : {
|
||||||
|
/* Relative to app dir */
|
||||||
|
"directory" : "lib/libheif-heic",
|
||||||
|
/* Relative to directory above */
|
||||||
|
"add-ld-path" : "lib",
|
||||||
|
/* Remove extension data from main flatpak package */
|
||||||
|
"bundle" : true,
|
||||||
|
/* Remove this extension when Loupe is deinstalled */
|
||||||
|
"autodelete" : true
|
||||||
|
}
|
||||||
|
},
|
||||||
"modules" : [
|
"modules" : [
|
||||||
{
|
{
|
||||||
"name": "geocode-glib",
|
"name": "geocode-glib",
|
||||||
|
|
@ -91,10 +104,42 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
/* HEIC (x265) decoder */
|
||||||
|
"name" : "libde265",
|
||||||
|
"buildsystem" : "cmake",
|
||||||
|
"config-opts": [
|
||||||
|
/* Install into folder for extension */
|
||||||
|
"-DCMAKE_INSTALL_PREFIX=/app/lib/libheif-heic",
|
||||||
|
"-DENABLE_SDL=Off"
|
||||||
|
],
|
||||||
|
"sources" : [
|
||||||
|
{
|
||||||
|
"type" : "git",
|
||||||
|
"url" : "https://github.com/strukturag/libde265.git",
|
||||||
|
"tag" : "v1.0.11"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
"name" : "libheif",
|
"name" : "libheif",
|
||||||
"buildsystem" : "cmake",
|
"buildsystem" : "cmake",
|
||||||
"config-opts": [
|
"config-opts": [
|
||||||
|
/* Build HEIC (x265) as plugin */
|
||||||
|
"-DWITH_LIBDE265_PLUGIN=On",
|
||||||
|
"-DPLUGIN_DIRECTORY=/app/lib/libheif-heic/lib",
|
||||||
|
"-DLIBDE265_INCLUDE_DIR=/app/lib/libheif-heic/include",
|
||||||
|
"-DLIBDE265_PKGCONF_LIBRARY_DIRS=/app/lib/libheif-heic/lib",
|
||||||
|
/* Turn all encoders off */
|
||||||
|
"-DWITH_X265=Off",
|
||||||
|
"-DWITH_SvtEnc=Off",
|
||||||
|
"-DWITH_SvtEnc_PLUGIN=Off",
|
||||||
|
"-DWITH_AOM_ENCODER=Off",
|
||||||
|
/* Turn off plugins for AV1 */
|
||||||
|
"-DWITH_RAV1E_PLUGIN=Off",
|
||||||
|
/* Turn off unused AV1 decoders */
|
||||||
|
"-DWITH_RAV1E=Off",
|
||||||
|
/* No need for examples */
|
||||||
|
"-DWITH_EXAMPLES=Off"
|
||||||
],
|
],
|
||||||
"sources" : [
|
"sources" : [
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,8 @@ use gtk::prelude::*;
|
||||||
|
|
||||||
use anyhow::Context;
|
use anyhow::Context;
|
||||||
use arc_swap::ArcSwap;
|
use arc_swap::ArcSwap;
|
||||||
use libheif_rs::{ColorSpace, HeifContext, Plane, RgbChroma};
|
use libheif_rs::{ColorSpace, HeifContext, LibHeif, Plane, RgbChroma};
|
||||||
|
use once_cell::sync::Lazy;
|
||||||
|
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
@ -15,6 +16,9 @@ use std::sync::Arc;
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Heif;
|
pub struct Heif;
|
||||||
|
|
||||||
|
/// Loads plugins on first use
|
||||||
|
static LIBHEIF: Lazy<LibHeif> = Lazy::new(LibHeif::new);
|
||||||
|
|
||||||
impl Heif {
|
impl Heif {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
path: PathBuf,
|
path: PathBuf,
|
||||||
|
|
@ -55,8 +59,8 @@ impl Heif {
|
||||||
RgbChroma::Rgb
|
RgbChroma::Rgb
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut image = handle
|
let mut image = LIBHEIF
|
||||||
.decode(ColorSpace::Rgb(rgb_chroma), None)
|
.decode(&handle, ColorSpace::Rgb(rgb_chroma), None)
|
||||||
.context(i18n("Failed to decode image"))?;
|
.context(i18n("Failed to decode image"))?;
|
||||||
|
|
||||||
let plane = image
|
let plane = image
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue