コード例 #1
0
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);
        }
    }
コード例 #2
0
ファイル: TimgFilterOffset.cpp プロジェクト: TheRyuu/ffdshow
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);
}
コード例 #3
0
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);
}
コード例 #4
0
ファイル: TimgFilterOffset.cpp プロジェクト: TheRyuu/ffdshow
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);
}
コード例 #5
0
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);
}