Ejemplo n.º 1
0
 HRESULT processPict(TffPict &pict) {
     // Store the decoded picture dimensions (used by some imgFilters)
     decodedPict = Trect(pict.rectFull, pict.rectFull.sar);
     if (!imgFilters) {
         imgFilters=createImgFilters();
     }
     return imgFilters->process(pict,presetSettings);
 }
Ejemplo n.º 2
0
STDMETHODIMP TffProcVideo::begin(unsigned int srcDx,unsigned int srcDy,int IfpsNum,int IfpsDen)
{
    end();
    fpsNum=IfpsNum;
    fpsDen=IfpsDen;
    srcR=Trect(0,0,srcDx,srcDy);
    return S_OK;
}
Ejemplo n.º 3
0
STDMETHODIMP_(LRESULT) TffdshowEnc::getFormat(const BITMAPINFOHEADER *inhdr, BITMAPINFO *lpbiOutput)
{
    extraDataSize = 0;
    initCo();
    if (getBMPcolorspace(inhdr, coSettings->incsps) == FF_CSP_NULL) {
        return ICERR_BADFORMAT;
    }

    unsigned int outDx, outDy;
    getOut(inhdr->biWidth, inhdr->biHeight, &outDx, &outDy);
    if (!findEncLib()) {
        return 0;
    }
    extradata.clear();
    if (enc->supExtradata()) {
        if (enccsps.empty()) {
            enc->getCompressColorspaces(enccsps, outDx, outDy);
        }
        enccsp = enccsps[0];
        enc->beginCompress(coSettings->mode, enccsp, Trect(0, 0, outDx, outDy));
        const void *edata0;
        enc->getExtradata(&edata0, &extraDataSize);
        if (extraDataSize) {
            extradata.set(edata0, extraDataSize, 0, true);
        }
        enc->end();
    }

    if (lpbiOutput == NULL) {
        return sizeof(BITMAPINFOHEADER) + extradata.size;
    }
    BITMAPINFOHEADER *outhdr = &lpbiOutput->bmiHeader;

    memcpy(outhdr, inhdr, sizeof(BITMAPINFOHEADER));
    outhdr->biSize = DWORD(sizeof(BITMAPINFOHEADER) + extradata.size);
    findEncLib();
    outhdr->biWidth = outDx;
    outhdr->biHeight = outDy;
    if (!enc || !enc->prepareHeader(outhdr)) {
        outhdr->biCompression = coSettings->fourcc;
        outhdr->biBitCount = 24; // or 16
        outhdr->biSizeImage = outDx * outDy * 3;
    }
    //TODO: maybe encoders should be allowed to modify other outhdr properties
    outhdr->biPlanes = 1;
    outhdr->biXPelsPerMeter = 0;
    outhdr->biYPelsPerMeter = 0;
    outhdr->biClrUsed = 0;
    outhdr->biClrImportant = 0;
    if (extradata.data) {
        memcpy((unsigned char*)outhdr + sizeof(BITMAPINFOHEADER), extradata.data, extradata.size);
    }
    biOutput.bmiHeader = lpbiOutput->bmiHeader;
    return ICERR_OK;
}
Ejemplo n.º 4
0
STDMETHODIMP_(LRESULT) TffdshowEnc::begin(const BITMAPINFOHEADER *inhdr)
{
    if (!findEncLib()) {
        return ICERR_ERROR;
    }

    int nom, den;
    if (lavc_reduce(&nom, &den, fpsRate, fpsScale, 10000)) {
        fpsRate = nom;
        fpsScale = den;
    }

    dbgInit();
    getOut(inhdr->biWidth, inhdr->biHeight, &outDx, &outDy);
    ownStoreExt = false;

    if (enccsps.empty()) {
        enc->getCompressColorspaces(enccsps, outDx, outDy);
        if (enccsps.empty()) {
            return ICERR_BADFORMAT;
        }
    }
    enccsp = enccsps[0];

    cfgcomode = coSettings->mode;
    switch (cfgcomode) {
        case ENC_MODE::CBR:
            if (!sup_CBR(coSettings->codecId)) {
                cfgcomode = ENC_MODE::UNKNOWN;
            }
            break;
        case ENC_MODE::VBR_QUAL:
            if (!sup_VBR_QUAL(coSettings->codecId)) {
                cfgcomode = ENC_MODE::UNKNOWN;
            }
            break;
        case ENC_MODE::VBR_QUANT:
            if (!sup_VBR_QUANT(coSettings->codecId)) {
                cfgcomode = ENC_MODE::UNKNOWN;
            }
            break;
    }

    if (coSettings->storeExt && !ownStoreExt && coSettings->storeExtFlnm[0]) {
        mux = Tmuxer::getMuxer(coSettings->muxer, this);
    } else {
        mux = NULL;
    }
    enc->setCoSettings(oldCodecId);
    LRESULT res = enc->beginCompress(cfgcomode, enccsp, Trect(0, 0, outDx, outDy));
    if (res != ICERR_OK) {
        return res;
    }

    dx = inhdr->biWidth;
    dy = inhdr->biHeight;
    totalsize = keyspacing = 0;
    if (coSettings->isProc && ffproc) {
        ffproc->begin(dx, dy, fpsRate, fpsScale);
    }

    if (mux) {
        mux->writeHeader(extradata.data, extradata.size, 1, biOutput.bmiHeader);
    }

    memset(&params, 0, sizeof(params));
    encStats.init(outDx, outDy, enccsp);
    outputdebug = globalSettings->outputdebug;
    outputdebugfile = globalSettings->outputdebugfile;

    working = true;
    firstrun = true;
    return ICERR_OK;
}