我使用 WIC 制作了一个编码器。然后我尝试在最耗时的部分使用线程。这是
/*Encodes a bitmap source*/
hr = piBitmapFrame->WriteSource(
piBitmapSrc, /*bitmap source*/
rc /*area which need to be wrote*/
);
piBitmapSrc → WICBitmap
rc → WICRect,矩形区域做的工作
这就是我尝试的方式。
HRESULT writeSrc(
IWICBitmapFrameEncode *piBitmapFrame,
IWICBitmap *piBitmapSrc,
WICRect *rc
)
{
/*Encodes a bitmap source*/
hr = piBitmapFrame->WriteSource(
piBitmapSrc, /*bitmap source*/
rc /*area which need to be wrote*/
);
return hr;
}
然后我这样称呼它
const int numberOfThreads = 4;
std::thread t[numberOfThreads];
int ht = (lHeight / numberOfThreads);
WICRect rc;
rc.X = 0;
rc.Height = ht;
rc.Width = lWidth;
rc.Y = 0;
t[0] = std::thread(writeSrc, piBitmapFrame, piBitmapSrc, &rc);
rc.Y += ht;
t[1] = std::thread(writeSrc, piBitmapFrame, piBitmapSrc, &rc);
rc.Y += ht;
t[2] = std::thread(writeSrc, piBitmapFrame, piBitmapSrc, &rc);
rc.Y += ht;
rc.Height = (lHeight - (3*ht));
t[3] = std::thread(writeSrc, piBitmapFrame, piBitmapSrc, &rc);
t[0].join();
t[1].join();
t[2].join();
t[3].join();
问题是,piBitmapFrame->WriteSource()
调用了 4 次,但只有 1 次返回 S_OK。其他 3 个返回以下错误代码
WINCODEC_ERR_STREAMWRITE
或者
WINCODEC_ERR_CODECTOOMANYSCANLINES
这是为什么。以及我如何正确使用线程来做到这一点