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); }
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; }
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; }
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(¶ms, 0, sizeof(params)); encStats.init(outDx, outDy, enccsp); outputdebug = globalSettings->outputdebug; outputdebugfile = globalSettings->outputdebugfile; working = true; firstrun = true; return ICERR_OK; }