Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 12 additions & 12 deletions classifier/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,20 @@ authors = ["colbyn <hello@colbyn.com>"]
edition = "2018"

[dependencies]
image = "0.23"
imageproc = "0.20"
libc = "^0.2"
image = "0.23.14"
imageproc = "0.22.0"
libc = "0.2.93"
rand = "0.7.3"
glob = "0.3.0"
rayon = "1.3.0"
mozjpeg-sys = "^0.10"
itertools = "0.8.0"
serde = {version = "^1.0", features = ["derive"]}
serde_json = "^1.0"
rayon = "1.5.0"
mozjpeg-sys = "0.10.13"
itertools = "0.10.0"
serde = {version = "1.0.25", features = ["derive"]}
serde_json = "1.0.64"
exoquant = "0.2.0"
lodepng = "2.5.0"
lodepng = "3.4.5"
hsl-ish = "0.1.0"
av-metrics = { version = "0.4", features = ["serde"] }
y4m = "0.5"
dcv-color-primitives = "0.1.4"
av-metrics = { version = "0.4.0", features = ["serde"] }
y4m = "0.5.3"
dcv-color-primitives = "0.2.0"
lazy_static = "1.4.0"
77 changes: 34 additions & 43 deletions classifier/src/classify.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use std::io::Cursor;
use av_metrics::video::*;
use image::{DynamicImage, GenericImage, GenericImageView};
use std::io::Cursor;
// use clap::{App, Arg};
// use console::style;
// use maplit::hashmap;
Expand All @@ -11,20 +11,19 @@ use image::{DynamicImage, GenericImage, GenericImageView};
// use std::path::Path;
// use std::process::exit;



