STDMETHODIMP TffdshowEnc::getInCodecString(char_t *buf, size_t buflen) { if (!buf) { return E_POINTER; } if (inColorspace == 0) { buf[0] = '\0'; } else { csp_getName(inColorspace, buf, buflen); } return S_OK; }
HRESULT TffdshowDecVideoDXVA::setOutputMediaType(const CMediaType &mt) { DPRINTF(_l("TffdshowDecVideoDXVA::setOutputMediaType")); TvideoCodecDec *pDecoder=NULL; getMovieSource((const TvideoCodecDec**)&pDecoder); TcspInfos ocsps; // DXVA mode : special output format TvideoCodecLibavcodecDxva *pDecoderDxva = (TvideoCodecLibavcodecDxva*)pDecoder; pDecoderDxva->getDXVAOutputFormats(ocsps); for (int i=0; cspFccs[i].name; i++) { const TcspInfo *cspInfo; // Look for the right DXVA colorspace bool ok=false; for (TcspInfos::const_iterator oc=ocsps.begin(); oc!=ocsps.end(); oc++) { if (mt.subtype==*(*oc)->subtype) { cspInfo=(const TcspInfo *)(*oc); ok=true; break; } } if (!ok) { continue; } m_frame.dstColorspace=FF_CSP_NV12; int biWidth,outDy; BITMAPINFOHEADER *bih; if (mt.formattype==FORMAT_VideoInfo && mt.pbFormat) { // && mt.pbFormat = work around other filter's bug. VIDEOINFOHEADER *vih=(VIDEOINFOHEADER*)mt.pbFormat; m_frame.dstStride=calcBIstride(biWidth=vih->bmiHeader.biWidth,cspInfo->Bpp*8); outDy=vih->bmiHeader.biHeight; bih=&vih->bmiHeader; } else if (mt.formattype==FORMAT_VideoInfo2 && mt.pbFormat) { VIDEOINFOHEADER2 *vih2=(VIDEOINFOHEADER2*)mt.pbFormat; m_frame.dstStride=calcBIstride(biWidth=vih2->bmiHeader.biWidth,cspInfo->Bpp*8); outDy=vih2->bmiHeader.biHeight; bih=&vih2->bmiHeader; } else { return VFW_E_TYPE_NOT_ACCEPTED; //S_FALSE; } m_frame.dstSize=DIBSIZE(*bih); char_t s[256]; DPRINTF(_l("TffdshowDecVideoDXVA::setOutputMediaType: colorspace:%s, biWidth:%i, dstStride:%i, Bpp:%i, dstSize:%i"),csp_getName(m_frame.dstColorspace,s,256),biWidth,m_frame.dstStride,cspInfo->Bpp,m_frame.dstSize); if (csp_isRGB(m_frame.dstColorspace) && outDy>0) { m_frame.dstColorspace|=FF_CSP_FLAGS_VFLIP; } //else if (biheight<0) // m_frame.colorspace|=FF_CSP_FLAGS_VFLIP; return S_OK; } m_frame.dstColorspace=FF_CSP_NULL; DPRINTF(_l("TffdshowDecVideoDXVA::setOutputMediaType Type not supported by FFDShow DXVA")); return VFW_E_TYPE_NOT_ACCEPTED; //S_FALSE; }
char_t* csp_getName(int csp,char_t *buf,unsigned int len) { return csp_getName(csp_getInfo(csp),csp,buf,len); }