鉴于上次问题没问清楚,所以这次问具体点了,请大家帮忙啊
我视频的正常输入是这样的:
我想对它进行红蓝立体处理,所有把左半图的R和右图B,G组成一个元素,于是形成了这样的输出:
问题就出来了,不知道如何处理掉输出右半的黑色部分
贴上我想要处理输出右半黑色部分而修改的代码,目前filter不能调用了
HRESULTCFlipFilter::CheckInputType(constCMediaType*mtIn)
{
CheckPointer(mtIn,E_POINTER);
if(mtIn->majortype!=MEDIATYPE_Video||
mtIn->subtype!=MEDIASUBTYPE_RGB24||
mtIn->formattype!=FORMAT_VideoInfo)
{
returnVFW_E_TYPE_NOT_ACCEPTED;
}
VIDEOINFO*pvi=(VIDEOINFO*)mtIn->Format();
if(pvi->bmiHeader.biBitCount!=24)
{
returnVFW_E_TYPE_NOT_ACCEPTED;
}
returnS_OK;
}
HRESULTCFlipFilter::GetMediaType(intiPosition,CMediaType*pMediaType)
{
if(m_pInput->IsConnected()==FALSE){
returnE_UNEXPECTED;
}
if(iPosition0){
returnVFW_S_NO_MORE_ITEMS;
}
CheckPointer(pMediaType,E_POINTER);
*pMediaType=m_pInput->CurrentMediaType();
if(pMediaType->formattype==FORMAT_VideoInfo)
{
VIDEOINFOHEADER*hrIn=(VIDEOINFOHEADER*)pMediaType->pbFormat;
hrIn->bmiHeader.biWidth=hrIn->bmiHeader.biWidth/2;
hrIn->bmiHeader.biHeight=hrIn->bmiHeader.biHeight;
hrIn->rcSource.right=hrIn->bmiHeader.biWidth;
hrIn->rcTarget.right=hrIn->bmiHeader.biWidth;
hrIn->rcSource.bottom=hrIn->bmiHeader.biHeight;
hrIn->rcTarget.bottom=hrIn->bmiHeader.biHeight;
}
elseif(pMediaType->formattype==FORMAT_VideoInfo2)
{
VIDEOINFOHEADER2*hrIn=(VIDEOINFOHEADER2*)pMediaType->pbFormat;
hrIn->bmiHeader.biWidth=hrIn->bmiHeader.biWidth/2;
hrIn->bmiHeader.biHeight=hrIn->bmiHeader.biHeight;
hrIn->rcSource.right=hrIn->bmiHeader.biWidth;
hrIn->rcTarget.right=hrIn->bmiHeader.biWidth;
hrIn->rcSource.bottom=hrIn->bmiHeader.biHeight;
hrIn->rcTarget.bottom=hrIn->bmiHeader.biHeight;
}
else
{
returnE_INVALIDARG;
}
returnNOERROR;
}
HRESULTCFlipFilter::CheckTransform(constCMediaType*mtIn,constCMediaType*mtOut)
{
CheckPointer(mtIn,E_POINTER);
CheckPointer(mtOut,E_POINTER);
HRESULThr;
if(FAILED(hr=CheckInputType(mtIn)))
{
returnhr;
}
//formatmustbeaVIDEOINFOHEADER
if(*mtOut->FormatType()!=FORMAT_VideoInfo)
{
returnE_INVALIDARG;
}
//formatsmustbebigenough
if(mtIn->FormatLength()FormatLength()Format();
VIDEOINFO*pOutput=(VIDEOINFO*)mtOut->Format();
if(memcmp(&pInput->bmiHeader,&pOutput->bmiHeader,sizeof(BITMAPINFOHEADER))==0)
{
returnNOERROR;
}
returnE_INVALIDARG;
}
HRESULTCFlipFilter::DecideBufferSize(IMemAllocator*pAllocator,ALLOCATOR_PROPERTIES*pprop)
{
if(m_pInput->IsConnected()==FALSE){
returnE_UNEXPECTED;
}
CheckPointer(pAllocator,E_POINTER);
CheckPointer(pprop,E_POINTER);
HRESULThr=NOERROR;
pprop->cBuffers=1;
pprop->cbBuffer=m_pOutput->CurrentMediaType().GetSampleSize();
ASSERT(pprop->cbBuffer);
ALLOCATOR_PROPERTIESActual;
hr=pAllocator->SetProperties(pprop,&Actual);
if(FAILED(hr)){
returnhr;
}
ASSERT(Actual.cBuffers==1);
if(pprop->cBuffers>Actual.cBuffers||
pprop->cbBuffer>Actual.cbBuffer){
returnE_FAIL;
}
returnNOERROR;
}
HRESULTCFlipFilter::Transform(IMediaSample*pIn,IMediaSample*pOut)
{
CheckPointer(pIn,E_POINTER);
CheckPointer(pOut,E_POINTER);
BYTE*pSourceBuffer,*pDestBuffer;
longlSourceSize=pIn->GetActualDataLength();
pIn->GetPointer(&pSourceBuffer);
pOut->GetPointer(&pDestBuffer);
//transform
CMediaTypepMediaType1;
VIDEOINFOHEADER*pvi=(VIDEOINFOHEADER*)pMediaType1.pbFormat;
intnWidth=WIDTHBYTES(pvi->bmiHeader.biWidth*pvi->bmiHeader.biBitCount);
for(inti=0;ibmiHeader.biHeight;i++)
{
for(intj=0;jbmiHeader.biWidth/2;j++)
{//blue,green,red;
pDestBuffer[j*3+pvi->bmiHeader.biWidth*3*i]=pSourceBuffer[j*3+pvi->bmiHeader.biWidth*3*i+pvi->bmiHeader.biWidth*3/2];
pDestBuffer[j*3+1+pvi->bmiHeader.biWidth*3*i]=pSourceBuffer[j*3+1+pvi->bmiHeader.biWidth*3*i+pvi->bmiHeader.biWidth*3/2];
pDestBuffer[j*3+2+pvi->bmiHeader.biWidth*3*i]=pSourceBuffer[j*3+2+pvi->bmiHeader.biWidth*3*i];
}
}
分 -->
|