This is decoders.h in view mode; [Download] [Up]
/* * Copyright (c) 1992 The Regents of the University of California. * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice and the following * two paragraphs appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. */ /* * decoders.h * * This file contains the declarations of structures required for Huffman * decoding * */ /* Include util.h for bit i/o parsing macros. */ #include "util.h" /* Code for unbound values in decoding tables */ #define ERROR -1 #define DCT_ERROR 63 #define MACRO_BLOCK_STUFFING 34 #define MACRO_BLOCK_ESCAPE 35 /* Two types of DCT Coefficients */ #define DCT_COEFF_FIRST 0 #define DCT_COEFF_NEXT 1 /* Special values for DCT Coefficients */ #define END_OF_BLOCK 62 #define ESCAPE 61 /* Structure for an entry in the decoding table of * macroblock_address_increment */ typedef struct { unsigned int value; /* value for macroblock_address_increment */ int num_bits; /* length of the Huffman code */ } mb_addr_inc_entry; /* Decoding table for macroblock_address_increment */ mb_addr_inc_entry mb_addr_inc[2048]; /* Structure for an entry in the decoding table of macroblock_type */ typedef struct { unsigned int mb_quant; /* macroblock_quant */ unsigned int mb_motion_forward; /* macroblock_motion_forward */ unsigned int mb_motion_backward; /* macroblock_motion_backward */ unsigned int mb_pattern; /* macroblock_pattern */ unsigned int mb_intra; /* macroblock_intra */ int num_bits; /* length of the Huffman code */ } mb_type_entry; /* Decoding table for macroblock_type in predictive-coded pictures */ mb_type_entry mb_type_P[64]; /* Decoding table for macroblock_type in bidirectionally-coded pictures */ mb_type_entry mb_type_B[64]; /* Structures for an entry in the decoding table of coded_block_pattern */ typedef struct { unsigned int cbp; /* coded_block_pattern */ int num_bits; /* length of the Huffman code */ } coded_block_pattern_entry; /* External declaration of coded block pattern table. */ extern coded_block_pattern_entry coded_block_pattern[512]; /* Structure for an entry in the decoding table of motion vectors */ typedef struct { int code; /* value for motion_horizontal_forward_code, * motion_vertical_forward_code, * motion_horizontal_backward_code, or * motion_vertical_backward_code. */ int num_bits; /* length of the Huffman code */ } motion_vectors_entry; /* Decoding table for motion vectors */ motion_vectors_entry motion_vectors[2048]; /* Structure for an entry in the decoding table of dct_dc_size */ typedef struct { unsigned int value; /* value of dct_dc_size (luminance or chrominance) */ int num_bits; /* length of the Huffman code */ } dct_dc_size_entry; /* External declaration of dct dc size lumiance table. */ extern dct_dc_size_entry dct_dc_size_luminance[128]; /* External declaration of dct dc size chrom table. */ extern dct_dc_size_entry dct_dc_size_chrominance[256]; /* DCT coeff tables. */ #define RUN_MASK 0xfc00 #define LEVEL_MASK 0x03f0 #define NUM_MASK 0x000f #define RUN_SHIFT 10 #define LEVEL_SHIFT 4 /* External declaration of dct coeff tables. */ extern unsigned short int dct_coeff_tbl_0[256]; extern unsigned short int dct_coeff_tbl_1[16]; extern unsigned short int dct_coeff_tbl_2[4]; extern unsigned short int dct_coeff_tbl_3[4]; extern unsigned short int dct_coeff_next[256]; extern unsigned short int dct_coeff_first[256]; #define DecodeDCTDCSizeLum(macro_val) \ { \ unsigned int index; \ \ show_bits7(&index); \ \ *(macro_val) = dct_dc_size_luminance[index].value; \ \ flush_bits(dct_dc_size_luminance[index].num_bits); \ } #define DecodeDCTDCSizeChrom(macro_val) \ { \ unsigned int index; \ \ show_bits8(&index); \ \ *(macro_val) = dct_dc_size_chrominance[index].value; \ \ flush_bits(dct_dc_size_chrominance[index].num_bits); \ } #define DecodeDCTCoeff(type, run, level) \ { \ unsigned int temp_run, index, temp_level, num_bits; \ unsigned short int *dct_coeff_tbl; \ unsigned int value; \ \ show_bits8(&index); \ if (type == DCT_COEFF_FIRST) \ dct_coeff_tbl = dct_coeff_first; \ else \ dct_coeff_tbl = dct_coeff_next; \ \ if (index > 3) { \ value = dct_coeff_tbl[index]; \ temp_run = (value & RUN_MASK) >> RUN_SHIFT; \ if (temp_run == END_OF_BLOCK) { \ *run = END_OF_BLOCK; \ *level = END_OF_BLOCK; \ } \ else { \ num_bits = (value & NUM_MASK) + 1; \ flush_bits(num_bits); \ if (temp_run != ESCAPE) { \ value = dct_coeff_tbl[index]; \ temp_level = (value & LEVEL_MASK) >> LEVEL_SHIFT; \ *run = temp_run; \ get_bits1(&value); \ *level = value ? -temp_level : temp_level; \ } \ else { /* temp_run == ESCAPE */ \ get_bits6(run); \ get_bits8(&temp_level); \ if (temp_level != 0 && temp_level != 128) \ *level = ((int) (temp_level << 24)) >> 24; \ else if (temp_level == 0) { \ get_bits8(&temp_level); \ *level = temp_level; \ assert(*level >= 128); \ } \ else { \ get_bits8(&temp_level); \ *level = temp_level - 256; \ assert(*level <= -128 && *level >= -255); \ } \ } \ } \ } \ else { \ if (index == 2) { \ show_bits10(&index); \ value = dct_coeff_tbl_2[index & 3]; \ } \ else if (index == 3) { \ show_bits10(&index); \ value = dct_coeff_tbl_3[index & 3]; \ } \ else if (index == 1) { \ show_bits12(&index); \ value = dct_coeff_tbl_1[index & 15]; \ } \ else { /* index == 0 */ \ show_bits16(&index); \ value = dct_coeff_tbl_0[index & 255]; \ } \ *run = (value & RUN_MASK) >> RUN_SHIFT; \ temp_level = (value & LEVEL_MASK) >> LEVEL_SHIFT; \ num_bits = (value & NUM_MASK) + 1; \ flush_bits(num_bits); \ get_bits1(&value); \ *level = value ? -temp_level : temp_level; \ } \ } #define DecodeDCTCoeffFirst(runval, levelval) \ { \ DecodeDCTCoeff(DCT_COEFF_FIRST, runval, levelval); \ } #define DecodeDCTCoeffNext(runval, levelval) \ { \ DecodeDCTCoeff(DCT_COEFF_NEXT, runval, levelval); \ }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.