/* * 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 { char value; /* value for macroblock_address_increment (was unsigned !) */ char num_bits; /* length of the Huffman code */ } mb_addr_inc_entry; /* Decoding table for macroblock_address_increment */ extern mb_addr_inc_entry mb_addr_inc[2048]; /* Structure for an entry in the decoding table of macroblock_type */ typedef struct { char data; /* quant motion_forward motion_backward pattern intra */ char num_bits; /* length of the Huffman code */ } mb_type_entry; #define MB_quant 8 #define MB_motion_forw 4 #define MB_motion_back 2 #define MB_pattern 1 /* Decoding table for macroblock_type in intra-coded pictures */ extern mb_type_entry mb_type_I[4]; /* Decoding table for macroblock_type in predictive-coded pictures */ extern mb_type_entry mb_type_P[64]; /* Decoding table for macroblock_type in bidirectionally-coded pictures */ extern mb_type_entry mb_type_B[64]; /* Structure for an entry in the decoding table of motion vectors */ typedef struct { char code; /* value for motion_horizontal_forward_code, * motion_vertical_forward_code, * motion_horizontal_backward_code, or * motion_vertical_backward_code. */ char num_bits; /* length of the Huffman code */ } motion_vectors_entry; /* Decoding table for motion vectors */ extern motion_vectors_entry motion_vectors[2048]; /* 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]; /* *-------------------------------------------------------------- * * DecodeDCTDCSizeLum -- * * Huffman Decoder for dct_dc_size_luminance; location where * the result of decoding will be placed is passed as argument. * The decoded values are obtained by doing a table lookup on * dct_dc_size_luminance. * * Results: * The decoded value for dct_dc_size_luminance or ERROR for * unbound values will be placed in the location specified. * * Side effects: * Bit stream is irreversibly parsed. * *-------------------------------------------------------------- */ #define DecodeDCTDCSizeLum(macro_val) macro_val = s_DecodeDCTDCSizeLum() /* *-------------------------------------------------------------- * * DecodeDCTDCSizeChrom -- * * Huffman Decoder for dct_dc_size_chrominance; location where * the result of decoding will be placed is passed as argument. * The decoded values are obtained by doing a table lookup on * dct_dc_size_chrominance. * * Results: * The decoded value for dct_dc_size_chrominance or ERROR for * unbound values will be placed in the location specified. * * Side effects: * Bit stream is irreversibly parsed. * *-------------------------------------------------------------- */ #define DecodeDCTDCSizeChrom(macro_val) macro_val = s_DecodeDCTDCSizeChrom() /* *-------------------------------------------------------------- * * decodeDCTCoeff -- * * Huffman Decoder for dct_coeff_first and dct_coeff_next; * locations where the results of decoding: run and level, are to * be placed and also the type of DCT coefficients, either * dct_coeff_first or dct_coeff_next, are being passed as argument. * * The decoder first examines the next 8 bits in the input stream, * and perform according to the following cases: * * '0000 0000' - examine 8 more bits (i.e. 16 bits total) and * perform a table lookup on dct_coeff_tbl_0. * One more bit is then examined to determine the sign * of level. * * '0000 0001' - examine 4 more bits (i.e. 12 bits total) and * perform a table lookup on dct_coeff_tbl_1. * One more bit is then examined to determine the sign * of level. * * '0000 0010' - examine 2 more bits (i.e. 10 bits total) and * perform a table lookup on dct_coeff_tbl_2. * One more bit is then examined to determine the sign * of level. * * '0000 0011' - examine 2 more bits (i.e. 10 bits total) and * perform a table lookup on dct_coeff_tbl_3. * One more bit is then examined to determine the sign * of level. * * otherwise - perform a table lookup on dct_coeff_tbl. If the * value of run is not ESCAPE, extract one more bit * to determine the sign of level; otherwise 6 more * bits will be extracted to obtain the actual value * of run , and then 8 or 16 bits to get the value of level. * * * * Results: * The decoded values of run and level or ERROR for unbound values * are placed in the locations specified. * * Side effects: * Bit stream is irreversibly parsed. * *-------------------------------------------------------------- */ #define DecodeDCTCoeff(dct_coeff_tbl, run, level) run = s_DecodeDCTCoeff(dct_coeff_tbl, &level) /* *-------------------------------------------------------------- * * decodeDCTCoeffFirst -- * * Huffman Decoder for dct_coeff_first. Locations for the * decoded results: run and level, are being passed as * arguments. Actual work is being done by calling DecodeDCTCoeff, * with the table dct_coeff_first. * * Results: * The decoded values of run and level for dct_coeff_first or * ERROR for unbound values are placed in the locations given. * * Side effects: * Bit stream is irreversibly parsed. * *-------------------------------------------------------------- */ #define DecodeDCTCoeffFirst(runval, levelval) DecodeDCTCoeff(dct_coeff_first, runval, levelval) /* *-------------------------------------------------------------- * * decodeDCTCoeffNext -- * * Huffman Decoder for dct_coeff_first. Locations for the * decoded results: run and level, are being passed as * arguments. Actual work is being done by calling DecodeDCTCoeff, * with the table dct_coeff_next. * * Results: * The decoded values of run and level for dct_coeff_next or * ERROR for unbound values are placed in the locations given. * * Side effects: * Bit stream is irreversibly parsed. * *-------------------------------------------------------------- */ #define DecodeDCTCoeffNext(runval, levelval) DecodeDCTCoeff(dct_coeff_next, runval, levelval); /* *-------------------------------------------------------------- * * DecodeMotionVectors -- * * Huffman Decoder for the various motion vectors, including * motion_horizontal_forward_code, motion_vertical_forward_code, * motion_horizontal_backward_code, motion_vertical_backward_code. * Location where the decoded result will be placed is being passed * as argument. The decoded values are obtained by doing a table * lookup on motion_vectors. * * Results: * The decoded value for the motion vector or ERROR for unbound * values will be placed in the location specified. * * Side effects: * Bit stream is irreversibly parsed. * *-------------------------------------------------------------- */ #ifdef NO_SANITY_CHECKS #define DecodeMotionVectors(value) value = sn_get_byte_huff(11, (short*)motion_vectors) #else #define DecodeMotionVectors(value) value = s_get_byte_huff(11, (short*)motion_vectors) #endif /* *-------------------------------------------------------------- * * DecodeMBAddrInc -- * * Huffman Decoder for macro_block_address_increment; the location * in which the result will be placed is being passed as argument. * The decoded value is obtained by doing a table lookup on * mb_addr_inc. * * Results: * The decoded value for macro_block_address_increment or ERROR * for unbound values will be placed in the location specified. * * Side effects: * Bit stream is irreversibly parsed. * *-------------------------------------------------------------- */ #ifdef NO_SANITY_CHECKS #define DecodeMBAddrInc(value) value = sn_get_byte_huff(11, (short*)mb_addr_inc) #else #define DecodeMBAddrInc(value) value = s_get_byte_huff(11, (short*)mb_addr_inc) #endif /* *-------------------------------------------------------------- * * DecodeMBTypeB -- * * Huffman Decoder for macro_block_type in bidirectionally-coded * pictures;locations in which the decoded results: macroblock_quant, * macroblock_motion_forward, macro_block_motion_backward, * macroblock_pattern, macro_block_intra, will be placed are * being passed as argument. The decoded values are obtained by * doing a table lookup on mb_type_B. * * Results: * The various decoded values for macro_block_type in * bidirectionally-coded pictures or ERROR for unbound values will * be placed in the locations specified. * * Side effects: * Bit stream is irreversibly parsed. * *-------------------------------------------------------------- */ #ifdef NO_SANITY_CHECKS #define DecodeMBTypeB(data, intra) data=sn_get_bits_huff(6, &intra, (short*)mb_type_B) #else #define DecodeMBTypeB(data, intra) data=s_get_bits_huff(6, &intra, (short*)mb_type_B) #endif /* *-------------------------------------------------------------- * * DecodeMBTypeI -- * * Huffman Decoder for macro_block_type in intra-coded pictures; * locations in which the decoded results: macroblock_quant, * macroblock_motion_forward, macro_block_motion_backward, * macroblock_pattern, macro_block_intra, will be placed are * being passed as argument. * * Results: * The various decoded values for macro_block_type in intra-coded * pictures or ERROR for unbound values will be placed in the * locations specified. * * Side effects: * Bit stream is irreversibly parsed. * *-------------------------------------------------------------- */ #ifdef NO_SANITY_CHECKS #define DecodeMBTypeI(data, intra) data=sn_get_bits_huff(2, &intra, (short*)mb_type_I) #else #define DecodeMBTypeI(data, intra) data=s_get_bits_huff(2, &intra, (short*)mb_type_I) #endif /* *-------------------------------------------------------------- * * DecodeMBTypeP -- * * Huffman Decoder for macro_block_type in predictive-coded pictures; * locations in which the decoded results: macroblock_quant, * macroblock_motion_forward, macro_block_motion_backward, * macroblock_pattern, macro_block_intra, will be placed are * being passed as argument. The decoded values are obtained by * doing a table lookup on mb_type_P. * * Results: * The various decoded values for macro_block_type in * predictive-coded pictures or ERROR for unbound values will be * placed in the locations specified. * * Side effects: * Bit stream is irreversibly parsed. * *-------------------------------------------------------------- */ #ifdef NO_SANITY_CHECKS #define DecodeMBTypeP(data, intra) data=sn_get_bits_huff(6,&intra, (short*)mb_type_P) #else #define DecodeMBTypeP(data, intra) data=s_get_bits_huff(6,&intra, (short*)mb_type_P) #endif /* *-------------------------------------------------------------- * * DecodeCBP -- * * Huffman Decoder for coded_block_pattern; location in which the * decoded result will be placed is being passed as argument. The * decoded values are obtained by doing a table lookup on * coded_block_pattern. * * Results: * The decoded value for coded_block_pattern or ERROR for unbound * values will be placed in the location specified. * * Side effects: * Bit stream is irreversibly parsed. * *-------------------------------------------------------------- */ #ifdef NO_SANITY_CHECKS #define DecodeCBP(coded_bp) coded_bp = sn_DecodeCBP() #else #define DecodeCBP(coded_bp) coded_bp = s_DecodeCBP() #endif