home *** CD-ROM | disk | FTP | other *** search
- /*
- * 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
-
-