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

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 "dllindex.h"
  37. #include "h261defs.h"
  38. #include "vldstate.h"
  39. #include "h261func.h"
  40. #include "hvscodes.h"        /* getImgParms can be called                    */
  41. #include "dec_blk.h"        /* set the proper pragmas for decode_block      */
  42. #include "vldecode.h"       /* set the proper pragmas for VLDecode          */
  43. #include "h263plus.h"
  44. //#define ANNOTATE_PICTURE    // Include diagnostic info in output picture
  45. #ifdef TESTING
  46. #include <stdio.h>
  47. #include <stdlib.h>
  48. #define BS_ERR_MSG(a)   a   // Generate messages on bitstream error (i.e., illegal 
  49.                             // bitstream syntax) to simplify debugging
  50. #define CHECKSYM(a)     a   // Check symbol types to verify decoder state tables
  51. #else
  52. #define BS_ERR_MSG(a)       // Suppress error messages 
  53. #define CHECKSYM(a)         // Don't check symbol types
  54. #endif
  55. // Declarations of local functions
  56. static int  findPSC( BS_PTR start[], int gn[], int num_sc, int *sc, H261Decoder *s );
  57. static void savePSCpointer( BS_PTR *bsPSC, H261Decoder *s );
  58. static void outputBsPointer( BS_PTR * start, BS_PTR * output, int codingMethod );
  59. static int decodeBitstream( H261Decoder *s,
  60.                             GOB_DESCR   *gob,
  61.                             BS_PTR      start[2],
  62.                             int         gn[2],
  63.                             int         *structStatus,
  64.                             int         *decStatus );
  65. static int  doGobStructures( H261Decoder *s, GOB_DESCR *gob, MACROBLOCK_DESCR mb[],
  66.                         BS_PTR start[2], int gn[2] );
  67. static int  doGobDecoding( H261Decoder *s, GOB_DESCR *gob, MACROBLOCK_DESCR mb[],
  68.                         BS_PTR start[2], SYMBOL sym[], int maxsym );
  69. static void gobConcealment( H261Decoder *s, GOB_DESCR *gob, MACROBLOCK_DESCR mb[] );
  70. static int build_gob_struct( S32 format, S32 gn, GOB_DESCR * gob);
  71. static int build263gob( S32 format, S32 gn, int next_gn, GOB_DESCR * gob,
  72.                         PICTURE_DESCR * pic );
  73. /*static void update_decMB( GOB_DESCR * gob, MACROBLOCK_DESCR mb[], int mb_per_row, 
  74.                         int codingMethod, MBMap * decMB, S32 * iFrame, int forcedUpdate );*/
  75. static int  initializePicture( H261Decoder * s );
  76. static int  decodePicLayer( BS_PTR * bs, int nbits, PICTURE_DESCR * pic,
  77.                             SYMBOL sym[], int maxsym, int codingMethod, GOB_DESCR * gob,
  78.                             int * ptype );
  79. static int  decode_pic261( BS_PTR * bs, int nbits, PICTURE_DESCR * pic,
  80.                             SYMBOL sym[], int maxsym);
  81. static int  decode261gob(  BS_PTR * bs, int nbits, GOB_DESCR * gob,
  82.                         MACROBLOCK_DESCR mb[], SYMBOL sym[], int maxsym);
  83. static int  decode_mb( SYMBOL insym[], int * nextsym, int * quant,
  84.                         GOB_DESCR * gob, MACROBLOCK_DESCR mb[], int mbnum,
  85.                         SYMBOL outsym[]);
  86. static int  decode_intra_block( SYMBOL insym[], int * nextsym,
  87.                             BLOCK_DESCR * block, SYMBOL outsym[]);
  88. static int  find_startcodes( BS_PTR * bs,   // Points to beginning of bitstream
  89.                             int numbits,    // length of bitstream in bits
  90.                             BS_PTR start[], // Returns positions for startcodes; size "max_start"
  91.                             int gobnum[],   // Returns 4 bits after startcode (5 bits for H.263); size "max_start"
  92.                             int max_start,  // Max number of start codes to be returned
  93.                             int codingMethod );  // Indicate H.261 or H.263 syntax
  94. static int  find_sc( BS_PTR * bs,       // Points to beginning of bitstream
  95.                      int numbits,       // length of bitstream in bits
  96.                      int startZeros,    // number of zeros in startcode
  97.                      BS_PTR * start );   // Returns position for bit after startcode
  98. #ifdef ANNOTATE_PICTURE
  99. // saveOrRestoreReconPicture
  100. static void saveOrRestoreReconPicture( PICTURE *pic,    // Picture to be saved or restored
  101.                                        int  restore     // Save if 0, otherwise restore
  102.                                      );
  103. // annotatePicture - Draw motion vectors etc.
  104. static void annotatePicture( PICTURE *pic, MACROBLOCK_DESCR mb[]);
  105. // annotateMacroblock
  106. static void annotateMacroblock( PIXEL data[], int xdim, MACROBLOCK_DESCR *mb,
  107.                                 int xMin, int xMax, int yMin, int yMax );
  108. static void drawMv( PIXEL data[], int xdim, int mvX, int mvY,
  109.                     int xMin, int xMax, int yMin, int yMax );
  110. static void plusMb( PIXEL data[], int xdim );
  111. static void crossMb( PIXEL data[], int xdim );
  112. static void fillMb( PIXEL data[], int xdim );
  113. static void markPixel( PIXEL *pixel );
  114. static int  DrawVector( unsigned char data[], int xdim, int x1, int y1, int x2, int y2 );
  115. static int  drawVec( unsigned char data[], int xdim, int x1, int y1 );
  116. #endif
  117. #define GN_END_OF_SEQUENCE  (31)    // GN=31 for EOS
  118. #define H263_START_ZEROS    (16)
  119. #define H263_GN_BITS        (5)
  120. #define H261_START_ZEROS    (15)
  121. #define H261_GN_BITS        (4)
  122. //
  123. //
  124. //  ****************************************************
  125. //  H261Decode - Decode one or several GOBs in a picture
  126. //  ****************************************************
  127. //
  128. //
  129. extern int  H261Decode( H261Decoder * s )
  130. #define NUM_SC      0
  131. #define NUMGOB      1
  132. #define ERRGOB      2
  133. #define IFRAME      3
  134. {
  135.     BS_PTR      *pStart;    // Position of startcodes ("start")
  136.     int         *pGn;       // GOB numbers following each startcode ("gn")
  137.     GOB_DESCR   *pGob;      // Can refer to several GOBs, if GOB headers are left out ("gob")
  138.     int         *pNum_sc;   // Points to number of startcodes found ("num_sc")
  139.     int         *pSc;       // Points to current startcode ("sc")
  140.     BS_PTR      bsPSC;
  141.     int         status, structStatus, decStatus;
  142.     BS_ERR_MSG(char msg[120];) /* Flawfinder: ignore */
  143.     s->state.actComp = 0;  // Init computation measure
  144.     pStart  =  s->state.bspStartCode;
  145.     pGn     =  s->state.gobNumber;
  146.     pGob    = &s->state.currentGob;
  147.     pNum_sc = &s->state.nStartCodes;
  148.     pSc     = &s->state.currentStartCode;
  149.     if (s->pic_layer.decodingInProgress) {
  150.         // Restore internal state; we interrupted reconstruction with status=OK
  151.         structStatus = decStatus = OK;
  152.         s->pic_layer.decodingInProgress = FALSE;    // Set only if we time out again
  153.     } else {    // We did not time out last time, so do the usual thing
  154.         s->state.i = 0;     // Tell ReconGob to reset its state
  155.         /* Find Picture and GOB Start Codes */
  156.         *pNum_sc = find_startcodes( &s->bsStart, BsDiff(s->bsEnd, s->bsStart),
  157.                                     pStart, pGn, SC_MAX, (int)s->codingMethod );
  158.         /*{   // Print startcode positions
  159.             int i;
  160.             for (i = 0; i < *pNum_sc; i++) {
  161.                 printf("Startcode %d: gn = %d starts in byte %d, bit %dn", i,
  162.                     pGn[i], pStart[i].byteptr - s->bsStart.byteptr, pStart[i].bitptr);
  163.             }
  164.             printf("Continue? ");
  165.             scanf("%d", &i);
  166.         }*/
  167.         s->status.dwStartcodes = *pNum_sc;
  168.         s->status.dwGobs = 0;       // # GOBs processed
  169.         s->status.dwBadgobs = 0;    // # erroneous GOBs
  170.         s->status.dwUpdateGobs = 0; // # GOBs for fast updating
  171.         s->status.dwFirstBadgob = 0; // First bad Gob
  172.         s->status.dwPsc = FALSE;    // indicates that a picture layer was successfully decoded
  173.         s->newBs = s->bsStart;      // Just in case...  (will be updated later)
  174.         if (*pNum_sc < 2) {
  175.             if (*pNum_sc == 1) {
  176.                 outputBsPointer( &pStart[0], &s->newBs, (int)s->codingMethod ); // If we exit, begin here next time
  177.             } else if ((s->bsEnd.byteptr - s->bsStart.byteptr) < 4) {
  178.                 // No startcode found and bitstream is less than 4 bytes long
  179.                 s->newBs = s->bsStart;
  180.             } else {
  181.                 // No startcode found; skip to end of bitstream
  182.                 s->newBs = s->bsEnd;
  183.                 s->newBs.byteptr -= 4;  // Back up 32 bits (22-bit PSC and one byte margin)
  184.             }
  185.             return( NO );
  186.         }
  187.         *pSc = 0;
  188.         if (s->next_gob == 0) {   // Decode Picture Layer info
  189.             do {
  190.                 if (findPSC( pStart, pGn, *pNum_sc, pSc, s ) != YES)   // Find Picture Start Code
  191.                     return( NO );
  192.                 // Try to decode Picture Layer
  193.                 outputBsPointer( &pStart[*pSc], &bsPSC, (int)s->codingMethod ); // Save possible picture start code pointer
  194.                 status = decodePicLayer( &pStart[*pSc], BsDiff(pStart[*pSc + 1], pStart[*pSc]),
  195.                                     &s->pic_layer, s->sym, s->maxSym, (int)s->codingMethod, pGob,
  196.                                     &s->ptype );
  197.                 // H.263: pStart[*pSc] gets bumped by decodePicLayer; now pointing to MB layer
  198.                 if (status != OK) {
  199.                     ++s->status.dwBadgobs;
  200.                     BS_ERR_MSG( H261ErrMsg( "Bitstream error when decoding Picture Layer" ); )
  201.                 } else {    // Decoded Picture Layer successfully
  202.                     savePSCpointer( &bsPSC, s );
  203.                     // Initialize image structures according to received image format: QCIF or CIF
  204.                     status = initializePicture ( s );   
  205.                     if (status != OK)  H261ErrMsg("Decoder: illegal picture format");
  206.                     s->status.dwIntraFrame = 1;  // Assume intraframe (set to zero if we encounter a non-INTRA MacroBlock)
  207. #ifdef ANNOTATE_PICTURE
  208.                     saveOrRestoreReconPicture( &s->oldOut, 1 ); // Restore prev. from local memory
  209. #endif
  210.                     if (s->codingMethod == H263_CODING  &&  status == OK) {
  211.                         s->next_gob = 0;    // First GOB is gn=0 for H.263
  212.                         break;  // Don't increment *pSc; decode GOB 0 first
  213.                     } else if (status == OK) {  // H.261 decoding
  214.                         s->next_gob = 1;    // Go on to decode first GOB (gn=1 for H.261)
  215.                     }
  216.                 }
  217.                 ++(*pSc);
  218.             } while (status != OK);
  219.         }
  220.     
  221.         // Decode GOBs until we reach next to last startcode or until picture complete
  222.         if (*pSc >= *pNum_sc - 1)  return NO;
  223.         // Decode bitstream for the first GOB
  224.         status = decodeBitstream( s, pGob, &pStart[*pSc], &pGn[*pSc], &structStatus, &decStatus );
  225.         if (status == H261_ERROR)  return NO;   // Exit to resync on next PSC
  226.     }   // end if !s->pic_layer.decodingInProgress
  227.     while (1) {     // Process until next to last startcode
  228.         // Reconstruct GOB
  229.         if (structStatus == OK) {
  230.             // decStatus!=OK means that we found bitstream errors
  231.             if (decStatus == OK) {
  232.                 //printf("Calling ReconGob n");
  233.                 ReconGob( pGob, s->mb, &s->oldOut, &s->newOut, &s->B_Out, 
  234.                            s->pic_layer.advancedPred, s->pic_layer.PBframeMode, 
  235.                            s->PBframeCap, s->pic_layer.reducedResUpdate, s->pic_layer.advancedIntraMode,
  236.                            &s->state, s->maxComp );
  237.                 // Time to exit?
  238.                 if (s->state.i > 0) {   // ReconGob timed out
  239.                     s->pic_layer.decodingInProgress = TRUE;
  240.                     return NO;
  241.                 }
  242. /*// Update macroblock map to control RGB conversion
  243. // This is not very useful anymore; skipped blocks might change when
  244. // we use overlapped MC or deblocking filter /SE 4/4/97
  245.                 update_decMB( pGob, pGob->mb, (int)(s->newOut.y.nhor >> 4), 
  246.                             (int)s->codingMethod, &s->decMB,
  247.                             &s->status.dwIntraFrame, NO );*/
  248.             } else {    //  Bitstream error
  249.                 gobConcealment( s, pGob, s->mb );
  250.             }
  251.             s->status.dwGobs += pGob->num_mb / max(1,pGob->mb_width);
  252.             s->next_gob = pGob->next_gn;
  253.         }
  254.         (*pSc)++;
  255.         outputBsPointer( &pStart[*pSc], &s->newBs, (int)s->codingMethod ); // If we exit, begin here next time
  256.         if (s->next_gob == 0) {    // Completed picture
  257. #ifdef DO_H263_PLUS
  258.             // Perform deblocking filtering
  259.             if(s->pic_layer.reducedResUpdate) {
  260.                 ReducedResDeblockingFilter( &s->newOut, s->mb );
  261.             } else if(s->pic_layer.deblockingFilterMode) {
  262.                 ApplyDeblockingFilter(&s->newOut, s->mb, FALSE);
  263.                 if(s->pic_layer.PBframeMode && s->PBframeCap) 
  264.                     ApplyDeblockingFilter(&s->B_Out, s->mb, TRUE);
  265.             }
  266. #endif
  267.             //checkPicture( s->newOut );  // Very useful when chasing subtle encoder bugs
  268. #ifdef ANNOTATE_PICTURE
  269.             saveOrRestoreReconPicture( &s->newOut, 0 ); // Save new picture to local memory
  270.             annotatePicture( &s->newOut, s->mb );  // Draw motion vectors etc.
  271.             annotatePicture( &s->B_Out, s->mb );
  272. #endif
  273.             return (YES);
  274.         }
  275.         if (*pSc >= *pNum_sc - 1)  return NO;
  276.         // Decode bitstream for the next GOB
  277.         status = decodeBitstream( s, pGob, &pStart[*pSc], &pGn[*pSc],
  278.                                   &structStatus, &decStatus );
  279.         if (status == H261_ERROR)  return NO;   // Exit to resync on next PSC
  280.     }
  281. }
  282. // findPSC - Search for Picture Start Code
  283. static int  findPSC( BS_PTR start[], int gn[], int num_sc, int *sc, H261Decoder *s )
  284. {
  285.     do {
  286.         if (*sc > num_sc - 2) { //  Reached last startcode?
  287.             return (NO);
  288.         }
  289.         (*sc)++;
  290.         outputBsPointer( &start[*sc], &s->newBs, (int)s->codingMethod ); // If we exit, begin here next time
  291.     } while (gn[*sc - 1] != 0); // GN=0 indicates PSC
  292.     *sc = *sc - 1;    // Back up to point at PSC
  293.     return( YES );
  294. }
  295. // savePSCpointer - Pass the pointer to the picture start code to caller
  296. static void savePSCpointer( BS_PTR *bsPSC, H261Decoder *s )
  297. {
  298.     s->status.dwPsc = TRUE; 
  299.     s->status.pscIndex.ww.byte = bsPSC->byteptr - s->bsAbs.byteptr; 
  300.     s->status.pscIndex.ww.bit =  bsPSC->bitptr & 0xff;
  301.     return;
  302. }
  303. // outputBsPointer - Copy "start" pointer and back up by length of startcode
  304. static void outputBsPointer( BS_PTR * start, BS_PTR * output, int codingMethod )
  305. {
  306.     int lenStartCode;
  307.     
  308.     if (codingMethod == H263_CODING) {
  309.         lenStartCode = H263_START_ZEROS + 1;
  310.     } else {
  311.         lenStartCode = H261_START_ZEROS + 1;
  312.     }
  313.     *output = *start;
  314.     IncBsPtr( output, -lenStartCode );
  315.     return;
  316. }
  317. // decodeBitstream - Decode bitstream for a GOB
  318. //  Returns H261_ERROR if we need to exit to resync on next PSC
  319. static int decodeBitstream( H261Decoder *s,
  320.                             GOB_DESCR   *gob,
  321.                             BS_PTR      start[2],
  322.                             int         gn[2],
  323.                             int         *structStatus,
  324.                             int         *decStatus )
  325. {
  326.     BS_ERR_MSG(char msg[120];) /* Flawfinder: ignore */
  327.     int nextStart;
  328.     *structStatus = doGobStructures( s, gob, s->mb, &start[0], &gn[0] );
  329.     if (*structStatus == OK  &&  gn[0] == s->next_gob) {
  330.         // GOB number is correct and structures in place
  331.         *decStatus = doGobDecoding( s, gob, s->mb, &start[0], s->sym, s->maxSym );
  332.     } else if (*structStatus == OK  &&  gn[0] == gob->next_gn) {     // GBSC was probably trashed
  333.         // This case will not occur for H.263
  334.         *structStatus = H261_ERROR;
  335.         //printf("Calling ConcealGob n");
  336.         ConcealGob( gob, s->mb, s->pic_layer.reducedResUpdate, &s->oldOut, &s->newOut);
  337.         ++s->status.dwBadgobs;
  338.         s->status.dwGobs += gob->num_mb / max(1,gob->mb_width);
  339.         s->next_gob = gob->next_gn;
  340.         s->status.dwIntraFrame=0;
  341.         BS_ERR_MSG(
  342.             sprintf( msg, "Bitstream error: did not find GOB %d", s->next_gob); /* Flawfinder: ignore */
  343.             H261ErrMsg( msg ); )
  344.     } else if (gn[0] == 0) {   // Unexpected PSC; exit so we can resync
  345.         *structStatus = H261_ERROR;
  346.         if (s->codingMethod == H263_CODING  &&  s->next_gob == 0) {
  347.             nextStart = 1;  // Try next startcode; this PSC did not work
  348.         } else {
  349.             nextStart = 0;  // Start with PSC next time
  350.         }
  351.         outputBsPointer( &start[nextStart], &s->newBs, (int)s->codingMethod );
  352.         BS_ERR_MSG( H261ErrMsg("Bitstream error: encountered PSC when expecting GBSC"); )
  353.         ++s->status.dwBadgobs;
  354.         s->status.dwIntraFrame=0;
  355.         s->next_gob = 0;
  356.         return H261_ERROR;  // This picture did not get done; start again
  357.     } else {    // Assume that GBSC was false; keep looking for GN = next_gob
  358.         *structStatus = H261_ERROR;
  359.     }
  360.     return OK;
  361. }
  362. // doGobStructures - Create gob and mb structures
  363. static int  doGobStructures( H261Decoder *s, GOB_DESCR *gob, MACROBLOCK_DESCR mb[],
  364.                         BS_PTR start[2], int gn[2] )
  365. {
  366.     int     maxbits, status;
  367.     
  368.     //printf("Entering doGobStructures:  gn[] = %d %dn", gn[0], gn[1]);
  369.     gob->mb = mb;
  370.     if (s->codingMethod == H263_CODING) {
  371.         if (s->next_gob > 0) {  // No GOB Layer for GOB 0
  372.             maxbits = BsDiff(start[1], start[0]);
  373.             status = DecGobLayer263( &start[0], maxbits, gob, &s->gfid );
  374.             // start[0] gets bumped by DecGobLayer263; now pointing to MB layer
  375.             if (status != OK) {
  376.                 BS_ERR_MSG( H261ErrMsg( "Bit error: DecGobLayer263 returned error" );)
  377.                 return( H261_ERROR );
  378.             }
  379.         }
  380.         status = build263gob( s->pic_layer.format, s->next_gob, gn[1], gob, &s->pic_layer );
  381.         if (status != OK) {
  382.             BS_ERR_MSG( H261ErrMsg( "Bit error: build263gob returned error" );)
  383.             return( H261_ERROR );
  384.         }
  385.     } else {    // H.261
  386.         status = build_gob_struct( s->pic_layer.format, s->next_gob, gob );
  387.         if (status != OK) {
  388.             H261ErrMsg( "Program error: build_gob_struct returned error" );
  389.             return( H261_ERROR );
  390.         }
  391.     }
  392.     return( status );
  393. }
  394. // doGobDecoding - Decode all information in a GOB
  395. static int  doGobDecoding( H261Decoder *s, GOB_DESCR *gob, MACROBLOCK_DESCR mb[],
  396.                         BS_PTR start[2], SYMBOL sym[], int maxsym )
  397. {
  398.     int     maxbits, status;
  399.     
  400.     //printf("Entering doGobDecoding:  num_mb = %dn", gob->num_mb);
  401.     maxbits = BsDiff(start[1], start[0]);
  402.     if (s->codingMethod == H263_CODING) {
  403.         mb += gob->first_col + gob->first_row * gob->mb_offset;
  404.         status = DecMbLayer263( &start[0], maxbits, gob, mb,
  405.                                     (int)s->pic_layer.interFrame,
  406.                                     (int)s->pic_layer.PBframeMode,
  407.                                     (int)s->pic_layer.unrestrictedMv,
  408.                                     (int)s->pic_layer.advancedIntraMode,
  409.                                     sym, maxsym);
  410.     } else {    // H.261
  411.         status = decode261gob( &start[0], maxbits, gob, mb, sym, maxsym);
  412.     }
  413.     if (status != OK) {
  414.         BS_ERR_MSG( H261ErrMsg( "Bitstream error in doGobDecoding" );)
  415.     }
  416.     return( status );
  417. }
  418. // gobConcealment - Conceal error and update error counters
  419. static void gobConcealment( H261Decoder *s, GOB_DESCR *gob, MACROBLOCK_DESCR mb[] )
  420. {
  421.     BS_ERR_MSG( char msg[120]; ) /* Flawfinder: ignore */
  422.     
  423.     //printf("Calling ConcealGob n");
  424.     ConcealGob( gob, mb, s->pic_layer.reducedResUpdate, &s->oldOut, &s->newOut );
  425.     if (s->pic_layer.PBframeMode && s->PBframeCap) {
  426.         // Conceal B-frame
  427.         ConcealGob( gob, mb, s->pic_layer.reducedResUpdate, &s->oldOut, &s->B_Out );
  428.     }
  429.     if (s->status.dwUpdateGobs == 0)   // If this is the first bad gob
  430.     {
  431.         s->status.dwFirstBadgob = s->next_gob;      // then save the number
  432.         s->status.dwUpdateGobs = gob->num_mb/max(1,gob->mb_width);
  433.     } else {
  434.         s->status.dwUpdateGobs = s->next_gob + gob->num_mb / max(1,gob->mb_width) -
  435.                                 s->status.dwFirstBadgob;
  436.     }
  437.     ++s->status.dwBadgobs;
  438.     s->status.dwIntraFrame=0;
  439.     BS_ERR_MSG(
  440.         sprintf( msg, "Bitstream error when decoding GOB %d", s->next_gob); /* Flawfinder: ignore */
  441.         H261ErrMsg( msg ); )
  442. }
  443. //  build_gob_struct - set up GOB descriptor and MB descriptors for GOB "gn"
  444. static int build_gob_struct( S32 format, S32 gn, GOB_DESCR * gob)
  445. #define MB_COLS_PER_GOB     11
  446. #define MB_ROWS_PER_GOB     3
  447. {
  448.     int mb_col, mb_row, row, col, index;
  449.     if (gn < 1  ||  gn > 12  ||     // CIF: GN=1,2,..,12
  450.         (format == 0  &&  gn != 1  &&  gn != 3  &&  gn != 5)) { // QCIF: 1,3,5
  451.         return (H261_ERROR);
  452.     }
  453.     // Fill in GOB descriptor
  454.     gob->num_mb = MB_COLS_PER_GOB * MB_ROWS_PER_GOB;
  455.     gob->first_col = 0;
  456.     gob->first_row = 0;
  457.     gob->mb_width = MB_COLS_PER_GOB;
  458.     gob->mb_offset = MB_COLS_PER_GOB;
  459.     // Determine next GOB number
  460.     if (format == 0  &&  gn < 5) {  // QCIF
  461.         gob->next_gn = gn + 2;
  462.     } else if (format != 0  &&  gn < 12) {  // CIF
  463.         gob->next_gn = gn + 1;
  464.     } else {    // This is last GOB in picture
  465.         gob->next_gn = 0;   // Look for PSC next time
  466.     }
  467.     // Fill in macroblock locations
  468.     if ((gn & 0x1)  ==  1) {
  469.         mb_col = 0;                 // Odd GOBs on left side
  470.     } else {
  471.         mb_col = MB_COLS_PER_GOB;   // Even GOBs on right side
  472.     }
  473.     mb_row = ((gn - 1) / 2) * MB_ROWS_PER_GOB;
  474.     for (row = 0; row < MB_ROWS_PER_GOB; row++) {
  475.         for (col = 0; col < MB_COLS_PER_GOB; col++) {
  476.             index = row * MB_COLS_PER_GOB + col;
  477.             (gob->mb + index)->x = col + mb_col;
  478.             (gob->mb + index)->y = row + mb_row;
  479.         }
  480.     }
  481.     return (OK);
  482. }
  483. // build263gob - set up GOB and MB descriptors for GOBS "gn" to "next_gn-1" (H.263)
  484. static int build263gob( S32 format, S32 gn, int next_gn, GOB_DESCR * gob,
  485.                         PICTURE_DESCR * pic )
  486. {
  487.     int mbhor, mbvert, num_gn, row, col, index, mbRowsPerGob;
  488.     switch (format) {
  489.     case SQCIF:
  490.         mbhor = 8;
  491.         num_gn = 6;
  492.         mbRowsPerGob = 1;
  493.         break;
  494.     case QCIF:
  495.         mbhor = 11;
  496.         num_gn = 9;
  497.         mbRowsPerGob = 1;
  498.         break;
  499.     case CIF:
  500.         mbhor = 22;
  501.         num_gn = 18;
  502.         mbRowsPerGob = 1;
  503.         break;
  504.     case CIF4:
  505.         mbhor = 44;
  506.         num_gn = 18;
  507.         mbRowsPerGob = 2;
  508.         break;
  509.     case CIF16:
  510.         mbhor = 88;
  511.         num_gn = 18;
  512.         mbRowsPerGob = 4;
  513.         break;
  514.     case ANYSIZE:
  515.         mbhor = (pic->cols + 15) >> 4;
  516.         num_gn = (pic->rows + 15) >> 4;
  517.         mbRowsPerGob = 1;
  518.         while (num_gn > GN_END_OF_SEQUENCE) {   // Max Group Number is 30
  519.             mbRowsPerGob *= 2;
  520.             num_gn = (num_gn + 1) >> 1;
  521.         }
  522.         break;
  523.     default:
  524.         return( H261_ERROR );
  525.         break;
  526.     }
  527. #ifdef DO_H263_PLUS
  528.     if (pic->reducedResUpdate) {
  529.         // Use 32x32 macroblocks
  530.         mbhor = ROUNDDIV2( mbhor );
  531.         if (mbRowsPerGob == 1) {
  532.             num_gn = ROUNDDIV2( num_gn );
  533.         } else {
  534.             mbRowsPerGob = ROUNDDIV2( mbRowsPerGob );
  535.         }
  536.     }
  537. #endif
  538.     if (gn < 0  ||  gn >= num_gn)  return( H261_ERROR );
  539.     // Fill in GOB descriptor
  540.     if (next_gn == 0  ||  next_gn == GN_END_OF_SEQUENCE) {
  541.         gob->next_gn = 0;   // Look for PSC next time
  542.         mbvert = num_gn - gn;
  543.     } else {
  544.         gob->next_gn = next_gn;
  545.         mbvert = next_gn - gn;
  546.     }
  547.     mbvert *= mbRowsPerGob;
  548.     if (mbvert <= 0)  return( H261_ERROR );
  549.     gob->num_mb = mbhor * mbvert;
  550.     gob->first_col = 0;
  551.     gob->first_row = gn * mbRowsPerGob; // Need previous row for advancedPred mode
  552.     gob->mb_width = mbhor;
  553.     gob->mb_offset = mbhor;
  554.     // Fill in macroblock locations
  555.     for (row = gn * mbRowsPerGob; row < gn * mbRowsPerGob + mbvert; row++) {
  556.         for (col = 0; col < mbhor; col++) {
  557.             index = row * mbhor + col;
  558.             gob->mb[index].x = col;
  559.             gob->mb[index].y = row;
  560.         }
  561.     }
  562.     return (OK);
  563. }
  564. /*********************
  565. //  update_decMB - Update macroblock map by ORing MTYPE for each MB
  566. static void update_decMB( GOB_DESCR * gob, MACROBLOCK_DESCR mb[], int mb_per_row, 
  567.                         int codingMethod, MBMap * decMB, S32 * iFrame, int forcedUpdate )
  568. {
  569.     int mbnum, i, row, col;
  570.     U8  mtype;
  571.     
  572.     if (codingMethod == H263_CODING) {
  573.         mbnum = gob->first_col + gob->first_row * gob->mb_offset;
  574.         for (i = mbnum; i < mbnum + gob->num_mb; ++i) {
  575.             mtype = mb[i].mtype;
  576.             decMB->data[i] |= mtype;
  577.             if ( mtype != MTYPE263_INTRA  &&  mtype != MTYPE263_INTRA_Q )  *iFrame = 0;
  578.         } 
  579.         if (forcedUpdate == YES) {  // Ensure that macroblock map is non-zero
  580.             for (i = mbnum; i < mbnum + gob->num_mb; ++i) {
  581.                 decMB->data[i] = 1;
  582.             } 
  583.         }
  584.     } else {    // H.261
  585.         mbnum = mb[0].x + mb[0].y * mb_per_row;
  586.         i = 0;
  587.         for (row = 0; row < MB_ROWS_PER_GOB; row++) {
  588.             for (col = 0; col < MB_COLS_PER_GOB; col++) {
  589.                 mtype = mb[i + col].mtype;
  590.                 decMB->data[mbnum + col] |= mtype;
  591.                 if ( mtype != MTYPE_INTRA  &&  mtype != MTYPE_INTRA_MQUANT )  *iFrame = 0;
  592.             }
  593.             mbnum += mb_per_row;
  594.             i += MB_COLS_PER_GOB;
  595.         } 
  596.         if (forcedUpdate == YES) {  // Ensure that macroblock map is non-zero
  597.             mbnum = mb[0].x + mb[0].y * mb_per_row;
  598.             for (row = 0; row < MB_ROWS_PER_GOB; row++) {
  599.                 for (col = 0; col < MB_COLS_PER_GOB; col++) {
  600.                     decMB->data[mbnum + col] = 1;
  601.                 }
  602.                 mbnum += mb_per_row;
  603.             } 
  604.         }
  605.     }
  606.     return;
  607. }
  608. *****************/
  609. /**************************************************************************
  610. * initializePicture ( H261Decoder *s) -
  611. *
  612. * this function initializes the picture structures according to the
  613. * format: QCIF or CIF
  614. *
  615. ***************************************************************************/
  616. #ifdef WATD
  617. extern void BreakPoint(void);
  618. #pragma aux BreakPoint = 0xcc;
  619. #endif
  620. static int  initializePicture( H261Decoder * s )
  621. {
  622.   S16   format;                     /* locals used for call to getImgParms  */
  623.   S16   numGOBs;                    /* this is done for consistency with    */
  624.   S16   numMBs;                     /* old init method                      */
  625.   S32   imgSize ;
  626.   S32   lumaSize;
  627.   S32   chromaLineLength;
  628.   S32   chromaRows;
  629.   S32   maxsym;  
  630.   int   status, mbHor, mbVert;
  631. #ifdef WATD
  632.    //BreakPoint();
  633. #endif
  634.   format = (S16)s->pic_layer.format;
  635.   s->decMB.format = format;
  636.   s->decMB.type = DECODER_MAP;
  637.     
  638.   if ( (s->formatCap == QCIF) && (format == CIF) )
  639.     H261ErrMsg("decoder not CIF capable");
  640.                     /* get the image parameters for the current format  */
  641.   if (format == ANYSIZE) {
  642.         mbHor = (s->pic_layer.cols + 15) >> 4;
  643.         mbVert = (s->pic_layer.rows + 15) >> 4;
  644.         //imgSize  = (long)384 * mbHor * mbVert;
  645.         lumaSize = (long)256 * mbHor * mbVert;
  646.         chromaLineLength = 8 * mbHor;
  647.         chromaRows = 8 * mbVert;
  648.         //numGOBs  = mbVert;
  649.         numMBs   = mbHor * mbVert;
  650.         //maxsym = 8 * lumaSize;
  651.         status = 0;
  652.         /////////if (numMBs > xxxxx)  status = UNKNOWN_PICTURE_FORMAT;
  653.   } else {
  654.     status = getImgParms (format, &numGOBs, &numMBs, &imgSize, &lumaSize, &chromaLineLength,
  655.                     &chromaRows, &maxsym);
  656.   }
  657.   if (status != 0) {
  658.     H261ErrMsg ("Decoder Error: initializePicture - UNKNOWN_PICTURE_FORMAT");
  659.     status = H261_ERROR;
  660.   } else if (numMBs > s->maxMbnum) {
  661.     H261ErrMsg ("Decoder Error: initializePicture - Too large picture");
  662.     status = H261_ERROR;
  663.   } else if (numMBs > s->maxMbnum) {
  664.     H261ErrMsg ("Decoder Error: initializePicture - Too large picture");
  665.     status = H261_ERROR;
  666.   } else {
  667.     status = OK;
  668.   }
  669.   // setup the image structures
  670.   //s->newOut.picLayout = s->B_Out.picLayout = VVS_LAYOUT_TEE;
  671.   //s->oldOut.picLayout   = VVS_LAYOUT_TEE;
  672.   s->newOut.picLayout = s->B_Out.picLayout = VVS_LAYOUT_YUV12;
  673.   
  674.   // Memory was already allocated when the decoder first opened.
  675.   // The luma pointers hold the address of the start of the memory for image buffers
  676.                                     
  677.   // Set up chroma pointers
  678.   // helix needs 420 out -gneel
  679.   // Layout_Tee also works.
  680.   if(s->newOut.picLayout == VVS_LAYOUT_YUV12)
  681.   {
  682. s->newOut.cb.ptr = s->newOut.y.ptr + lumaSize;
  683. s->B_Out.cb.ptr  = s->B_Out.y.ptr  + lumaSize;
  684. s->newOut.cr.ptr = s->newOut.cb.ptr + (lumaSize>>2);
  685. s->B_Out.cr.ptr  = s->B_Out.cb.ptr  + (lumaSize>>2);
  686. s->newOut.cb.ptrAlias = s->newOut.y.ptrAlias + lumaSize;
  687. s->B_Out.cb.ptrAlias  = s->B_Out.y.ptrAlias  + lumaSize;
  688. s->newOut.cr.ptrAlias = s->newOut.cb.ptrAlias + (lumaSize>>2);
  689. s->B_Out.cr.ptrAlias  = s->B_Out.cb.ptrAlias  + (lumaSize>>2);
  690. // Set up remainder of COMPONENT structs
  691. s->newOut.y.nhor    = s->B_Out.y.nhor    = chromaLineLength * 2;
  692. s->newOut.y.nvert   = s->B_Out.y.nvert   = chromaRows * 2;
  693. s->newOut.y.hoffset = s->B_Out.y.hoffset = chromaLineLength * 2;
  694. s->newOut.cb.nhor    = s->B_Out.cb.nhor    = chromaLineLength;
  695. s->newOut.cb.nvert   = s->B_Out.cb.nvert   = chromaRows;
  696. s->newOut.cb.hoffset = s->B_Out.cb.hoffset = chromaLineLength;
  697. s->newOut.cr.nhor    = s->B_Out.cr.nhor    = chromaLineLength;
  698. s->newOut.cr.nvert   = s->B_Out.cr.nvert   = chromaRows;
  699. s->newOut.cr.hoffset = s->B_Out.cr.hoffset = chromaLineLength;
  700.   } else {
  701. s->newOut.cb.ptr = s->newOut.y.ptr + lumaSize;
  702. s->B_Out.cb.ptr  = s->B_Out.y.ptr  + lumaSize;
  703. //s->oldOut.cb.ptr = s->oldOut.y.ptr + lumaSize;
  704.   
  705. s->newOut.cr.ptr = s->newOut.cb.ptr + chromaLineLength;
  706. s->B_Out.cr.ptr  = s->B_Out.cb.ptr  + chromaLineLength;
  707. //s->oldOut.cr.ptr = s->oldOut.cb.ptr + chromaLineLength;
  708. s->newOut.cb.ptrAlias = s->newOut.y.ptrAlias + lumaSize;
  709. s->B_Out.cb.ptrAlias  = s->B_Out.y.ptrAlias  + lumaSize;
  710. //s->oldOut.cb.ptrAlias = s->oldOut.y.ptrAlias + lumaSize;
  711. s->newOut.cr.ptrAlias = s->newOut.cb.ptrAlias + chromaLineLength;
  712. s->B_Out.cr.ptrAlias  = s->B_Out.cb.ptrAlias  + chromaLineLength;
  713. //s->oldOut.cr.ptrAlias = s->oldOut.cb.ptrAlias + chromaLineLength;
  714. // Set up remainder of COMPONENT structs
  715. s->newOut.y.nhor    = s->B_Out.y.nhor    = chromaLineLength * 2;
  716. s->newOut.y.nvert   = s->B_Out.y.nvert   = chromaRows * 2;
  717. s->newOut.y.hoffset = s->B_Out.y.hoffset = chromaLineLength * 2;
  718. s->newOut.cb.nhor    = s->B_Out.cb.nhor    = chromaLineLength;
  719. s->newOut.cb.nvert   = s->B_Out.cb.nvert   = chromaRows;
  720. s->newOut.cb.hoffset = s->B_Out.cb.hoffset = chromaLineLength * 2;
  721. s->newOut.cr.nhor    = s->B_Out.cr.nhor    = chromaLineLength;
  722. s->newOut.cr.nvert   = s->B_Out.cr.nvert   = chromaRows;
  723. s->newOut.cr.hoffset = s->B_Out.cr.hoffset = chromaLineLength * 2;
  724.   }
  725.   return (status);
  726. }
  727. //  decodePicLayer - Decode Picture Layer information
  728. static int  decodePicLayer( BS_PTR * bs, int nbits, PICTURE_DESCR * pic,
  729.                             SYMBOL sym[], int maxsym, int codingMethod, GOB_DESCR * gob,
  730.                             int * ptype )
  731. {
  732.     int     status;
  733.     
  734.     if (codingMethod == H263_CODING) {
  735.         status = DecPicLayer263( bs, nbits, pic, gob, ptype );
  736.     } else {
  737.         status = decode_pic261( bs, nbits, pic, sym, maxsym );
  738.     }
  739.     return( status );
  740. }
  741. //  decode_pic261 - Decode H.261 Picture Layer information
  742. //  This routine is very picky when determining whether bitstream is valid.
  743. //  It returns OK only if a startcode ends the bitstream; otherwise, it
  744. //  returns H261_ERROR.
  745. static int  decode_pic261( BS_PTR * bs, int nbits, PICTURE_DESCR * pic,
  746.                             SYMBOL sym[], int maxsym)
  747. {
  748.     int     state, status, parsed_bits, nsym, i;
  749.     BS_ERR_MSG( char msg[120] ); /* Flawfinder: ignore */
  750.     state = ST_AFTER_STARTCODE;
  751.     //printf( "DecodePic: Entering VLDecode with  State = %d  nbits = %dn",
  752.     //            state, nbits);
  753.     status = VLDECODE( *bs, nbits, &state, &parsed_bits, &nsym, sym, maxsym);
  754.     if (parsed_bits != nbits) {
  755.         BS_ERR_MSG( sprintf( msg, "decode_pic_layer: Tried to decode %d bits, exit after %d bits", /* Flawfinder: ignore */
  756.                 nbits, parsed_bits);
  757.                 H261ErrMsg( msg ); )
  758.         return (H261_ERROR);
  759.     }
  760.     if (state != ST_AFTER_STARTCODE) {
  761.         BS_ERR_MSG( sprintf( msg, "decode_pic_layer: Bitstream did not end with startcode"); /* Flawfinder: ignore */
  762.                 H261ErrMsg( msg); )
  763.         return (H261_ERROR);
  764.     }
  765. /*    {
  766.         int i;
  767.         printf( "DecodePic: Status = %d  State = %d  Decoded %d bits, %d symbolsn",
  768.                 status, state, parsed_bits, nsym);
  769.         // Print decoded symbols
  770.         printf("n");
  771.         for (i = 0; i < nsym; i++) {
  772.             printf("DecodePic: "); printsym( sym[i] ); printf("n");
  773.         }
  774.         printf("n");
  775.     }*/
  776.     CHECKSYM( if (checksym( sym[0], SYM_GN, "decode_pic_layer") != OK) exit(0); )
  777.     i = 1;  // Skip first symbol ("GN" = 0)
  778.     CHECKSYM( if (checksym( sym[i], SYM_QUANT_TR, "decode_pic_layer") != OK) exit(0); )
  779.     pic->tr = sym[i++].value;
  780.     CHECKSYM( if (checksym( sym[i], SYM_PTYPE, "decode_pic_layer") != OK) exit(0); )
  781.     pic->ptype = sym[i++].value;
  782.     pic->splitscreen = pic->ptype & FLAG_SPLITSCREEN;
  783.     pic->doccamera = pic->ptype & FLAG_DOCCAMERA;
  784.     pic->fp_release = pic->ptype & FLAG_FP_RELEASE;
  785.     if (pic->ptype & FLAG_CIF_FORMAT) {
  786.         pic->format = CIF;
  787.     } else {
  788.         pic->format = QCIF;
  789.     }
  790.     pic->hi_res = (pic->ptype & FLAG_HI_RES) ^ FLAG_HI_RES; // 1 = off, 0 = on
  791.     pic->advancedPred = 0;  // No overlapped MC for H.261
  792.     pic->PBframeMode = 0;   // No PB-frames for H.261
  793. #ifdef DO_H263_PLUS
  794.     pic->reducedResUpdate = 0;
  795. #endif
  796.     pic->peiCount = 0;                  // Loop 'til PEI=0
  797.     while (sym[i].type == SYM_SPARE) {
  798.         //char msg[100];
  799.         //sprintf(msg,"n Decode DLL: PEI=%x", sym[i].value);
  800.         //OutputDebugString(msg);
  801.         if (pic->peiCount < MAX_PEI_COUNT) {
  802.             //char msg[100];
  803.             //sprintf(msg,"n Decode DLL: pSpare: %2x", sym[i].value);
  804.             //OutputDebugString(msg);
  805.             pic->pSpare[pic->peiCount] = sym[i].value;
  806.         }
  807.         pic->peiCount++;                // Inc counter
  808.         i++;                            // Next Symbol  
  809.     }
  810.     CHECKSYM( if (checksym( sym[i], SYM_GEI_PEI, "decode_pic_layer") != OK) exit(0));    
  811.     i++;                                // Skip PEI Symbol
  812.     
  813.     if (sym[i].type != SYM_STARTCODE) {
  814.         BS_ERR_MSG( sprintf( msg, "decode_pic_layer: Did not find startcode after pic_layer"); /* Flawfinder: ignore */
  815.                 H261ErrMsg( msg ); )
  816.         return (H261_ERROR);
  817.     }
  818.     return (OK);
  819. }
  820. //  decode261gob - Decode all symbols for a Group Of Blocks
  821. //  This routine is very picky when determining whether bitstream is valid.
  822. //  It returns OK only if a startcode ends the bitstream; otherwise, it
  823. //  returns H261_ERROR.
  824. static int  decode261gob(  BS_PTR * bs, int nbits, GOB_DESCR * gob,
  825.                         MACROBLOCK_DESCR mb[], SYMBOL sym[], int maxsym)
  826. {
  827.     int     state, status, parsed_bits, mbnum, nextsym, quant, i, mba,
  828.             nsym,       // # symbols returned by VLDecode
  829.             isym;       // # symbols returned by this routine, i.e.,
  830.                         // after deletion of EOBs etc.
  831.     BS_ERR_MSG ( char msg[120] ); /* Flawfinder: ignore */
  832.     state = ST_AFTER_STARTCODE;
  833.     //printf( "DecodeGOB: Entering VLDecode with  State: ");
  834.     //printstate( state ); printf("  nbits = %dn", nbits);
  835.     status = VLDECODE( *bs, nbits, &state, &parsed_bits, &nsym, sym, maxsym);
  836.     if (parsed_bits != nbits) {
  837.         BS_ERR_MSG( sprintf( msg, "decode261gob: Tried to decode %d bits, exit after %d bits", /* Flawfinder: ignore */
  838.                 nbits, parsed_bits);
  839.                 H261ErrMsg( msg ); )
  840.         return (H261_ERROR);
  841.     }
  842.     if (state != ST_AFTER_STARTCODE) {
  843.         BS_ERR_MSG( sprintf( msg, "decode261gob: Bitstream did not end with startcode"); /* Flawfinder: ignore */
  844.                 H261ErrMsg( msg ); )
  845.         return (H261_ERROR);
  846.     }
  847. /*    {
  848.         int num;
  849.         printf( "DecodeGOB: Status = %d  State: ", status); printstate( state );
  850.         printf("  Decoded %d bits, %d symbolsn", parsed_bits, nsym);
  851.         // Print decoded symbols
  852.         printf("DecodeGOB: # symbols to print: ");
  853.         scanf("%d", &num);
  854.         for (i = 0; i < num; i++) {
  855.             printf("DecodeGOB: "); printsym( sym[i] ); printf("n");
  856.         }
  857.         printf("n");
  858.     }
  859.  */
  860.     nextsym = 0;
  861.     CHECKSYM( if (checksym( sym[nextsym], SYM_GN, "decode261gob") != OK) exit(0); )
  862.     gob->gn = sym[nextsym++].value;      // GOB number
  863.     CHECKSYM( if (checksym( sym[nextsym], SYM_QUANT_TR, "decode261gob") != OK) exit(0); )
  864.     quant = sym[nextsym++].value;
  865.     if (quant < QUANT_MIN  ||  quant > QUANT_MAX) {
  866.         BS_ERR_MSG( sprintf( msg, "decode261gob: quant = %d", quant); /* Flawfinder: ignore */
  867.                 H261ErrMsg( msg ); )
  868.         return (H261_ERROR);
  869.     }
  870.     gob->gquant = quant;
  871.     //CHECKSYM( if (checksym( sym[nextsym], SYM_GEI_PEI, "decode261gob") != OK) exit(0);  )
  872.     //gob->gei = sym[nextsym].value;
  873.     gob->num_gspare = 0;
  874.     while (sym[nextsym].type == SYM_SPARE) {   // Loop until GEI=0
  875.         CHECKSYM( if (checksym( sym[nextsym], SYM_SPARE, "decode261gob") != OK) exit(0); )
  876.         ++nextsym;  // Drop GSPARE on the floor
  877.         ++(gob->num_gspare);
  878.         
  879.     }
  880.     CHECKSYM( if (checksym( sym[nextsym], SYM_GEI_PEI, "decode261gob") != OK) exit(0); )
  881.     ++nextsym;      // Skip GEI
  882.     
  883.             
  884.     mbnum = 0;
  885.     isym = 0;
  886.     //  We expect MBA, MBA Stuffing, or Startcode
  887.     while (sym[nextsym].type == SYM_MBA_STUFFING) {
  888.         ++nextsym;      // Remove MBA stuffing
  889.     }
  890.     while (sym[nextsym].type != SYM_STARTCODE) {    // Keep going until next startcode
  891.         // We expect MBA
  892.         CHECKSYM( if (checksym( sym[nextsym], SYM_MBA, "decode261gob") != OK) exit(0); )
  893.         mba = sym[nextsym++].value;
  894.         //printf("MB #%d: ", mbnum+mba); printsym( sym[nextsym-1] ); // MBA
  895.         //printf("   "); printsym( sym[nextsym] ); printf("n"); // MTYPE
  896.         if (mbnum + mba  >  gob->num_mb) {
  897.             BS_ERR_MSG( sprintf( msg, "decode261gob: Bitstream error, mbnum=%d", mbnum + mba); /* Flawfinder: ignore */
  898.                     H261ErrMsg( msg ); )
  899.             return (H261_ERROR);
  900.         }
  901.         for (i = mbnum + 1; i < mbnum + mba; i++) {
  902.             mb[i-1].mtype = MTYPE_SKIP;
  903.         }
  904.         mbnum += mba;
  905.         status = decode_mb( sym, &nextsym, &quant, gob, mb, mbnum-1, &sym[isym] );
  906.         if (status == H261_ERROR) {
  907.             BS_ERR_MSG( sprintf( msg, "decode261gob: Bitstream error, MB #%d", mbnum); /* Flawfinder: ignore */
  908.                     H261ErrMsg( msg ); )
  909.             return (H261_ERROR);
  910.         }
  911.         isym += status;
  912.         //  We expect MBA, MBA Stuffing, or Startcode
  913.         while (sym[nextsym].type == SYM_MBA_STUFFING) {
  914.             ++nextsym;      // Remove MBA stuffing
  915.         }
  916.     }
  917.     for (i = mbnum + 1; i <= gob->num_mb; i++) {
  918.         mb[i-1].mtype = MTYPE_SKIP;
  919.     }
  920.     return (OK);
  921. }
  922. //  insym[*nextsym] contains MTYPE when we enter
  923. static int  decode_mb( SYMBOL insym[], int * nextsym, int * quant,
  924.                         GOB_DESCR * gob, MACROBLOCK_DESCR mb[], int mbnum,
  925.                         SYMBOL outsym[])
  926. {
  927.     int isym, blk, status, mask;
  928.     CHECKSYM ( char msg[120] ); /* Flawfinder: ignore */
  929.     //printf("decode_mb: "); printsym( insym[*nextsym] ); printf("n");
  930.     isym = 0;
  931.     CHECKSYM( if (checksym( insym[*nextsym], SYM_MTYPE, "decode_mb") != OK) exit(0); )
  932.     mb[mbnum].mtype = insym[(*nextsym)++].value;
  933.     switch ( mb[mbnum].mtype ) {
  934.     case MTYPE_INTER_MQUANT:
  935.         CHECKSYM( if (checksym( insym[*nextsym], SYM_QUANT_TR, "decode_mb") != OK) exit(0); )
  936.         *quant = insym[(*nextsym)++].value;
  937.         if (*quant < QUANT_MIN  ||  *quant > QUANT_MAX) {
  938.             BS_ERR_MSG( sprintf( msg, "decode_mb: quant = %d", *quant); /* Flawfinder: ignore */
  939.                     H261ErrMsg( msg ); )
  940.             return (H261_ERROR);
  941.         }
  942.         // FALLTHROUGH
  943.     case MTYPE_INTER:
  944.         CHECKSYM( if (checksym( insym[*nextsym], SYM_CBP, "decode_mb") != OK) exit(0); )
  945.         mb[mbnum].cbp = insym[(*nextsym)++].value;
  946.         mask = 0x20;    // Bitmask for first block
  947.         for (blk = 0; blk < 6; blk++) {
  948.             mb[mbnum].block[blk].nsym = 0;
  949.             if ((mb[mbnum].cbp & mask) != 0) {
  950.                 status = decode_block( insym, nextsym,
  951.                                 &(mb[mbnum].block[blk]),
  952.                                 &outsym[isym] );
  953.                 if (status == H261_ERROR) {
  954.                     BS_ERR_MSG( sprintf( msg, "decode_mb: Bitstream error, block #%d", blk); /* Flawfinder: ignore */
  955.                             H261ErrMsg( msg ); )
  956.                     return (H261_ERROR);
  957.                 }
  958.                 isym += status;
  959.             }
  960.             mask >>= 1;
  961.         }
  962.         break;
  963.     case MTYPE_MCFILT_MQUANT:
  964.     case MTYPE_MC_MQUANT:
  965.         CHECKSYM( if (checksym( insym[*nextsym], SYM_QUANT_TR, "decode_mb") != OK) exit(0); )
  966.         *quant = insym[(*nextsym)++].value;
  967.         if (*quant < QUANT_MIN  ||  *quant > QUANT_MAX) {
  968.             BS_ERR_MSG( sprintf( msg, "decode_mb: quant = %d", *quant); /* Flawfinder: ignore */
  969.                     H261ErrMsg( msg ); )
  970.             return (H261_ERROR);
  971.         }
  972.         // FALLTHROUGH
  973.     case MTYPE_MCFILT_CBP:
  974.     case MTYPE_MC_CBP:
  975.         CHECKSYM( if (checksym( insym[*nextsym], SYM_MVD, "decode_mb") != OK) exit(0); )
  976.         mb[mbnum].mvd_x = insym[(*nextsym)++].value;
  977.         CHECKSYM( if (checksym( insym[*nextsym], SYM_MVD, "decode_mb") != OK) exit(0); )
  978.         mb[mbnum].mvd_y = insym[(*nextsym)++].value;
  979.         if (mbnum % gob->mb_width > 0  &&
  980.                     mb[mbnum-1].mtype >= MTYPE_MC_NOCBP) {
  981.              mb[mbnum].mv_x = mb[mbnum-1].mv_x + mb[mbnum].mvd_x;
  982.              mb[mbnum].mv_y = mb[mbnum-1].mv_y + mb[mbnum].mvd_y;
  983.         } else {
  984.              mb[mbnum].mv_x = mb[mbnum].mvd_x;
  985.              mb[mbnum].mv_y = mb[mbnum].mvd_y;
  986.         }
  987.         CHECKSYM( if (checksym( insym[*nextsym], SYM_CBP, "decode_mb") != OK) exit(0); )
  988.         mb[mbnum].cbp = insym[(*nextsym)++].value;
  989.         mask = 0x20;    // Bitmask for first block
  990.         for (blk = 0; blk < 6; blk++) {
  991.             mb[mbnum].block[blk].nsym = 0;
  992.             if ((mb[mbnum].cbp & mask) != 0) {
  993.                 status = decode_block( insym, nextsym,
  994.                                 &(mb[mbnum].block[blk]),
  995.                                 &outsym[isym] );
  996.                 if (status == H261_ERROR) {
  997.                     BS_ERR_MSG( sprintf( msg, "decode_mb: Bitstream error, block #%d", blk); /* Flawfinder: ignore */
  998.                             H261ErrMsg( msg ); )
  999.                     return (H261_ERROR);
  1000.                 }
  1001.                 isym += status;
  1002.             }
  1003.             mask >>= 1;
  1004.         }
  1005.         break;
  1006.     case MTYPE_MCFILT_NOCBP:
  1007.     case MTYPE_MC_NOCBP:
  1008.         CHECKSYM( if (checksym( insym[*nextsym], SYM_MVD, "decode_mb") != OK) exit(0); )
  1009.         mb[mbnum].mvd_x = insym[(*nextsym)++].value;
  1010.         CHECKSYM( if (checksym( insym[*nextsym], SYM_MVD, "decode_mb") != OK) exit(0); )
  1011.         mb[mbnum].mvd_y = insym[(*nextsym)++].value;
  1012.         if (mbnum % gob->mb_width > 0  &&
  1013.                     mb[mbnum-1].mtype >= MTYPE_MC_NOCBP) {
  1014.              mb[mbnum].mv_x = mb[mbnum-1].mv_x + mb[mbnum].mvd_x;
  1015.              mb[mbnum].mv_y = mb[mbnum-1].mv_y + mb[mbnum].mvd_y;
  1016.         } else {
  1017.              mb[mbnum].mv_x = mb[mbnum].mvd_x;
  1018.              mb[mbnum].mv_y = mb[mbnum].mvd_y;
  1019.         }
  1020.         break;
  1021.     case MTYPE_INTRA_MQUANT:
  1022.         CHECKSYM( if (checksym( insym[*nextsym], SYM_QUANT_TR, "decode_mb") != OK) exit(0); )
  1023.         *quant = insym[(*nextsym)++].value;
  1024.         if (*quant < QUANT_MIN  ||  *quant > QUANT_MAX) {
  1025.             BS_ERR_MSG( sprintf( msg, "decode_mb: quant = %d", *quant); /* Flawfinder: ignore */
  1026.                     H261ErrMsg( msg ); )
  1027.             return (H261_ERROR);
  1028.         }
  1029.         // FALLTHROUGH
  1030.     case MTYPE_INTRA:
  1031.         for (blk = 0; blk < 6; blk++) {
  1032.             status = decode_intra_block( insym, nextsym,
  1033.                                 &(mb[mbnum].block[blk]),
  1034.                                 &outsym[isym] );
  1035.             if (status == H261_ERROR) {
  1036.                 BS_ERR_MSG( sprintf( msg, "decode_mb: Bitstream error, block #%d", blk); /* Flawfinder: ignore */
  1037.                         H261ErrMsg( msg  ); )
  1038.                 return (H261_ERROR);
  1039.             }
  1040.             isym += status;
  1041.         }
  1042.         break;
  1043.     default:    // Illegal MTYPE is due to program error; not from bit errors
  1044.         CHECKSYM( sprintf( msg, "decode_mb: MTYPE = %d", mb[mbnum].mtype); /* Flawfinder: ignore */
  1045.             H261ErrMsg( msg ); )
  1046.         return (H261_ERROR);
  1047.         break;
  1048.     }
  1049.     mb[mbnum].quant = *quant;
  1050.     return (isym);
  1051. }
  1052. static int  decode_intra_block( SYMBOL insym[], int * nextsym,
  1053.                             BLOCK_DESCR * block, SYMBOL outsym[])
  1054. {
  1055.     int isym, zzpos, run;
  1056.     CHECKSYM ( char msg[120] ); /* Flawfinder: ignore */
  1057.     /* DC coefficient */
  1058.     //printf("decode_intra_block DC: "); printsym( insym[*nextsym] ); printf("n");
  1059.     CHECKSYM( if (checksym( insym[*nextsym], SYM_INTRA_DC, "decode_intra") != OK) exit(0); )
  1060.     outsym[0].type = 0;
  1061.     outsym[0].value = insym[(*nextsym)++].value;
  1062.     /* AC coefficients */
  1063.     isym = 1;
  1064.     zzpos = 1;
  1065.     //printf("decode_intra_block AC: "); printsym( insym[*nextsym] ); printf("n");
  1066.     while (insym[*nextsym].type != SYM_EOB) {
  1067.         if (insym[*nextsym].type == SYM_ESC_RUN) {
  1068.             run = insym[(*nextsym)++].value;
  1069.             outsym[isym].type = run;
  1070.             CHECKSYM( if (checksym( insym[*nextsym], SYM_ESC_LEVEL, "decode_intra") != OK) exit(0); )
  1071.             outsym[isym++].value = insym[(*nextsym)++].value;
  1072.         } else {
  1073.             run = insym[*nextsym].type;
  1074.             CHECKSYM( if (run < 0) {
  1075.                 sprintf( msg, "PROGRAM ERROR: run = %d in decode_intra", run); /* Flawfinder: ignore */
  1076.                 H261ErrMsg( msg );
  1077.                 return( H261_ERROR );
  1078.                 } )
  1079.             outsym[isym++] = insym[(*nextsym)++];
  1080.         }
  1081.         zzpos += run + 1;
  1082. //        printf("decode_intra_block AC: "); printsym( insym[*nextsym] );
  1083. //        printf("   zzpos = %dn", zzpos);
  1084.         if (zzpos > 64) {   // If we decoded coeff. 63, we will now have zzpos=64
  1085.             BS_ERR_MSG( sprintf( msg, "decode_intra_block: Bitstream error, zzpos=%d", zzpos); /* Flawfinder: ignore */
  1086.             H261ErrMsg( msg ); )
  1087.             return (H261_ERROR);
  1088.         }
  1089.     }
  1090.     (*nextsym)++;   /* Advance pointer to symbol after EOB */
  1091.     block->sym = outsym;
  1092.     block->nsym = isym;
  1093.     return (isym);
  1094. }
  1095. /* Compute # bits in segment bs1 - bs2 */
  1096. extern int BsDiff( BS_PTR bs1, BS_PTR bs2 )
  1097. {
  1098.     int bits;
  1099.     bits = 8 * (bs1.byteptr - bs2.byteptr) + bs1.bitptr - bs2.bitptr;
  1100.     return (bits);
  1101. }
  1102. static int  find_startcodes( BS_PTR * bs,   // Points to beginning of bitstream
  1103.                             int numbits,    // length of bitstream in bits
  1104.                             BS_PTR start[], // Returns positions for startcodes; size "max_start"
  1105.                             int gobnum[],   // Returns 4 bits after startcode (5 bits for H.263); size "max_start"
  1106.                             int max_start,  // Max number of start codes to be returned
  1107.                             int codingMethod )  // Indicate H.261 or H.263 syntax
  1108. {
  1109.     int i, bits_left, startZeros, gnBits;
  1110.     BS_PTR  bs_next;
  1111.     if (codingMethod == H263_CODING) {
  1112.         startZeros = H263_START_ZEROS;
  1113.         gnBits = H263_GN_BITS;
  1114.     } else {    // H.261
  1115.         startZeros = H261_START_ZEROS;
  1116.         gnBits = H261_GN_BITS;
  1117.     }
  1118.     i = 0;
  1119.     bs_next = *bs;
  1120.     while (i < max_start) {
  1121.         bits_left = numbits - BsDiff( bs_next, *bs);
  1122.         if (find_sc( &bs_next, bits_left, startZeros, &start[i] ) != YES) {
  1123.             return (i);
  1124.         }
  1125.         gobnum[i] = Get8Bits( start[i] ) >> (8 - gnBits);
  1126.         bs_next = start[i];
  1127.         i++;
  1128.     }
  1129.     return (max_start);
  1130. }
  1131. static  U8 leading[256];
  1132. static  U8 trailing[256];
  1133. extern void InitFindSC( void )
  1134. {
  1135.     int i, j, bitmask;
  1136.     for (i = 0; i < 256; i++) {
  1137.         leading[i] = 0;
  1138.         bitmask = 0x80;
  1139.         for (j = 0; j < 8; j++) {
  1140.             if ((i & bitmask) != 0) {
  1141.                 break;
  1142.             }
  1143.             bitmask >>= 1;
  1144.             ++leading[i];
  1145.         }
  1146.         trailing[i] = 0;
  1147.         bitmask = 0x1;
  1148.         for (j = 0; j < 8; j++) {
  1149.             if ((i & bitmask) != 0) {
  1150.                 break;
  1151.             }
  1152.             bitmask <<= 1;
  1153.             ++trailing[i];
  1154.         }
  1155.         //printf("%3x: Leading = %d  Trailing = %dn", i, leading[i], trailing[i]);
  1156.     }
  1157.     return;
  1158. }
  1159. //  find_sc - Find startcode consisting of startZeros zeros followed by 1
  1160. //  Returns YES if startcode found, otherwise NO
  1161. //  Operates on byte boundaries; might not look at last 8 bits in bitstream
  1162. static int  find_sc( BS_PTR * bs,       // Points to beginning of bitstream
  1163.                      int numbits,       // length of bitstream in bits
  1164.                      int startZeros,    // number of zeros in startcode
  1165.                      BS_PTR * start )   // Returns position for bit after startcode
  1166. {
  1167.     int     zeros, nbytes, i, validBitsInLastByte;
  1168.     U8   b;
  1169.     /* Read first byte from bitstream; set "irrelevant bits" to 1 */
  1170.     b = *bs->byteptr | (0xff & (0xff << (8 - bs->bitptr)));
  1171.     zeros = trailing[b];
  1172. //    nbytes = (numbits + bs->bitptr - 8 - max(H263_GN_BITS, H261_GN_BITS) ) >> 3;
  1173.     nbytes = (numbits + bs->bitptr - 1 ) >> 3;
  1174.     validBitsInLastByte = (numbits + bs->bitptr) &07;
  1175.     if (validBitsInLastByte == 0)
  1176.         validBitsInLastByte = 8;
  1177.     start->byteptr = bs->byteptr + 1;
  1178.     for (i = 0; i < nbytes; i++) {
  1179.         b = *start->byteptr;
  1180.         zeros += leading[b];
  1181.         if (zeros < startZeros  &&  b != 0) {
  1182.             zeros = trailing[b];
  1183.         } else if (b != 0) {    /* Found startcode */
  1184.             start->bitptr = leading[b] + 1;
  1185.             if (i == nbytes - 1 && 
  1186.                 start->bitptr + H263_GN_BITS > validBitsInLastByte
  1187.                 ||
  1188.                 i == nbytes - 2 &&
  1189.                 start->bitptr + H263_GN_BITS > 8 + validBitsInLastByte)
  1190.                 return(NO);
  1191.             if (start->bitptr > 7) {
  1192.                 ++(start->byteptr);
  1193.                 start->bitptr -= 8;
  1194.             }
  1195.             return (YES);
  1196.         }   /* else: b=0; continue until 1 is found */
  1197.         ++(start->byteptr);
  1198.     }
  1199.     return (NO);
  1200. }
  1201. #ifdef TESTING
  1202. ///////////  Routines for debugging  //////////////
  1203. extern int  checksym( SYMBOL sym, int type, char routine[] )
  1204. {
  1205.     char msg[120], csym[80], ctype[80]; /* Flawfinder: ignore */
  1206.     
  1207.     if (sym.type == type) {
  1208.         return (OK);
  1209.     } else {    // Not expected type
  1210.         sprintsym( sym , csym, 80);
  1211.         sprinttype( type, ctype, 80);
  1212.         SafeSprintf(msg, 120, "%s: Encountered %s  Expected %s", routine, csym, ctype);
  1213.         H261ErrMsg( msg );
  1214.         return (H261_ERROR);
  1215.     }
  1216. }
  1217. #endif // TESTING
  1218. #ifdef ANNOTATE_PICTURE
  1219. // saveOrRestoreReconPicture
  1220. static void saveOrRestoreReconPicture( PICTURE *pic,    // Picture to be saved or restored
  1221.                                        int  restore     // Save if 0, otherwise restore
  1222.                                      )
  1223. {
  1224. #define MAX_BYTES   ((176*144*3)/2)
  1225.     int             nBytes;
  1226.     static PIXEL    savePic[MAX_BYTES];
  1227.     
  1228.     nBytes = (pic->y.nhor * pic->y.nvert * 3) >> 1;
  1229.     // Packed format is assumed
  1230.     if (nBytes > MAX_BYTES) {
  1231.         H261ErrMsg("Error in saveOrRestoreReconPicturen");
  1232.         exit(0);
  1233.     } else if (restore) {   // Restore the saved picture
  1234.         memcpy( pic->y.ptr, savePic, nBytes ); /* Flawfinder: ignore */
  1235.     } else {                // Save picture for next decoding
  1236.         memcpy( savePic, pic->y.ptr, nBytes ); /* Flawfinder: ignore */
  1237.     }
  1238. }
  1239. // annotatePicture - Draw motion vectors etc.
  1240. static void annotatePicture( PICTURE *pic, MACROBLOCK_DESCR mb[])
  1241. {
  1242.     int     xSize, ySize, numMb, i, x, y;
  1243.     PIXEL   *upperLeft;
  1244.     
  1245.     xSize = pic->y.nhor;
  1246.     ySize = pic->y.nvert;
  1247.     numMb = (xSize * ySize) >> 8;
  1248.     for (i = 0; i < numMb; ++i) {
  1249.         x = 16 * mb[i].x;
  1250.         y = 16 * mb[i].y;
  1251.         upperLeft = pic->y.ptr + x + y * pic->y.hoffset;
  1252.         annotateMacroblock( upperLeft, pic->y.hoffset, &mb[i],
  1253.                             -x, xSize - 1 - x,
  1254.                             -y, ySize - 1 - y );
  1255.     }
  1256. }
  1257. #define WHITE   (255)
  1258. #define BLACK   (0)
  1259. #define BLACK_THRESHOLD (192)   // Paint with black if pixel is brighter than threshold
  1260. // Limit x to interval [low,high]
  1261. #define LIMIT( low, x, high )    max( low, min( x, high ))
  1262. // annotateMacroblock
  1263. static void annotateMacroblock( PIXEL data[], int xdim, MACROBLOCK_DESCR *mb,
  1264.                                 int xMin, int xMax, int yMin, int yMax )
  1265. {
  1266.     switch (mb->mtype)
  1267.     {
  1268.     case MTYPE_SKIP:
  1269.         // Do nothing
  1270.         break;
  1271.     case MTYPE263_INTER:
  1272.     case MTYPE263_INTER_Q:
  1273.         // Draw motion vector
  1274.         drawMv( &data[7 + 7 * xdim], xdim, mb->mv_x, mb->mv_y,
  1275.                 xMin-7, xMax-7, yMin-7, yMax-7 );
  1276.         break;
  1277.     case MTYPE263_INTER4V:
  1278.         // Draw a "plus"
  1279.         plusMb( data, xdim );
  1280.         // Draw 4 motion vectors
  1281.         drawMv( &data[3 + 3 * xdim], xdim, mb->blkMvX[0], mb->blkMvY[0],
  1282.                 xMin-3, xMax-3, yMin-3, yMax-3 );
  1283.         drawMv( &data[11 + 3 * xdim], xdim, mb->blkMvX[1], mb->blkMvY[1],
  1284.                 xMin-11, xMax-11, yMin-3, yMax-3 );
  1285.         drawMv( &data[3 + 11 * xdim], xdim, mb->blkMvX[2], mb->blkMvY[2],
  1286.                 xMin-3, xMax-3, yMin-11, yMax-11 );
  1287.         drawMv( &data[11 + 11 * xdim], xdim, mb->blkMvX[3], mb->blkMvY[3],
  1288.                 xMin-11, xMax-11, yMin-11, yMax-11 );
  1289.         break;
  1290.     case MTYPE263_INTRA:
  1291.     case MTYPE263_INTRA_Q:
  1292.         //  Draw motion vector and mark block with a cross
  1293.         drawMv( &data[7 + 7 * xdim], xdim, mb->mv_x, mb->mv_y,
  1294.                 xMin-7, xMax-7, yMin-7, yMax-7 );
  1295.         crossMb( data, xdim );
  1296.         break;
  1297.     default:
  1298.         // Fill block with white
  1299.         fillMb( data, xdim );
  1300.         break;
  1301.     }
  1302. }
  1303. // drawMv - Draw motion vector starting in (0,0)
  1304. static void drawMv( PIXEL data[], int xdim, int mvX, int mvY,
  1305.                     int xMin, int xMax, int yMin, int yMax )
  1306. {
  1307.     if (mvX == 0  &&  mvY == 0) {
  1308.         // Draw a circle
  1309.         markPixel( &data[-xdim] );
  1310.         markPixel( &data[-xdim + 1] );
  1311.         markPixel( &data[-1] );
  1312.         markPixel( &data[2] );
  1313.         markPixel( &data[xdim - 1] );
  1314.         markPixel( &data[xdim + 2] );
  1315.         markPixel( &data[2*xdim] );
  1316.         markPixel( &data[2*xdim+1] );
  1317.     } else {    // Draw motion vector
  1318.         // Divide by 2 (one frac. bit); round "away" from 0
  1319.         /*if (mvX > 0) ++mvX;
  1320.         mvX >>= 1;
  1321.         if (mvY > 0) ++mvY;
  1322.         mvY >>= 1;*/    // Leave mv's scaled up by factor of 2
  1323.         // Clip to picture rectangle
  1324.         mvX = LIMIT( xMin, mvX, xMax );
  1325.         mvY = LIMIT( yMin, mvY, yMax );
  1326.         DrawVector( data, xdim, 0, 0, mvX, mvY );
  1327.     }
  1328. }
  1329. // plusMb - Mark block with a "plus"
  1330. static void plusMb( PIXEL data[], int xdim )
  1331. {
  1332.     int col;
  1333.     
  1334.     // Horizontal line
  1335.     data += 7 * xdim;
  1336.     for (col = 5; col <= 9; ++col) {
  1337.         markPixel( &data[col] );
  1338.     }
  1339.     // Vertical line
  1340.     markPixel( &data[7 - 2 * xdim] );
  1341.     markPixel( &data[7 - 1 * xdim] );
  1342.     markPixel( &data[7 + 1 * xdim] );
  1343.     markPixel( &data[7 + 2 * xdim] );
  1344. }
  1345. // crossMb - Mark block with a cross
  1346. static void crossMb( PIXEL data[], int xdim )
  1347. {
  1348.     int row;
  1349.     
  1350.     for (row = 0; row < 16; ++row) {
  1351.         markPixel( &data[row] );
  1352.         markPixel( &data[15 - row] );
  1353.         data += xdim;
  1354.     }
  1355. }
  1356. // fillMb - Fill block with white
  1357. static void fillMb( PIXEL data[], int xdim )
  1358. {
  1359.     int row, col;
  1360.     
  1361.     for (row = 0; row < 16; ++row) {
  1362.         for (col = 0; col < 16; ++col) {
  1363.             markPixel( &data[col] );
  1364.         }
  1365.         data += xdim;
  1366.     }
  1367. }
  1368. // markPixel - Set pixel to white if < 192, otherwise set it to black
  1369. static void markPixel( PIXEL *pixel )
  1370. {
  1371.     if (*pixel < BLACK_THRESHOLD) {
  1372.         *pixel = WHITE;
  1373.     } else {
  1374.         *pixel = BLACK;
  1375.     }
  1376. }
  1377. ///////////// Graphics routines /////////////
  1378. #include <stdlib.h>
  1379. #include <math.h>
  1380. // Static function declarations
  1381. static int DrawVector( unsigned char data[], int xdim, int x1, int y1, int x2, int y2 );
  1382. static int drawVec( unsigned char data[], int xdim, int x1, int y1 );
  1383. // DrawVector - Draw vector from (x1,y1) to (x2,y2)
  1384. static int DrawVector( unsigned char data[], int xdim, int x1, int y1, int x2, int y2 )
  1385. {
  1386.     int x, y;
  1387.     
  1388.     if (y1 == y2) {         // Draw horizontal line
  1389.         data += y1 * xdim;
  1390.         for (x = min(x1,x2); x <= max(x1,x2); ++x)  markPixel( &data[x] );
  1391.     } else if (x1 == x2) {  // Draw vertical line
  1392.         data += min(y1,y2) * xdim;
  1393.         for (y = min(y1,y2); y <= max(y1,y2); ++y) {
  1394.             markPixel( &data[x1] );
  1395.             data += xdim;
  1396.         }
  1397.     } else if (x2 > x1) {   // Use (x1,y1) as origin
  1398.         data += x1 + y1 * xdim;
  1399.         drawVec( data, xdim, x2-x1, y2-y1 );
  1400.     } else {                // Use (x2,y2) as origin
  1401.         data += x2 + y2 * xdim;
  1402.         drawVec( data, xdim, x1-x2, y1-y2 );
  1403.     }
  1404.     return(1);
  1405. }
  1406. // drawVec - Draw vector from origin to (x1,y1)
  1407. //  Assumes that x1 > 0, and y1 != 0
  1408. //  Draw pixels that are within 0.5 units distance of vector
  1409. static int drawVec( unsigned char data[], int xdim, int x1, int y1 )
  1410. {
  1411.     int x, y, xLast, xNew;
  1412.     float   fX1, fY1, fNorm, fA, fB, fXstep, fX, fDist;
  1413.     
  1414.     if (y1 < 0) {
  1415.         y1 = -y1;
  1416.         xdim = -xdim;
  1417.     }
  1418.     // Now, both x1 and y1 are >0
  1419.     // Compute equation for line:  ax + by = 0, where (a,b) is normal vector of length 1
  1420.     // The distance between (x,y) and the line is the inner product: abs(ax + by)
  1421.     fX1 = (float)x1;
  1422.     fY1 = (float)y1;
  1423.     fNorm = (float) sqrt( fX1*fX1 + fY1*fY1);
  1424.     fA = -fY1 / fNorm;  // fA < 0
  1425.     fB = fX1 / fNorm;   // fB > 0
  1426.     fXstep = fX1 / fY1; // x increment per row
  1427.     // First row
  1428.     fX = (float)(0.5 * fXstep);  // Intersection with y=0.5
  1429.     xLast = (int)fX;    // Truncate (Note: fX > 0; int always truncates towards zero)
  1430.     for (x = 0; x <= xLast; ++x)  markPixel( &data[x] );
  1431.     // Intermediate rows
  1432.     for (y = 1; y < y1; ++y) {
  1433.         data += xdim;
  1434.         // Check distance to (xLast, y)
  1435.         fDist = fA * (float)xLast + fB * (float)y;  // fDist > 0
  1436.         if (fDist < 0.4999) {
  1437.             markPixel( &data[xLast] );
  1438.         } else if (fDist + fA - fB > -0.4999) {     // Check distance to (xLast+1, y-1)
  1439.             //fDist = fA * (float)(xLast+1) + fB * (float)(y-1);  // fDist < 0
  1440.             markPixel( &data[xLast+1 - xdim] );
  1441.         }
  1442.         fX += fXstep;   // Intersection with y+0.5
  1443.         xNew = (int)fX;
  1444.         for (x = xLast + 1; x <= xNew; ++x)  markPixel( &data[x] );
  1445.         xLast = xNew;
  1446.     }
  1447.     // Last row (y = y1)
  1448.     data += xdim;
  1449.     // Check distance to (xLast, y1)
  1450.     fDist = fA * (float)xLast + fB * (float)y1; // fDist > 0
  1451.     if (fDist < 0.4999) {
  1452.         markPixel( &data[xLast] );
  1453.     } else if (fDist + fA - fB > -0.4999) {     // Check distance to (xLast+1, y1-1)
  1454.         markPixel( &data[xLast+1 - xdim] );
  1455.     }
  1456.     for (x = xLast + 1; x <= x1; ++x)  markPixel( &data[x] );
  1457.     
  1458.     return(1);
  1459. }
  1460. #endif  /* ANNOTATE_PICTURE */
  1461. /*
  1462. // Compute checksums for picture (used for debugging only)
  1463. static int checkPicture( PICTURE pic );
  1464. static int checkComponent( COMPONENT comp );
  1465. static PIXEL encPic[176*144], decPic[176*144], diffPic[176*144];
  1466. extern int storePicture( PICTURE pic, int picNum )
  1467. {
  1468. int i, j;
  1469. PIXEL *in, *out;
  1470. in = pic.y.ptr;
  1471. if (picNum == 0)
  1472. out = encPic;
  1473. else
  1474. out = decPic;
  1475.     for (i = 0; i < pic.y.nvert; i++) {
  1476.         for (j = 0; j < pic.y.nhor; j++) {
  1477. out[j] = in[j];
  1478.         }
  1479. in += pic.y.hoffset;
  1480. out += pic.y.nhor;
  1481.     }
  1482. return( 1 );
  1483. }
  1484. static int checkPicture( PICTURE pic )
  1485. {
  1486. int         y, cb, cr, i;
  1487.     static int  sum = 0;
  1488. storePicture( pic, 1 );
  1489. y = checkComponent( pic.y );
  1490. cb = checkComponent( pic.cb );
  1491. cr = checkComponent( pic.cr );
  1492. sum += y + cb + cr;
  1493. for (i = 0; i < 176*144; ++i)
  1494. diffPic[i] = encPic[i] - decPic[i];
  1495. return( sum );
  1496. }
  1497. static int checkComponent( COMPONENT comp )
  1498. {
  1499.     int i, j, sum;
  1500.     PIXEL   *p;
  1501. sum = 0, p = comp.ptr;
  1502.     for (i = 0; i < comp.nvert; i++) {
  1503.         for (j = 0; j < comp.nhor; j++) {
  1504. sum += p[j];
  1505.         }
  1506. p += comp.hoffset;
  1507.     }
  1508. return( sum );
  1509. }
  1510. */