Browse Source

Fix some inverse transform functions

pull/2633/head
Ynse Hoornenborg 2 years ago
parent
commit
e67d0fb455
  1. 306
      src/ImageSharp/Formats/Heif/Av1/Transform/Inverse/Av1Adst16Inverse1dTransformer.cs
  2. 1031
      src/ImageSharp/Formats/Heif/Av1/Transform/Inverse/Av1Dct64Inverse1dTransformer.cs

306
src/ImageSharp/Formats/Heif/Av1/Transform/Inverse/Av1Adst16Inverse1dTransformer.cs

@ -17,203 +17,199 @@ internal class Av1Adst16Inverse1dTransformer : IAv1Transformer1d
/// <summary>
/// SVT: svt_av1_iadst16_new
/// </summary>
private static void TransformScalar(ref int input, ref int output, int cosBit, Span<byte> stageRange)
private static void TransformScalar(ref int input, ref int output, int cos_bit, Span<byte> stage_range)
{
Span<int> cospi = Av1SinusConstants.CosinusPi(cosBit);
Span<int> cospi = Av1SinusConstants.CosinusPi(cos_bit);
int stage = 0;
Span<int> stepSpan = stackalloc int[16];
ref int step = ref stepSpan[0];
Span<int> bufferSpan = stackalloc int[16];
ref int buffer = ref bufferSpan[0];
Span<int> bf0 = stackalloc int[16];
Span<int> bf1 = stackalloc int[16];
// stage 0;
// stage 1;
stage++;
buffer = Unsafe.Add(ref input, 15);
Unsafe.Add(ref buffer, 1) = input;
Unsafe.Add(ref buffer, 2) = Unsafe.Add(ref input, 13);
Unsafe.Add(ref buffer, 3) = Unsafe.Add(ref input, 2);
Unsafe.Add(ref buffer, 4) = Unsafe.Add(ref input, 11);
Unsafe.Add(ref buffer, 5) = Unsafe.Add(ref input, 4);
Unsafe.Add(ref buffer, 6) = Unsafe.Add(ref input, 9);
Unsafe.Add(ref buffer, 7) = Unsafe.Add(ref input, 6);
Unsafe.Add(ref buffer, 8) = Unsafe.Add(ref input, 7);
Unsafe.Add(ref buffer, 9) = Unsafe.Add(ref input, 8);
Unsafe.Add(ref buffer, 10) = Unsafe.Add(ref input, 5);
Unsafe.Add(ref buffer, 11) = Unsafe.Add(ref input, 10);
Unsafe.Add(ref buffer, 12) = Unsafe.Add(ref input, 3);
Unsafe.Add(ref buffer, 13) = Unsafe.Add(ref input, 12);
Unsafe.Add(ref buffer, 14) = Unsafe.Add(ref input, 1);
Unsafe.Add(ref buffer, 15) = Unsafe.Add(ref input, 14);
bf0[0] = Unsafe.Add(ref input, 15);
bf0[1] = Unsafe.Add(ref input, 0);
bf0[2] = Unsafe.Add(ref input, 13);
bf0[3] = Unsafe.Add(ref input, 2);
bf0[4] = Unsafe.Add(ref input, 11);
bf0[5] = Unsafe.Add(ref input, 4);
bf0[6] = Unsafe.Add(ref input, 9);
bf0[7] = Unsafe.Add(ref input, 6);
bf0[8] = Unsafe.Add(ref input, 7);
bf0[9] = Unsafe.Add(ref input, 8);
bf0[10] = Unsafe.Add(ref input, 5);
bf0[11] = Unsafe.Add(ref input, 10);
bf0[12] = Unsafe.Add(ref input, 3);
bf0[13] = Unsafe.Add(ref input, 12);
bf0[14] = Unsafe.Add(ref input, 1);
bf0[15] = Unsafe.Add(ref input, 14);
// range_check_buf(stage, input, bf1, size, stage_range[stage]);
// stage 2
stage++;
step = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[2], buffer, cospi[62], Unsafe.Add(ref buffer, 1), cosBit);
Unsafe.Add(ref step, 1) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[62], buffer, -cospi[2], Unsafe.Add(ref buffer, 1), cosBit);
Unsafe.Add(ref step, 2) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[10], Unsafe.Add(ref buffer, 2), cospi[54], Unsafe.Add(ref buffer, 3), cosBit);
Unsafe.Add(ref step, 3) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[54], Unsafe.Add(ref buffer, 2), -cospi[10], Unsafe.Add(ref buffer, 3), cosBit);
Unsafe.Add(ref step, 4) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[18], Unsafe.Add(ref buffer, 4), cospi[46], Unsafe.Add(ref buffer, 5), cosBit);
Unsafe.Add(ref step, 5) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[46], Unsafe.Add(ref buffer, 4), -cospi[18], Unsafe.Add(ref buffer, 5), cosBit);
Unsafe.Add(ref step, 6) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[26], Unsafe.Add(ref buffer, 6), cospi[38], Unsafe.Add(ref buffer, 7), cosBit);
Unsafe.Add(ref step, 7) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[38], Unsafe.Add(ref buffer, 6), -cospi[26], Unsafe.Add(ref buffer, 7), cosBit);
Unsafe.Add(ref step, 8) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[34], Unsafe.Add(ref buffer, 8), cospi[30], Unsafe.Add(ref buffer, 9), cosBit);
Unsafe.Add(ref step, 9) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[30], Unsafe.Add(ref buffer, 8), -cospi[34], Unsafe.Add(ref buffer, 9), cosBit);
Unsafe.Add(ref step, 10) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[42], Unsafe.Add(ref buffer, 10), cospi[22], Unsafe.Add(ref buffer, 1), cosBit);
Unsafe.Add(ref step, 11) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[22], Unsafe.Add(ref buffer, 10), -cospi[42], Unsafe.Add(ref buffer, 11), cosBit);
Unsafe.Add(ref step, 12) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[50], Unsafe.Add(ref buffer, 12), cospi[14], Unsafe.Add(ref buffer, 13), cosBit);
Unsafe.Add(ref step, 13) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[14], Unsafe.Add(ref buffer, 12), -cospi[50], Unsafe.Add(ref buffer, 13), cosBit);
Unsafe.Add(ref step, 14) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[58], Unsafe.Add(ref buffer, 14), cospi[6], Unsafe.Add(ref buffer, 15), cosBit);
Unsafe.Add(ref step, 15) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[14], Unsafe.Add(ref buffer, 14), -cospi[58], Unsafe.Add(ref buffer, 15), cosBit);
bf1[0] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[2], bf0[0], cospi[62], bf0[1], cos_bit);
bf1[1] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[62], bf0[0], -cospi[2], bf0[1], cos_bit);
bf1[2] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[10], bf0[2], cospi[54], bf0[3], cos_bit);
bf1[3] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[54], bf0[2], -cospi[10], bf0[3], cos_bit);
bf1[4] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[18], bf0[4], cospi[46], bf0[5], cos_bit);
bf1[5] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[46], bf0[4], -cospi[18], bf0[5], cos_bit);
bf1[6] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[26], bf0[6], cospi[38], bf0[7], cos_bit);
bf1[7] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[38], bf0[6], -cospi[26], bf0[7], cos_bit);
bf1[8] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[34], bf0[8], cospi[30], bf0[9], cos_bit);
bf1[9] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[30], bf0[8], -cospi[34], bf0[9], cos_bit);
bf1[10] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[42], bf0[10], cospi[22], bf0[11], cos_bit);
bf1[11] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[22], bf0[10], -cospi[42], bf0[11], cos_bit);
bf1[12] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[50], bf0[12], cospi[14], bf0[13], cos_bit);
bf1[13] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[14], bf0[12], -cospi[50], bf0[13], cos_bit);
bf1[14] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[58], bf0[14], cospi[6], bf0[15], cos_bit);
bf1[15] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[6], bf0[14], -cospi[58], bf0[15], cos_bit);
// range_check_buf(stage, input, bf1, size, stage_range[stage]);
// stage 3
stage++;
byte range = stageRange[stage];
buffer = Av1Dct4Inverse1dTransformer.ClampValue(step + Unsafe.Add(ref step, 8), range);
Unsafe.Add(ref buffer, 1) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 1) + Unsafe.Add(ref step, 9), range);
Unsafe.Add(ref buffer, 2) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 2) + Unsafe.Add(ref step, 10), range);
Unsafe.Add(ref buffer, 3) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 3) + Unsafe.Add(ref step, 11), range);
Unsafe.Add(ref buffer, 4) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 4) + Unsafe.Add(ref step, 12), range);
Unsafe.Add(ref buffer, 5) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 5) + Unsafe.Add(ref step, 13), range);
Unsafe.Add(ref buffer, 6) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 6) + Unsafe.Add(ref step, 14), range);
Unsafe.Add(ref buffer, 7) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 7) + Unsafe.Add(ref step, 15), range);
Unsafe.Add(ref buffer, 8) = Av1Dct4Inverse1dTransformer.ClampValue(step - Unsafe.Add(ref step, 8), range);
Unsafe.Add(ref buffer, 9) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 1) - Unsafe.Add(ref step, 9), range);
Unsafe.Add(ref buffer, 10) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 2) - Unsafe.Add(ref step, 10), range);
Unsafe.Add(ref buffer, 11) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 3) - Unsafe.Add(ref step, 11), range);
Unsafe.Add(ref buffer, 12) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 4) - Unsafe.Add(ref step, 12), range);
Unsafe.Add(ref buffer, 13) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 5) - Unsafe.Add(ref step, 13), range);
Unsafe.Add(ref buffer, 14) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 6) - Unsafe.Add(ref step, 14), range);
Unsafe.Add(ref buffer, 15) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 7) - Unsafe.Add(ref step, 15), range);
bf0[0] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[0] + bf1[8], stage_range[stage]);
bf0[1] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[1] + bf1[9], stage_range[stage]);
bf0[2] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[2] + bf1[10], stage_range[stage]);
bf0[3] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[3] + bf1[11], stage_range[stage]);
bf0[4] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[4] + bf1[12], stage_range[stage]);
bf0[5] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[5] + bf1[13], stage_range[stage]);
bf0[6] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[6] + bf1[14], stage_range[stage]);
bf0[7] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[7] + bf1[15], stage_range[stage]);
bf0[8] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[0] - bf1[8], stage_range[stage]);
bf0[9] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[1] - bf1[9], stage_range[stage]);
bf0[10] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[2] - bf1[10], stage_range[stage]);
bf0[11] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[3] - bf1[11], stage_range[stage]);
bf0[12] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[4] - bf1[12], stage_range[stage]);
bf0[13] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[5] - bf1[13], stage_range[stage]);
bf0[14] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[6] - bf1[14], stage_range[stage]);
bf0[15] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[7] - bf1[15], stage_range[stage]);
// range_check_buf(stage, input, bf1, size, stage_range[stage]);
// stage 4
stage++;
step = buffer;
Unsafe.Add(ref step, 1) = Unsafe.Add(ref buffer, 1);
Unsafe.Add(ref step, 2) = Unsafe.Add(ref buffer, 2);
Unsafe.Add(ref step, 3) = Unsafe.Add(ref buffer, 3);
Unsafe.Add(ref step, 4) = Unsafe.Add(ref buffer, 4);
Unsafe.Add(ref step, 5) = Unsafe.Add(ref buffer, 5);
Unsafe.Add(ref step, 6) = Unsafe.Add(ref buffer, 6);
Unsafe.Add(ref step, 7) = Unsafe.Add(ref buffer, 7);
Unsafe.Add(ref step, 8) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[8], Unsafe.Add(ref buffer, 8), cospi[56], Unsafe.Add(ref buffer, 9), cosBit);
Unsafe.Add(ref step, 9) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[56], Unsafe.Add(ref buffer, 8), -cospi[8], Unsafe.Add(ref buffer, 9), cosBit);
Unsafe.Add(ref step, 10) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[40], Unsafe.Add(ref buffer, 10), cospi[24], Unsafe.Add(ref buffer, 11), cosBit);
Unsafe.Add(ref step, 11) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[24], Unsafe.Add(ref buffer, 10), -cospi[40], Unsafe.Add(ref buffer, 11), cosBit);
Unsafe.Add(ref step, 12) = Av1Dct4Inverse1dTransformer.HalfButterfly(-cospi[56], Unsafe.Add(ref buffer, 12), cospi[8], Unsafe.Add(ref buffer, 13), cosBit);
Unsafe.Add(ref step, 13) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[8], Unsafe.Add(ref buffer, 12), cospi[56], Unsafe.Add(ref buffer, 13), cosBit);
Unsafe.Add(ref step, 14) = Av1Dct4Inverse1dTransformer.HalfButterfly(-cospi[24], Unsafe.Add(ref buffer, 14), cospi[40], Unsafe.Add(ref buffer, 15), cosBit);
Unsafe.Add(ref step, 15) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[40], Unsafe.Add(ref buffer, 14), cospi[24], Unsafe.Add(ref buffer, 15), cosBit);
bf1[0] = bf0[0];
bf1[1] = bf0[1];
bf1[2] = bf0[2];
bf1[3] = bf0[3];
bf1[4] = bf0[4];
bf1[5] = bf0[5];
bf1[6] = bf0[6];
bf1[7] = bf0[7];
bf1[8] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[8], bf0[8], cospi[56], bf0[9], cos_bit);
bf1[9] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[56], bf0[8], -cospi[8], bf0[9], cos_bit);
bf1[10] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[40], bf0[10], cospi[24], bf0[11], cos_bit);
bf1[11] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[24], bf0[10], -cospi[40], bf0[11], cos_bit);
bf1[12] = Av1Dct4Inverse1dTransformer.HalfButterfly(-cospi[56], bf0[12], cospi[8], bf0[13], cos_bit);
bf1[13] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[8], bf0[12], cospi[56], bf0[13], cos_bit);
bf1[14] = Av1Dct4Inverse1dTransformer.HalfButterfly(-cospi[24], bf0[14], cospi[40], bf0[15], cos_bit);
bf1[15] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[40], bf0[14], cospi[24], bf0[15], cos_bit);
// range_check_buf(stage, input, bf1, size, stage_range[stage]);
// stage 5
stage++;
range = stageRange[stage];
buffer = Av1Dct4Inverse1dTransformer.ClampValue(step + Unsafe.Add(ref step, 4), range);
Unsafe.Add(ref buffer, 1) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 1) + Unsafe.Add(ref step, 5), range);
Unsafe.Add(ref buffer, 2) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 2) + Unsafe.Add(ref step, 6), range);
Unsafe.Add(ref buffer, 3) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 3) + Unsafe.Add(ref step, 7), range);
Unsafe.Add(ref buffer, 4) = Av1Dct4Inverse1dTransformer.ClampValue(step - Unsafe.Add(ref step, 4), range);
Unsafe.Add(ref buffer, 5) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 1) - Unsafe.Add(ref step, 5), range);
Unsafe.Add(ref buffer, 6) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 2) - Unsafe.Add(ref step, 6), range);
Unsafe.Add(ref buffer, 7) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 3) - Unsafe.Add(ref step, 7), range);
Unsafe.Add(ref buffer, 8) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 8) + Unsafe.Add(ref step, 12), range);
Unsafe.Add(ref buffer, 9) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 9) + Unsafe.Add(ref step, 13), range);
Unsafe.Add(ref buffer, 10) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 10) + Unsafe.Add(ref step, 14), range);
Unsafe.Add(ref buffer, 11) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 11) + Unsafe.Add(ref step, 15), range);
Unsafe.Add(ref buffer, 12) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 8) - Unsafe.Add(ref step, 12), range);
Unsafe.Add(ref buffer, 13) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 9) - Unsafe.Add(ref step, 13), range);
Unsafe.Add(ref buffer, 14) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 10) - Unsafe.Add(ref step, 14), range);
Unsafe.Add(ref buffer, 15) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 11) - Unsafe.Add(ref step, 15), range);
// range_check_buf(stage, input, bf1, size, stage_range[stage]);
bf0[0] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[0] + bf1[4], stage_range[stage]);
bf0[1] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[1] + bf1[5], stage_range[stage]);
bf0[2] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[2] + bf1[6], stage_range[stage]);
bf0[3] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[3] + bf1[7], stage_range[stage]);
bf0[4] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[0] - bf1[4], stage_range[stage]);
bf0[5] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[1] - bf1[5], stage_range[stage]);
bf0[6] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[2] - bf1[6], stage_range[stage]);
bf0[7] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[3] - bf1[7], stage_range[stage]);
bf0[8] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[8] + bf1[12], stage_range[stage]);
bf0[9] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[9] + bf1[13], stage_range[stage]);
bf0[10] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[10] + bf1[14], stage_range[stage]);
bf0[11] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[11] + bf1[15], stage_range[stage]);
bf0[12] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[8] - bf1[12], stage_range[stage]);
bf0[13] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[9] - bf1[13], stage_range[stage]);
bf0[14] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[10] - bf1[14], stage_range[stage]);
bf0[15] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[11] - bf1[15], stage_range[stage]);
// range_check_buf(stage, input, bf0, size, stage_range[stage]);
// stage 6
step = buffer;
Unsafe.Add(ref step, 1) = Unsafe.Add(ref buffer, 1);
Unsafe.Add(ref step, 2) = Unsafe.Add(ref buffer, 2);
Unsafe.Add(ref step, 3) = Unsafe.Add(ref buffer, 3);
Unsafe.Add(ref step, 4) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[16], Unsafe.Add(ref buffer, 4), cospi[48], Unsafe.Add(ref buffer, 5), cosBit);
Unsafe.Add(ref step, 5) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[48], Unsafe.Add(ref buffer, 4), -cospi[16], Unsafe.Add(ref buffer, 5), cosBit);
Unsafe.Add(ref step, 6) = Av1Dct4Inverse1dTransformer.HalfButterfly(-cospi[48], Unsafe.Add(ref buffer, 6), cospi[16], Unsafe.Add(ref buffer, 7), cosBit);
Unsafe.Add(ref step, 7) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[16], Unsafe.Add(ref buffer, 6), cospi[48], Unsafe.Add(ref buffer, 7), cosBit);
Unsafe.Add(ref step, 8) = Unsafe.Add(ref buffer, 8);
Unsafe.Add(ref step, 9) = Unsafe.Add(ref buffer, 9);
Unsafe.Add(ref step, 10) = Unsafe.Add(ref buffer, 10);
Unsafe.Add(ref step, 11) = Unsafe.Add(ref buffer, 11);
Unsafe.Add(ref step, 12) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[16], Unsafe.Add(ref buffer, 12), cospi[48], Unsafe.Add(ref buffer, 13), cosBit);
Unsafe.Add(ref step, 13) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[48], Unsafe.Add(ref buffer, 12), -cospi[16], Unsafe.Add(ref buffer, 13), cosBit);
Unsafe.Add(ref step, 14) = Av1Dct4Inverse1dTransformer.HalfButterfly(-cospi[48], Unsafe.Add(ref buffer, 14), cospi[16], Unsafe.Add(ref buffer, 15), cosBit);
Unsafe.Add(ref step, 15) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[16], Unsafe.Add(ref buffer, 14), cospi[48], Unsafe.Add(ref buffer, 15), cosBit);
stage++;
bf1[0] = bf0[0];
bf1[1] = bf0[1];
bf1[2] = bf0[2];
bf1[3] = bf0[3];
bf1[4] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[16], bf0[4], cospi[48], bf0[5], cos_bit);
bf1[5] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[48], bf0[4], -cospi[16], bf0[5], cos_bit);
bf1[6] = Av1Dct4Inverse1dTransformer.HalfButterfly(-cospi[48], bf0[6], cospi[16], bf0[7], cos_bit);
bf1[7] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[16], bf0[6], cospi[48], bf0[7], cos_bit);
bf1[8] = bf0[8];
bf1[9] = bf0[9];
bf1[10] = bf0[10];
bf1[11] = bf0[11];
bf1[12] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[16], bf0[12], cospi[48], bf0[13], cos_bit);
bf1[13] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[48], bf0[12], -cospi[16], bf0[13], cos_bit);
bf1[14] = Av1Dct4Inverse1dTransformer.HalfButterfly(-cospi[48], bf0[14], cospi[16], bf0[15], cos_bit);
bf1[15] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[16], bf0[14], cospi[48], bf0[15], cos_bit);
// range_check_buf(stage, input, bf1, size, stage_range[stage]);
// stage 7
stage++;
range = stageRange[stage];
buffer = Av1Dct4Inverse1dTransformer.ClampValue(step + Unsafe.Add(ref step, 2), range);
Unsafe.Add(ref buffer, 1) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 1) + Unsafe.Add(ref step, 3), range);
Unsafe.Add(ref buffer, 2) = Av1Dct4Inverse1dTransformer.ClampValue(step - Unsafe.Add(ref step, 2), range);
Unsafe.Add(ref buffer, 3) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 1) - Unsafe.Add(ref step, 3), range);
Unsafe.Add(ref buffer, 4) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 4) + Unsafe.Add(ref step, 6), range);
Unsafe.Add(ref buffer, 5) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 5) + Unsafe.Add(ref step, 7), range);
Unsafe.Add(ref buffer, 6) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 4) - Unsafe.Add(ref step, 6), range);
Unsafe.Add(ref buffer, 7) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 5) - Unsafe.Add(ref step, 7), range);
Unsafe.Add(ref buffer, 8) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 8) + Unsafe.Add(ref step, 10), range);
Unsafe.Add(ref buffer, 9) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 9) + Unsafe.Add(ref step, 11), range);
Unsafe.Add(ref buffer, 10) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 8) - Unsafe.Add(ref step, 10), range);
Unsafe.Add(ref buffer, 11) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 9) - Unsafe.Add(ref step, 11), range);
Unsafe.Add(ref buffer, 12) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 12) + Unsafe.Add(ref step, 14), range);
Unsafe.Add(ref buffer, 13) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 13) + Unsafe.Add(ref step, 15), range);
Unsafe.Add(ref buffer, 14) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 12) - Unsafe.Add(ref step, 14), range);
Unsafe.Add(ref buffer, 15) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 13) - Unsafe.Add(ref step, 15), range);
bf0[0] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[0] + bf1[2], stage_range[stage]);
bf0[1] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[1] + bf1[3], stage_range[stage]);
bf0[2] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[0] - bf1[2], stage_range[stage]);
bf0[3] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[1] - bf1[3], stage_range[stage]);
bf0[4] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[4] + bf1[6], stage_range[stage]);
bf0[5] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[5] + bf1[7], stage_range[stage]);
bf0[6] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[4] - bf1[6], stage_range[stage]);
bf0[7] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[5] - bf1[7], stage_range[stage]);
bf0[8] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[8] + bf1[10], stage_range[stage]);
bf0[9] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[9] + bf1[11], stage_range[stage]);
bf0[10] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[8] - bf1[10], stage_range[stage]);
bf0[11] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[9] - bf1[11], stage_range[stage]);
bf0[12] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[12] + bf1[14], stage_range[stage]);
bf0[13] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[13] + bf1[15], stage_range[stage]);
bf0[14] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[12] - bf1[14], stage_range[stage]);
bf0[15] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[13] - bf1[15], stage_range[stage]);
// range_check_buf(stage, input, bf1, size, stage_range[stage]);
// stage 8
step = buffer;
Unsafe.Add(ref step, 1) = Unsafe.Add(ref buffer, 1);
Unsafe.Add(ref step, 2) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[32], Unsafe.Add(ref buffer, 2), cospi[32], Unsafe.Add(ref buffer, 3), cosBit);
Unsafe.Add(ref step, 3) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[32], Unsafe.Add(ref buffer, 2), -cospi[32], Unsafe.Add(ref buffer, 3), cosBit);
Unsafe.Add(ref step, 4) = Unsafe.Add(ref buffer, 4);
Unsafe.Add(ref step, 5) = Unsafe.Add(ref buffer, 5);
Unsafe.Add(ref step, 6) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[32], Unsafe.Add(ref buffer, 6), cospi[32], Unsafe.Add(ref buffer, 7), cosBit);
Unsafe.Add(ref step, 7) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[32], Unsafe.Add(ref buffer, 6), -cospi[32], Unsafe.Add(ref buffer, 7), cosBit);
Unsafe.Add(ref step, 8) = Unsafe.Add(ref buffer, 8);
Unsafe.Add(ref step, 9) = Unsafe.Add(ref buffer, 9);
Unsafe.Add(ref step, 10) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[32], Unsafe.Add(ref buffer, 10), cospi[32], Unsafe.Add(ref buffer, 11), cosBit);
Unsafe.Add(ref step, 11) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[32], Unsafe.Add(ref buffer, 10), -cospi[32], Unsafe.Add(ref buffer, 11), cosBit);
Unsafe.Add(ref step, 12) = Unsafe.Add(ref buffer, 12);
Unsafe.Add(ref step, 13) = Unsafe.Add(ref buffer, 13);
Unsafe.Add(ref step, 14) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[32], Unsafe.Add(ref buffer, 14), cospi[32], Unsafe.Add(ref buffer, 15), cosBit);
Unsafe.Add(ref step, 15) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[32], Unsafe.Add(ref buffer, 14), -cospi[32], Unsafe.Add(ref buffer, 15), cosBit);
bf1[0] = bf0[0];
bf1[1] = bf0[1];
bf1[2] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[32], bf0[2], cospi[32], bf0[3], cos_bit);
bf1[3] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[32], bf0[2], -cospi[32], bf0[3], cos_bit);
bf1[4] = bf0[4];
bf1[5] = bf0[5];
bf1[6] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[32], bf0[6], cospi[32], bf0[7], cos_bit);
bf1[7] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[32], bf0[6], -cospi[32], bf0[7], cos_bit);
bf1[8] = bf0[8];
bf1[9] = bf0[9];
bf1[10] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[32], bf0[10], cospi[32], bf0[11], cos_bit);
bf1[11] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[32], bf0[10], -cospi[32], bf0[11], cos_bit);
bf1[12] = bf0[12];
bf1[13] = bf0[13];
bf1[14] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[32], bf0[14], cospi[32], bf0[15], cos_bit);
bf1[15] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[32], bf0[14], -cospi[32], bf0[15], cos_bit);
// range_check_buf(stage, input, bf1, size, stage_range[stage]);
// stage 9
output = step;
Unsafe.Add(ref output, 1) = -Unsafe.Add(ref step, 8);
Unsafe.Add(ref output, 2) = Unsafe.Add(ref step, 12);
Unsafe.Add(ref output, 3) = -Unsafe.Add(ref step, 4);
Unsafe.Add(ref output, 4) = Unsafe.Add(ref step, 6);
Unsafe.Add(ref output, 5) = -Unsafe.Add(ref step, 14);
Unsafe.Add(ref output, 6) = Unsafe.Add(ref step, 10);
Unsafe.Add(ref output, 7) = -Unsafe.Add(ref step, 2);
Unsafe.Add(ref output, 8) = Unsafe.Add(ref step, 3);
Unsafe.Add(ref output, 9) = -Unsafe.Add(ref step, 11);
Unsafe.Add(ref output, 10) = Unsafe.Add(ref step, 15);
Unsafe.Add(ref output, 11) = -Unsafe.Add(ref step, 7);
Unsafe.Add(ref output, 12) = Unsafe.Add(ref step, 5);
Unsafe.Add(ref output, 13) = -Unsafe.Add(ref step, 13);
Unsafe.Add(ref output, 14) = Unsafe.Add(ref step, 9);
Unsafe.Add(ref output, 15) = -Unsafe.Add(ref step, 1);
Unsafe.Add(ref output, 0) = bf1[0];
Unsafe.Add(ref output, 1) = -bf1[8];
Unsafe.Add(ref output, 2) = bf1[12];
Unsafe.Add(ref output, 3) = -bf1[4];
Unsafe.Add(ref output, 4) = bf1[6];
Unsafe.Add(ref output, 5) = -bf1[14];
Unsafe.Add(ref output, 6) = bf1[10];
Unsafe.Add(ref output, 7) = -bf1[2];
Unsafe.Add(ref output, 8) = bf1[3];
Unsafe.Add(ref output, 9) = -bf1[11];
Unsafe.Add(ref output, 10) = bf1[15];
Unsafe.Add(ref output, 11) = -bf1[7];
Unsafe.Add(ref output, 12) = bf1[5];
Unsafe.Add(ref output, 13) = -bf1[13];
Unsafe.Add(ref output, 14) = bf1[9];
Unsafe.Add(ref output, 15) = -bf1[1];
}
}

1031
src/ImageSharp/Formats/Heif/Av1/Transform/Inverse/Av1Dct64Inverse1dTransformer.cs

File diff suppressed because it is too large
Loading…
Cancel
Save