Last Revision Date: 6/11/2014
This article describes why an image stream may become divided in two and the frame rate halved when manipulating the CURRENT_FRAME_RATE register of a camera on a bus configured with the FirePRO driver.
This issue, as shown in the image below acquired using the FlyCap demo program, occurs under very specific circumstances:
- The camera is connected to an IEEE-1394b card that is using the FirePRO driver (pgr1394.sys); and
- The camera is currently streaming isochronous data to the host system; and
- The CURRENT_FRAME_RATE register 0x600 is manipulated in the manner described in the section "Problems Maximizing Frame Rates" of Maximum number of IEEE-1394 cameras on a single 1394 bus
This problem can occur when the FirePRO driver operates in "packet-per-buffer" mode. In this mode, each incoming isochronous data packet is DMA'ed into its own piece of memory that is exactly the size of one packet. If the packet is bigger, the remainder is dropped. This is a different mode than that used by the standard PGRCAM camera driver, which uses a "buffer fill" mechanism. When using buffer fill mode, this problem does not occur. The Microsoft low-level 1394 drivers support both packet-per-buffer and buffer fill modes. Later versions of the FirePRO driver operate in buffer fill mode by default.
In the case of the image shown above, the frames rates being used result in a packet size that is equal to one line of the image. This causes the image to look like it is squashed vertically.
When to Use Packet-Per-Buffer Mode
The main advantage of the packet-per-buffer mode is that it allows you to view errors that occur on the IEEE-1394b card while streaming video.
Switching Between Modes
Versions 1.6rc15 and later of the FlyCapture SDK implement a Windows registry entry that allows users to toggle between packet-per-buffer and buffer fill mode. The registry key is:
Each ...\XXXX\... value represents an entry for an individual FireWire bus.
When this registry value is set to '1' the PGRPRO driver will operate in buffer fill mode; if it is set to '0' it will operate in packet-per-buffer mode.
A system reboot is required for the new settings to take effect.