YUVviewer有原始的版本和Plus版本,作者应该是Peter Lee。这两个,源码网上只找到过原版的,Plus的只有exe。跑了一遍ballroom,发现最后显示的帧数是248.
按照640(宽)*480(高)*1.5(考虑UV)*248(帧数)=114, 278 ,400,与文件大小( 115 ,200,000)相比较,明显少掉一块。YUV文件不应该是只包含数据,没有其他冗余信息么,也不应该有文件头什么的。115 ,200,000对应的应该是250帧。
后来我用MATLAB实现了播放,250帧都可以播放的。于是认定YUVviewer有bug,源码里找啊找,先是发现了一处
pWin->m_pFile[i]->Seek(g_nCurrentFrame*picsize*3/2, CFile::begin);
3/2,后来发现picsize是亮度的大小,所以要乘以3/2.
又去寻找CFile上的问题,发现打开的时候,没有用二进制模式,于是又加上了CFile::modeRead |CFile::typeBinary。跑出来的结果,还是一样。
不过这次细心了,发现窗口标题上,是从0开始的,0到248,意味着有249帧。奇怪,还有一帧呢?
我一度以为,打开文件的时候,就已经出现了一个窗口,显示出图像了,所以,这实际上是第一帧,而后面又是从0开始编号,所以就只能编到248了!但是读代码的结果,发现直接play的时候,实际g_nCurrentFrame是等于0的,所有是从头开始的。所有这种假设不成立。
然后就加入几句话把g_nCurrentFrame的值和pWin->m_pWnd[i]->nPicShowOrder的值打出来,窗口标题显示的就是pWin->m_pWnd[i]-&g