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> /// <summary>
/// SVT: svt_av1_iadst16_new /// SVT: svt_av1_iadst16_new
/// </summary> /// </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; int stage = 0;
Span<int> stepSpan = stackalloc int[16]; Span<int> bf0 = stackalloc int[16];
ref int step = ref stepSpan[0]; Span<int> bf1 = stackalloc int[16];
Span<int> bufferSpan = stackalloc int[16];
ref int buffer = ref bufferSpan[0];
// stage 0; // stage 0;
// stage 1; // stage 1;
stage++; stage++;
buffer = Unsafe.Add(ref input, 15); bf0[0] = Unsafe.Add(ref input, 15);
Unsafe.Add(ref buffer, 1) = input; bf0[1] = Unsafe.Add(ref input, 0);
Unsafe.Add(ref buffer, 2) = Unsafe.Add(ref input, 13); bf0[2] = Unsafe.Add(ref input, 13);
Unsafe.Add(ref buffer, 3) = Unsafe.Add(ref input, 2); bf0[3] = Unsafe.Add(ref input, 2);
Unsafe.Add(ref buffer, 4) = Unsafe.Add(ref input, 11); bf0[4] = Unsafe.Add(ref input, 11);
Unsafe.Add(ref buffer, 5) = Unsafe.Add(ref input, 4); bf0[5] = Unsafe.Add(ref input, 4);
Unsafe.Add(ref buffer, 6) = Unsafe.Add(ref input, 9); bf0[6] = Unsafe.Add(ref input, 9);
Unsafe.Add(ref buffer, 7) = Unsafe.Add(ref input, 6); bf0[7] = Unsafe.Add(ref input, 6);
Unsafe.Add(ref buffer, 8) = Unsafe.Add(ref input, 7); bf0[8] = Unsafe.Add(ref input, 7);
Unsafe.Add(ref buffer, 9) = Unsafe.Add(ref input, 8); bf0[9] = Unsafe.Add(ref input, 8);
Unsafe.Add(ref buffer, 10) = Unsafe.Add(ref input, 5); bf0[10] = Unsafe.Add(ref input, 5);
Unsafe.Add(ref buffer, 11) = Unsafe.Add(ref input, 10); bf0[11] = Unsafe.Add(ref input, 10);
Unsafe.Add(ref buffer, 12) = Unsafe.Add(ref input, 3); bf0[12] = Unsafe.Add(ref input, 3);
Unsafe.Add(ref buffer, 13) = Unsafe.Add(ref input, 12); bf0[13] = Unsafe.Add(ref input, 12);
Unsafe.Add(ref buffer, 14) = Unsafe.Add(ref input, 1); bf0[14] = Unsafe.Add(ref input, 1);
Unsafe.Add(ref buffer, 15) = Unsafe.Add(ref input, 14); bf0[15] = Unsafe.Add(ref input, 14);
// range_check_buf(stage, input, bf1, size, stage_range[stage]); // range_check_buf(stage, input, bf1, size, stage_range[stage]);
// stage 2 // stage 2
stage++; stage++;
step = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[2], buffer, cospi[62], Unsafe.Add(ref buffer, 1), cosBit); bf1[0] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[2], bf0[0], cospi[62], bf0[1], cos_bit);
Unsafe.Add(ref step, 1) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[62], buffer, -cospi[2], Unsafe.Add(ref buffer, 1), cosBit); bf1[1] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[62], bf0[0], -cospi[2], bf0[1], cos_bit);
Unsafe.Add(ref step, 2) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[10], Unsafe.Add(ref buffer, 2), cospi[54], Unsafe.Add(ref buffer, 3), cosBit); bf1[2] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[10], bf0[2], cospi[54], bf0[3], cos_bit);
Unsafe.Add(ref step, 3) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[54], Unsafe.Add(ref buffer, 2), -cospi[10], Unsafe.Add(ref buffer, 3), cosBit); bf1[3] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[54], bf0[2], -cospi[10], bf0[3], cos_bit);
Unsafe.Add(ref step, 4) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[18], Unsafe.Add(ref buffer, 4), cospi[46], Unsafe.Add(ref buffer, 5), cosBit); bf1[4] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[18], bf0[4], cospi[46], bf0[5], cos_bit);
Unsafe.Add(ref step, 5) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[46], Unsafe.Add(ref buffer, 4), -cospi[18], Unsafe.Add(ref buffer, 5), cosBit); bf1[5] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[46], bf0[4], -cospi[18], bf0[5], cos_bit);
Unsafe.Add(ref step, 6) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[26], Unsafe.Add(ref buffer, 6), cospi[38], Unsafe.Add(ref buffer, 7), cosBit); bf1[6] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[26], bf0[6], cospi[38], bf0[7], cos_bit);
Unsafe.Add(ref step, 7) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[38], Unsafe.Add(ref buffer, 6), -cospi[26], Unsafe.Add(ref buffer, 7), cosBit); bf1[7] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[38], bf0[6], -cospi[26], bf0[7], cos_bit);
Unsafe.Add(ref step, 8) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[34], Unsafe.Add(ref buffer, 8), cospi[30], Unsafe.Add(ref buffer, 9), cosBit); bf1[8] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[34], bf0[8], cospi[30], bf0[9], cos_bit);
Unsafe.Add(ref step, 9) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[30], Unsafe.Add(ref buffer, 8), -cospi[34], Unsafe.Add(ref buffer, 9), cosBit); bf1[9] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[30], bf0[8], -cospi[34], bf0[9], cos_bit);
Unsafe.Add(ref step, 10) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[42], Unsafe.Add(ref buffer, 10), cospi[22], Unsafe.Add(ref buffer, 1), cosBit); bf1[10] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[42], bf0[10], cospi[22], bf0[11], cos_bit);
Unsafe.Add(ref step, 11) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[22], Unsafe.Add(ref buffer, 10), -cospi[42], Unsafe.Add(ref buffer, 11), cosBit); bf1[11] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[22], bf0[10], -cospi[42], bf0[11], cos_bit);
Unsafe.Add(ref step, 12) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[50], Unsafe.Add(ref buffer, 12), cospi[14], Unsafe.Add(ref buffer, 13), cosBit); bf1[12] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[50], bf0[12], cospi[14], bf0[13], cos_bit);
Unsafe.Add(ref step, 13) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[14], Unsafe.Add(ref buffer, 12), -cospi[50], Unsafe.Add(ref buffer, 13), cosBit); bf1[13] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[14], bf0[12], -cospi[50], bf0[13], cos_bit);
Unsafe.Add(ref step, 14) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[58], Unsafe.Add(ref buffer, 14), cospi[6], Unsafe.Add(ref buffer, 15), cosBit); bf1[14] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[58], bf0[14], cospi[6], bf0[15], cos_bit);
Unsafe.Add(ref step, 15) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[14], Unsafe.Add(ref buffer, 14), -cospi[58], Unsafe.Add(ref buffer, 15), cosBit); bf1[15] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[6], bf0[14], -cospi[58], bf0[15], cos_bit);
// range_check_buf(stage, input, bf1, size, stage_range[stage]); // range_check_buf(stage, input, bf1, size, stage_range[stage]);
// stage 3 // stage 3
stage++; stage++;
byte range = stageRange[stage]; bf0[0] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[0] + bf1[8], stage_range[stage]);
buffer = Av1Dct4Inverse1dTransformer.ClampValue(step + Unsafe.Add(ref step, 8), range); bf0[1] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[1] + bf1[9], stage_range[stage]);
Unsafe.Add(ref buffer, 1) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 1) + Unsafe.Add(ref step, 9), range); bf0[2] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[2] + bf1[10], stage_range[stage]);
Unsafe.Add(ref buffer, 2) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 2) + Unsafe.Add(ref step, 10), range); bf0[3] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[3] + bf1[11], stage_range[stage]);
Unsafe.Add(ref buffer, 3) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 3) + Unsafe.Add(ref step, 11), range); bf0[4] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[4] + bf1[12], stage_range[stage]);
Unsafe.Add(ref buffer, 4) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 4) + Unsafe.Add(ref step, 12), range); bf0[5] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[5] + bf1[13], stage_range[stage]);
Unsafe.Add(ref buffer, 5) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 5) + Unsafe.Add(ref step, 13), range); bf0[6] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[6] + bf1[14], stage_range[stage]);
Unsafe.Add(ref buffer, 6) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 6) + Unsafe.Add(ref step, 14), range); bf0[7] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[7] + bf1[15], stage_range[stage]);
Unsafe.Add(ref buffer, 7) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 7) + Unsafe.Add(ref step, 15), range); bf0[8] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[0] - bf1[8], stage_range[stage]);
Unsafe.Add(ref buffer, 8) = Av1Dct4Inverse1dTransformer.ClampValue(step - Unsafe.Add(ref step, 8), range); bf0[9] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[1] - bf1[9], stage_range[stage]);
Unsafe.Add(ref buffer, 9) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 1) - Unsafe.Add(ref step, 9), range); bf0[10] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[2] - bf1[10], stage_range[stage]);
Unsafe.Add(ref buffer, 10) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 2) - Unsafe.Add(ref step, 10), range); bf0[11] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[3] - bf1[11], stage_range[stage]);
Unsafe.Add(ref buffer, 11) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 3) - Unsafe.Add(ref step, 11), range); bf0[12] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[4] - bf1[12], stage_range[stage]);
Unsafe.Add(ref buffer, 12) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 4) - Unsafe.Add(ref step, 12), range); bf0[13] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[5] - bf1[13], stage_range[stage]);
Unsafe.Add(ref buffer, 13) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 5) - Unsafe.Add(ref step, 13), range); bf0[14] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[6] - bf1[14], stage_range[stage]);
Unsafe.Add(ref buffer, 14) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 6) - Unsafe.Add(ref step, 14), range); bf0[15] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[7] - bf1[15], stage_range[stage]);
Unsafe.Add(ref buffer, 15) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 7) - Unsafe.Add(ref step, 15), range);
// range_check_buf(stage, input, bf1, size, stage_range[stage]); // range_check_buf(stage, input, bf1, size, stage_range[stage]);
// stage 4 // stage 4
stage++; stage++;
step = buffer; bf1[0] = bf0[0];
Unsafe.Add(ref step, 1) = Unsafe.Add(ref buffer, 1); bf1[1] = bf0[1];
Unsafe.Add(ref step, 2) = Unsafe.Add(ref buffer, 2); bf1[2] = bf0[2];
Unsafe.Add(ref step, 3) = Unsafe.Add(ref buffer, 3); bf1[3] = bf0[3];
Unsafe.Add(ref step, 4) = Unsafe.Add(ref buffer, 4); bf1[4] = bf0[4];
Unsafe.Add(ref step, 5) = Unsafe.Add(ref buffer, 5); bf1[5] = bf0[5];
Unsafe.Add(ref step, 6) = Unsafe.Add(ref buffer, 6); bf1[6] = bf0[6];
Unsafe.Add(ref step, 7) = Unsafe.Add(ref buffer, 7); bf1[7] = bf0[7];
Unsafe.Add(ref step, 8) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[8], Unsafe.Add(ref buffer, 8), cospi[56], Unsafe.Add(ref buffer, 9), cosBit); bf1[8] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[8], bf0[8], cospi[56], bf0[9], cos_bit);
Unsafe.Add(ref step, 9) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[56], Unsafe.Add(ref buffer, 8), -cospi[8], Unsafe.Add(ref buffer, 9), cosBit); bf1[9] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[56], bf0[8], -cospi[8], bf0[9], cos_bit);
Unsafe.Add(ref step, 10) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[40], Unsafe.Add(ref buffer, 10), cospi[24], Unsafe.Add(ref buffer, 11), cosBit); bf1[10] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[40], bf0[10], cospi[24], bf0[11], cos_bit);
Unsafe.Add(ref step, 11) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[24], Unsafe.Add(ref buffer, 10), -cospi[40], Unsafe.Add(ref buffer, 11), cosBit); bf1[11] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[24], bf0[10], -cospi[40], bf0[11], cos_bit);
Unsafe.Add(ref step, 12) = Av1Dct4Inverse1dTransformer.HalfButterfly(-cospi[56], Unsafe.Add(ref buffer, 12), cospi[8], Unsafe.Add(ref buffer, 13), cosBit); bf1[12] = Av1Dct4Inverse1dTransformer.HalfButterfly(-cospi[56], bf0[12], cospi[8], bf0[13], cos_bit);
Unsafe.Add(ref step, 13) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[8], Unsafe.Add(ref buffer, 12), cospi[56], Unsafe.Add(ref buffer, 13), cosBit); bf1[13] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[8], bf0[12], cospi[56], bf0[13], cos_bit);
Unsafe.Add(ref step, 14) = Av1Dct4Inverse1dTransformer.HalfButterfly(-cospi[24], Unsafe.Add(ref buffer, 14), cospi[40], Unsafe.Add(ref buffer, 15), cosBit); bf1[14] = Av1Dct4Inverse1dTransformer.HalfButterfly(-cospi[24], bf0[14], cospi[40], bf0[15], cos_bit);
Unsafe.Add(ref step, 15) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[40], Unsafe.Add(ref buffer, 14), cospi[24], Unsafe.Add(ref buffer, 15), cosBit); bf1[15] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[40], bf0[14], cospi[24], bf0[15], cos_bit);
// range_check_buf(stage, input, bf1, size, stage_range[stage]); // range_check_buf(stage, input, bf1, size, stage_range[stage]);
// stage 5 // stage 5
stage++; stage++;
range = stageRange[stage]; bf0[0] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[0] + bf1[4], stage_range[stage]);
buffer = Av1Dct4Inverse1dTransformer.ClampValue(step + Unsafe.Add(ref step, 4), range); bf0[1] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[1] + bf1[5], stage_range[stage]);
Unsafe.Add(ref buffer, 1) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 1) + Unsafe.Add(ref step, 5), range); bf0[2] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[2] + bf1[6], stage_range[stage]);
Unsafe.Add(ref buffer, 2) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 2) + Unsafe.Add(ref step, 6), range); bf0[3] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[3] + bf1[7], stage_range[stage]);
Unsafe.Add(ref buffer, 3) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 3) + Unsafe.Add(ref step, 7), range); bf0[4] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[0] - bf1[4], stage_range[stage]);
Unsafe.Add(ref buffer, 4) = Av1Dct4Inverse1dTransformer.ClampValue(step - Unsafe.Add(ref step, 4), range); bf0[5] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[1] - bf1[5], stage_range[stage]);
Unsafe.Add(ref buffer, 5) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 1) - Unsafe.Add(ref step, 5), range); bf0[6] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[2] - bf1[6], stage_range[stage]);
Unsafe.Add(ref buffer, 6) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 2) - Unsafe.Add(ref step, 6), range); bf0[7] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[3] - bf1[7], stage_range[stage]);
Unsafe.Add(ref buffer, 7) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 3) - Unsafe.Add(ref step, 7), range); bf0[8] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[8] + bf1[12], stage_range[stage]);
Unsafe.Add(ref buffer, 8) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 8) + Unsafe.Add(ref step, 12), range); bf0[9] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[9] + bf1[13], stage_range[stage]);
Unsafe.Add(ref buffer, 9) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 9) + Unsafe.Add(ref step, 13), range); bf0[10] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[10] + bf1[14], stage_range[stage]);
Unsafe.Add(ref buffer, 10) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 10) + Unsafe.Add(ref step, 14), range); bf0[11] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[11] + bf1[15], stage_range[stage]);
Unsafe.Add(ref buffer, 11) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 11) + Unsafe.Add(ref step, 15), range); bf0[12] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[8] - bf1[12], stage_range[stage]);
Unsafe.Add(ref buffer, 12) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 8) - Unsafe.Add(ref step, 12), range); bf0[13] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[9] - bf1[13], stage_range[stage]);
Unsafe.Add(ref buffer, 13) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 9) - Unsafe.Add(ref step, 13), range); bf0[14] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[10] - bf1[14], stage_range[stage]);
Unsafe.Add(ref buffer, 14) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 10) - Unsafe.Add(ref step, 14), range); bf0[15] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[11] - bf1[15], stage_range[stage]);
Unsafe.Add(ref buffer, 15) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 11) - Unsafe.Add(ref step, 15), range);
// range_check_buf(stage, input, bf0, size, stage_range[stage]);
// range_check_buf(stage, input, bf1, size, stage_range[stage]);
// stage 6 // stage 6
step = buffer; stage++;
Unsafe.Add(ref step, 1) = Unsafe.Add(ref buffer, 1); bf1[0] = bf0[0];
Unsafe.Add(ref step, 2) = Unsafe.Add(ref buffer, 2); bf1[1] = bf0[1];
Unsafe.Add(ref step, 3) = Unsafe.Add(ref buffer, 3); bf1[2] = bf0[2];
Unsafe.Add(ref step, 4) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[16], Unsafe.Add(ref buffer, 4), cospi[48], Unsafe.Add(ref buffer, 5), cosBit); bf1[3] = bf0[3];
Unsafe.Add(ref step, 5) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[48], Unsafe.Add(ref buffer, 4), -cospi[16], Unsafe.Add(ref buffer, 5), cosBit); bf1[4] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[16], bf0[4], cospi[48], bf0[5], cos_bit);
Unsafe.Add(ref step, 6) = Av1Dct4Inverse1dTransformer.HalfButterfly(-cospi[48], Unsafe.Add(ref buffer, 6), cospi[16], Unsafe.Add(ref buffer, 7), cosBit); bf1[5] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[48], bf0[4], -cospi[16], bf0[5], cos_bit);
Unsafe.Add(ref step, 7) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[16], Unsafe.Add(ref buffer, 6), cospi[48], Unsafe.Add(ref buffer, 7), cosBit); bf1[6] = Av1Dct4Inverse1dTransformer.HalfButterfly(-cospi[48], bf0[6], cospi[16], bf0[7], cos_bit);
Unsafe.Add(ref step, 8) = Unsafe.Add(ref buffer, 8); bf1[7] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[16], bf0[6], cospi[48], bf0[7], cos_bit);
Unsafe.Add(ref step, 9) = Unsafe.Add(ref buffer, 9); bf1[8] = bf0[8];
Unsafe.Add(ref step, 10) = Unsafe.Add(ref buffer, 10); bf1[9] = bf0[9];
Unsafe.Add(ref step, 11) = Unsafe.Add(ref buffer, 11); bf1[10] = bf0[10];
Unsafe.Add(ref step, 12) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[16], Unsafe.Add(ref buffer, 12), cospi[48], Unsafe.Add(ref buffer, 13), cosBit); bf1[11] = bf0[11];
Unsafe.Add(ref step, 13) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[48], Unsafe.Add(ref buffer, 12), -cospi[16], Unsafe.Add(ref buffer, 13), cosBit); bf1[12] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[16], bf0[12], cospi[48], bf0[13], cos_bit);
Unsafe.Add(ref step, 14) = Av1Dct4Inverse1dTransformer.HalfButterfly(-cospi[48], Unsafe.Add(ref buffer, 14), cospi[16], Unsafe.Add(ref buffer, 15), cosBit); bf1[13] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[48], bf0[12], -cospi[16], bf0[13], cos_bit);
Unsafe.Add(ref step, 15) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[16], Unsafe.Add(ref buffer, 14), cospi[48], Unsafe.Add(ref buffer, 15), cosBit); 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]); // range_check_buf(stage, input, bf1, size, stage_range[stage]);
// stage 7 // stage 7
stage++; stage++;
range = stageRange[stage]; bf0[0] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[0] + bf1[2], stage_range[stage]);
buffer = Av1Dct4Inverse1dTransformer.ClampValue(step + Unsafe.Add(ref step, 2), range); bf0[1] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[1] + bf1[3], stage_range[stage]);
Unsafe.Add(ref buffer, 1) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 1) + Unsafe.Add(ref step, 3), range); bf0[2] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[0] - bf1[2], stage_range[stage]);
Unsafe.Add(ref buffer, 2) = Av1Dct4Inverse1dTransformer.ClampValue(step - Unsafe.Add(ref step, 2), range); bf0[3] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[1] - bf1[3], stage_range[stage]);
Unsafe.Add(ref buffer, 3) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 1) - Unsafe.Add(ref step, 3), range); bf0[4] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[4] + bf1[6], stage_range[stage]);
Unsafe.Add(ref buffer, 4) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 4) + Unsafe.Add(ref step, 6), range); bf0[5] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[5] + bf1[7], stage_range[stage]);
Unsafe.Add(ref buffer, 5) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 5) + Unsafe.Add(ref step, 7), range); bf0[6] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[4] - bf1[6], stage_range[stage]);
Unsafe.Add(ref buffer, 6) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 4) - Unsafe.Add(ref step, 6), range); bf0[7] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[5] - bf1[7], stage_range[stage]);
Unsafe.Add(ref buffer, 7) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 5) - Unsafe.Add(ref step, 7), range); bf0[8] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[8] + bf1[10], stage_range[stage]);
Unsafe.Add(ref buffer, 8) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 8) + Unsafe.Add(ref step, 10), range); bf0[9] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[9] + bf1[11], stage_range[stage]);
Unsafe.Add(ref buffer, 9) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 9) + Unsafe.Add(ref step, 11), range); bf0[10] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[8] - bf1[10], stage_range[stage]);
Unsafe.Add(ref buffer, 10) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 8) - Unsafe.Add(ref step, 10), range); bf0[11] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[9] - bf1[11], stage_range[stage]);
Unsafe.Add(ref buffer, 11) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 9) - Unsafe.Add(ref step, 11), range); bf0[12] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[12] + bf1[14], stage_range[stage]);
Unsafe.Add(ref buffer, 12) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 12) + Unsafe.Add(ref step, 14), range); bf0[13] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[13] + bf1[15], stage_range[stage]);
Unsafe.Add(ref buffer, 13) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 13) + Unsafe.Add(ref step, 15), range); bf0[14] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[12] - bf1[14], stage_range[stage]);
Unsafe.Add(ref buffer, 14) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 12) - Unsafe.Add(ref step, 14), range); bf0[15] = Av1Dct4Inverse1dTransformer.ClampValue(bf1[13] - bf1[15], stage_range[stage]);
Unsafe.Add(ref buffer, 15) = Av1Dct4Inverse1dTransformer.ClampValue(Unsafe.Add(ref step, 13) - Unsafe.Add(ref step, 15), range);
// range_check_buf(stage, input, bf1, size, stage_range[stage]); // range_check_buf(stage, input, bf1, size, stage_range[stage]);
// stage 8 // stage 8
step = buffer; bf1[0] = bf0[0];
Unsafe.Add(ref step, 1) = Unsafe.Add(ref buffer, 1); bf1[1] = bf0[1];
Unsafe.Add(ref step, 2) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[32], Unsafe.Add(ref buffer, 2), cospi[32], Unsafe.Add(ref buffer, 3), cosBit); bf1[2] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[32], bf0[2], cospi[32], bf0[3], cos_bit);
Unsafe.Add(ref step, 3) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[32], Unsafe.Add(ref buffer, 2), -cospi[32], Unsafe.Add(ref buffer, 3), cosBit); bf1[3] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[32], bf0[2], -cospi[32], bf0[3], cos_bit);
Unsafe.Add(ref step, 4) = Unsafe.Add(ref buffer, 4); bf1[4] = bf0[4];
Unsafe.Add(ref step, 5) = Unsafe.Add(ref buffer, 5); bf1[5] = bf0[5];
Unsafe.Add(ref step, 6) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[32], Unsafe.Add(ref buffer, 6), cospi[32], Unsafe.Add(ref buffer, 7), cosBit); bf1[6] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[32], bf0[6], cospi[32], bf0[7], cos_bit);
Unsafe.Add(ref step, 7) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[32], Unsafe.Add(ref buffer, 6), -cospi[32], Unsafe.Add(ref buffer, 7), cosBit); bf1[7] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[32], bf0[6], -cospi[32], bf0[7], cos_bit);
Unsafe.Add(ref step, 8) = Unsafe.Add(ref buffer, 8); bf1[8] = bf0[8];
Unsafe.Add(ref step, 9) = Unsafe.Add(ref buffer, 9); bf1[9] = bf0[9];
Unsafe.Add(ref step, 10) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[32], Unsafe.Add(ref buffer, 10), cospi[32], Unsafe.Add(ref buffer, 11), cosBit); bf1[10] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[32], bf0[10], cospi[32], bf0[11], cos_bit);
Unsafe.Add(ref step, 11) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[32], Unsafe.Add(ref buffer, 10), -cospi[32], Unsafe.Add(ref buffer, 11), cosBit); bf1[11] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[32], bf0[10], -cospi[32], bf0[11], cos_bit);
Unsafe.Add(ref step, 12) = Unsafe.Add(ref buffer, 12); bf1[12] = bf0[12];
Unsafe.Add(ref step, 13) = Unsafe.Add(ref buffer, 13); bf1[13] = bf0[13];
Unsafe.Add(ref step, 14) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[32], Unsafe.Add(ref buffer, 14), cospi[32], Unsafe.Add(ref buffer, 15), cosBit); bf1[14] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[32], bf0[14], cospi[32], bf0[15], cos_bit);
Unsafe.Add(ref step, 15) = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[32], Unsafe.Add(ref buffer, 14), -cospi[32], Unsafe.Add(ref buffer, 15), cosBit); bf1[15] = Av1Dct4Inverse1dTransformer.HalfButterfly(cospi[32], bf0[14], -cospi[32], bf0[15], cos_bit);
// range_check_buf(stage, input, bf1, size, stage_range[stage]); // range_check_buf(stage, input, bf1, size, stage_range[stage]);
// stage 9 // stage 9
output = step; Unsafe.Add(ref output, 0) = bf1[0];
Unsafe.Add(ref output, 1) = -Unsafe.Add(ref step, 8); Unsafe.Add(ref output, 1) = -bf1[8];
Unsafe.Add(ref output, 2) = Unsafe.Add(ref step, 12); Unsafe.Add(ref output, 2) = bf1[12];
Unsafe.Add(ref output, 3) = -Unsafe.Add(ref step, 4); Unsafe.Add(ref output, 3) = -bf1[4];
Unsafe.Add(ref output, 4) = Unsafe.Add(ref step, 6); Unsafe.Add(ref output, 4) = bf1[6];
Unsafe.Add(ref output, 5) = -Unsafe.Add(ref step, 14); Unsafe.Add(ref output, 5) = -bf1[14];
Unsafe.Add(ref output, 6) = Unsafe.Add(ref step, 10); Unsafe.Add(ref output, 6) = bf1[10];
Unsafe.Add(ref output, 7) = -Unsafe.Add(ref step, 2); Unsafe.Add(ref output, 7) = -bf1[2];
Unsafe.Add(ref output, 8) = Unsafe.Add(ref step, 3); Unsafe.Add(ref output, 8) = bf1[3];
Unsafe.Add(ref output, 9) = -Unsafe.Add(ref step, 11); Unsafe.Add(ref output, 9) = -bf1[11];
Unsafe.Add(ref output, 10) = Unsafe.Add(ref step, 15); Unsafe.Add(ref output, 10) = bf1[15];
Unsafe.Add(ref output, 11) = -Unsafe.Add(ref step, 7); Unsafe.Add(ref output, 11) = -bf1[7];
Unsafe.Add(ref output, 12) = Unsafe.Add(ref step, 5); Unsafe.Add(ref output, 12) = bf1[5];
Unsafe.Add(ref output, 13) = -Unsafe.Add(ref step, 13); Unsafe.Add(ref output, 13) = -bf1[13];
Unsafe.Add(ref output, 14) = Unsafe.Add(ref step, 9); Unsafe.Add(ref output, 14) = bf1[9];
Unsafe.Add(ref output, 15) = -Unsafe.Add(ref step, 1); 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