mcomp.c

来自「symbian 下的helix player源代码」· C语言 代码 · 共 1,603 行 · 第 1/5 页

C
1,603
字号
}


// weighNoLeft_Vert - Overlap with MV from vert. neighbor for upper left 4x4 pixels
static void weighNoLeft_Vert( PIXEL *dest, PIXEL const *p, int hdim )
{
    // First row
    dest[0] = (3 * dest[0] +  p[TOP_OFFSET + 0] + 2) >> 2;
    dest[1] = (3 * dest[1] +  p[TOP_OFFSET + 1] + 2) >> 2;
    dest[2] = (3 * dest[2] +  p[TOP_OFFSET + 2] + 2) >> 2;
    dest[3] = (3 * dest[3] +  p[TOP_OFFSET + 3] + 2) >> 2;
    // Second row
    dest += hdim, p += hdim;
    dest[0] = (7 * dest[0] +  p[TOP_OFFSET + 0] + 4) >> 3;
    dest[1] = (7 * dest[1] +  p[TOP_OFFSET + 1] + 4) >> 3;
    dest[2] = (3 * dest[2] +  p[TOP_OFFSET + 2] + 2) >> 2;
    dest[3] = (3 * dest[3] +  p[TOP_OFFSET + 3] + 2) >> 2;
    // Third row
    dest += hdim, p += hdim;
    dest[0] = (7 * dest[0] +  p[TOP_OFFSET + 0] + 4) >> 3;
    dest[1] = (7 * dest[1] +  p[TOP_OFFSET + 1] + 4) >> 3;
    dest[2] = (7 * dest[2] +  p[TOP_OFFSET + 2] + 4) >> 3;
    dest[3] = (7 * dest[3] +  p[TOP_OFFSET + 3] + 4) >> 3;
    // Fourth row (identical to third row)
    dest += hdim, p += hdim;
    dest[0] = (7 * dest[0] +  p[TOP_OFFSET + 0] + 4) >> 3;
    dest[1] = (7 * dest[1] +  p[TOP_OFFSET + 1] + 4) >> 3;
    dest[2] = (7 * dest[2] +  p[TOP_OFFSET + 2] + 4) >> 3;
    dest[3] = (7 * dest[3] +  p[TOP_OFFSET + 3] + 4) >> 3;
    return;
}


// weighLeft - Overlap with MV from left neighbor for upper left 4x4 pixels
static void weighLeft( PIXEL *dest, PIXEL const *p, int hdim )
{
    // First row
    dest[0] = (3 * dest[0] +  p[0] + 2) >> 2;
    dest[1] = (7 * dest[1] +  p[1] + 4) >> 3;
    dest[2] = (7 * dest[2] +  p[2] + 4) >> 3;
    dest[3] = (7 * dest[3] +  p[3] + 4) >> 3;
    // Second row
    dest += hdim, p += hdim;
    dest[0] = (3 * dest[0] +  p[0] + 2) >> 2;
    dest[1] = (3 * dest[1] +  p[1] + 2) >> 2;
    dest[2] = (7 * dest[2] +  p[2] + 4) >> 3;
    dest[3] = (7 * dest[3] +  p[3] + 4) >> 3;
    // Third row (identical to second row)
    dest += hdim, p += hdim;
    dest[0] = (3 * dest[0] +  p[0] + 2) >> 2;
    dest[1] = (3 * dest[1] +  p[1] + 2) >> 2;
    dest[2] = (7 * dest[2] +  p[2] + 4) >> 3;
    dest[3] = (7 * dest[3] +  p[3] + 4) >> 3;
    // Fourth row (identical to third row)
    dest += hdim, p += hdim;
    dest[0] = (3 * dest[0] +  p[0] + 2) >> 2;
    dest[1] = (3 * dest[1] +  p[1] + 2) >> 2;
    dest[2] = (7 * dest[2] +  p[2] + 4) >> 3;
    dest[3] = (7 * dest[3] +  p[3] + 4) >> 3;
    return;
}


