Skip to content

Commit

Permalink
Merge pull request #33 from awxkee/dev
Browse files Browse the repository at this point in the history
Dev
  • Loading branch information
awxkee authored Dec 24, 2024
2 parents 608ff74 + effff95 commit 4b4a751
Show file tree
Hide file tree
Showing 22 changed files with 973 additions and 3,444 deletions.
488 changes: 241 additions & 247 deletions app/benches/yuv8/main.rs

Large diffs are not rendered by default.

8 changes: 3 additions & 5 deletions app/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,9 @@ use yuvutils_rs::{
yuv420_p16_to_rgb, yuv420_p16_to_rgb16, yuv420_to_rgb, yuv420_to_yuyv422, yuv422_p16_to_rgb,
yuv422_p16_to_rgb16, yuv422_to_rgb, yuv422_to_rgba, yuv444_p16_to_rgb16, yuv444_to_rgb,
yuv_nv12_to_rgb, yuv_nv12_to_rgb_p16, yuv_nv12_to_rgba, yuv_nv12_to_rgba_p16, yuv_nv16_to_rgb,
yuv_nv24_to_rgb, yuyv422_to_rgb, yuyv422_to_yuv420, BufferStoreMut, ConversionQuality,
SharpYuvGammaTransfer, YuvBiPlanarImageMut, YuvBytesPacking, YuvChromaSubsampling,
YuvEndianness, YuvGrayImageMut, YuvPackedImage, YuvPackedImageMut, YuvPlanarImageMut, YuvRange,
YuvStandardMatrix,
yuv_nv24_to_rgb, yuyv422_to_rgb, yuyv422_to_yuv420, SharpYuvGammaTransfer, YuvBiPlanarImageMut,
YuvBytesPacking, YuvChromaSubsampling, YuvEndianness, YuvGrayImageMut, YuvPackedImage,
YuvPackedImageMut, YuvPlanarImageMut, YuvRange, YuvStandardMatrix,
};

