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

Symbian

开发平台:

Visual C++

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