// weighRight_Vert - Derived from weighLeft_Vert by reversing indices
//  This means that the assembler routine can be easily derived from the other
static void weighRight_Vert( PIXEL *dest,   // Non-overlapped MC; overlapped by this routine
                            PIXEL const *p, // p: MC using right motion vector
                                            // &p[TOP_OFFSET]: MC using top/bottom MV
                            int hdim )      // Line offset
{
    // First row
    dest[3] = (2 * dest[3] +     p[3] +     p[TOP_OFFSET + 3] + 2) >> 2;
    dest[2] = (5 * dest[2] +     p[2] + 2 * p[TOP_OFFSET + 2] + 4) >> 3;
    dest[1] = (5 * dest[1] +     p[1] + 2 * p[TOP_OFFSET + 1] + 4) >> 3;
    dest[0] = (5 * dest[0] +     p[0] + 2 * p[TOP_OFFSET + 0] + 4) >> 3;
    // Second row
    dest += hdim, p += hdim;
    dest[3] = (5 * dest[3] + 2 * p[3] +     p[TOP_OFFSET + 3] + 4) >> 3;
    dest[2] = (5 * dest[2] + 2 * p[2] +     p[TOP_OFFSET + 2] + 4) >> 3;
    dest[1] = (5 * dest[1] +     p[1] + 2 * p[TOP_OFFSET + 1] + 4) >> 3;
    dest[0] = (5 * dest[0] +     p[0] + 2 * p[TOP_OFFSET + 0] + 4) >> 3;
    // Third row
    dest += hdim, p += hdim;
    dest[3] = (5 * dest[3] + 2 * p[3] +     p[TOP_OFFSET + 3] + 4) >> 3;
    dest[2] = (5 * dest[2] + 2 * p[2] +     p[TOP_OFFSET + 2] + 4) >> 3;
    dest[1] = (6 * dest[1] +     p[1] +     p[TOP_OFFSET + 1] + 4) >> 3;
    dest[0] = (6 * dest[0] +     p[0] +     p[TOP_OFFSET + 0] + 4) >> 3;
    // Fourth row (identical to third row)
    dest += hdim, p += hdim;
    dest[3] = (5 * dest[3] + 2 * p[3] +     p[TOP_OFFSET + 3] + 4) >> 3;
    dest[2] = (5 * dest[2] + 2 * p[2] +     p[TOP_OFFSET + 2] + 4) >> 3;
    dest[1] = (6 * dest[1] +     p[1] +     p[TOP_OFFSET + 1] + 4) >> 3;
    dest[0] = (6 * dest[0] +     p[0] +     p[TOP_OFFSET + 0] + 4) >> 3;
    return;
}


// weighNoRight_Vert - Derived from weighNoLeft_Vert by reversing indices
//  This means that the assembler routine can be easily derived from the other
static void weighNoRight_Vert( PIXEL *dest, PIXEL const *p, int hdim )
{
    // First row
    dest[3] = (3 * dest[3] +  p[TOP_OFFSET + 3] + 2) >> 2;
    dest[2] = (3 * dest[2] +  p[TOP_OFFSET + 2] + 2) >> 2;
    dest[1] = (3 * dest[1] +  p[TOP_OFFSET + 1] + 2) >> 2;
    dest[0] = (3 * dest[0] +  p[TOP_OFFSET + 0] + 2) >> 2;
    // Second row
    dest += hdim, p += hdim;
    dest[3] = (7 * dest[3] +  p[TOP_OFFSET + 3] + 4) >> 3;
    dest[2] = (7 * dest[2] +  p[TOP_OFFSET + 2] + 4) >> 3;
    dest[1] = (3 * dest[1] +  p[TOP_OFFSET + 1] + 2) >> 2;
    dest[0] = (3 * dest[0] +  p[TOP_OFFSET + 0] + 2) >> 2;
    // Third row
    dest += hdim, p += hdim;
    dest[3] = (7 * dest[3] +  p[TOP_OFFSET + 3] + 4) >> 3;
    dest[2] = (7 * dest[2] +  p[TOP_OFFSET + 2] + 4) >> 3;
    dest[1] = (7 * dest[1] +  p[TOP_OFFSET + 1] + 4) >> 3;
    dest[0] = (7 * dest[0] +  p[TOP_OFFSET + 0] + 4) >> 3;
    // Fourth row (identical to third row)
    dest += hdim, p += hdim;
    dest[3] = (7 * dest[3] +  p[TOP_OFFSET + 3] + 4) >> 3;
    dest[2] = (7 * dest[2] +  p[TOP_OFFSET + 2] + 4) >> 3;
    dest[1] = (7 * dest[1] +  p[TOP_OFFSET + 1] + 4) >> 3;
    dest[0] = (7 * dest[0] +  p[TOP_OFFSET + 0] + 4) >> 3;
    return;
}


