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); }
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); }