如何使输出宽度减半

[复制链接]
查看11 | 回复6 | 2021-1-27 05:51:59 | 显示全部楼层 |阅读模式
鉴于上次问题没问清楚,所以这次问具体点了,请大家帮忙啊
我视频的正常输入是这样的:

我想对它进行红蓝立体处理,所有把左半图的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];
}
}

分 -->
回复

使用道具 举报

千问 | 2021-1-27 05:51:59 | 显示全部楼层
窗口也要缩小一般吧。
回复

使用道具 举报

千问 | 2021-1-27 05:51:59 | 显示全部楼层
引用2楼dizuo的回复:窗口也要缩小一般吧。
窗口是动态改变的
回复

使用道具 举报

千问 | 2021-1-27 05:51:59 | 显示全部楼层
Transform设置改变后的sample的数据长度
pOut->SetActualDataLength()
回复

使用道具 举报

千问 | 2021-1-27 05:51:59 | 显示全部楼层
引用4楼zoulie的回复:Transform设置改变后的sample的数据长度
pOut->SetActualDataLength()

longlSourceSize=pIn->GetActualDataLength();
pOut->SetActualDataLength(lSourceSize/2)
问题依旧
回复

使用道具 举报

千问 | 2021-1-27 05:51:59 | 显示全部楼层
试试改Output时的MediaType,把其中的VideoInfo里的宽度减半。然后在处理buffer时把图像数据对齐成匹配的宽度。
回复

使用道具 举报

千问 | 2021-1-27 05:51:59 | 显示全部楼层
引用7楼dream238的回复:试试改Output时的MediaType,把其中的VideoInfo里的宽度减半。然后在处理buffer时把图像数据对齐成匹配的宽度。
dream,你说的outpin的mediatype应该就是getmedietype吧?还有我对数据对齐不是很明白?不知道是怎么修改,请教一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行