vld.c
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:25k
源码类别:

Symbian

开发平台:

Visual C++

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