作者catyun ()
看板C_Sharp
标题Re: 能够显示YUV / RGB格式影像的code...
时间Sat Sep 18 03:56:25 2004
※ 引述《ithinkurdumb (Yankees Rule All)》之铭言:
: 我找了DirectX 9的SDK和MSDN Library,
: 但是没有找到相关的资料.
: 因为我对这些是初次接触,
: 能够麻烦你说的详细一些吗?
: 谢谢...:)
: ※ 引述《catyun ()》之铭言:
: : 你有连续播放的需求吗
: : 若要连续播放请用directx
: : 用gdi来画的话fps会很低
: : directdraw的surface可以吃YUV的资料的样子
: : 我之前是用Overlay..直接喂YUV资料进去就会显示出来了
你还没说你有没有要连续播放啊
若你只是要抓frame出来就不用directx了...粉麻烦
我这里有以前写的sample code...可以参考看看
主要是先把4:2:0转回4:4:4
再用线性转换公式把YUV转回RGB
clip()是用来保证转出来的pixel值在0~255间
//把4:2:0变到4:4:4
kdu_byte *buf = decompressor.get_frame();
kdu_byte *Uptr=buf+myDim.x*myDim.y;
kdu_byte *Vptr=buf+(myDim.x*myDim.y*5/4);
for(int j=0;j<myDim.y;j=j+2)
for(int i=0;i<myDim.x;i=i+2)
{
U[myDim.x*j+i]=*Uptr;
U[myDim.x*j+i+1]=*Uptr;
U[myDim.x*(j+1)+i]=*Uptr;
U[myDim.x*(j+1)+i+1]=*Uptr;
Uptr++;
V[myDim.x*j+i]=*Vptr;
V[myDim.x*j+i+1]=*Vptr;
V[myDim.x*(j+1)+i]=*Vptr;
V[myDim.x*(j+1)+i+1]=*Vptr;
Vptr++;
}
//转换回RGB并显示在萤幕上(BCB)
mybitmap->Width=myDim.x;
mybitmap->Height=myDim.y;
mybitmap->PixelFormat=pf24bit;
float R,G,B;
for (int y=0; y < myDim.y;y++)
{
Byte *ptr=(byte *)mybitmap->ScanLine[y];
for (int x=0; x < myDim.x;x++)
{
//clock_t t_time=clock();
R=clip(buf[x+y*myDim.x]+2.032*(V[x+y*myDim.x]-128));
G=clip(buf[x+y*myDim.x]-0.395*(U[x+y*myDim.x]-128)-0.581*(V[x+y*my
Dim.x]-128));
B=clip(buf[x+y*myDim.x]+1.140*(U[x+y*myDim.x]-128));
//file_time += ((double)(clock()-t_time)) / CLOCKS_PER_SEC;
ptr[x*3]=B;
ptr[x*3+1]=G;
ptr[x*3+2]=R;
}
}
directx比较困难,我之前是用directdraw建立surface,fourcc指定为YV12
然後把YUV的资料直接搬到surface的记忆体中,就显示在萤幕上了
连续frame播放也很快,用上面这种GDI的方法的话
fps大概十张上下吧(P4-2.8G)
用directx的话,视你decoder而定,到上百张也都可能
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.166.171.177