// weighRight - Derived from weighLeft by reversing indices
//  This means that the assembler routine can be easily derived from the other
static void weighRight( PIXEL *dest, PIXEL const *p, int hdim )
{
    // First row
    dest[3] = (3 * dest[3] +  p[3] + 2) >> 2;
    dest[2] = (7 * dest[2] +  p[2] + 4) >> 3;
    dest[1] = (7 * dest[1] +  p[1] + 4) >> 3;
    dest[0] = (7 * dest[0] +  p[0] + 4) >> 3;
    // Second row
    dest += hdim, p += hdim;
    dest[3] = (3 * dest[3] +  p[3] + 2) >> 2;
    dest[2] = (3 * dest[2] +  p[2] + 2) >> 2;
    dest[1] = (7 * dest[1] +  p[1] + 4) >> 3;
    dest[0] = (7 * dest[0] +  p[0] + 4) >> 3;
    // Third row (identical to second row)
    dest += hdim, p += hdim;
    dest[3] = (3 * dest[3] +  p[3] + 2) >> 2;
    dest[2] = (3 * dest[2] +  p[2] + 2) >> 2;
    dest[1] = (7 * dest[1] +  p[1] + 4) >> 3;
    dest[0] = (7 * dest[0] +  p[0] + 4) >> 3;
    // Fourth row (identical to third row)
    dest += hdim, p += hdim;
    dest[3] = (3 * dest[3] +  p[3] + 2) >> 2;
    dest[2] = (3 * dest[2] +  p[2] + 2) >> 2;
    dest[1] = (7 * dest[1] +  p[1] + 4) >> 3;
    dest[0] = (7 * dest[0] +  p[0] + 4) >> 3;
    return;
}


static void mc16pelsNoInterpol( PIXEL *in, PIXEL *out, int hdim, int vSize )
{
#ifndef FOR_UNIX
    union { // Copy words to speed up routine
        PIXEL   *pix;
        U32     *word;
    } pIn, pOut;

    pIn.pix = in;
    pOut.pix = out;
    while (vSize > 0) {
        *(pOut.word + 0) = *(pIn.word + 0);
        *(pOut.word + 1) = *(pIn.word + 1);
        *(pOut.word + 2) = *(pIn.word + 2);
        *(pOut.word + 3) = *(pIn.word + 3);
        pIn.pix += hdim;
        pOut.pix += hdim;
        --vSize;
    }
    return;
#else
    union { // PIXELs are not always word-aligned! Gotta copy bytes in UNIX
        PIXEL   *pix;
        BYTE    *byte;
    } pIn, pOut;

    BYTE    *pInbyte;
    BYTE    *pOutbyte;
    int     i;

    pIn.pix = in;
    pOut.pix = out;
    while (vSize > 0) {
        pInbyte = pIn.byte;
        pOutbyte = pOut.byte;
        for (i=0; i<16; i++)
	  *(pOutbyte++) = *(pInbyte++);

        pIn.pix += hdim;
        pOut.pix += hdim;
        --vSize;
    }
    return;
#endif
}


