由于XVID采用VFW是可安装型驱动程序,因此它是核心态工作的动态连接库。每个可安装型驱动程序需要输出DriverProc函数。这个函数接收来自操作系统的各种设备驱动消息,根据设备驱动消息不同,对设备执行不同的操作或向应用程序提供需要的信息。系统发送给DriverProc函数的主要消息如下:
DRV_CLOSE 当驱动程序实例被关闭时,发送此消息。
DRV_OPEN 打开VFW驱动程序。
下面就是跟压缩和解压有关的消息:
ICM_ABOUT
ICM_COMPRESS
ICM_COMPRESS_BEGIN
ICM_COMPRESS_END
ICM_COMPRESS_FRAMES_INFO
ICM_COMPRESS_GET_FORMAT
ICM_COMPRESS_GET_SIZE
ICM_COMPRESS_QUERY
ICM_CONFIGURE
ICM_DECOMPRESS
ICM_DECOMPRESS_BEGIN
ICM_DECOMPRESS_END
ICM_DECOMPRESS_GET_FORMAT
ICM_DECOMPRESS_GET_PALETTE
ICM_DECOMPRESS_QUERY
ICM_DECOMPRESS_SET_PALETTE
ICM_DECOMPRESSEX
ICM_DECOMPRESSEX_BEGIN
ICM_DECOMPRESSEX_END
ICM_DECOMPRESSEX_QUERY
ICM_GET
ICM_GETBUFFERSWANTED
ICM_GETDEFAULTKEYFRAMERATE
ICM_GETDEFAULTQUALITY
ICM_GETINFO
ICM_GETQUALITY
ICM_GETSTATE
ICM_SET_STATUS_PROC
ICM_SETQUALITY
ICM_SETSTATE
VFW处理程序,就是实现这些消息的响应,然后调用XVID的接口。
在VFW里的流程是这样的:
开始接收到DRV_OPEN消息,创建XVID的CODEC的对象,然后就接收到与输入要压缩数据的格式、大小等等消息,还有输出的格式、大小。
接着下来就会收到压缩开始消息ICM_COMPRESS_BEGIN,在这个消息里需要调用XVID压缩相关的函数,进行压缩初始化工作。
然后不断地接收到ICM_COMPRESS消息,每帧数据都发送这条消息过来,然后就调用XVID的压缩函数进行压缩每帧数据。
最后,没有数据压缩,就会发送ICM_COMPRESS_END消息,这时就需要删除所有创建对象,并调用XVID的函数来清除XVID使用的对象。
当用电视卡录下世界杯的AVI文件时,就可以通过调用VFW的驱动程序来压缩数据了。一般每秒钟都有25帧,每秒钟的视频就需要发送25条ICM_COMPRESS消息。
VFW驱动程序里,还有一部份内容是读取和保存XVID的配置参数。可以根据用户设置参数保存起来,方便用户,不用每次都需要配置一次参数。