Alien-FreeImage

 view release on metacpan or  search on metacpan

src/Source/LibJXR/image/decode/strdec_x86.c  view on Meta::CPAN


        movdqa xmm3, xmm0   // d = xmm3
        paddd xmm0, xmm0
        paddd xmm0, xmm3
        psrad xmm0, 3
        paddd xmm1, xmm0

        movdqa xmm0, xmm1   // a = xmm0
        paddd xmm1, xmm1
        paddd xmm1, xmm0
        psrad xmm1, 4
        paddd xmm3, xmm1

        movdqa xmm5, xmm0   // a
        psrad xmm5, 7
        paddd xmm3, xmm5    // d += (a >> 7)
        psrad xmm5, 3
        psubd xmm3, xmm5    // d -= (a >> 10)

        movdqa xmm5, [g_const_d4]
        movdqa xmm1, xmm3   // d = xmm1
        psubd xmm2, xmm4
        paddd xmm5, xmm3
        paddd xmm3, xmm3
        paddd xmm3, xmm5
        psrad xmm3, 3
        paddd xmm0, xmm3

        movdqa xmm3, xmm2   // b = xmm3
        psrad xmm2, 1
        psubd xmm1, xmm2

        movdqa xmm2, xmm0   // a = xmm2
        psubd xmm0, xmm3
        psrad xmm0, 1
        psubd xmm0, xmm4    // c = xmm0

        paddd xmm3, xmm1
        psubd xmm2, xmm0

        //================
        movdqa [edi + 4 * 4], xmm1
        movdqa [edi + 4 * 64], xmm0
        movdqa [esi + 4 * 12], xmm2
        movdqa [esi + 4 * 72], xmm3

        add ebp, 8
        mov [esp], ebp
        jnz Loop0

        //================
        add esp, (4 + 4) * 16 + 4
        pop edi
        pop esi
        pop ebx
        pop ebp
        ret 4 * 2
    }
}

Int invTransformMacroblock_YUV444_Center5(CWMImageStrCodec * pSC)
{
    const OVERLAP olOverlap = pSC->WMISCP.olOverlap;
    int i = 0;

    assert(0 < pSC->cRow && pSC->cRow < pSC->cmbHeight);
    assert(0 < pSC->cColumn && pSC->cColumn < pSC->cmbWidth);

    assert(0 == pSC->WMII.cPostProcStrength);

    assert(YUV_444 == pSC->m_param.cfColorFormat);
    assert(3 == pSC->m_param.cNumChannels);

    assert(pSC->m_Dparam->bDecodeFullWidth);
    assert(1 == pSC->m_Dparam->cThumbnailScale);

    for (i = 0; i < 3; ++i)
    {
        PixelI* const p0 = pSC->p0MBbuffer[i];
        PixelI* const p1 = pSC->p1MBbuffer[i];

        //================================
        // second level inverse transform
        strIDCT4x4Stage2(p1);
        if (pSC->m_param.bScaledArith) {
            strNormalizeDec(p1, (i != 0));
        }

        //================================
        // second level inverse overlap
        if (OL_TWO <= olOverlap)
        {
            strPost4x4Stage2Split_alternate(p0, p1);
        }

        //================================
        // first level inverse transform
        strIDCT4x4Stage1_OPT5(p0, p1);

        //================================
        // first level inverse overlap
        if (OL_ONE <= olOverlap)
        {
            strPost4x4Stage1_alternate_ASM5(p0, p1);
        }
    }

    return ICERR_OK;
}
#endif
#endif

//================================================================
void StrDecOpt(CWMImageStrCodec* pSC)
{
#if defined(WMP_OPT_SSE2)
    if (IsProcessorFeaturePresent(PF_XMMI64_INSTRUCTIONS_AVAILABLE))
    {
        CWMImageInfo* pII = &pSC->WMII;
        // CWMIStrCodecParam* pSCP = &pSC->WMISCP;

        g_const_d0 = _mm_setzero_si128();
        g_const_d3 = _mm_set1_epi32(3);
        g_const_d1 = _mm_set_epi32(1, 1, 1, 1);
        g_const_d4 = _mm_set_epi32(4, 4, 4, 4);

        g_const_d0x80 = _mm_set_epi32(0x80, 0x80, 0x80, 0x80);
        g_const_w0x80 = _mm_set_epi16(0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80);
        g_const_b0x80 = _mm_set_epi8(0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80);

        if (pSC->WMII.fPaddedUserBuffer &&
            //pSC->m_Dparam->bDecodeFullFrame &&
            //((pII->cWidth & 0xf) == 0) &&
            //(((int) pSC->WMIBI.pv & 0xf) == 0) &&
            BD_8 == pII->bdBitDepth &&
            CF_RGB == pII->cfColorFormat &&
            24 == pII->cBitsPerUnit &&
            pII->bRGB &&
            O_NONE == pII->oOrientation &&
            YUV_444 == pSC->m_param.cfColorFormat &&
            pSC->p1MBbuffer[1] - pSC->p1MBbuffer[0] == pSC->p1MBbuffer[2] - pSC->p1MBbuffer[1] &&
            pSC->m_Dparam->bDecodeFullFrame &&
            1)
        {
#if defined(WMP_OPT_CC_DEC)
            if (pSC->m_param.bScaledArith || pSC->WMISCP.olOverlap != OL_NONE)
            {
                pSC->Load = outputMBRow_RGB24_Lossy_3;
            }
            else
            {
                pSC->Load = outputMBRow_RGB24_Lossless_1;
            }
#endif // WMP_OPT_CC_DEC
        }

        if (YUV_444 == pSC->m_param.cfColorFormat &&
            pSC->p1MBbuffer[1] - pSC->p1MBbuffer[0] == pSC->p1MBbuffer[2] - pSC->p1MBbuffer[1] &&
            pSC->m_Dparam->bDecodeFullWidth &&
            pSC->m_param.cSubVersion == CODEC_SUBVERSION_NEWSCALING_SOFT_TILES &&
            1 == pSC->m_Dparam->cThumbnailScale)
        {
#if defined(WMP_OPT_TRFM_DEC)
            pSC->TransformCenter = invTransformMacroblock_YUV444_Center5;
#endif
        }

    }
#else
    UNREFERENCED_PARAMETER( pSC );
#endif    
}



( run in 0.446 second using v1.01-cache-2.11-cpan-3782747c604 )