List: linux-video Subject: Winnov hardware compression From: Bill Dirks <bdirks () micron ! com> Date: 1999-10-21 19:57:39 [Download message RAW] Here are some more details about Winnov hardware compression. I haven't made it available to applications yet, but I'm working on it. Maybe in a few days. At least this gives some understanding of how it works. Bill. Winnov WAVI Hardware Compression As Applied in the Linux Drivers WAVI is the chip designed by Winnov that the Videum series products are based on. WAVI captures data from the video decoder chip and stores it in the on-board SRAM in one of the several video data formats that it can do. The Linux driver uses five video data format modes of the WAVI when capturing in its compressed mode: DH7, DH6, DH5, DH4, and YCQ. DH7, DH6, DH5, and DH4 are the Delta-Huffman variable- length compressed formats. These formats compress YUV 4:2:2 data using variable-length codes. The uncompressed 4:2:2 data is 8 bits per component, and stores two pixel values using two Y values, one U value and one V value. The Ys and U/Vs alternate like this: Y-U-Y-V-Y-U-Y-V-Y-U-Y-V--.... Without compression, the data requires 16 bits per pixel. The compressed format turns each one of those components into a variable-length code. The process is as follows: 1. The data values are truncated to 7 (DH7), 6 (DH6), 5 (DH5) or 4 (DH4) bits by discarding the low-order bits. 2. The result is compared with the previous value of the component, and the delta is computed by subtracting the previous value (delta = value - previous_value). A Y value is compared with the previous Y value, a U value is compared with the previous U value, and V with previous V. The very first Y, U and V of a video field image is compared with zero. 3. If the delta is a positive value greater than 7, or a negative value less than -7, then the delta is discarded, and the absolute (truncated) value of the component is stored, prefixed by 8 1-bits. Otherwise the delta is converted to a variable-length code by the following table. CODE DELTA MSB.........LSB 001111111 +7 00111111 +6 0011111 +5 001111 +4 00111 +3 0011 +2 001 +1 0 0 101 -1 1011 -2 10111 -3 101111 -4 1011111 -5 10111111 -6 101111111 -7 xxxx11111111 X DH4 absolute value, not a delta xxxxx11111111 X DH5 absolute value, not a delta xxxxxx11111111 X DH6 absolute value, not a delta xxxxxxx11111111 X DH7 absolute value, not a delta Successive codes are assembled into longer words from LSB to MSB. For example, the code sequence (+3), (-2), (-4), (0) becomes 16 bits like this: MSB LSB 0 101111 1011 00111 (0) (-4) (-2) (+3) So you read the codes from LSB to MSB. You could call it a little-endian system. The decompression algorithm should be obvious. If the next 8 bits are all 1's then it is an absolute code. Get the value from the bits following the 8 1's. Otherwise it is a delta code. Convert the code to a delta value and add it to the previous value. Fill in the LSBs of each output value with 0's to make it 8 bits. This compression scheme is lossy. The loss occurs at the first step where the data are truncated. The variable-length encoding and decoding is lossless. This scheme preserves spacial resolution (there is no blurring effect) because it encodes each pixel individually. It's a good choice for capturing raw video disk to save space while preserving quality. The best case compression rate is when all the deltas are zero which results in 2 bits per pixel. Typical is more like 4 to 7 bits per pixel. It depends on the dimensions of the image (bigger images get better compression because adjacent pixels are more similar) and on the content of the image. Bad compression cases can cause the compressed data to grow quite large if there are a lot of absolute codes. An example is the "snow" you get with bad TV reception. If the image data grows too big for the SRAM, then it becomes impossible to capture images. To deal with that, the driver has a worst case fall-back mode. When the image can't be captured in compressed mode, the driver captures it in YCQ at half the vertical resolution. YCQ is a quantized YUV 4:1:1 format. Each 32 bits of data contains four pixels: four 5-bit Y values, one 6-bit U value and one 6-bit V value. That results in 8 bits per pixel. Reducing the vertical resolution by half gives an effective 4 bits per pixel, with some loss of spacial resolution. The driver will only capture images that are guaranteed to fit in SRAM at 4 bits per pixel. Each 32-bit word of YCQ data is formatted like this: MSB LSB VVVVVVdddddcccccUUUUUUbbbbbaaaaa Where a, b, c, and d are the Y values, and U and V are the U and V values. -- To unsubscribe: mail video4linux-list-request@redhat.com with "unsubscribe" as the Subject.