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

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 "dllindex.h"
  36. #include "h261defs.h"
  37. #include "vldstate.h"
  38. #include "vldtabs.h"
  39. #include "h261func.h"
  40. #include "vldecode.h"       /* set the proper pragmas for VLDecode          */
  41. #include "h263plus.h"
  42. //#include <stdio.h>
  43. //#include <stdlib.h>
  44. //#define BS_ERR_MSG(a)   a   // Generate messages on bitstream error (i.e., illegal 
  45.                             // bitstream syntax) to simplify debugging
  46. #define BS_ERR_MSG(a)       // Suppress error messages 
  47. //#define CHECKSYM(a)     a     // Check symbol types to verify decoder state tables
  48. #define CHECKSYM(a)             // Don't check symbol types
  49. ////////////  Static function declarations  ////////////
  50. //  initPBtabs - Initialize tables for Bquant and mvB/mvF
  51. static void initPBtabs( PICTURE_DESCR * pic );
  52. //  decMvd - Decode "num" motion vectors
  53. static int  decMvd( BS_PTR * bs,    // Bitstream pointer; updated by this routine
  54.                     int * maxBits,  // max bits to decode; updated by this routine
  55.                     int num,        // number of motion vectors to decode
  56.                     S8  x[],        // hor. components decoded by this routine
  57.                     S8  y[]         // vert. components decoded by this routine
  58.                     );
  59. // getMvComp - Compute mv component in H.263 decoder
  60. static int getMvComp( int pred, S8 diff, int unrestrictedMv );
  61. //  dec263blocks - Decode block layer for a macroblock
  62. static int  dec263blocks(   BS_PTR * bs,    // Bitstream pointer; updated by this routine
  63.                             int * maxBits,  // max bits to decode; updated by this routine
  64.                             int cbp,        // Coded Block Pattern
  65.                             int intraFlag,  // 0: INTER block, otherwise INTRA
  66.                             int advancedIntraMode, // 0: off else on
  67.                             BLOCK_DESCR block[6],   // block descriptors generated by this routine
  68.                             SYMBOL sym[],   // array for symbols generated by this routine
  69.                             int maxsym      // size of sym[] array
  70.                             );
  71. //  parseSymbols - Create block descriptor and merge ESC-RUN and ESC-LEVEL symbols
  72. //  Return number of symbols
  73. static int parseSymbols( SYMBOL insym[],        // Input symbols
  74.                         int nsym,               // # input symbols
  75.                         SYMBOL outsym[]         // output symbols
  76.                         );
  77. //  DecPicLayer263 - Decode H.263 Picture Layer information
  78. extern int  DecPicLayer263( BS_PTR * bs, int nbits, PICTURE_DESCR * pic,
  79.                             GOB_DESCR * gob, int * decPtype )
  80. {
  81.     int     gn, tr, ptype, quant, pei, pspare, cpm;
  82. #ifdef DO_H263_PLUS
  83.     int eptype=0;
  84. #endif
  85.     // Decode GN
  86.     if (FLDecSymbol( bs, 5, &nbits, &gn )  !=  OK)  return( OUT_OF_BITS );
  87.     if (gn != 0)  return( H261_ERROR );     // GN=0 for Picture Start Code
  88.     // Decode TR
  89.     if (FLDecSymbol( bs, 8, &nbits, &tr )  !=  OK)  return( OUT_OF_BITS );
  90.     pic->tr = tr;
  91.     // Decode PTYPE
  92.     if (FLDecSymbol( bs, 13, &nbits, &ptype )  !=  OK)  return( OUT_OF_BITS );
  93. #ifdef DO_H263_PLUS
  94.     if ((ptype & 0xe0) == PTYPE263_EPTYPE) {
  95.         if(FLDecSymbol( bs, 14, &nbits, &eptype )  !=  OK)  return( OUT_OF_BITS );
  96.         // the picture type is in bits 1-3 of EPTYPE, put those bits into bits 6-8 of PTYPE
  97.         ptype &= 0xFFFFFF1F; // clear bits 6-8
  98.         ptype |= (0x3800 & eptype) >> 6; 
  99.     }
  100. #endif
  101.     pic->ptype = ptype;
  102.     *decPtype = ptype;
  103.     pic->splitscreen = ptype & PTYPE263_SPLITSCREEN;
  104.     pic->doccamera = ptype & PTYPE263_DOCCAMERA;
  105.     pic->fp_release = ptype & PTYPE263_FP_RELEASE;
  106.     switch (ptype & 0xe0)
  107.     {
  108.     case PTYPE263_SQCIF:
  109.         pic->format = SQCIF;
  110.         break;
  111.     case PTYPE263_QCIF:
  112.         pic->format = QCIF;
  113.         break;
  114.     case PTYPE263_CIF:
  115.         pic->format = CIF;
  116.         break;
  117.     case PTYPE263_4CIF:
  118.         pic->format = CIF4;
  119.         break;
  120.     case PTYPE263_16CIF:
  121.         pic->format = CIF16;
  122.         break;
  123.     case PTYPE263_RESERVED:
  124.         pic->format = ANYSIZE;
  125.         break;
  126.     default:
  127.         return( H261_ERROR );
  128.         break;
  129.     }
  130.     if ((ptype & 0x800) != 0  || (ptype & 0x1000) == 0) return( H261_ERROR );
  131.     pic->interFrame = ptype & PTYPE263_INTER;
  132.     pic->unrestrictedMv = ptype & PTYPE263_UNRESTRICTED_MV;
  133.     pic->advancedPred = ptype & PTYPE263_ADVANCED_PRED;
  134.     pic->syntax_basedAC = ptype & PTYPE263_SYNTAX_BASED_AC;
  135.     if (pic->syntax_basedAC) {
  136.         BS_ERR_MSG( H261ErrMsg("Syntax-based AC not yet supported"); )
  137.         return( H261_ERROR );
  138.     }
  139.     pic->PBframeMode = (ptype & PTYPE263_PB_FRAME) != 0;
  140. #ifdef DO_H263_PLUS
  141.     // Do PB frame - either orignal or improved mode
  142.     pic->PBframeMode = (ptype & PTYPE263_PB_FRAME) ? 1 : 0;
  143.     if(pic->PBframeMode) {
  144.         if( eptype & EPTYPE263PLUS_IMPROVED_PBFRAME_MODE) {
  145.             pic->PBframeMode = H263PLUS_IMPROVED_PBFRAME_MODE;
  146.         }
  147.     } else {
  148.         if( eptype & EPTYPE263PLUS_IMPROVED_PBFRAME_MODE) {
  149.             return ( H261_ERROR );
  150.         }
  151.     }
  152.     // Are deblocking filters on?
  153.     pic->deblockingFilterMode = eptype & EPTYPE263PLUS_DEBLOCKING_FILTER_MODE;
  154.     // Use advanced intra mode?
  155.     pic->advancedIntraMode = eptype & EPTYPE263PLUS_ADVANCED_INTRA_MODE;
  156.     // Using Reduced-resolution Update mode?
  157.     pic->reducedResUpdate = eptype & EPTYPE263PLUS_REDUCED_RES_UPDATE;
  158.     //if (pic->reducedResUpdate && (!pic->interFrame || pic->PBframeMode)) return( H261_ERROR );
  159. #else
  160.     pic->reducedResUpdate = 0;
  161. #endif
  162.     if(pic->interFrame == 0 && pic->PBframeMode != 0) return( H261_ERROR );
  163.     // Decode PQUANT
  164.     if (FLDecSymbol( bs, 5, &nbits, &quant )  !=  OK)  return( OUT_OF_BITS );
  165.     if (quant < QUANT_MIN  ||  quant > QUANT_MAX)  return( H261_ERROR );
  166.     gob->gquant = quant;
  167.      // Decode CPM (continuous presence multipoint). For now, flag error if not zero.
  168.     if (FLDecSymbol( bs, 1, &nbits, &cpm )  !=  OK)  return( OUT_OF_BITS );
  169.     // if (cpm != 0)  return( H261_ERROR );
  170.     pic->cpm = cpm;     // Save (we may need it?)
  171.     if (pic->PBframeMode) {
  172.         // Decode TRB
  173.         if (FLDecSymbol( bs, 3, &nbits, &tr )  !=  OK)  return( OUT_OF_BITS );
  174.         pic->tempRefBframe = tr;
  175.         // Decode DBQUANT
  176.         if (FLDecSymbol( bs, 2, &nbits, &quant )  !=  OK)  return( OUT_OF_BITS );
  177.         pic->dbQuant = quant;
  178.         initPBtabs( pic );  // Generate lookup tables for Bquant and mvB/mvF
  179.     }
  180.     pic->trPrev = pic->tr;  // Hold on to TR for decoding of next picture
  181.     // Decode PEI
  182.     if (FLDecSymbol( bs, 1, &nbits, &pei )  !=  OK)  return( OUT_OF_BITS );
  183.     pic->peiCount = 0;
  184.     // Decode PSPARE
  185.     while (pei) {   // Loop until PEI=0
  186.         if (pic->peiCount < MAX_PEI_COUNT) {
  187.             FLDecSymbol( bs, 8, &nbits, &pspare );
  188.             pic->pSpare[pic->peiCount] = pspare;
  189.         } else {
  190.             ++bs->byteptr;  // Drop PSPARE on the floor
  191.         }
  192.         ++pic->peiCount;
  193.         if (FLDecSymbol( bs, 1, &nbits, &pei )  !=  OK)  return( OUT_OF_BITS );
  194.     }
  195.     // Indicate that GOB header has no "spares"
  196.     gob->gei = 0;
  197.     gob->num_gspare = 0;
  198.     return( OK );
  199. }
  200. //  InitMvTabs - Initialize tables for mvB/mvF
  201. extern void InitMvTabs( int trD, int trB,
  202.                         int tabMvF[], int tabMvB[]  // [UMV_MIN:UMV_MAX]
  203.                         )
  204. {
  205.     int i;
  206.     // Generate tables for B-picture motion vectors
  207.     trD &= H263_TR_MASK;
  208.     if (trD == 0)  trD = 2; // Avoid divide by 0
  209.     if (trB >= trD)  trB = 0;   // Ensure trB < trD
  210.     for (i = UMV_MIN; i <= UMV_MAX; ++i) {
  211.         tabMvF[i] = (trB * i) / trD;          // Mv using prev. picture
  212.         tabMvB[i] = ((trB - trD) * i) / trD;  // Mv using new P-picture
  213.     }
  214. }
  215. // Tables for B-picture: Bquant and mvF/mvB
  216. static U8   tabBquant[QUANT_MAX-QUANT_MIN+1];
  217. static int  decMvF[UMV_MAX-UMV_MIN+1],  // Mv using prev. picture
  218.             decMvB[UMV_MAX-UMV_MIN+1];  // Mv using new P-picture
  219. //  initPBtabs - Initialize tables for Bquant and mvB/mvF
  220. static void initPBtabs( PICTURE_DESCR * pic )
  221. {
  222.     int i, n;
  223.     // Generate tables for B-picture motion vectors
  224.     InitMvTabs( (pic->tr - pic->trPrev) & H263_TR_MASK, 
  225.                 pic->tempRefBframe,
  226.                 &decMvF[-UMV_MIN], &decMvB[-UMV_MIN] );
  227.     // Generate table for Bquant
  228.     n = pic->dbQuant + 5;
  229.     for (i = QUANT_MIN; i <= QUANT_MAX; ++i) {
  230.         tabBquant[i - QUANT_MIN] = min( (n*i) >> 2, QUANT_MAX );
  231.     }
  232. }
  233. //  DecGobLayer263 - Decode H.263 GOB Layer information
  234. extern int  DecGobLayer263( BS_PTR * bs, int nbits, GOB_DESCR * gob, int * gfid )
  235. {
  236.     int     gn, quant;
  237.     // Decode GN
  238.     if (FLDecSymbol( bs, 5, &nbits, &gn )  !=  OK)  return( OUT_OF_BITS );
  239.     // Decode GFID
  240.     if (FLDecSymbol( bs, 2, &nbits, gfid )  !=  OK)  return( OUT_OF_BITS );
  241.     // Decode GQUANT
  242.     if (FLDecSymbol( bs, 5, &nbits, &quant )  !=  OK)  return( OUT_OF_BITS );
  243.     if (quant < QUANT_MIN  ||  quant > QUANT_MAX)  return( H261_ERROR );
  244.     gob->gquant = quant;
  245.     // Indicate that GOB header has no "spares"
  246.     gob->gei = 0;
  247.     gob->num_gspare = 0;
  248.     return( OK );
  249. }
  250. //#define DB_DUMP_BLOCK_SYMBOLS
  251. #ifdef DB_DUMP_BLOCK_SYMBOLS
  252. FILE * pDecFile=0;
  253. int bDecOpen=0;
  254. int bDecClose=0;
  255. #endif
  256. //  DecMbLayer263 - Decode macroblock layer and block layer for a Group Of Blocks
  257. //  This routine is very picky when determining whether bitstream is valid.
  258. //  It returns OK only if a startcode ends the bitstream; otherwise, it
  259. //  returns H261_ERROR.
  260. extern int  DecMbLayer263(  BS_PTR * bs,    // Bitstream pointer
  261.                             int nbits,      // Bits to decode (incl. trailing startcode)
  262.                             GOB_DESCR * gob,        // GOB descriptor
  263.                             MACROBLOCK_DESCR mb[],  // Packed array of "gob->num_mb" MB descr.
  264.                             int interFrame, // 0: ptype=INTRA, otherwise ptype=INTER
  265.                             int PBframe,    // 0: not PB frame, otherwise PB frame
  266.                             int unrestrictedMv, // 0: -16/+15.5 motion, otherwise +/- 31.5
  267.                             int advancedIntraMode, // 0: off else on
  268.                             SYMBOL sym[],   // symbol array
  269.                             int maxsym      // size of symbol array
  270.                             )
  271. {
  272.     int     quant, isym, mcbpcTab, i, j, status, cbpyTab, intraFlag, horPredOnly, mvX, mvY;
  273.     SYMBOL  s;
  274.     int     mcbpc, modB, cbpB;
  275.     BS_ERR_MSG ( char msg[120] ); /* Flawfinder: ignore */
  276.     
  277.     isym = 0;
  278.     quant = gob->gquant;
  279.     if (interFrame) {
  280.         mcbpcTab = TAB263_MCBPC_INTER;
  281.     } else {
  282.         mcbpcTab = TAB263_MCBPC_INTRA;
  283.     }
  284.     for (i = 0; i < gob->num_mb; ++i) {
  285.         // Decode MCBPC
  286.         do {
  287.             status = VLDecSymbol( bs, mcbpcTab, &nbits, &s );
  288. if (status != OK)  
  289.                 if (s.type != SYM_STARTCODE) {
  290. status = BITSTREAM_ERROR;
  291. goto error_exit;
  292. } else {
  293. return(OK);
  294. }
  295.         } while( s.type == SYM_MCBPC_STUFFING );
  296.         mcbpc = s.value;
  297.         mb[i].mtype = mcbpc & 0xfc; // Mask off cbpC (two LSBs)
  298. #ifdef DO_H263_PLUS
  299.         if(advancedIntraMode && 
  300.             (mb[i].mtype == MTYPE263_INTRA || mb[i].mtype == MTYPE263_INTRA_Q)) {
  301.             // Decode INTRA_MODE
  302.             status = VLDecSymbol( bs, TAB263PLUS_INTRA_MODE, &nbits, &s );
  303. if (status != OK)  goto error_exit;
  304.             mb[i].intra_mode = s.value;
  305.         } else {
  306.             mb[i].intra_mode = ADV_INTRA_PRED_NONE;
  307.         }
  308. #endif
  309.         //printf("DecMbLayer:  x = %d   y = %d   type = %dn", mb[i].x, mb[i].y, mb[i].mtype );
  310.         if (mb[i].mtype == MTYPE_SKIP) {
  311.             mb[i].mv_x = 0;
  312.             mb[i].mv_y = 0;
  313.         } else {
  314.             if (PBframe) {
  315.                 // Decode MODB
  316. #ifdef DO_H263_PLUS
  317. if(PBframe==H263PLUS_IMPROVED_PBFRAME_MODE) {
  318. status = VLDecSymbol( bs, TAB263PLUS_MODB, &nbits, &s );
  319. } else {
  320. status = VLDecSymbol( bs, TAB263_MODB, &nbits, &s );
  321. }
  322. #else
  323. status = VLDecSymbol( bs, TAB263_MODB, &nbits, &s );
  324. #endif
  325. if (status != OK)  
  326. goto error_exit;
  327.                 modB = s.value;
  328.                 mb[i].modB = modB;
  329.                 if (BFRAME_HAS_CBP(&mb[i])) {    // Decode cbpB
  330.                     status = FLDecSymbol( bs, 6, &nbits, &cbpB );
  331.                     if (status != OK)  goto error_exit;
  332.                     mb[i].cbpB = cbpB;
  333.                 } else {
  334.                     mb[i].cbpB = 0;
  335.                 }
  336.             } else {
  337.                 mb[i].modB = modB = 0;
  338.             }
  339.             // Decode cbpY
  340.             if (mb[i].mtype == MTYPE263_INTRA  ||  mb[i].mtype == MTYPE263_INTRA_Q) {
  341.                 cbpyTab = TAB263_CBPY_INTRA;
  342.             } else {
  343.                 cbpyTab = TAB263_CBPY;
  344.             }
  345.             status = VLDecSymbol( bs, cbpyTab, &nbits, &s );
  346.             if (status != OK)  goto error_exit;
  347.             mb[i].cbp = (s.value << 2) | (mcbpc & 0x3);
  348.             // Decode DQUANT
  349.             if (mb[i].mtype == MTYPE263_INTER_Q  ||  mb[i].mtype == MTYPE263_INTRA_Q) {
  350.                 status = VLDecSymbol( bs, TAB263_DQUANT, &nbits, &s );
  351.                 if (status != OK)  goto error_exit;
  352.                 mb[i].dquant = s.value;
  353.                 quant += mb[i].dquant;
  354.                 if (quant < QUANT_MIN)
  355.                     quant = QUANT_MIN;
  356.                 if (quant > QUANT_MAX)
  357.                     quant = QUANT_MAX;
  358.             }
  359.             mb[i].quant = quant;
  360.             // Decode motion vectors and block layer
  361.             if (i < gob->mb_width) {
  362.                 horPredOnly = YES;  // First row of macroblocks; don't use prev. row
  363.             } else {
  364.                 horPredOnly = NO;
  365.             }
  366.             switch( mb[i].mtype ) {
  367.                 
  368.             case MTYPE263_INTRA:
  369.             case MTYPE263_INTRA_Q:
  370.                 if (PBframe) {  // Decode MVD
  371.                     status = decMvd( bs, &nbits, 1, &mb[i].mvd_x, &mb[i].mvd_y );
  372.                     if (status != OK)  goto error_exit;
  373.                     MvPred( &mb[i], WHOLE_MACROBLOCK, gob->mb_offset, horPredOnly, &mvX, &mvY );
  374.                     mb[i].mv_x = getMvComp( mvX, mb[i].mvd_x, unrestrictedMv );
  375.                     mb[i].mv_y = getMvComp( mvY, mb[i].mvd_y, unrestrictedMv );
  376.                     if (BFRAME_HAS_MOTION_VECTOR(&mb[i])) {  // Decode MVDB
  377.                         status = decMvd( bs, &nbits, 1, &mb[i].mvdB_x, &mb[i].mvdB_y );
  378.                         if (status != OK)  goto error_exit;
  379.                     }
  380.                 } else {
  381.                     mb[i].mv_x = 0;
  382.                     mb[i].mv_y = 0;
  383.                 }
  384.                 intraFlag = YES;
  385. #ifdef DO_H263_PLUS
  386.                 status = dec263blocks( bs, &nbits, mb[i].cbp, intraFlag, advancedIntraMode,
  387.                                         mb[i].block, &sym[isym], maxsym - isym );
  388. #else
  389.                 status = dec263blocks( bs, &nbits, mb[i].cbp, intraFlag, 0,
  390.                                         mb[i].block, &sym[isym], maxsym - isym );
  391. #endif
  392. #ifdef DB_DUMP_BLOCK_SYMBOLS
  393.                 if(bDecClose) {
  394.                     fclose(pDecFile);
  395.                     pDecFile = NULL;
  396.                 }
  397.                 if(bDecOpen) {
  398.                     pDecFile = fopen("C:\temp\dec_out.dmp", "wt");
  399.                 }
  400.                 if(pDecFile) {
  401.                     int b,s;
  402.                     fprintf(pDecFile, "n n Macroblock %d n n", i);
  403.                     for(b=0; b<6; b++) {
  404.                         fprintf(pDecFile, "n Block %d n", b);
  405.                         for(s=0; s<mb[i].block[b].nsym; s++) {
  406.                             fprintf(pDecFile, "lev = %d  run = %dn", mb[i].block[b].sym[s].value, mb[i].block[b].sym[s].type);
  407.                         }
  408.                     }
  409.                 }
  410. #endif
  411.                 if (status == H261_ERROR) {
  412.                     status = BITSTREAM_ERROR;
  413.                     goto error_exit;
  414.                 }
  415.                 isym += status;
  416.                 break;
  417.                 
  418.             case MTYPE263_INTER:
  419.             case MTYPE263_INTER_Q:
  420.                 // Decode MVD
  421.                 status = decMvd( bs, &nbits, 1, &mb[i].mvd_x, &mb[i].mvd_y );
  422.                 if (status != OK)  goto error_exit;
  423.                 MvPred( &mb[i], WHOLE_MACROBLOCK, gob->mb_offset, horPredOnly, &mvX, &mvY );
  424.                 mb[i].mv_x = getMvComp( mvX, mb[i].mvd_x, unrestrictedMv );
  425.                 mb[i].mv_y = getMvComp( mvY, mb[i].mvd_y, unrestrictedMv );
  426.                 if (BFRAME_HAS_MOTION_VECTOR(&mb[i])) {  // Decode MVDB
  427.                     status = decMvd( bs, &nbits, 1, &mb[i].mvdB_x, &mb[i].mvdB_y );
  428.                     if (status != OK)  goto error_exit;
  429.                 }
  430.                 intraFlag = 0;
  431.                 status = dec263blocks( bs, &nbits, mb[i].cbp, intraFlag, 0,
  432.                                         mb[i].block, &sym[isym], maxsym - isym );
  433.                 if (status == H261_ERROR) {
  434.                     status = BITSTREAM_ERROR;
  435.                     goto error_exit;
  436.                 }
  437.                 isym += status;
  438.                 break;
  439.                 
  440.             case MTYPE263_INTER4V:
  441.                 // Decode MVD1-4
  442.                 status = decMvd( bs, &nbits, 4, mb[i].blkDiffX, mb[i].blkDiffY );
  443.                 if (status != OK)  goto error_exit;
  444.                 for (j = 0; j < 4; ++j) {
  445.                     MvPred( &mb[i], j, gob->mb_offset, horPredOnly, &mvX, &mvY );
  446.                     mb[i].blkMvX[j] = getMvComp( mvX, mb[i].blkDiffX[j], unrestrictedMv );
  447.                     mb[i].blkMvY[j] = getMvComp( mvY, mb[i].blkDiffY[j], unrestrictedMv );
  448.                 }
  449.                 if (BFRAME_HAS_MOTION_VECTOR(&mb[i])) {  // Decode MVDB
  450.                     status = decMvd( bs, &nbits, 1, &mb[i].mvdB_x, &mb[i].mvdB_y );
  451.                     if (status != OK)  goto error_exit;
  452.                 }
  453.                 intraFlag = 0;
  454.                 status = dec263blocks( bs, &nbits, mb[i].cbp, intraFlag, 0,
  455.                                         mb[i].block, &sym[isym], maxsym - isym );
  456.                 if (status == H261_ERROR) {
  457.                     status = BITSTREAM_ERROR;
  458.                     goto error_exit;
  459.                 }
  460.                 isym += status;
  461.                 break;
  462.                 
  463.             default:
  464.                 status = UNKNOWN_MTYPE;
  465.                 goto error_exit;
  466.                 break;
  467.             }
  468.             
  469.             if (PBframe) {
  470.                 // Reconstruct forward and backward mv for B-frame
  471.                 GetMvBframe( &mb[i], unrestrictedMv, &decMvF[-UMV_MIN], &decMvB[-UMV_MIN] );
  472.                 mb[i].Bquant = tabBquant[quant - QUANT_MIN];
  473.                 if (BFRAME_HAS_CBP(&mb[i])) {    // Decode B blocks
  474.                     intraFlag = 0;
  475.                     status = dec263blocks( bs, &nbits, mb[i].cbpB, intraFlag, 0,
  476.                                             mb[i].Bblock, &sym[isym], maxsym - isym );
  477.                     if (status == H261_ERROR) {
  478.                         status = BITSTREAM_ERROR;
  479.                         goto error_exit;
  480.                     }
  481.                     isym += status;
  482.                 }
  483.             }
  484.         }
  485.     }
  486.     //printf("DecMbLayer:  Remove stuffing, then find startcode; nbits = %dn", nbits);
  487.     
  488. do {
  489.         status = VLDecSymbol( bs, mcbpcTab, &nbits, &s );
  490.         if (status != OK)  
  491. return(OK);
  492. // goto error_exit;
  493. // sometimes the end of stream is not that clean.. -gneel
  494.     } while( s.type == SYM_MCBPC_STUFFING);
  495. //    if (s.type != SYM_STARTCODE  ||  nbits != 0) {
  496. //        status = BITSTREAM_ERROR;
  497. //        goto error_exit;
  498. //    }
  499. // After all the mbs are over there may not be a start code.
  500.     return( OK );
  501. error_exit:
  502.     BS_ERR_MSG( sprintf( msg, "DecMbLayer263: error %d occurred in block #%d", status, i); /* Flawfinder: ignore */
  503.                                 H261ErrMsg( msg ); )
  504.     return( H261_ERROR );
  505. }
  506. //  decMvd - Decode "num" motion vectors
  507. static int  decMvd( BS_PTR * bs,    // Bitstream pointer; updated by this routine
  508.                     int * maxBits,  // max bits to decode; updated by this routine
  509.                     int num,        // number of motion vectors to decode
  510.                     S8  x[],        // hor. components decoded by this routine
  511.                     S8  y[]         // vert. components decoded by this routine
  512.                     )
  513. {
  514.     int     i, status;
  515.     SYMBOL  s;
  516.     
  517.     for (i = 0; i < num; ++i) {
  518.         // Decode horizontal component
  519.         status = VLDecSymbol( bs, TAB263_MVD, maxBits, &s );
  520.         if (status != OK)  return( status );
  521.         x[i] = s.value;
  522.         // Decode vertical component
  523.         status = VLDecSymbol( bs, TAB263_MVD, maxBits, &s );
  524.         if (status != OK)  return( status );
  525.         y[i] = s.value;
  526.     }
  527.     return( OK );
  528. }
  529. // getMvComp - Compute mv component in H.263 decoder
  530. static int getMvComp( int pred, S8 diff, int unrestrictedMv )
  531. {
  532.     int output;
  533.     
  534.     output = pred + diff;
  535.     if (unrestrictedMv == 0) {
  536.         while (output < MVD263_MIN) {
  537.             output += MV263_WRAP;
  538.         }
  539.         while (output > MVD263_MAX) {
  540.             output -= MV263_WRAP;
  541.         }
  542.     } else if (pred < UMV_NEG_THRESH) {
  543.         // UMV pred < -15.5: -31.5 <= output <= 0
  544.         if (output < UMV_MIN) {
  545.             output += MV263_WRAP;   // Need only check negative limit, since diff <= 15.5
  546.         }
  547.     } else if (pred > UMV_POS_THRESH  &&  output > UMV_MAX) {
  548.         // UMV pred > 16: 0 <= output <= 31.5
  549.         output -= MV263_WRAP;       // Need only check positive limit, since diff >= -16
  550.     }   // else: Don't need to check for -15.5 <= pred <= 16
  551.     return( output );
  552. }
  553. //  GetMvBframe - Reconstruct forward and backward motion vectors for B-frame
  554. extern void GetMvBframe( MACROBLOCK_DESCR *mb, int unrestrictedMv,
  555.                          int tabMvF[], int tabMvB[]  // [UMV_MIN:UMV_MAX]
  556.                          )
  557. {
  558.     int j;
  559.     if (mb->mtype == MTYPE263_INTER4V) {
  560.         for (j = 0; j < 4; ++j) {
  561.             // Forward prediction (using prev. frame)
  562.             mb->blkMvFx[j] = tabMvF[ mb->blkMvX[j] ];
  563.             mb->blkMvFy[j] = tabMvF[ mb->blkMvY[j] ];
  564.             if (BFRAME_HAS_MOTION_VECTOR(mb)) {
  565.                 mb->blkMvFx[j] = getMvComp( mb->blkMvFx[j], mb->mvdB_x, unrestrictedMv );
  566.                 mb->blkMvFy[j] = getMvComp( mb->blkMvFy[j], mb->mvdB_y, unrestrictedMv );
  567.                 // Backward prediction (using next P-frame)
  568.                 mb->blkMvBx[j] = mb->blkMvFx[j] - mb->blkMvX[j];
  569.                 mb->blkMvBy[j] = mb->blkMvFy[j] - mb->blkMvY[j];
  570.             } else {
  571.                 mb->blkMvBx[j] = tabMvB[ mb->blkMvX[j] ];
  572.                 mb->blkMvBy[j] = tabMvB[ mb->blkMvY[j] ];
  573.             }
  574.         }
  575.     } else {    // Same motion vector for the whole macroblock
  576.         // Forward prediction (using prev. frame)
  577.         mb->blkMvFx[0] = tabMvF[ mb->mv_x ];
  578.         mb->blkMvFy[0] = tabMvF[ mb->mv_y ];
  579.         if (BFRAME_HAS_MOTION_VECTOR(mb)) {
  580.             mb->blkMvFx[0] = getMvComp( mb->blkMvFx[0], mb->mvdB_x, unrestrictedMv );
  581.             mb->blkMvFy[0] = getMvComp( mb->blkMvFy[0], mb->mvdB_y, unrestrictedMv );
  582.             // Backward prediction (using next P-frame)
  583.             mb->blkMvBx[0] = mb->blkMvFx[0] - mb->mv_x;
  584.             mb->blkMvBy[0] = mb->blkMvFy[0] - mb->mv_y;
  585.         } else {
  586.             mb->blkMvBx[0] = tabMvB[ mb->mv_x ];
  587.             mb->blkMvBy[0] = tabMvB[ mb->mv_y ];
  588.         }
  589.     }
  590. }
  591. //  dec263blocks - Decode block layer for a macroblock
  592. static int  dec263blocks(   BS_PTR * bs,    // Bitstream pointer; updated by this routine
  593.                             int * maxBits,  // max bits to decode; updated by this routine
  594.                             int cbp,        // Coded Block Pattern
  595.                             int intraFlag,  // 0: INTER block, otherwise INTRA
  596.                             int advancedIntraMode, // 0: off else on
  597.                             BLOCK_DESCR block[6],   // block descriptors generated by this routine
  598.                             SYMBOL sym[],   // array for symbols generated by this routine
  599.                             int maxsym      // size of sym[] array
  600.                             )
  601. {
  602.     int startState, isym, mask, blk, state, status, parsed_bits, nsym;
  603.     
  604.     if (intraFlag) {
  605. #ifdef DO_H263_PLUS
  606.         if(advancedIntraMode) {
  607.             startState = ST263PLUS_BLK_6;
  608.         } else {
  609.             startState = ST263_INTRA_DC_AC;
  610.         }
  611. #else
  612.         startState = ST263_INTRA_DC_AC; // Decode DC and AC coeffs
  613. #endif
  614.     } else {
  615.         startState = ST263_BLK_6;       // Decode one INTER block
  616.     }
  617.     isym = 0;
  618.     mask = 0x20;    // Bit 5 indicates whether first block is coded
  619.     for (blk = 0; blk < 6; ++blk) {
  620.         if (cbp & mask) {
  621.             state = startState;
  622.             status = VLDECODE( *bs, *maxBits, &state, &parsed_bits, 
  623.                                 &nsym, &sym[isym], maxsym - isym );
  624.             if (status != FINISHED_LAST_BLOCK)  return( H261_ERROR );
  625.             IncBsPtr( bs, parsed_bits );
  626.             *maxBits -= parsed_bits;
  627.             status = parseSymbols( &sym[isym], nsym, &sym[isym] );
  628.             if (status == H261_ERROR)  return( H261_ERROR );
  629.             block[blk].sym = &sym[isym];
  630.             block[blk].nsym = status;
  631.             isym += status;
  632.         } else if (intraFlag && !advancedIntraMode) { // Decode INTRA-DC
  633.             if (VLDecSymbol( bs, TAB263_INTRA_DC, maxBits, &sym[isym] )  !=  OK) {
  634.                 return( H261_ERROR );
  635.             }
  636.             block[blk].sym = &sym[isym];
  637.             block[blk].nsym = 1;
  638.             ++isym;
  639.         } else {    // No coeffs
  640.             block[blk].nsym = 0;
  641.         }
  642.         mask >>= 1; // Check next block
  643.     }
  644.     return( isym );
  645. }
  646. //  parseSymbols - Merge ESC-RUN and ESC-LEVEL symbols
  647. //  Return number of symbols
  648. static int parseSymbols( SYMBOL insym[],        // Input symbols
  649.                         int nsym,               // # input symbols
  650.                         SYMBOL outsym[]         // output symbols
  651.                         )
  652. {
  653.     int iIn, iOut, zzpos, last, run;
  654.     BS_ERR_MSG ( char msg[120] ); /* Flawfinder: ignore */
  655.     
  656.     iIn = 0, iOut = 0, zzpos = 0;
  657.     while (iIn < nsym) {
  658.         if (insym[iIn].type == SYM_ESC_RUN) {   // Encountered ESCAPE-LAST-RUN-LEVEL symbol
  659.             last = insym[iIn].value & 0x40;     // LAST is found in bit 6
  660.             run = insym[iIn++].value & 0x3f;    // RUN in bits 0-5
  661.             outsym[iOut].type = run;
  662.             CHECKSYM( if (checksym( insym[iIn], SYM_ESC_LEVEL, "parseSymbols") != OK) return(H261_ERROR);)
  663.             outsym[iOut++].value = insym[iIn++].value;
  664.         } else {
  665.             last = insym[iIn].type & 0x40;      // LAST is found in bit 6
  666.             run = insym[iIn].type & 0x3f;     // RUN in bits 0-5
  667.             outsym[iOut].type = run;
  668.             outsym[iOut++].value = insym[iIn++].value;
  669.         }
  670.         zzpos += run + 1;
  671.         //printf("parseSymbols: "); printsym(outsym[iOut-1 ); printf("   zzpos = %dn", zzpos);
  672.         if (zzpos > 64) {   // If we decoded coeff. 63, we will now have zzpos=64
  673.             BS_ERR_MSG( sprintf( msg, "parseSymbols: Bitstream error, zzpos=%d", zzpos); /* Flawfinder: ignore */
  674.             H261ErrMsg( msg ); )
  675.             return (H261_ERROR);
  676.         }
  677.         if (last != 0  &&  iIn < nsym) {
  678.             H261ErrMsg( "parseSymbols: Encountered LAST=1 prematurely" );
  679.             return (H261_ERROR);
  680.         }
  681.     }
  682.     /*{
  683.         int i;
  684.         static int iprint = YES;
  685.         if (iprint) {
  686.             printf("parseSymbols: Found %d symbolsn", iOut);
  687.             for (i = 0; i < iOut; ++i) {
  688.                 printf("Symbol %d:  ", i);
  689.                 printsym( outsym[i] );
  690.                 printf("n");
  691.             }
  692.             printf("parseSymbols: Continue printouts? [0/1]: ");
  693.             scanf("%d", &iprint);
  694.         }
  695.     }*/
  696.     if (last != LAST263_RUNVAL  ||  iIn != nsym) {
  697.         H261ErrMsg( "parseSymbols: Did not find LAST=1" );
  698.         return (H261_ERROR);
  699.     }
  700.     return (iOut);
  701. }