关于播放的问题
我的问题是这样的,我自己写了一个Filter, 继承CTransformFilter,在Transform函数哪里处理视频数据.实现下面功能,
假如视频数据如下
1 2 3 4
5 6 7 8
经过我的处理变成下面
1 2
5 6
3 4
7 8
然后我就测试,第一种情况是这样的,我在graphedit中直接用我的MyFilter链接Render,在处理RGB32数据的时候,在Transform函数哪里要下面的处理才正常显示.
HRESULT CContrast::Transform(IMediaSample *pIn, IMediaSample *pOut)
{
if (*(m_pInput->CurrentMediaType().Subtype()) == MEDIASUBTYPE_RGB32)
{
{
int nWidth = 0, nHeight = 0;
VIDEOINFO* pInfo = (VIDEOINFO*)m_pInput->CurrentMediaType().Format();
nWidth = pInfo->bmiHeader.biWidth;
nHeight = pInfo->bmiHeader.biHeight;
BYTE* pBuffer = 0;
BYTE* pBufferOut = 0;
pIn->GetPointer(&pBuffer);
pOut->GetPointer(&pBufferOut);
RGBQUAD* pBuf = (RGBQUAD*)pBuffer;
RGBQUAD* pBufOut = (RGBQUAD*)pBufferOut;
int nBufferSize = nWidth * abs(nHeight) / 2;
RGBQUAD* pBuffer1 = new RGBQUAD[nBufferSize];
if (pBuffer1 == NULL)
return NOERROR; //虽然分配失败,但为了不影响播放,返回NOERROR,表示按原来来播放.
RGBQUAD* pBuffer2 = new RGBQUAD[nBufferSize];
if (pBuffer2 == NULL)
{
delete pBuffer1;
pBuffer1 = NULL;
return NOERROR;
}
for (int nIndex = 0; nIndex < abs(nHeight); nIndex++)
{
for (int i = 0; i < nWidth / 2; i ++)
pBuffer1[i + nIndex * (nWidth / 2)] = pBuf[i + nIndex * nWidth];
for (int j = 0; j < nWidth / 2; j++)
pBuffer2[j + nIndex * (nWidth / 2)] = pBuf[j + nWidth / 2 + nIndex * nWidth];
}
for (int t = abs(nHeight) - 1; t >= 0; t--)
{
for (int k = 0; k < nWidth / 2; k++)
pBufOut[k + (abs(nHeight) - 1 - t) * (nWidth / 2)] = pBuffer1[k + t * (nWidth / 2)];
}
pBufOut += nWidth * nHeight / 2;
for (int n = abs(nHeight) - 1; n >= 0; n--)
{
for (int k = 0; k < nWidth / 2; k++)
pBufOut[k + (abs(nHeight) - 1 - n) * (nWidth / 2)] = pBuffer2[k + n * (nWidth / 2)];
}
if (pBuffer1)
{
delete pBuffer1;
pBuffer1 = NULL;
}
if (pBuffer2)
{
delete pBuffer2;
pBuffer2 = NULL;
}
}
}
}
在第二种测试的情况是这样的。
1.mpg --> mpeg-1 Stream Splitter --> MPEG Video Decoder --> MyFilter --> ffdshow video encoder --> AVI Mux --> 30.avi
其中我看了,它们的链接的子类型也是RGB32的,但在MyFilter的Transform函数哪里要下面的处理才可以播放30.avi文件正常
HRESULT CContrast::Transform(IMediaSample *pIn, IMediaSample *pOut)
{
if (*(m_pInput->CurrentMediaType().Subtype()) == MEDIASUBTYPE_RGB32)
{
{
int nWidth = 0, nHeight = 0;
VIDEOINFO* pInfo = (VIDEOINFO*)m_pInput->CurrentMediaType().Format();
nWidth = pInfo->bmiHeader.biWidth;
nHeight = abs(pInfo->bmiHeader.biHeight);
BYTE* pBuffer = 0;
BYTE* pBufferOut = 0;
pIn->GetPointer(&pBuffer);
pOut->GetPointer(&pBufferOut);
RGBQUAD* pBuf = (RGBQUAD*)pBuffer;
RGBQUAD* pBufOut = (RGBQUAD*)pBufferOut;
int nBufferSize = nWidth * nHeight / 2;
RGBQUAD* pBuffer1 = new RGBQUAD[nBufferSize];
if (pBuffer1 == NULL)
{
return NOERROR; //虽然分配失败,但为了不影响播放,返回NOERROR,表示按原来来播放.
}
RGBQUAD* pBuffer2 = new RGBQUAD[nBufferSize];
if (pBuffer2 == NULL)
{
delete pBuffer1;
pBuffer1 = NULL;
return NOERROR;
}
for (int nIndex = 0; nIndex < nHeight; nIndex++)
{
for (int i = 0; i < nWidth / 2; i++)
pBuffer1[i + nIndex * (nWidth / 2)] = pBuf[i + nIndex * nWidth];
for (int j = 0; j < nWidth / 2; j++)
pBuffer2[j + nIndex * (nWidth / 2)] = pBuf[j + nWidth / 2 + nIndex * nWidth];
}
for (int t = 0; t < nHeight; t++)
{
for (int k = 0; k < nWidth / 2; k++)
pBufOut[k + t * (nWidth / 2)] = pBuffer2[k + t * (nWidth / 2)];
}
pBufOut += nWidth * nHeight / 2;
for (int n = 0; n < nHeight; n++)
{
for (int k = 0; k < nWidth / 2; k++)
pBufOut[k + n * (nWidth / 2)] = pBuffer1[k + n * (nWidth / 2)];
}
if (pBuffer1)
{
delete pBuffer1;
pBuffer1 = NULL;
}
if (pBuffer2)
{
delete pBuffer2;
pBuffer2 = NULL;
}
}
}
}
那我想请问的是,为什么它们的处理会不一样的?是否我某些情况没有考虑清楚?