Math-DCT

 view release on metacpan or  search on metacpan

DCT.xs  view on Meta::CPAN

    for (x = 0; x < size*size; x+=size) {
        fast_dct_1d_precalc((char *)&input[x], size, coef);
    }

    for (x = 0; x < size; x++) {
        k = x * size;
        for (y = 0; y < size; y++) {
            temp[y*size+x]=input[k++];
        }
    }

    for (y = 0; y < size*size; y+=size) {
        fast_dct_1d_precalc((char *)&temp[y], size, coef);
    }

    for (x = 0; x < size; x++) {
        k = x * size;
        for (y = 0; y < size; y++) {
            input[y*size+x]=temp[k++];
        }
    }
}

void transform_recursive(double input[], double temp[], int size, double coef[]) {
    if (size == 1)
        return;

    int i,j;
    int half = size / 2;

    for (i = 0; i < half; i++) {
        double x = input[i];
        double y = input[size-1-i];
        temp[i] = x+y;
        temp[i+half] = (x-y)/coef[half+i];
    }

    transform_recursive(temp, input, half, coef);
    transform_recursive(&temp[half], input, half, coef);

    j = 0;
    for (i = 0; i < half-1; i++) {
        input[j++] = temp[i];
        input[j++] = temp[i+half] + temp[i+half+1];
    }
    input[size-2] = temp[half-1];
    input[size-1] = temp[size-1];
}


MODULE = Math::DCT  PACKAGE = Math::DCT  

PROTOTYPES: DISABLE


void
fct8_1d (inbuf)
    char *  inbuf
        PREINIT:
        I32* temp;
        PPCODE:
        temp = PL_markstack_ptr++;
        fct8_1d(inbuf);
        if (PL_markstack_ptr != temp) {
          /* truly void, because dXSARGS not invoked */
          PL_markstack_ptr = temp;
          XSRETURN_EMPTY; /* return empty stack */
        }
        /* must have used dXSARGS; list context implied */
        return; /* assume stack size is correct */

void
fct8_2d (inbuf)
    char *  inbuf
        PREINIT:
        I32* temp;
        PPCODE:
        temp = PL_markstack_ptr++;
        fct8_2d(inbuf);
        if (PL_markstack_ptr != temp) {
          /* truly void, because dXSARGS not invoked */
          PL_markstack_ptr = temp;
          XSRETURN_EMPTY; /* return empty stack */
        }
        /* must have used dXSARGS; list context implied */
        return; /* assume stack size is correct */

void
dct_1d (inbuf, size)
    char *  inbuf
    int size
        PREINIT:
        I32* temp;
        PPCODE:
        temp = PL_markstack_ptr++;
        dct_1d(inbuf, size);
        if (PL_markstack_ptr != temp) {
          /* truly void, because dXSARGS not invoked */
          PL_markstack_ptr = temp;
          XSRETURN_EMPTY; /* return empty stack */
        }
        /* must have used dXSARGS; list context implied */
        return; /* assume stack size is correct */

void
idct_1d (inbuf, size)
    char *  inbuf
    int size
        PREINIT:
        I32* temp;
        PPCODE:
        temp = PL_markstack_ptr++;
        idct_1d(inbuf, size);
        if (PL_markstack_ptr != temp) {
          /* truly void, because dXSARGS not invoked */
          PL_markstack_ptr = temp;
          XSRETURN_EMPTY; /* return empty stack */
        }
        /* must have used dXSARGS; list context implied */
        return; /* assume stack size is correct */

void
dct_2d (inbuf, size)
    char *  inbuf
    int size
        PREINIT:
        I32* temp;
        PPCODE:
        temp = PL_markstack_ptr++;
        dct_2d(inbuf, size);
        if (PL_markstack_ptr != temp) {
          /* truly void, because dXSARGS not invoked */
          PL_markstack_ptr = temp;
          XSRETURN_EMPTY; /* return empty stack */
        }
        /* must have used dXSARGS; list context implied */
        return; /* assume stack size is correct */

void
idct_2d (inbuf, size)
    char *  inbuf
    int size
        PREINIT:
        I32* temp;
        PPCODE:
        temp = PL_markstack_ptr++;
        idct_2d(inbuf, size);
        if (PL_markstack_ptr != temp) {
          /* truly void, because dXSARGS not invoked */
          PL_markstack_ptr = temp;
          XSRETURN_EMPTY; /* return empty stack */
        }
        /* must have used dXSARGS; list context implied */
        return; /* assume stack size is correct */

void
fast_dct_1d (inbuf, size)
    char *  inbuf
    int size
        PREINIT:
        I32* temp;
        PPCODE:
        temp = PL_markstack_ptr++;
        fast_dct_1d(inbuf, size);
        if (PL_markstack_ptr != temp) {
          /* truly void, because dXSARGS not invoked */
          PL_markstack_ptr = temp;
          XSRETURN_EMPTY; /* return empty stack */
        }
        /* must have used dXSARGS; list context implied */
        return; /* assume stack size is correct */

void
fast_dct_2d (inbuf, size)
    char *  inbuf
    int size
        PREINIT:
        I32* temp;
        PPCODE:
        temp = PL_markstack_ptr++;
        fast_dct_2d(inbuf, size);
        if (PL_markstack_ptr != temp) {
          /* truly void, because dXSARGS not invoked */
          PL_markstack_ptr = temp;
          XSRETURN_EMPTY; /* return empty stack */
        }
        /* must have used dXSARGS; list context implied */
        return; /* assume stack size is correct */



( run in 1.252 second using v1.01-cache-2.11-cpan-5511b514fd6 )