一直想用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);

后问题解决了。