Beispiel #1
0
STDMETHODIMP_(LRESULT) Tffvfw::decRun(void *icd0)
{
    if (!decVFW) {
        return VFW_E_RUNTIME_ERROR;
    }
    icd=(ICDECOMPRESS*)icd0;
    if (~((icd->dwFlags&ICDECOMPRESS_HURRYUP) | (icd->dwFlags&ICDECOMPRESS_UPDATE) | (icd->dwFlags&ICDECOMPRESS_PREROLL))) {
        if ((colorspace=getBMPcolorspace(icd->lpbiOutput,autoforcedcolorspaces.decGetForcedCsp(decVFW)))==FF_CSP_NULL) {
            return ICERR_UNSUPPORTED;
        }
        if (colorspace&FF_CSP_RGB16) {
            colorspace=(colorspace&~FF_CSP_RGB16)|FF_CSP_RGB15;
        }
        if (sign(icd->lpbiInput->biHeight)!=sign(icd->lpbiOutput->biHeight) && !csp_isYUVpacked(colorspace)) {
            colorspace^=FF_CSP_FLAGS_VFLIP;
        }
    } else {
        colorspace=FF_CSP_NULL;
    }

    unsigned char *inData=(unsigned char*)icd->lpInput;
    unsigned int inLen=icd->lpbiInput->biSizeImage;

    isSyncPoint=(icd->dwFlags&ICDECOMPRESS_NOTKEYFRAME)==0;
    return dec->decompress(inData,inLen,this);
}
Beispiel #2
0
HRESULT TimgFilterMirror::process(TfilterQueue::iterator it, TffPict &pict, const TfilterSettingsVideo *cfg0)
{
    if (is(pict, cfg0)) {
        const ToffsetSettings *cfg = (const ToffsetSettings*)cfg0;
        init(pict, cfg->full, cfg->half);
        unsigned char *ptr[4];
        bool cspChanged = getCurNext(pict.csp, pict, cfg->full, COPYMODE_DEF, ptr);
        if (cspChanged)
            switch (pict.cspInfo.Bpp) {
                case 1:
                    mirrorFc = &TimgFilterMirror::mirror<int8_t>;
                    break;
                case 2:
                    mirrorFc = &TimgFilterMirror::mirror<int16_t>;
                    break;
                case 3:
                    mirrorFc = &TimgFilterMirror::mirror<int24_t>;
                    break;
                case 4:
                    mirrorFc = &TimgFilterMirror::mirror<int32_t>;
                    break;
                default:
                    mirrorFc = NULL;
                    break;
            }
        if (csp_isYUVpacked(pict.csp)) {
            unsigned char *src = ptr[0], *dst = ptr[0] + (dx2[0] - 1) * 2;
            int dx = dx2[0];
            if (pict.cspInfo.packedLumaOffset == 0 && pict.cspInfo.packedChromaOffset == 1)
                for (unsigned int y = 0; y < dy2[0]; y++, src += stride2[0], dst += stride2[0])
                    for (int x = 0; x < dx; x += 4) {
                        std::swap(src[x  ], dst[-x + 2]);
                        std::swap(src[x + 3], dst[-x + 1]);
                        std::swap(src[x + 2], dst[-x  ]);
                        std::swap(src[x + 1], dst[-x + 3]);
                    }
            else
                for (unsigned int y = 0; y < dy2[0]; y++, src += stride2[0], dst += stride2[0])
                    for (int x = 0; x < dx; x += 4) {
                        std::swap(src[x  ], dst[-x + 2]);
                        std::swap(src[x + 3], dst[-x + 1]);
                        std::swap(src[x + 2], dst[-x  ]);
                        std::swap(src[x + 1], dst[-x + 3]);
                    }
        } else if (mirrorFc)
            for (unsigned int i = 0; i < pict.cspInfo.numPlanes; i++) {
                unsigned int dx = dx2[i] / 2;
                for (unsigned int y = 0; y < dy2[i]; y++, ptr[i] += stride2[i]) {
                    (this->*mirrorFc)(i, dx, ptr[i]);
                }
            }
    }
    return parent->processSample(++it, pict);
}