static void mc8pelsNoInterpol( PIXEL *in, PIXEL *out, int hdim, int vSize )
{
#ifndef FOR_UNIX
    union { // Copy words to speed up routine
        PIXEL   *pix;
        U32     *word;
    } pIn, pOut;

    pIn.pix = in;
    pOut.pix = out;
    while (vSize > 0) {
        *(pOut.word + 0) = *(pIn.word + 0);
        *(pOut.word + 1) = *(pIn.word + 1);
        pIn.pix += hdim;
        pOut.pix += hdim;
        --vSize;
    }
    return;
#else
    union { // PIXELs are not always word-aligned! Gotta copy bytes in UNIX
        PIXEL   *pix;
        BYTE    *byte;
    } pIn, pOut;

    pIn.pix = in;
    pOut.pix = out;
    while (vSize > 0) {
        *(pOut.byte + 0) = *(pIn.byte + 0);
        *(pOut.byte + 1) = *(pIn.byte + 1);
        *(pOut.byte + 2) = *(pIn.byte + 2);
        *(pOut.byte + 3) = *(pIn.byte + 3);
        *(pOut.byte + 4) = *(pIn.byte + 4);
        *(pOut.byte + 5) = *(pIn.byte + 5);
        *(pOut.byte + 6) = *(pIn.byte + 6);
        *(pOut.byte + 7) = *(pIn.byte + 7);
        pIn.pix += hdim;
        pOut.pix += hdim;
        --vSize;
    }
    return;
#endif
}


static void mc4pelsNoInterpol( PIXEL *in, PIXEL *out, int hdim, int vSize )
{
#ifndef FOR_UNIX
    union { // Copy words to speed up routine
        PIXEL   *pix;
        U32     *word;
    } pIn, pOut;

    pIn.pix = in;
    pOut.pix = out;
    while (vSize > 0) {
        *(pOut.word + 0) = *(pIn.word + 0);
        pIn.pix += hdim;
        pOut.pix += hdim;
        --vSize;
    }
    return;
#else
    union { // PIXELs are not always word-aligned! Gotta copy bytes in UNIX
        PIXEL   *pix;
        BYTE    *byte;
    } pIn, pOut;

    pIn.pix = in;
    pOut.pix = out;
    while (vSize > 0) {
        *(pOut.byte + 0) = *(pIn.byte + 0);
        *(pOut.byte + 1) = *(pIn.byte + 1);
        *(pOut.byte + 2) = *(pIn.byte + 2);
        *(pOut.byte + 3) = *(pIn.byte + 3);
        pIn.pix += hdim;
        pOut.pix += hdim;
        --vSize;
    }
    return;
#endif
}


static void mc16pelsHorInterpol( PIXEL const *in, PIXEL *out, int hdim, int vSize )
{
    while (vSize > 0) {
        out[0] = (in[0] + in[1] + 1) >> 1;
        out[1] = (in[1] + in[2] + 1) >> 1;
        out[2] = (in[2] + in[3] + 1) >> 1;
        out[3] = (in[3] + in[4] + 1) >> 1;
        out[4] = (in[4] + in[5] + 1) >> 1;
        out[5] = (in[5] + in[6] + 1) >> 1;
        out[6] = (in[6] + in[7] + 1) >> 1;
        out[7] = (in[7] + in[8] + 1) >> 1;
        out[8] = (in[8] + in[9] + 1) >> 1;
        out[9] = (in[9] + in[10] + 1) >> 1;
        out[10] = (in[10] + in[11] + 1) >> 1;
        out[11] = (in[11] + in[12] + 1) >> 1;
        out[12] = (in[12] + in[13] + 1) >> 1;
        out[13] = (in[13] + in[14] + 1) >> 1;
        out[14] = (in[14] + in[15] + 1) >> 1;
        out[15] = (in[15] + in[16] + 1) >> 1;
        in += hdim;
        out += hdim;
        --vSize;
    }
    return;
}


static void mc8pelsHorInterpol( PIXEL const *in, PIXEL *out, int hdim, int vSize )
{
    

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?