fn read_file_bytes(file_path: &str) -> Result<Vec<u8>, String> {
Expand Down Expand Up @@ -271,7 +270,6 @@ fn main() {
rgba_stride as u32,
YuvRange::Limited,
YuvStandardMatrix::Bt709,
ConversionQuality::Fastest,
)
.unwrap();

Expand Down
89 changes: 10 additions & 79 deletions fuzz/yuv_to_rgb/yuv_to_rgb.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,68 +32,19 @@
use libfuzzer_sys::fuzz_target;
use yuvutils_rs::{
yuv420_to_rgb, yuv420_to_rgba, yuv422_to_rgb, yuv422_to_rgba, yuv444_to_rgb, yuv444_to_rgba,
ConversionQuality, YuvPlanarImage, YuvRange, YuvStandardMatrix,
YuvPlanarImage, YuvRange, YuvStandardMatrix,
};

fuzz_target!(|data: (u8, u8, u8, u8, u8, u8)| {
fuzz_yuv_420(
data.0,
data.1,
data.2,
data.3,
data.4,
ConversionQuality::Fastest,
);
fuzz_yuv_420(
data.0,
data.1,
data.2,
data.3,
data.4,
ConversionQuality::Good,
);
fuzz_yuv_422(
data.0,
data.1,
data.2,
data.3,
data.4,
ConversionQuality::Fastest,
);
fuzz_yuv_422(
data.0,
data.1,
data.2,
data.3,
data.4,
ConversionQuality::Good,
);
fuzz_yuv_444(
data.0,
data.1,
data.2,
data.3,
data.4,
ConversionQuality::Fastest,
);
fuzz_yuv_444(
data.0,
data.1,
data.2,
data.3,
data.4,
ConversionQuality::Good,
);
fuzz_yuv_420(data.0, data.1, data.2, data.3, data.4);
fuzz_yuv_420(data.0, data.1, data.2, data.3, data.4);
fuzz_yuv_422(data.0, data.1, data.2, data.3, data.4);
fuzz_yuv_422(data.0, data.1, data.2, data.3, data.4);
fuzz_yuv_444(data.0, data.1, data.2, data.3, data.4);
fuzz_yuv_444(data.0, data.1, data.2, data.3, data.4);
});

fn fuzz_yuv_420(
i_width: u8,
i_height: u8,
y_value: u8,
u_value: u8,
v_value: u8,
conversion_quality: ConversionQuality,
) {
fn fuzz_yuv_420(i_width: u8, i_height: u8, y_value: u8, u_value: u8, v_value: u8) {
if i_height == 0 || i_width == 0 {
return;
}
Expand All @@ -120,7 +71,6 @@ fn fuzz_yuv_420(
i_width as u32 * 3,
YuvRange::Limited,
YuvStandardMatrix::Bt601,
conversion_quality,
)
.unwrap();

Expand All @@ -132,19 +82,11 @@ fn fuzz_yuv_420(
i_width as u32 * 4,
YuvRange::Limited,
YuvStandardMatrix::Bt601,
conversion_quality,
)
.unwrap();
}

fn fuzz_yuv_422(
i_width: u8,
i_height: u8,
y_value: u8,
u_value: u8,
v_value: u8,
conversion_quality: ConversionQuality,
) {
fn fuzz_yuv_422(i_width: u8, i_height: u8, y_value: u8, u_value: u8, v_value: u8) {
if i_height == 0 || i_width == 0 {
return;
}
Expand All @@ -171,7 +113,6 @@ fn fuzz_yuv_422(
i_width as u32 * 3,
YuvRange::Limited,
YuvStandardMatrix::Bt601,
conversion_quality,
)
.unwrap();

Expand All @@ -183,19 +124,11 @@ fn fuzz_yuv_422(
i_width as u32 * 4,
YuvRange::Limited,
YuvStandardMatrix::Bt601,
conversion_quality,
)
.unwrap();
}

fn fuzz_yuv_444(
i_width: u8,
i_height: u8,
y_value: u8,
u_value: u8,
v_value: u8,
conversion_quality: ConversionQuality,
) {
fn fuzz_yuv_444(i_width: u8, i_height: u8, y_value: u8, u_value: u8, v_value: u8) {
if i_height == 0 || i_width == 0 {
return;
}
Expand All @@ -222,7 +155,6 @@ fn fuzz_yuv_444(
i_width as u32 * 3,
YuvRange::Limited,
YuvStandardMatrix::Bt601,
conversion_quality,
)
.unwrap();

Expand All @@ -234,7 +166,6 @@ fn fuzz_yuv_444(
i_width as u32 * 4,
YuvRange::Limited,
YuvStandardMatrix::Bt601,
conversion_quality,
)
.unwrap();
}
5 changes: 0 additions & 5 deletions src/avx2/avx2_utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -893,11 +893,6 @@ pub(crate) unsafe fn _mm256_affine_v_dot<const PRECISION: i32>(
)
}

#[inline(always)]
pub(crate) unsafe fn avx2_create(lo: __m128i, hi: __m128i) -> __m256i {
_mm256_set_m128i(hi, lo)
}

#[inline(always)]
pub(crate) unsafe fn _mm256_expand8_to_10(v: __m256i) -> (__m256i, __m256i) {
let (v0, v1) = _mm256_interleave_epi8(v, v);
Expand Down
46 changes: 13 additions & 33 deletions src/avx2/gbr_to_rgb.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
use crate::avx2::avx2_utils::{_mm256_store_interleave_rgb_for_yuv, avx2_pack_u16};
use crate::avx2::avx2_utils::{
_mm256_expand8_to_10, _mm256_store_interleave_rgb_for_yuv, avx2_pack_u16,
};
use crate::yuv_support::YuvSourceChannels;
#[cfg(target_arch = "x86")]
use std::arch::x86::*;
Expand Down Expand Up @@ -119,8 +121,6 @@ unsafe fn avx_yuv_to_rgba_row_limited_impl<const DESTINATION_CHANNELS: u8>(

let v_alpha = _mm256_set1_epi8(255u8 as i8);

const V_SCALE: i32 = 2;

let vy_coeff = _mm256_set1_epi16(y_coeff as i16);
let vy_bias = _mm256_set1_epi8(y_bias as i8);

Expand All @@ -138,37 +138,17 @@ unsafe fn avx_yuv_to_rgba_row_limited_impl<const DESTINATION_CHANNELS: u8>(
vy_bias,
);

let rl_hi = _mm256_mulhrs_epi16(
_mm256_slli_epi16::<V_SCALE>(_mm256_cvtepu8_epi16(_mm256_castsi256_si128(r_values0))),
vy_coeff,
);
let gl_hi = _mm256_mulhrs_epi16(
_mm256_slli_epi16::<V_SCALE>(_mm256_cvtepu8_epi16(_mm256_castsi256_si128(g_values0))),
vy_coeff,
);
let bl_hi = _mm256_mulhrs_epi16(
_mm256_slli_epi16::<V_SCALE>(_mm256_cvtepu8_epi16(_mm256_castsi256_si128(b_values0))),
vy_coeff,
);
let (r_y_lo, r_y_hi) = _mm256_expand8_to_10(r_values0);
let (g_y_lo, g_y_hi) = _mm256_expand8_to_10(g_values0);
let (b_y_lo, b_y_hi) = _mm256_expand8_to_10(b_values0);

let rl_lo = _mm256_mulhrs_epi16(
_mm256_slli_epi16::<V_SCALE>(_mm256_cvtepu8_epi16(_mm256_extracti128_si256::<1>(
r_values0,
))),
vy_coeff,
);
let gl_lo = _mm256_mulhrs_epi16(
_mm256_slli_epi16::<V_SCALE>(_mm256_cvtepu8_epi16(_mm256_extracti128_si256::<1>(
g_values0,
))),
vy_coeff,
);
let bl_lo = _mm256_mulhrs_epi16(
_mm256_slli_epi16::<V_SCALE>(_mm256_cvtepu8_epi16(_mm256_extracti128_si256::<1>(
b_values0,
))),
vy_coeff,
);
let rl_hi = _mm256_mulhrs_epi16(r_y_hi, vy_coeff);
let gl_hi = _mm256_mulhrs_epi16(g_y_hi, vy_coeff);
let bl_hi = _mm256_mulhrs_epi16(b_y_hi, vy_coeff);

let rl_lo = _mm256_mulhrs_epi16(r_y_lo, vy_coeff);
let gl_lo = _mm256_mulhrs_epi16(g_y_lo, vy_coeff);
let bl_lo = _mm256_mulhrs_epi16(b_y_lo, vy_coeff);

let r_values = avx2_pack_u16(rl_lo, rl_hi);
let g_values = avx2_pack_u16(gl_lo, gl_hi);
Expand Down
4 changes: 0 additions & 4 deletions src/avx2/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,6 @@ mod y_to_rgba;
mod y_to_rgba_alpha;
mod ycgco_to_rgb;
mod ycgco_to_rgba_alpha;
mod yuv2rgba420_fast;
mod yuv2rgba_fast;
mod yuv_nv_to_rgba;
mod yuv_nv_to_rgba420;
mod yuv_p16_to_rgb16;
Expand Down Expand Up @@ -74,8 +72,6 @@ pub(crate) use y_to_rgba::avx2_y_to_rgba_row;
pub(crate) use y_to_rgba_alpha::avx2_y_to_rgba_alpha_row;
pub(crate) use ycgco_to_rgb::avx2_ycgco_to_rgb_row;
pub(crate) use ycgco_to_rgba_alpha::avx2_ycgco_to_rgba_alpha;
pub(crate) use yuv2rgba420_fast::avx2_yuv_to_rgba_fast_row420;
pub(crate) use yuv2rgba_fast::avx2_yuv_to_rgba_fast_row;
pub(crate) use yuv_nv_to_rgba::avx2_yuv_nv_to_rgba_row;
pub(crate) use yuv_nv_to_rgba420::avx2_yuv_nv_to_rgba_row420;
pub(crate) use yuv_p16_to_rgb16::avx_yuv_p16_to_rgba_row;
Expand Down
Loading

0 comments on commit 4b4a751

Please sign in to comment.