HRESULT TimgFilterLogoaway::process(TfilterQueue::iterator it,TffPict &pict,const TfilterSettingsVideo *cfg0) { if (is(pict,cfg0)) { const TlogoawaySettings *cfg=(const TlogoawaySettings*)cfg0; init(pict,cfg->full,cfg->half); bool cspChanged; if (cfg->lumaonly) { cspChanged=getCurNext(FF_CSPS_MASK_YUV_PLANAR,pict,cfg->full,COPYMODE_DEF,&plane[0].dst,NULL,NULL,NULL); } else { cspChanged=getCurNext(FF_CSPS_MASK_YUV_PLANAR,pict,cfg->full,COPYMODE_DEF,&plane[0].dst,&plane[1].dst,&plane[2].dst,NULL); } if (cspChanged || logotemp.rectFull.dx!=(unsigned int)cfg->dx || logotemp.rectFull.dy!=(unsigned int)cfg->dy || !plane[0] || oldLumaOnly!=cfg->lumaonly || oldBlur!=cfg->blur || oldMode!=cfg->mode || stricmp(oldparambitmap,cfg->parambitmap)!=0) { oldLumaOnly=cfg->lumaonly; oldBlur=cfg->blur; oldMode=cfg->mode; ff_strncpy(oldparambitmap, cfg->parambitmap, countof(oldparambitmap)); done(); if (cfg->mode==TlogoawaySettings::MODE_SHAPEXY || cfg->mode==TlogoawaySettings::MODE_SHAPEUGLARM) { parambitmap=new TffPict(csp2,cfg->parambitmap,parambitmapbuf,deci); if (parambitmap->rectFull.dx!=(unsigned int)cfg->dx || parambitmap->rectFull.dy!=(unsigned int)cfg->dy) { delete parambitmap; parambitmap=NULL; } } for (int i=0; i<(cfg->lumaonly?1:3); i++) { plane[i].shiftX=pict.cspInfo.shiftX[i]; plane[i].shiftY=pict.cspInfo.shiftY[i]; plane[i].w=cfg->dx>>plane[i].shiftX; plane[i].h=cfg->dy>>plane[i].shiftY; if (parambitmap) { plane[i].parambitmapdata=parambitmap->data[i]; plane[i].parambitmapstride=parambitmap->stride[i]; } else { plane[i].parambitmapdata=NULL; plane[i].parambitmapstride=0; } plane[i].init(cfg); } } Trect tempR(cfg->x,cfg->y,cfg->dx,cfg->dy); logotemp.copyFrom(pict,logotempbuf,&tempR); YUVcolor yuv(cfg->solidcolor); for (int i=0; i<(cfg->lumaonly?1:3); i++) { plane[i].stride2=stride2[i]; plane[i].logotempdata=logotemp.data[i]; plane[i].logotempstride=logotemp.stride[i]; plane[i].solidcolor=(i==0?yuv.Y:(i==1?yuv.V+128:yuv.U+128)); plane[i].process(cfg); } }
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); }
HRESULT TimgFilterNoiseMplayer::process(TfilterQueue::iterator it,TffPict &pict,const TfilterSettingsVideo *cfg0) { if (is(pict,cfg0)) { const TnoiseSettings *cfg=(const TnoiseSettings*)cfg0; init(pict,cfg->full,cfg->half); if (!cfg->equal(oldnoise)) { oldnoise=*cfg; y.done(); uv.done(); } uint64_t csp=0; if (cfg->strength) { const unsigned char *srcY; getCur(FF_CSPS_MASK_YUV_PLANAR,pict,cfg->full,&srcY,NULL,NULL,NULL); unsigned char *dstY; getCurNext(csp=csp1,pict,cfg->full,COPYMODE_NO,&dstY,NULL,NULL,NULL); if (!y) { y.init(cfg->strength/(cfg->averaged?1:3),cfg); } y.process(srcY,dstY,stride2[0],stride1[0],dx1[0],dy1[0]); _mm_empty(); } if (cfg->strengthChroma) { const unsigned char *srcU,*srcV; getCur(csp?csp:FF_CSPS_MASK_YUV_PLANAR,pict,cfg->full,NULL,&srcU,&srcV,NULL); unsigned char *dstU,*dstV; getCurNext(csp1,pict,cfg->full,COPYMODE_NO,NULL,&dstU,&dstV,NULL); if (oldcsp!=csp1) { oldcsp=csp1; doneChroma(); } if (!uv) { uv.init(cfg->strengthChroma/(cfg->averaged?1:2),cfg); } uv.process(srcU,dstU,stride2[1],stride1[1],dx1[1],dy1[1]); uv.process(srcV,dstV,stride2[2],stride1[2],dx1[2],dy1[2]); _mm_empty(); } } return parent->processSample(++it,pict); }
HRESULT TimgFilterFlip::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]; getCurNext(pict.csp, pict, cfg->full, COPYMODE_DEF, ptr); for (unsigned int i = 0; i < pict.cspInfo.numPlanes; i++) { unsigned char *src = ptr[i], *dst = ptr[i] + stride2[i] * (dy2[i] - 1); unsigned int dx = dx2[i] * pict.cspInfo.Bpp, dy = dy2[i] / 2; void *tmp = _alloca(dx); for (unsigned int y = 0; y < dy; y++, src += stride2[i], dst -= stride2[i]) { memcpy(tmp, src, dx); memcpy(src, dst, dx); memcpy(dst, tmp, dx); } } } return parent->processSample(++it, pict); }
HRESULT TimgFilterShowMV::process(TfilterQueue::iterator it,TffPict &pict,const TfilterSettingsVideo *cfg0) { if (is(pict,cfg0)) { const TvisSettings *cfg=(const TvisSettings*)cfg0; const TvideoCodecDec *movie; deciV->getMovieSource(&movie); init(pict,0,0); unsigned char *dstY=NULL; if (movie && (movie->caps()&(TvideoCodec::CAPS::VIS_MV|TvideoCodec::CAPS::VIS_QUANTS))) { if (cfg->mv) { getCurNext(FF_CSPS_MASK_YUV_PLANAR,pict,0,COPYMODE_DEF,&dstY,NULL,NULL,NULL); movie->drawMV(dstY,dx1[0],stride2[0],dy1[0]); } if (cfg->quants && movie->quants) { if (!dstY) { getCurNext(FF_CSPS_MASK_YUV_PLANAR,pict,0,COPYMODE_DEF,&dstY,NULL,NULL,NULL); } const unsigned char *quants=(const unsigned char*)movie->quants; for (unsigned int y=4; y<=dy1[0]-12; y+=16,quants+=movie->quantsStride*movie->quantBytes) { const unsigned char *q=quants; for (unsigned int x=0; x<=dx1[0]-12; x+=16,q+=movie->quantBytes) { unsigned int qq=*q; if (qq>99) { qq=99; } if (qq/10) { drawNum(numsL+(qq/10)*64,maskL,dstY+(x+4)+y*stride2[0],stride2[0]); drawNum(numsR+(qq%10)*64,maskR,dstY+(x+4)+y*stride2[0],stride2[0]); } else { drawNum(numsL+qq*64,maskL,dstY+(x+6)+y*stride2[0],stride2[0]); } } } _mm_empty(); } } if (cfg->graph) { if (!dstY) { getCurNext(FF_CSPS_MASK_YUV_PLANAR,pict,0,COPYMODE_DEF,&dstY,NULL,NULL,NULL); } if (frames.empty()) { frames.resize(2000); } frames.erase(frames.begin()); frames.push_back(Tframe(pict.srcSize,pict.frametype)); unsigned char *dst=dstY+(dy1[0]-1)*stride2[0]; size_t max=0; for (unsigned int i=2000-dx1[0]; i<2000; i++) if (frames[i].first>max) { max=frames[i].first; } if (max) for (unsigned int i=2000-dx1[0]; i<2000; i++,dst++) { Tframe &f=frames[i]; unsigned char c; switch (f.second&FRAME_TYPE::typemask) { case FRAME_TYPE::I: c=255; break; case FRAME_TYPE::P: c=210; break; case FRAME_TYPE::B: c=170; break; default: c=130; break; } for (unsigned char *dst1=dst,*dst1end=dst1-std::min(int((dy1[0]/4)*f.first/max),int(dy1[0])-1)*stride2[0]; dst1!=dst1end; dst1-=stride2[0]) { *dst1=c; } } } } return parent->processSample(++it,pict); }