pub fn run() {
let input_path = "assets/samples/pexels-photo-1153655.jpeg";
let quality = 10;

// SOURCE-1
let source1 = ::image::open(input_path).expect("source image");

// SOURCE-2
let source2 = ::image::open(input_path).expect("source image");
let source2 = unsafe {crate::codec::jpeg::encode(&source2, quality)};
let source2 = unsafe { crate::codec::jpeg::encode(&source2, quality) };
std::fs::write("test.jpeg", &source2);
let source2 = ::image::load_from_memory_with_format(&source2, ::image::ImageFormat::Jpeg).expect("decode jpeg buffer");
let source2 = ::image::load_from_memory_with_format(&source2, ::image::ImageFormat::Jpeg)
.expect("decode jpeg buffer");

// RESIZE
let source1 = source1.resize(300, 300, ::image::imageops::FilterType::Lanczos3);
Expand All @@ -38,11 +37,7 @@ pub fn run() {
let encoded = {
let ([y, u, v], width, height) = crate::color::format::to_yuv420p(&source);
let y4m_frame = y4m::Frame::new([&y, &u, &v], None);
let encoder = y4m::encode(
width,
height,
y4m::Ratio::new(0, 1),
);
let encoder = y4m::encode(width, height, y4m::Ratio::new(0, 1));
let mut buffer = Vec::<u8>::new();
{
let encoder = encoder.with_colorspace(y4m::Colorspace::C420);
Expand All @@ -57,53 +52,49 @@ pub fn run() {
let ssim = {
let mut decoder1 = to_encoded(&source1);
let mut decoder2 = to_encoded(&source2);

let mut decoder1: y4m::Decoder<Cursor<Vec<u8>>> = y4m::Decoder::new(&mut decoder1).expect("init y4m decoder");
let mut decoder2: y4m::Decoder<Cursor<Vec<u8>>> = y4m::Decoder::new(&mut decoder2).expect("init y4m decoder");
av_metrics::video::ssim::calculate_video_ssim(
&mut decoder1,
&mut decoder2,
None,
).expect("calculate_video_ssim")

let mut decoder1: y4m::Decoder<Cursor<Vec<u8>>> =
y4m::Decoder::new(&mut decoder1).expect("init y4m decoder");
let mut decoder2: y4m::Decoder<Cursor<Vec<u8>>> =
y4m::Decoder::new(&mut decoder2).expect("init y4m decoder");
av_metrics::video::ssim::calculate_video_ssim(&mut decoder1, &mut decoder2, None)
.expect("calculate_video_ssim")
};

let msssim = {
let mut decoder1 = to_encoded(&source1);
let mut decoder2 = to_encoded(&source2);

let mut decoder1: y4m::Decoder<Cursor<Vec<u8>>> = y4m::Decoder::new(&mut decoder1).expect("init y4m decoder");
let mut decoder2: y4m::Decoder<Cursor<Vec<u8>>> = y4m::Decoder::new(&mut decoder2).expect("init y4m decoder");
av_metrics::video::ssim::calculate_video_msssim(
&mut decoder1,
&mut decoder2,
None,
).expect("calculate_video_msssim")

let mut decoder1: y4m::Decoder<Cursor<Vec<u8>>> =
y4m::Decoder::new(&mut decoder1).expect("init y4m decoder");
let mut decoder2: y4m::Decoder<Cursor<Vec<u8>>> =
y4m::Decoder::new(&mut decoder2).expect("init y4m decoder");
av_metrics::video::ssim::calculate_video_msssim(&mut decoder1, &mut decoder2, None)
.expect("calculate_video_msssim")
};

let ciede = {
let mut decoder1 = to_encoded(&source1);
let mut decoder2 = to_encoded(&source2);

let mut decoder1: y4m::Decoder<Cursor<Vec<u8>>> = y4m::Decoder::new(&mut decoder1).expect("init y4m decoder");
let mut decoder2: y4m::Decoder<Cursor<Vec<u8>>> = y4m::Decoder::new(&mut decoder2).expect("init y4m decoder");
av_metrics::video::ciede::calculate_video_ciede(
&mut decoder1,
&mut decoder2,
None,
).expect("calculate_video_ciede")

let mut decoder1: y4m::Decoder<Cursor<Vec<u8>>> =
y4m::Decoder::new(&mut decoder1).expect("init y4m decoder");
let mut decoder2: y4m::Decoder<Cursor<Vec<u8>>> =
y4m::Decoder::new(&mut decoder2).expect("init y4m decoder");
av_metrics::video::ciede::calculate_video_ciede(&mut decoder1, &mut decoder2, None)
.expect("calculate_video_ciede")
};

let psnr_hvs = {
let mut decoder1 = to_encoded(&source1);
let mut decoder2 = to_encoded(&source2);

let mut decoder1: y4m::Decoder<Cursor<Vec<u8>>> = y4m::Decoder::new(&mut decoder1).expect("init y4m decoder");
let mut decoder2: y4m::Decoder<Cursor<Vec<u8>>> = y4m::Decoder::new(&mut decoder2).expect("init y4m decoder");
av_metrics::video::psnr_hvs::calculate_video_psnr_hvs(
&mut decoder1,
&mut decoder2,
None,
).expect("calculate_video_psnr_hvs")

let mut decoder1: y4m::Decoder<Cursor<Vec<u8>>> =
y4m::Decoder::new(&mut decoder1).expect("init y4m decoder");
let mut decoder2: y4m::Decoder<Cursor<Vec<u8>>> =
y4m::Decoder::new(&mut decoder2).expect("init y4m decoder");
av_metrics::video::psnr_hvs::calculate_video_psnr_hvs(&mut decoder1, &mut decoder2, None)
.expect("calculate_video_psnr_hvs")
};

println!("ssim: {:#?}", ssim);
Expand Down
36 changes: 17 additions & 19 deletions classifier/src/codec/jpeg.rs
Original file line number Diff line number Diff line change
@@ -1,21 +1,15 @@
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
use std::path::PathBuf;
use image::{ColorType, DynamicImage, GenericImage, GenericImageView, Pixel};
use itertools::Itertools;
use libc::{c_float, c_void, size_t};
use rayon::prelude::*;
use serde::{Deserialize, Serialize};
use std::convert::From;
use std::ffi::{CStr, CString};
use std::os::raw::{c_char, c_int};
use libc::{size_t, c_float, c_void};
use serde::{Serialize, Deserialize};
use image::{
GenericImage,
DynamicImage,
GenericImageView,
ColorType,
Pixel,
};
use rayon::prelude::*;
use itertools::Itertools;
use std::path::PathBuf;

///////////////////////////////////////////////////////////////////////////////
// MOZJPEG FFI HELPERS
Expand All @@ -29,12 +23,10 @@ const FALSE: mozjpeg_sys::boolean = false as mozjpeg_sys::boolean;
const COLOR_SPACE: mozjpeg_sys::J_COLOR_SPACE = mozjpeg_sys::J_COLOR_SPACE::JCS_RGB;
const COLOR_SPACE_COMPONENTS: libc::c_int = 3 as libc::c_int;


///////////////////////////////////////////////////////////////////////////////
// MOZJPEG ENCODER
///////////////////////////////////////////////////////////////////////////////


pub unsafe fn encode(source: &DynamicImage, quality: u8) -> Vec<u8> {
///////////////////////////////////////////////////////////////////////////
// INPUT
Expand Down Expand Up @@ -71,8 +63,16 @@ pub unsafe fn encode(source: &DynamicImage, quality: u8) -> Vec<u8> {
cinfo.write_JFIF_header = FALSE;
cinfo.optimize_coding = TRUE;
mozjpeg_sys::jpeg_simple_progression(&mut cinfo);
mozjpeg_sys::jpeg_c_set_bool_param(&mut cinfo, mozjpeg_sys::JBOOLEAN_USE_SCANS_IN_TRELLIS, TRUE);
mozjpeg_sys::jpeg_c_set_bool_param(&mut cinfo, mozjpeg_sys::JBOOLEAN_USE_LAMBDA_WEIGHT_TBL, TRUE);
mozjpeg_sys::jpeg_c_set_bool_param(
&mut cinfo,
mozjpeg_sys::JBOOLEAN_USE_SCANS_IN_TRELLIS,
TRUE,
);
mozjpeg_sys::jpeg_c_set_bool_param(
&mut cinfo,
mozjpeg_sys::JBOOLEAN_USE_LAMBDA_WEIGHT_TBL,
TRUE,
);
mozjpeg_sys::jpeg_set_quality(&mut cinfo, quality as i32, TRUE);

///////////////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -112,8 +112,6 @@ pub unsafe fn encode(source: &DynamicImage, quality: u8) -> Vec<u8> {
// OPT
///////////////////////////////////////////////////////////////////////////////



///////////////////////////////////////////////////////////////////////////////
// DEV
///////////////////////////////////////////////////////////////////////////////
Expand All @@ -124,4 +122,4 @@ pub unsafe fn encode(source: &DynamicImage, quality: u8) -> Vec<u8> {
// let (encoded, report) = OptContext::from_image(source).run_search(false);
// println!("results: {:#?}", report);
// std::fs::write("assets/output/test.jpeg", encoded);
// }
// }
2 changes: 1 addition & 1 deletion classifier/src/codec/mod.rs
Original file line number Diff line number Diff line change
@@ -1 +1 @@
pub mod jpeg;
pub mod jpeg;
44 changes: 14 additions & 30 deletions classifier/src/color/format.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use std::sync::{Arc, Mutex};
use image::{DynamicImage, GenericImage, GenericImageView};
use dcv_color_primitives::{convert_image, ColorSpace, ImageFormat, PixelFormat};
use image::{DynamicImage, GenericImage, GenericImageView};
use std::sync::{Arc, Mutex};

fn ensure_even_reslution(source: &DynamicImage) -> DynamicImage {
let (width, height) = source.dimensions();
Expand All @@ -22,34 +22,26 @@ fn ensure_even_reslution(source: &DynamicImage) -> DynamicImage {
height
}
};
let new_image = source
.clone()
.crop(0, 0, new_width, new_height);
let new_image = source.clone().crop(0, 0, new_width, new_height);
new_image
} else {
source.clone()
}
}


pub fn to_nv12(source: &DynamicImage) -> (Vec<u8>, usize, usize) {
// ENSURE VALID INPUT IMAGE
let source = ensure_even_reslution(source);
// SETUP
dcv_color_primitives::initialize();
let (mut width, height) = source.dimensions();

// ALLOCATE INPUT
let source_buffer: Vec<u8> = {
source
.to_bgra()
.pixels()
.flat_map(|px: &::image::Bgra<u8>| vec![
px.0[0],
px.0[1],
px.0[2],
px.0[3],
])
.flat_map(|px: &::image::Bgra<u8>| vec![px.0[0], px.0[1], px.0[2], px.0[3]])
.collect::<Vec<u8>>()
};
let input_data: &[&[u8]] = &[&source_buffer[..]];
Expand All @@ -58,7 +50,7 @@ pub fn to_nv12(source: &DynamicImage) -> (Vec<u8>, usize, usize) {
color_space: ColorSpace::Lrgb,
num_planes: 1,
};

// ALLOCATE OUTPUT
let dst_size: usize = 3 * (width as usize) * (height as usize) / 2;
let mut output_buffer = vec![0u8; dst_size];
Expand All @@ -79,8 +71,9 @@ pub fn to_nv12(source: &DynamicImage) -> (Vec<u8>, usize, usize) {
&dst_format,
None,
output_data,
).expect("convert rgba source to nv12");

)
.expect("convert rgba source to nv12");

// DONE
assert!(output_data.len() == 1);
(
Expand All @@ -94,22 +87,14 @@ pub fn to_yuv420p(source: &DynamicImage) -> ([Vec<u8>; 3], usize, usize) {
use itertools::Itertools;
let (mut nv12, width, height) = to_nv12(source);
std::fs::write("test.nv12.yuv", &nv12);
let y_size: usize = {
(width * height) as usize
};
let uv_size_interleaved: usize = {
(width * height / 2) as usize
};
let uv_size_planar: usize = {
(width * height / 4) as usize
};
let y_size: usize = { (width * height) as usize };
let uv_size_interleaved: usize = { (width * height / 2) as usize };
let uv_size_planar: usize = { (width * height / 4) as usize };
// println!("nv12: {}", nv12.len());
// println!("y_size: {}", y_size);
// println!("uv_size_interleaved: {}", uv_size_interleaved);
assert!(nv12.len() == y_size + uv_size_interleaved);
let y = nv12
.drain(0 .. y_size)
.collect::<Vec<_>>();
let y = nv12.drain(0..y_size).collect::<Vec<_>>();
assert!(nv12.len() == uv_size_interleaved);
let (u, v) = nv12
.into_iter()
Expand All @@ -129,9 +114,8 @@ pub fn to_yuv420p(source: &DynamicImage) -> ([Vec<u8>; 3], usize, usize) {
([y, u, v], width, height)
}


// pub fn to_y4m(source: &DynamicImage) -> y4m::Frame {
// let [y, u, v] = to_yuv420p(source);
// let frame = y4m::Frame::new([&y, &u, &v], None);
// frame
// }
// }
2 changes: 1 addition & 1 deletion classifier/src/color/mod.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
pub mod format;
pub mod palette;
pub mod quant;
pub mod format;
Loading