一直想用6410的jpg解码器替换wince的解码器,这几天终于有时间,弄了一下。过程不是太复杂,大致如下:
1.从wince自带的decoder例子开始,主要是修改renderImage部分。
2.注册表的配置,因为wince的例子没有注册表配置,所以这部分花了不少时间。
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\imaging\codecs]
"_LastCookie"=dword:00000001
[HKEY_LOCAL_MACHINE\Software\Microsoft\Imaging\Codecs\s3c6410 jpeg Decoder]
"MIME Type"="image/jpeg"
"Filename Extension"="*.jpg"
"File Type Description"="JPEG file"
"DLLNAME"="imgcodec"
"Signature Mask"=hex:\
ff,ff ;SigMask
"Signature Pattern"=hex:\
ff,d8 ;SigPattern
"Signature Size"=dword:2
"Signature Count"=dword:1
"Format ID"= hex:\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
; AE,3C,6B,B9,28,07,D3,11,9D,7B,00,00,F8,1E,F3,2E
;"{b96b3cae-0728-11d3-9d7b-0000f81ef32e}" ;ImageFormatJPEG
"CLSID"= hex:\
FA,80,A2,80,A3,C2,0c,4E,98,BF,67,32,9B,22,FD,BF
;"{80A280FA-C2A3-4e0c-98BF-67329B22FDBF}" ;CLSID_JPEGDecoder
"Flags"=dword:00020022
"Version"=dword:1
"_InfoSize"=dword:d0
微软的文档上没有提到_LastCookie,一开始没设置_LastCookie,结果总是用系统的解码器。
3.在测试时发再现,解了几十幅图后,就出错了。经过一下午的郁闷,终于找到原因:
在jpeg驱动中,VirtualAllocCopyEx与VirtualFreeEx的用法出现问题。
开始是VirtualFreeEx(JPGRegCtx->callerProcess, // HANDLE hProcess
JPGRegCtx->strUserBuf,
JPG_STREAM_BUF_SIZE,
MEM_DECOMMIT);
好象并没有真正释放虚拟内存,最后导制VirtualAllocCopyEx出错.
改成VirtualFreeEx(JPGRegCtx->callerProcess, // HANDLE hProcess
(UINT32)JPGRegCtx->strUserBuf& ~VM_BLOCK_OFST_MASK,
0,
MEM_RELEASE);
后问题解决了。