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

Symbian

开发平台:

Visual C++

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