Example #1
0
fdct_ifast (DCTELEM * data)
{
    int_fast16_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
    int_fast16_t tmp10, tmp11, tmp12, tmp13;
    int_fast16_t z1, z2, z3, z4, z5, z11, z13;
    DCTELEM *dataptr;
    int ctr;

    row_fdct(data);

    /* Pass 2: process columns. */

    dataptr = data;
    for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
        tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];
        tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];
        tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];
        tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];
        tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];
        tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];
        tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];
        tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];

        /* Even part */

        tmp10 = tmp0 + tmp3;        /* phase 2 */
        tmp13 = tmp0 - tmp3;
        tmp11 = tmp1 + tmp2;
        tmp12 = tmp1 - tmp2;

        dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */
        dataptr[DCTSIZE*4] = tmp10 - tmp11;

        z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */
        dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */
        dataptr[DCTSIZE*6] = tmp13 - z1;

        /* Odd part */

        tmp10 = tmp4 + tmp5;        /* phase 2 */
        tmp11 = tmp5 + tmp6;
        tmp12 = tmp6 + tmp7;

        /* The rotator is modified from fig 4-8 to avoid extra negations. */
        z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */
        z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */
        z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */
        z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */

        z11 = tmp7 + z3;            /* phase 5 */
        z13 = tmp7 - z3;

        dataptr[DCTSIZE*5] = z13 + z2; /* phase 6 */
        dataptr[DCTSIZE*3] = z13 - z2;
        dataptr[DCTSIZE*1] = z11 + z4;
        dataptr[DCTSIZE*7] = z11 - z4;

        dataptr++;                  /* advance pointer to next column */
    }
}
Example #2
0
void ff_faandct(DCTELEM *data)
{
    FLOAT tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
    FLOAT tmp10, tmp11, tmp12, tmp13;
    FLOAT z2, z4, z11, z13;
    FLOAT av_unused z5;
    FLOAT temp[64];
    int i;

    emms_c();

    row_fdct(temp, data);

    for (i = 0; i < 8; i++)
    {
        tmp0 = temp[8*0 + i] + temp[8*7 + i];
        tmp7 = temp[8*0 + i] - temp[8*7 + i];
        tmp1 = temp[8*1 + i] + temp[8*6 + i];
        tmp6 = temp[8*1 + i] - temp[8*6 + i];
        tmp2 = temp[8*2 + i] + temp[8*5 + i];
        tmp5 = temp[8*2 + i] - temp[8*5 + i];
        tmp3 = temp[8*3 + i] + temp[8*4 + i];
        tmp4 = temp[8*3 + i] - temp[8*4 + i];

        tmp10 = tmp0 + tmp3;
        tmp13 = tmp0 - tmp3;
        tmp11 = tmp1 + tmp2;
        tmp12 = tmp1 - tmp2;

        data[8*0 + i] = lrintf(SCALE(8 * 0 + i) * (tmp10 + tmp11));
        data[8*4 + i] = lrintf(SCALE(8 * 4 + i) * (tmp10 - tmp11));

        tmp12 += tmp13;
        tmp12 *= A1;
        data[8*2 + i] = lrintf(SCALE(8 * 2 + i) * (tmp13 + tmp12));
        data[8*6 + i] = lrintf(SCALE(8 * 6 + i) * (tmp13 - tmp12));

        tmp4 += tmp5;
        tmp5 += tmp6;
        tmp6 += tmp7;

#if 0
        z5 = (tmp4 - tmp6) * A5;
        z2 = tmp4 * A2 + z5;
        z4 = tmp6 * A4 + z5;
#else
        z2 = tmp4 * (A2 + A5) - tmp6 * A5;
        z4 = tmp6 * (A4 - A5) + tmp4 * A5;
#endif
        tmp5 *= A1;

        z11 = tmp7 + tmp5;
        z13 = tmp7 - tmp5;

        data[8*5 + i] = lrintf(SCALE(8 * 5 + i) * (z13 + z2));
        data[8*3 + i] = lrintf(SCALE(8 * 3 + i) * (z13 - z2));
        data[8*1 + i] = lrintf(SCALE(8 * 1 + i) * (z11 + z4));
        data[8*7 + i] = lrintf(SCALE(8 * 7 + i) * (z11 - z4));
    }
}
ff_fdct248_islow (DCTELEM * data)
{
	int_fast32_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
	int_fast32_t tmp10, tmp11, tmp12, tmp13;
	int_fast32_t z1;
	DCTELEM *dataptr;
	int ctr;

	row_fdct(data);

	/* Pass 2: process columns.
	 * We remove the PASS1_BITS scaling, but leave the results scaled up
	 * by an overall factor of 8.
	 */

	dataptr = data;
	for (ctr = DCTSIZE-1; ctr >= 0; ctr--)
	{
		tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*1];
		tmp1 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*3];
		tmp2 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*5];
		tmp3 = dataptr[DCTSIZE*6] + dataptr[DCTSIZE*7];
		tmp4 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*1];
		tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*3];
		tmp6 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*5];
		tmp7 = dataptr[DCTSIZE*6] - dataptr[DCTSIZE*7];

		tmp10 = tmp0 + tmp3;
		tmp11 = tmp1 + tmp2;
		tmp12 = tmp1 - tmp2;
		tmp13 = tmp0 - tmp3;

		dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS);
		dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS);

		z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
		dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865),
		                                       CONST_BITS+PASS1_BITS);
		dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065),
		                                       CONST_BITS+PASS1_BITS);

		tmp10 = tmp4 + tmp7;
		tmp11 = tmp5 + tmp6;
		tmp12 = tmp5 - tmp6;
		tmp13 = tmp4 - tmp7;

		dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS);
		dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS);

		z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
		dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865),
		                                       CONST_BITS+PASS1_BITS);
		dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065),
		                                       CONST_BITS+PASS1_BITS);

		dataptr++;                 /* advance pointer to next column */
	}
}
Example #4
0
fdct_ifast248 (DCTELEM * data)
{
  int_fast16_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
  int_fast16_t tmp10, tmp11, tmp12, tmp13;
  int_fast16_t z1;
  DCTELEM *dataptr;
  int ctr;
  SHIFT_TEMPS

  row_fdct(data);

  /* Pass 2: process columns. */

  dataptr = data;
  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
    tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*1];
    tmp1 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*3];
    tmp2 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*5];
    tmp3 = dataptr[DCTSIZE*6] + dataptr[DCTSIZE*7];
    tmp4 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*1];
    tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*3];
    tmp6 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*5];
    tmp7 = dataptr[DCTSIZE*6] - dataptr[DCTSIZE*7];

    /* Even part */

    tmp10 = tmp0 + tmp3;
    tmp11 = tmp1 + tmp2;
    tmp12 = tmp1 - tmp2;
    tmp13 = tmp0 - tmp3;

    dataptr[DCTSIZE*0] = tmp10 + tmp11;
    dataptr[DCTSIZE*4] = tmp10 - tmp11;

    z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781);
    dataptr[DCTSIZE*2] = tmp13 + z1;
    dataptr[DCTSIZE*6] = tmp13 - z1;

    tmp10 = tmp4 + tmp7;
    tmp11 = tmp5 + tmp6;
    tmp12 = tmp5 - tmp6;
    tmp13 = tmp4 - tmp7;

    dataptr[DCTSIZE*1] = tmp10 + tmp11;
    dataptr[DCTSIZE*5] = tmp10 - tmp11;

    z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781);
    dataptr[DCTSIZE*3] = tmp13 + z1;
    dataptr[DCTSIZE*7] = tmp13 - z1;

    dataptr++;                        /* advance pointer to next column */
  }
}
Example #5
0
void ff_faandct(int16_t *data)
{
    FLOAT tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
    FLOAT tmp10, tmp11, tmp12, tmp13;
    FLOAT z2, z4, z11, z13;
    FLOAT temp[64];
    int i;

    emms_c();

    row_fdct(temp, data);

    for (i=0; i<8; i++) {
        tmp0= temp[8*0 + i] + temp[8*7 + i];
        tmp7= temp[8*0 + i] - temp[8*7 + i];
        tmp1= temp[8*1 + i] + temp[8*6 + i];
        tmp6= temp[8*1 + i] - temp[8*6 + i];
        tmp2= temp[8*2 + i] + temp[8*5 + i];
        tmp5= temp[8*2 + i] - temp[8*5 + i];
        tmp3= temp[8*3 + i] + temp[8*4 + i];
        tmp4= temp[8*3 + i] - temp[8*4 + i];

        tmp10= tmp0 + tmp3;
        tmp13= tmp0 - tmp3;
        tmp11= tmp1 + tmp2;
        tmp12= tmp1 - tmp2;

        data[8*0 + i]= lrintf(postscale[8*0 + i] * (tmp10 + tmp11));
        data[8*4 + i]= lrintf(postscale[8*4 + i] * (tmp10 - tmp11));

        tmp12 += tmp13;
        tmp12 *= A1;
        data[8*2 + i]= lrintf(postscale[8*2 + i] * (tmp13 + tmp12));
        data[8*6 + i]= lrintf(postscale[8*6 + i] * (tmp13 - tmp12));

        tmp4 += tmp5;
        tmp5 += tmp6;
        tmp6 += tmp7;

        z2= tmp4*(A2+A5) - tmp6*A5;
        z4= tmp6*(A4-A5) + tmp4*A5;

        tmp5*=A1;

        z11= tmp7 + tmp5;
        z13= tmp7 - tmp5;

        data[8*5 + i]= lrintf(postscale[8*5 + i] * (z13 + z2));
        data[8*3 + i]= lrintf(postscale[8*3 + i] * (z13 - z2));
        data[8*1 + i]= lrintf(postscale[8*1 + i] * (z11 + z4));
        data[8*7 + i]= lrintf(postscale[8*7 + i] * (z11 - z4));
    }
}
Example #6
0
void ff_faandct(DCTELEM * data)
{
    FLOAT tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
    FLOAT tmp10, tmp11, tmp12, tmp13;
    FLOAT z1, z2, z3, z4, z5, z11, z13;
    FLOAT temp[64];
    int i;

    emms_c();

    row_fdct(temp, data);

    for (i=0; i<8; i++) {
        tmp0= temp[8*0 + i] + temp[8*7 + i];
        tmp7= temp[8*0 + i] - temp[8*7 + i];
        tmp1= temp[8*1 + i] + temp[8*6 + i];
        tmp6= temp[8*1 + i] - temp[8*6 + i];
        tmp2= temp[8*2 + i] + temp[8*5 + i];
        tmp5= temp[8*2 + i] - temp[8*5 + i];
        tmp3= temp[8*3 + i] + temp[8*4 + i];
        tmp4= temp[8*3 + i] - temp[8*4 + i];

        tmp10= tmp0 + tmp3;
        tmp13= tmp0 - tmp3;
        tmp11= tmp1 + tmp2;
        tmp12= tmp1 - tmp2;

        data[8*0 + i]= lrintf(SCALE(8*0 + i) * (tmp10 + tmp11));
        data[8*4 + i]= lrintf(SCALE(8*4 + i) * (tmp10 - tmp11));

        z1= (tmp12 + tmp13)* A1;
        data[8*2 + i]= lrintf(SCALE(8*2 + i) * (tmp13 + z1));
        data[8*6 + i]= lrintf(SCALE(8*6 + i) * (tmp13 - z1));

        tmp10= tmp4 + tmp5;
        tmp11= tmp5 + tmp6;
        tmp12= tmp6 + tmp7;

        z5= (tmp10 - tmp12) * A5;
        z2= tmp10*A2 + z5;
        z4= tmp12*A4 + z5;
        z3= tmp11*A1;

        z11= tmp7 + z3;
        z13= tmp7 - z3;

        data[8*5 + i]= lrintf(SCALE(8*5 + i) * (z13 + z2));
        data[8*3 + i]= lrintf(SCALE(8*3 + i) * (z13 - z2));
        data[8*1 + i]= lrintf(SCALE(8*1 + i) * (z11 + z4));
        data[8*7 + i]= lrintf(SCALE(8*7 + i) * (z11 - z4));
    }
}
Example #7
0
void ff_faandct248(DCTELEM *data)
{
    FLOAT tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
    FLOAT tmp10, tmp11, tmp12, tmp13;
    FLOAT temp[64];
    int i;

    emms_c();

    row_fdct(temp, data);

    for (i = 0; i < 8; i++)
    {
        tmp0 = temp[8*0 + i] + temp[8*1 + i];
        tmp1 = temp[8*2 + i] + temp[8*3 + i];
        tmp2 = temp[8*4 + i] + temp[8*5 + i];
        tmp3 = temp[8*6 + i] + temp[8*7 + i];
        tmp4 = temp[8*0 + i] - temp[8*1 + i];
        tmp5 = temp[8*2 + i] - temp[8*3 + i];
        tmp6 = temp[8*4 + i] - temp[8*5 + i];
        tmp7 = temp[8*6 + i] - temp[8*7 + i];

        tmp10 = tmp0 + tmp3;
        tmp11 = tmp1 + tmp2;
        tmp12 = tmp1 - tmp2;
        tmp13 = tmp0 - tmp3;

        data[8*0 + i] = lrintf(SCALE(8 * 0 + i) * (tmp10 + tmp11));
        data[8*4 + i] = lrintf(SCALE(8 * 4 + i) * (tmp10 - tmp11));

        tmp12 += tmp13;
        tmp12 *= A1;
        data[8*2 + i] = lrintf(SCALE(8 * 2 + i) * (tmp13 + tmp12));
        data[8*6 + i] = lrintf(SCALE(8 * 6 + i) * (tmp13 - tmp12));

        tmp10 = tmp4 + tmp7;
        tmp11 = tmp5 + tmp6;
        tmp12 = tmp5 - tmp6;
        tmp13 = tmp4 - tmp7;

        data[8*1 + i] = lrintf(SCALE(8 * 0 + i) * (tmp10 + tmp11));
        data[8*5 + i] = lrintf(SCALE(8 * 4 + i) * (tmp10 - tmp11));

        tmp12 += tmp13;
        tmp12 *= A1;
        data[8*3 + i] = lrintf(SCALE(8 * 2 + i) * (tmp13 + tmp12));
        data[8*7 + i] = lrintf(SCALE(8 * 6 + i) * (tmp13 - tmp12));
    }
}
ff_jpeg_fdct_islow (DCTELEM * data)
{
	int_fast32_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
	int_fast32_t tmp10, tmp11, tmp12, tmp13;
	int_fast32_t z1, z2, z3, z4, z5;
	DCTELEM *dataptr;
	int ctr;

	row_fdct(data);

	/* Pass 2: process columns.
	 * We remove the PASS1_BITS scaling, but leave the results scaled up
	 * by an overall factor of 8.
	 */

	dataptr = data;
	for (ctr = DCTSIZE-1; ctr >= 0; ctr--)
	{
		tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];
		tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];
		tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];
		tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];
		tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];
		tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];
		tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];
		tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];

		/* Even part per LL&M figure 1 --- note that published figure is faulty;
		 * rotator "sqrt(2)*c1" should be "sqrt(2)*c6".
		 */

		tmp10 = tmp0 + tmp3;
		tmp13 = tmp0 - tmp3;
		tmp11 = tmp1 + tmp2;
		tmp12 = tmp1 - tmp2;

		dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS);
		dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS);

		z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
		dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865),
		                                       CONST_BITS+PASS1_BITS);
		dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065),
		                                       CONST_BITS+PASS1_BITS);

		/* Odd part per figure 8 --- note paper omits factor of sqrt(2).
		 * cK represents cos(K*pi/16).
		 * i0..i3 in the paper are tmp4..tmp7 here.
		 */

		z1 = tmp4 + tmp7;
		z2 = tmp5 + tmp6;
		z3 = tmp4 + tmp6;
		z4 = tmp5 + tmp7;
		z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */

		tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
		tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
		tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
		tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
		z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
		z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
		z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
		z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */

		z3 += z5;
		z4 += z5;

		dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp4 + z1 + z3,
		                                       CONST_BITS+PASS1_BITS);
		dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp5 + z2 + z4,
		                                       CONST_BITS+PASS1_BITS);
		dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp6 + z2 + z3,
		                                       CONST_BITS+PASS1_BITS);
		dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp7 + z1 + z4,
		                                       CONST_BITS+PASS1_BITS);

		dataptr++;                  /* advance pointer to next column */
	}
}