vld.c
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:24k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #include "hxtypes.h"
  36. //#include <stdio.h>
  37. //#include <stdlib.h>
  38. //#include <string.h>
  39. //#include <ctype.h>
  40. #include "dllindex.h"
  41. #include "h261defs.h"
  42. #include "h261func.h"
  43. #include "vldstate.h"
  44. #include "vldtabs.h"
  45. #include "vld.h"
  46. #include "machine.h"
  47. #include "hvutils.h"
  48. #include "h263plus.h"
  49. #if defined(_WINDOWS)
  50. #include "hxstrutl.h"
  51. #endif /* _WINDOWS */
  52. static int buildtable( int minBits, struct vlc_entry input[], DECTABENTRY output[DECTABSIZE]);
  53. static int parse_bits(  char vlc[],     /* String with bit pattern */
  54.                         int strmax,     /* Max characters in "vlc" excluding terminating null */
  55.                         int maxbits,    /* Max # bits in codeword */
  56.                         int * bits,     /* Returns # bits; 0 < bits < maxbits+1 */
  57.                         int * codeword, /* Returns codeword */
  58.                         int minBits     // Min # bits in codeword
  59. );
  60. //  Get8Bits - return next 8 bits from bitstream
  61. extern U8 Get8Bits( BS_PTR bs)
  62. {
  63.     int k;
  64.     k = (*bs.byteptr << 8) | *(bs.byteptr + 1);
  65.     return (k >> (8 - bs.bitptr));
  66. }
  67. //  IncBsPtr - Increment (or decrement) bitstream pointer
  68. extern void IncBsPtr( BS_PTR * bs, int incr)
  69. {
  70.     bs->bitptr += incr;
  71.     while (bs->bitptr > 7) {
  72.        ++(bs->byteptr);
  73.         bs->bitptr -= 8;
  74.     }
  75.     while (bs->bitptr < 0) {
  76.         --(bs->byteptr);
  77.         bs->bitptr += 8;
  78.     }
  79.     return;
  80. }
  81. // FLDecSymbol - Decode fixed length symbol of length "bits"
  82. // Return values:   1   OK: successful decoding; symbol returned in "value"
  83. //                  0   OUT_OF_BITS: consumed more than "numBits"; returning numBits < 0
  84. extern int FLDecSymbol( BS_PTR * bs,        // Bitstream pointer; incremented by this routine
  85.                         int bits,           // Symbol length
  86.                         int * numBits,      // Max # bits to decode; decremented by this routine
  87.                         int * value         // Returns decoded symbol
  88.                         )
  89. {
  90.     *value = 0;
  91.     while (bits > 8) {
  92.         *value |= Get8Bits( *bs ) << (bits - 8);
  93.         bits -= 8;
  94.         *numBits -= 8;
  95.         ++bs->byteptr;
  96.     }
  97.     *value |= Get8Bits( *bs ) >> (8 - bits);
  98.     *numBits -= bits;       // Subtract parsed bits
  99.     IncBsPtr( bs, bits);    // Advance bitpointer
  100.     //printf("FLDecSymbol: value = %2xn", *value );
  101.     if (*numBits < 0) {
  102.         return (OUT_OF_BITS);
  103.     }
  104.     return( OK );
  105. }
  106. // VLDecSymbol - Decode variable length symbol using dectable[tabNum]
  107. // Return values:   1   OK: successful decoding; symbol returned in sym
  108. //                  0   OUT_OF_BITS: consumed more than "numBits"; returning numBits < 0
  109. //                  -1  ILLEGAL_SYMBOL: bitstream error
  110. //                  -2  ILLEGAL_STATE: internal program error
  111. //                  -3  FINISHED_LAST_BLOCK: reached state ST263_FINISHED (program
  112. //                      error for this routine)
  113. extern int VLDecSymbol( BS_PTR * bs,        // Bitstream pointer; incremented by this routine
  114.                         int tabNum,         // Use dectable[tabNum] for decoding
  115.                         int * numBits,      // Max # bits to decode; decremented by this routine
  116.                         SYMBOL * sym        // Returns decoded symbol
  117.                         )
  118. {
  119.     DECTABENTRY * entry;
  120.     /*printf( "Entered VLDecSymbol: bitstream = %2x %2x %2x %2x  bitptr = %dn",
  121.             *bs->byteptr, *(bs->byteptr + 1), *(bs->byteptr + 2),
  122.             *(bs->byteptr + 3), bs->bitptr);*/
  123.             
  124.     entry = &dectable [tabNum] [Get8Bits( *bs )];
  125.     while (entry->bits < 0) {   // Long codeword; sym.value indicates table */
  126.         *numBits += entry->bits;        // Subtract parsed bits
  127.         IncBsPtr( bs, -entry->bits);    // Advance bitpointer
  128.         //printf("VLDecSymbol - long symbol: "); printsym( entry->sym ); printf("n");
  129.         entry = &dectable [ entry->sym.value ] [Get8Bits( *bs )];
  130.     }
  131.     *numBits -= entry->bits;        // Subtract parsed bits
  132.     IncBsPtr( bs, entry->bits);     // Advance bitpointer
  133.     /*{
  134.         //int input;
  135.         printf("VLDecSymbol: "); printsym( entry->sym ); printf("n");
  136.         printf("  Cont? (<0 to exit): ");
  137.         scanf("%d", &input);
  138.         if (input < 0) exit(0);
  139.     }*/
  140.     if (entry->sym.type  ==  SYM_EXIT) {    // Premature exit
  141.         if (*numBits < 0) {
  142.             return (OUT_OF_BITS);
  143.         } else {
  144.             return (entry->sym.value);
  145.         }
  146.     }
  147.     *sym = entry->sym;
  148.     if (*numBits < 0) {
  149.         return (OUT_OF_BITS);
  150.     }
  151.     return( OK );
  152. }
  153. //  InitDecodeTable - Generate decoding tables
  154. extern void InitDecodeTable( void )
  155. {
  156.     int minBits;
  157.     
  158.     minBits = 1;    // Codeword strings need to be non-empty
  159.     buildtable( minBits, dct_next, dectable[TAB_DCT_NEXT]);
  160.     buildtable( minBits, dct_first, dectable[TAB_DCT_FIRST]);
  161.     buildtable( minBits, dct_00100, dectable[TAB_DCT_00100]);
  162.     buildtable( minBits, dct_000000, dectable[TAB_DCT_000000]);
  163.     buildtable( minBits, escape_run, dectable[TAB_ESCAPE_RUN]);
  164.     buildtable( minBits, escape_level, dectable[TAB_ESCAPE_LEVEL]);
  165.     buildtable( minBits, intra_dc, dectable[TAB_INTRA_DC]);
  166.     buildtable( minBits, last_intra_dc, dectable[TAB_LAST_INTRA_DC]);
  167.     buildtable( minBits, mba_startcode, dectable[TAB_MBA_STARTCODE]);
  168.     buildtable( minBits, long_mba, dectable[TAB_LONG_MBA]);
  169.     buildtable( minBits, long_startcode, dectable[TAB_LONG_STARTCODE]);
  170.     buildtable( minBits, mtype, dectable[TAB_MTYPE]);
  171.     buildtable( minBits, long_mtype, dectable[TAB_LONG_MTYPE]);
  172.     buildtable( minBits, mvd, dectable[TAB_MVD]);
  173.     buildtable( minBits, long_mvd, dectable[TAB_LONG_MVD]);
  174.     buildtable( minBits, cbp, dectable[TAB_CBP]);
  175.     buildtable( minBits, long_cbp, dectable[TAB_LONG_CBP]);
  176.     buildtable( minBits, quant_tr, dectable[TAB_QUANT_TR]);  //Don't parse strings
  177.     buildtable( minBits, gei_pei, dectable[TAB_GEI_PEI]);
  178.     buildtable( minBits, long_spare, dectable[TAB_LONG_SPARE]);  //Don't parse strings
  179.     buildtable( minBits, gn, dectable[TAB_GN]);
  180.     buildtable( minBits, ptype, dectable[TAB_PTYPE]);    //Don't parse strings
  181.     buildtable( minBits, illegal_state, dectable[TAB_ILLEGAL_STATE]);
  182.     
  183.     // Generate H.263 decoding tables
  184.     buildtable( minBits, mcbpc263,               dectable[TAB263_MCBPC_INTER] );
  185.     buildtable( minBits, long_mcbpc263,          dectable[TAB263_LONG_MCBPC_INTER] );
  186.     buildtable( minBits, long_startcode263,      dectable[TAB263_LONG_STARTCODE] );
  187.     buildtable( minBits, zeros_and_start263,     dectable[TAB263_ZEROS_AND_START] );
  188.     buildtable( minBits, intra_mcbpc263,         dectable[TAB263_MCBPC_INTRA] );
  189.     buildtable( minBits, long_intra_mcbpc263,    dectable[TAB263_LONG_MCBPC_INTRA] );
  190.     buildtable( minBits, modb263,                dectable[TAB263_MODB] );
  191.     buildtable( minBits, cbpy263,                dectable[TAB263_CBPY] );
  192.     buildtable( minBits, intra_cbpy263,          dectable[TAB263_CBPY_INTRA] );
  193.     buildtable( minBits, dquant263,              dectable[TAB263_DQUANT] );
  194.     buildtable( minBits, mvd263,                 dectable[TAB263_MVD] );
  195.     buildtable( minBits, long_mvd263,            dectable[TAB263_LONG_MVD] );
  196.     buildtable( minBits, tcoef,                  dectable[TAB263_TCOEF] );
  197.     buildtable( minBits, tcoef_0001,             dectable[TAB263_TCOEF_0001] );
  198.     buildtable( minBits, tcoef_0000_1,           dectable[TAB263_TCOEF_0000_1] );
  199.     buildtable( minBits, tcoef_0000_0,           dectable[TAB263_TCOEF_0000_0] );
  200.     buildtable( minBits, esc263_run,             dectable[TAB263_ESC_RUN] );
  201.     buildtable( minBits, esc263_level,           dectable[TAB263_ESCAPE_LEVEL] );
  202.     buildtable( minBits, intra263_dc,            dectable[TAB263_INTRA_DC] );
  203. #ifdef DO_H263_PLUS
  204.     buildtable( minBits, modb263plus,            dectable[TAB263PLUS_MODB] );
  205.     buildtable( minBits, intra_mode263plus,      dectable[TAB263PLUS_INTRA_MODE] );
  206.     buildtable( minBits, tcoef_plus,             dectable[TAB263PLUS_TCOEF] );
  207.     buildtable( minBits, tcoef_0001_plus,        dectable[TAB263PLUS_TCOEF_0001] );
  208.     buildtable( minBits, tcoef_0000_1_plus,      dectable[TAB263PLUS_TCOEF_0000_1] );
  209.     buildtable( minBits, tcoef_0000_0_plus,      dectable[TAB263PLUS_TCOEF_0000_0] );
  210. #endif
  211.     minBits = 0;    // Accept empty codeword string (length 0) to produce SYM_EXIT
  212.     buildtable( minBits, finished_263blk,        dectable[TAB263_FINISHED] );
  213.     
  214.     /*{
  215.         int i, ntab;
  216.         printf("nDiagnostic print of table #: ");
  217.         scanf("%d", &ntab);
  218.         while (ntab >= 0) {
  219.             printf( "Entry    Type  Value  Length  Statechangen");
  220.             for (i = 0; i < 256; i++) {
  221.                 printf( " %3d     %3d    %3d    %3d        %3dn", i,
  222.                 dectable[ntab][i].sym.type, dectable[ntab][i].sym.value,
  223.                 dectable[ntab][i].bits, dectable[ntab][i].statechange);
  224.             }
  225.             printf("nDiagnostic print of table #: ");
  226.             scanf("%d", &ntab);
  227.         }
  228.         
  229.         printf("nselectdectab:n");
  230.         for (i = 0; i < NUMSTATES; ++i)
  231.         {
  232.             if (i % 10  ==  0)  printf("n%3d   ", i);
  233.             if (i % 10  ==  5)  printf("  ");
  234.             printf("%3d", selectdectab[i] );
  235.         }
  236.         printf("n");
  237.     }*/
  238.     return;
  239. }
  240. //  buildtable - Generate 8-bit (DECTABBITS) decode table;
  241. //  Contains 256 (DECTABSIZE) entries
  242. static int buildtable( int minBits, struct vlc_entry input[], DECTABENTRY output[DECTABSIZE])
  243. {
  244.     int i, j, bits, codeword, flc, value, status;
  245.     char msg[120]; /* Flawfinder: ignore */
  246.     for (i = 0; i < DECTABSIZE; i++) {
  247.         output[i].sym.type = SYM_EXIT;
  248.         output[i].sym.value = ILLEGAL_SYMBOL;
  249.     }
  250.     if (strcmpi( input[0].vlc, "FLC")) {    /* VLC is default */
  251.         flc = 0;
  252.         //printf("Variable lengthn");
  253.         i = 0;
  254.     } else {
  255.         flc = 1;
  256.         //printf("Fixed lengthn");
  257.         i = 1;
  258.     }
  259.     //printf( "                   Hex   Type   Value   Statechangen");
  260.     while (strcmpi( input[i].vlc, "End")) {  /* Process until "End" */
  261.         status = parse_bits( input[i].vlc, MAX_STRING_VLD-1, DECTABBITS,
  262.                                 &bits, &codeword, minBits);
  263.         if (status != OK) {
  264.             sprintf( msg, "Error in parse_bits from buildtable"); /* Flawfinder: ignore */
  265.             H261ErrMsg( msg );
  266.             return( H261_ERROR );
  267.         }
  268.         codeword <<= DECTABBITS - bits;
  269.         value = input[i].value;
  270.         if (flc == 0) { /* Do one codeword if VLC code */
  271.             input[i].last_value = value;
  272.         }
  273.         while (value <= input[i].last_value) {
  274.             //strpad( input[i].vlc, ' ', MAX_STRING_VLD-1);
  275.             //printf( "%3d: %s    %2x  %4d   %4d      %4d    Bits = %dn",
  276.             //    i, input[i].vlc, codeword, input[i].type, value,
  277.             //    input[i].statechange, bits);
  278.             /* Build decode table */
  279.             for (j = codeword; j < codeword + (1 << (DECTABBITS - bits)); j++) {
  280.                 if (output[j].sym.type != SYM_EXIT  ||
  281.                         output[j].sym.value != ILLEGAL_SYMBOL) {
  282.                     sprintf( msg, "String %d: Entry %d done previously", i, j); /* Flawfinder: ignore */
  283.                     H261ErrMsg( msg );
  284.                     return( H261_ERROR );
  285.                 }
  286.                 output[j].sym.type = input[i].type;
  287.                 output[j].sym.value = value;
  288.                 output[j].statechange = input[i].statechange;
  289.                 /* Signal long codeword by inverting "bits" */
  290.                 if (input[i].type == SYM_ESCAPE) {
  291.                     output[j].bits = -bits;
  292.                 } else {
  293.                     output[j].bits = bits;
  294.                 }
  295.             }
  296.             ++value;
  297.             codeword += (1 << (DECTABBITS - bits));
  298.         }
  299.         if (++i > DECTABSIZE) {
  300.             goto no_end;
  301.         }
  302.     }
  303. /*    if (flc == 0) {
  304.         printf("Reached End after finding %d variable length codesn", i);
  305.     } else {
  306.         printf("Reached End after finding %d fixed length entriesn", i-1);
  307.     }
  308.  */
  309.     return (OK);
  310.     
  311. no_end:
  312.     sprintf( msg, "No End mark"); /* Flawfinder: ignore */
  313.     H261ErrMsg( msg );
  314.     return( H261_ERROR );
  315. }
  316. //  Parse bitstring "vlc", return length in "bits" and value in "codeword"
  317. static int parse_bits(  char vlc[],     /* String with bit pattern */
  318.                         int strmax,     /* Max characters in "vlc" excluding terminating null */
  319.                         int maxbits,    /* Max # bits in codeword */
  320.                         int * bits,     /* Returns # bits; 0 < bits < maxbits+1 */
  321.                         int * codeword, /* Returns codeword */
  322.                         int minBits     // Min # bits in codeword
  323. )
  324. {
  325.     int j, c;
  326.     char msg[120]; /* Flawfinder: ignore */
  327.     
  328.     *bits = 0, j = 0, *codeword = 0;
  329.     c = vlc[j];
  330.     while (c != 0) {
  331.         if (c == '0'  ||  c == '1') {
  332.             *codeword <<= 1;
  333.             ++(*bits);
  334.             if (c == '1') {
  335.                 ++(*codeword);
  336.             }
  337.         } else if (isspace(c) == 0) {   /* Found illegal character */
  338.             SafeSprintf(msg, 120, "parse_bits - Illegal string: %s", vlc);
  339.             H261ErrMsg( msg );
  340.             return( H261_ERROR );
  341.         }
  342.         c = vlc[++j];
  343.     }
  344.     if (j > strmax) {
  345.         SafeSprintf(msg, 120, "Too long string: %s", vlc);
  346.         H261ErrMsg( msg );
  347.         return( H261_ERROR );
  348.     }
  349.     if (*bits > maxbits  ||  *bits < minBits) {
  350.         SafeSprintf(msg, 120, "Illegal string: %s", vlc);
  351.         H261ErrMsg( msg );
  352.         return( H261_ERROR );
  353.     }
  354.     return (OK);
  355. }
  356. ///////////  Routines for debugging  //////////////
  357. //  strpad - Pad str to length len; return number of appended chars
  358. /*static int strpad( char str[], int pad, int len)
  359. {
  360.     int i, numpad;
  361.     numpad = 0;
  362.     for (i = strlen(str); i < len; i++) {
  363.         str[i] = pad;
  364.         ++numpad;
  365.     }
  366.     if (numpad > 0) {
  367.         str[len] = NULL;
  368.     }
  369.     return (numpad);
  370. }*/
  371. extern void printsym( SYMBOL sym )
  372. {
  373.     char ctype[80]; /* Flawfinder: ignore */
  374.     
  375.     sprinttype( sym.type, ctype, 80);
  376.     printf("%s =%4d", ctype, sym.value);
  377.     return;
  378. }
  379. extern void sprintsym( SYMBOL sym, char s[], int sBufLen)
  380. {
  381.     char ctype[80]; /* Flawfinder: ignore */
  382.     
  383.     sprinttype( sym.type, ctype, 80);
  384.     SafeSprintf(s, sBufLen, "%s =%4d", ctype, sym.value);
  385.     return;
  386. }
  387. extern void sprinttype( int symtype, char s[], int sBufLen)
  388. {
  389.     switch (symtype) {
  390.     case SYM_EXIT:
  391.         SafeSprintf(s, sBufLen, "EXIT");
  392.         break;
  393.     case SYM_ESCAPE:
  394.         SafeSprintf(s, sBufLen, "ESCAPE  Table");
  395.         break;
  396.     case SYM_EOB:
  397.         SafeSprintf(s, sBufLen, "End Of Block");
  398.         break;
  399.     case SYM_INTRA_DC:
  400.         SafeSprintf(s, sBufLen, "Intra DC");
  401.         break;
  402.     case SYM_MBA:
  403.         SafeSprintf(s, sBufLen, "MBA");
  404.         break;
  405.     case SYM_STARTCODE:
  406.         SafeSprintf(s, sBufLen, "StartCode");
  407.         break;
  408.     case SYM_MBA_STUFFING:
  409.         SafeSprintf(s, sBufLen, "MBA Stuffing");
  410.         break;
  411.     case SYM_MTYPE:
  412.         SafeSprintf(s, sBufLen, "MB Type");
  413.         break;
  414.     case SYM_MVD:
  415.         SafeSprintf(s, sBufLen, "MVDiff");
  416.         break;
  417.     case SYM_CBP:
  418.         SafeSprintf(s, sBufLen, "CBP");
  419.         break;
  420.     case SYM_QUANT_TR:
  421.         SafeSprintf(s, sBufLen, "Quant/TR");
  422.         break;
  423.     case SYM_GEI_PEI:
  424.         SafeSprintf(s, sBufLen, "ExtraInsert");
  425.         break;
  426.     case SYM_SPARE:
  427.         SafeSprintf(s, sBufLen, "Spare");
  428.         break;
  429.     case SYM_GN:
  430.         SafeSprintf(s, sBufLen, "GOB Number");
  431.         break;
  432.     case SYM_PTYPE:
  433.         SafeSprintf(s, sBufLen, "Picture Type");
  434.         break;
  435.     case SYM_ESC_RUN:
  436.         SafeSprintf(s, sBufLen, "ESC Run");
  437.         break;
  438.     case SYM_ESC_LEVEL:
  439.         SafeSprintf(s, sBufLen, "ESC Level");
  440.         break;
  441.     case SYM_MCBPC:
  442.         SafeSprintf(s, sBufLen, "MCBPC");
  443.         break;
  444.     case SYM_MCBPC_STUFFING:
  445.         SafeSprintf(s, sBufLen, "MCBPC Stuffing");
  446.         break;
  447.     case SYM_MODB:
  448.         SafeSprintf(s, sBufLen, "MODB");
  449.         break;
  450.     case SYM_CBPY:
  451.         SafeSprintf(s, sBufLen, "CBPY");
  452.         break;
  453.     case SYM_DQUANT:
  454.         SafeSprintf(s, sBufLen, "DQUANT");
  455.         break;
  456.     default:
  457.         SafeSprintf(s, sBufLen, "Run = %d   Level", symtype);
  458.         break;
  459.     }
  460.     return;
  461. }
  462. extern void printstate( int state )
  463. {
  464.     switch (state) {
  465.     case ST_MC_NOCBP_MVDX:
  466.         printf("MC No coeffs MVDx");
  467.         break;
  468.     case ST_MC_NOCBP_MVDY:
  469.         printf("MC No coeffs MVDy");
  470.         break;
  471.     case ST_MBA_STARTCODE:
  472.         printf("MBA or Startcode");
  473.         break;
  474.     case ST_NEXT_BLK_6:
  475.         printf("One block to go, AC coeff");
  476.         break;
  477.     case ST_FIRST_BLK_6:
  478.         printf("One block to go, first coeff");
  479.         break;
  480.     case ST_NEXT_BLK_5:
  481.         printf("Two blocks to go, AC coeff");
  482.         break;
  483.     case ST_FIRST_BLK_5:
  484.         printf("Two blocks to go, first coeff");
  485.         break;
  486.     case ST_NEXT_BLK_4:
  487.         printf("Three blocks to go, AC coeff");
  488.         break;
  489.     case ST_FIRST_BLK_4:
  490.         printf("Three blocks to go, first coeff");
  491.         break;
  492.     case ST_NEXT_BLK_3:
  493.         printf("Four blocks to go, AC coeff");
  494.         break;
  495.     case ST_FIRST_BLK_3:
  496.         printf("Four blocks to go, first coeff");
  497.         break;
  498.     case ST_NEXT_BLK_2:
  499.         printf("Five blocks to go, AC coeff");
  500.         break;
  501.     case ST_FIRST_BLK_2:
  502.         printf("Five blocks to go, first coeff");
  503.         break;
  504.     case ST_NEXT_BLK_1:
  505.         printf("Six blocks to go, AC coeff");
  506.         break;
  507.     case ST_FIRST_BLK_1:
  508.         printf("Six blocks to go, first coeff");
  509.         break;
  510.     case ST_INTRA_DC_BLK_6:
  511.         printf("Last INTRA block, DC coeff");
  512.         break;
  513.     case ST_INTRA_AC_BLK_5:
  514.         printf("Two INTRA blocks to go, AC coeff");
  515.         break;
  516.     case ST_INTRA_DC_BLK_5:
  517.         printf("Two INTRA blocks to go, DC coeff");
  518.         break;
  519.     case ST_INTRA_AC_BLK_4:
  520.         printf("Three INTRA blocks to go, AC coeff");
  521.         break;
  522.     case ST_INTRA_DC_BLK_4:
  523.         printf("Three INTRA blocks to go, DC coeff");
  524.         break;
  525.     case ST_INTRA_AC_BLK_3:
  526.         printf("Four INTRA blocks to go, AC coeff");
  527.         break;
  528.     case ST_INTRA_DC_BLK_3:
  529.         printf("Four INTRA blocks to go, DC coeff");
  530.         break;
  531.     case ST_INTRA_AC_BLK_2:
  532.         printf("Five INTRA blocks to go, AC coeff");
  533.         break;
  534.     case ST_INTRA_DC_BLK_2:
  535.         printf("Five INTRA blocks to go, DC coeff");
  536.         break;
  537.     case ST_INTRA_AC_BLK_1:
  538.         printf("Six INTRA blocks to go, AC coeff");
  539.         break;
  540.     case ST_INTRA_DC_BLK_1:
  541.         printf("Six INTRA blocks to go, DC coeff");
  542.         break;
  543.     case ST_MC_CBP_MVDX:
  544.         printf("MVDx");
  545.         break;
  546.     case ST_MC_CBP_MVDY:
  547.         printf("MVDy");
  548.         break;
  549.     case ST_CBP:
  550.         printf("CBP");
  551.         break;
  552.     case ST_INTRA_MQUANT:
  553.         printf("INTRA MQUANT");
  554.         break;
  555.     case ST_MC_CBP_MQUANT:
  556.         printf("MC MQUANT");
  557.         break;
  558.     case ST_ESC_BLK_6:
  559.         printf("ESCAPE, one block to go");
  560.         break;
  561.     case ST_INTER_MQUANT:
  562.         printf("INTER MQUANT");
  563.         break;
  564.     case ST_ESC_BLK_5:
  565.         printf("ESCAPE, two blocks to go");
  566.         break;
  567.     case ST_MTYPE:
  568.         printf("MTYPE");
  569.         break;
  570.     case ST_ESC_BLK_4:
  571.         printf("ESCAPE, three blocks to go");
  572.         break;
  573.     case ST_GEI_PEI:
  574.         printf("PEI/GEI");
  575.         break;
  576.     case ST_ESC_BLK_3:
  577.         printf("ESCAPE, four blocks to go");
  578.         break;
  579.     case ST_PTYPE:
  580.         printf("PictureType");
  581.         break;
  582.     case ST_ESC_BLK_2:
  583.         printf("ESCAPE, five blocks to go");
  584.         break;
  585.     case ST_GQUANT:
  586.         printf("GQUANT");
  587.         break;
  588.     case ST_ESC_BLK_1:
  589.         printf("ESCAPE, six blocks to go");
  590.         break;
  591.     case ST_TR:
  592.         printf("TempRef");
  593.         break;
  594.     case ST_AFTER_STARTCODE:
  595.         printf("After Startcode");
  596.         break;
  597.     case ST_ESC_INTRA_5:
  598.         printf("ESCAPE, two INTRA blocks to go");
  599.         break;
  600.     case ST_ESC_INTRA_4:
  601.         printf("ESCAPE, three INTRA blocks to go");
  602.         break;
  603.     case ST_ESC_INTRA_3:
  604.         printf("ESCAPE, four INTRA blocks to go");
  605.         break;
  606.     case ST_ESC_INTRA_2:
  607.         printf("ESCAPE, five INTRA blocks to go");
  608.         break;
  609.     case ST_ESC_INTRA_1:
  610.         printf("ESCAPE, six INTRA blocks to go");
  611.         break;
  612.     // H.263 states
  613.     case ST263_FINISHED:
  614.         printf("Finished H.263 block decoding");
  615.         break;
  616.     case ST263_ESC_FINISHED:
  617.         printf("Decode ESC-LEVEL, then done");
  618.         break;
  619.     case ST263_BLK_6:
  620.         printf("Decoding last block (block 6)");
  621.         break;
  622.     case ST263_ESC_BLK6:
  623.         printf("Decode ESC-LEVEL, then continue with block 6");
  624.         break;
  625.     case ST263_BLK_5:
  626.         printf("Decoding block 5");
  627.         break;
  628.     case ST263_ESC_BLK5:
  629.         printf("Decode ESC-LEVEL, then continue with block 5");
  630.         break;
  631.     case ST263_BLK_4:
  632.         printf("Decoding block 4");
  633.         break;
  634.     case ST263_ESC_BLK4:
  635.         printf("Decode ESC-LEVEL, then continue with block 4");
  636.         break;
  637.     case ST263_BLK_3:
  638.         printf("Decoding block 3");
  639.         break;
  640.     case ST263_ESC_BLK3:
  641.         printf("Decode ESC-LEVEL, then continue with block 3");
  642.         break;
  643.     case ST263_BLK_2:
  644.         printf("Decoding block 2");
  645.         break;
  646.     case ST263_ESC_BLK2:
  647.         printf("Decode ESC-LEVEL, then continue with block 2");
  648.         break;
  649.     case ST263_BLK_1:
  650.         printf("Decoding block 1");
  651.         break;
  652.     case ST263_ESC_BLK1:
  653.         printf("Decode ESC-LEVEL, then continue with block 1");
  654.         break;
  655.     case ST263_INTRA_DC_ONLY:
  656.         printf("Decode INTRA-DC only, then exit");
  657.         break;
  658.     case ST263_INTRA_DC_AC:
  659.         printf("Decode INTRA-DC and AC coeffs, then exit");
  660.         break;
  661.     default:
  662.         printf("Unknown state = %d", state);
  663.         break;
  664.     }
  665.     return;
  666. }