GetPic.cpp
上传用户:panstart
上传日期:2022-04-12
资源大小:199k
文件大小:32k
源码类别:

IP电话/视频会议

开发平台:

C++ Builder

  1. ////////////////////////////////////////////////////////////////////////////
  2. //
  3. //
  4. //    Project     : VideoNet version 1.1.
  5. //    Description : Peer to Peer Video Conferencing over the LAN.
  6. //   Author      : Nagareshwar Y Talekar ( nsry2002@yahoo.co.in)
  7. //    Date        : 15-6-2004.
  8. //
  9. //    This is the modified version of tmndecode (H.263 decoder) 
  10. //    written by Karl & Robert.It was in ANSI C. I have converted into C++
  11. //    so that it can be integrated into any windows application. I have 
  12. //    removed some of the files which had display and file storing 
  13. //    functions.I have removed the unnecessary code and also added some
  14. //    new files..
  15. //   Original library dealt with files. Input & Output , both were files.
  16. //    I have done some major changes so that it can be used for real time 
  17. //    decoding process. Now one can use this library for decoding H263 frames. 
  18. //
  19. //
  20. //    File description : 
  21. //    Name    : GetPic.cpp
  22. //
  23. /////////////////////////////////////////////////////////////////////////////
  24. /************************************************************************
  25.  *
  26.  *  getpic.c, picture decoding for tmndecode (H.263 decoder)
  27.  *  Copyright (C) 1996  Telenor R&D, Norway
  28.  *        Karl Olav Lillevold <Karl.Lillevold@nta.no>
  29.  *
  30.  *  This program is free software; you can redistribute it and/or modify
  31.  *  it under the terms of the GNU General Public License as published by
  32.  *  the Free Software Foundation; either version 2 of the License, or
  33.  *  (at your option) any later version.
  34.  *
  35.  *  This program is distributed in the hope that it will be useful,
  36.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  37.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  38.  *  GNU General Public License for more details.
  39.  *
  40.  *  You should have received a copy of the GNU General Public License
  41.  *  along with this program; if not, write to the Free Software
  42.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  43.  *
  44.  *  Karl Olav Lillevold               <Karl.Lillevold@nta.no>
  45.  *  Telenor Research and Development
  46.  *  P.O.Box 83                        tel.:   +47 63 84 84 00
  47.  *  N-2007 Kjeller, Norway            fax.:   +47 63 81 00 76
  48.  *
  49.  *  Robert Danielsen                  e-mail: Robert.Danielsen@nta.no
  50.  *  Telenor Research and Development  www:    http://www.nta.no/brukere/DVC/
  51.  *  P.O.Box 83                        tel.:   +47 63 84 84 00
  52.  *  N-2007 Kjeller, Norway            fax.:   +47 63 81 00 76
  53.  *  
  54.  ************************************************************************/
  55. /*
  56.  * modified by Wayne Ellis BT Labs to run Annex E Arithmetic Decoding
  57.  *           <ellis_w_wayne@bt-web.bt.co.uk>
  58.  *
  59.  * based on mpeg2decode, (C) 1994, MPEG Software Simulation Group
  60.  * and mpeg2play, (C) 1994 Stefan Eckart
  61.  *                         <stefan@lis.e-technik.tu-muenchen.de>
  62.  */
  63. #include "GetPic.h"
  64. /* decode one frame or field picture */
  65. void getpicture(int *framenum)
  66. {
  67.   int i;
  68.   unsigned char *tmp;
  69.   for (i=0; i<3; i++) {
  70.     tmp = oldrefframe[i];
  71.     oldrefframe[i] = refframe[i];
  72.     refframe[i] = tmp;
  73.     newframe[i] = refframe[i];
  74.   }
  75.   if (mv_outside_frame && *framenum > 0) {
  76.     make_edge_image(oldrefframe[0],edgeframe[0],coded_picture_width,
  77.             coded_picture_height,32);
  78.     make_edge_image(oldrefframe[1],edgeframe[1],chrom_width, chrom_height,16);
  79.     make_edge_image(oldrefframe[2],edgeframe[2],chrom_width, chrom_height,16);
  80.   }
  81.   getMBs(*framenum);
  82.   if (pb_frame) {
  83.     if (expand && outtype == T_X11) {
  84.       interpolate_image(bframe[0], exnewframe[0],
  85.         coded_picture_width, coded_picture_height);
  86.       interpolate_image(bframe[1], exnewframe[1], chrom_width, chrom_height);
  87.       interpolate_image(bframe[2], exnewframe[2], chrom_width, chrom_height);
  88.       
  89.       storeframe(exnewframe, *framenum);
  90.     }
  91.     else
  92.       storeframe(bframe,*framenum);
  93.     *framenum += pb_frame;
  94.   }
  95.   if (expand && outtype == T_X11) {
  96.     interpolate_image(newframe[0], exnewframe[0],
  97.               coded_picture_width, coded_picture_height);
  98.     interpolate_image(newframe[1], exnewframe[1], chrom_width, chrom_height);
  99.     interpolate_image(newframe[2], exnewframe[2], chrom_width, chrom_height);
  100.     storeframe(exnewframe, *framenum);
  101.   }
  102.   else
  103.     storeframe(newframe,*framenum);
  104. }
  105. /**
  106. *   Store the pointer to Y, U , V frames...
  107. *  
  108. */
  109. void storeframe(unsigned char *src[],int frame)
  110. {
  111.   
  112.   yp=src[0]; // Y component
  113.   up=src[1];        // U component
  114.   vp=src[2];        // V component
  115. }
  116. /* decode all macroblocks of the current picture */
  117. static void getMBs(int framenum)
  118. {
  119.   int comp;
  120.   int MBA, MBAmax;
  121.   int bx, by;
  122.   int COD=0,MCBPC, CBPY, CBP=0, CBPB=0, MODB=0, Mode=0, DQUANT;
  123.   int COD_index, CBPY_index, MODB_index, DQUANT_index, MCBPC_index;
  124.   int INTRADC_index, YCBPB_index, UVCBPB_index, mvdbx_index, mvdby_index;
  125.   int mvx, mvy, mvy_index, mvx_index, pmv0, pmv1, xpos, ypos, gob, i,k;
  126.   int mvdbx=0, mvdby=0, pmvdbx, pmvdby, gfid, YCBPB, UVCBPB, gobheader_read;
  127.   int startmv,stopmv,offset,bsize,last_done=0,pCBP=0,pCBPB=0,pCOD=0;
  128.   int DQ_tab[4] = {-1,-2,1,2};
  129.   short *bp;
  130.   /* number of macroblocks per picture */
  131.   MBAmax = mb_width*mb_height;
  132.   MBA = 0; /* macroblock address */
  133.   newgob = 0;
  134.   /* mark MV's above the picture */
  135.   for (i = 1; i < mb_width+1; i++) {
  136.     for (k = 0; k < 5; k++) {
  137.       MV[0][k][0][i] = NO_VEC;
  138.       MV[1][k][0][i] = NO_VEC;
  139.     }
  140.     modemap[0][i] = MODE_INTRA;
  141.   }
  142.   /* zero MV's on the sides of the picture */
  143.   for (i = 0; i < mb_height+1; i++) {
  144.     for (k = 0; k < 5; k++) {
  145.       MV[0][k][i][0] = 0;
  146.       MV[1][k][i][0] = 0;
  147.       MV[0][k][i][mb_width+1] = 0;
  148.       MV[1][k][i][mb_width+1] = 0;
  149.     }
  150.     modemap[i][0] = MODE_INTRA;
  151.     modemap[i][mb_width+1] = MODE_INTRA;
  152.   }
  153.   fault = 0;
  154.   gobheader_read = 0;
  155.   
  156.   for (;;) {
  157.     //if (trace)
  158.     //  printf("frame %d, MB %dn",framenum,MBA);
  159.   resync:
  160.     /* This version of the decoder does not resync on every possible
  161.        error, and it does not do all possible error checks. It is not
  162.        difficult to make it much more error robust, but I do not think
  163.        it is necessary to include this in the freely available
  164.        version. */
  165.     if (fault) {
  166.         if(trace)
  167. fputs("Warning: A Fault Condition Has Occurred - Resyncing n",dlog);
  168.       startcode();  /* sync on new startcode */
  169.       fault = 0;
  170.     }
  171.     if (!(showbits(22)>>6)) { /* startcode */
  172.       startcode();  
  173.       /* in case of byte aligned start code, ie. PSTUF, GSTUF or ESTUF
  174.          is used */
  175.       
  176.       if (showbits(22) == (32|SE_CODE)) { /* end of sequence */
  177.         if (!(syntax_arith_coding && MBA < MBAmax)) {
  178.           return;
  179.         }
  180.       }
  181.       else if ((showbits(22) == PSC<<5) ) { /* new picture */
  182.         if (!(syntax_arith_coding && MBA < MBAmax)) {
  183.           return;
  184.         }
  185.       }
  186.       else {
  187.         if (!(syntax_arith_coding && MBA%mb_width)) {
  188.           if (syntax_arith_coding) {   /* SAC hack to finish GOBs which   */
  189.             gob = (showbits(22) & 31); /* end with MBs coded with no bits */
  190.             if (gob * mb_width != MBA) 
  191.               goto finish_gob;
  192.           }
  193.           gob = getheader() - 1;
  194.           if (gob > mb_height) {
  195.             if (!quiet)
  196.               fputs("GN out of rangen",dlog);
  197.             return;
  198.           }
  199.           
  200.           /* GFID is not allowed to change unless PTYPE in picture header 
  201.              changes */
  202.           gfid = getbits(2);
  203.           /* NB: in error-prone environments the decoder can use this
  204.              value to determine whether a picture header where the PTYPE
  205.              has changed, has been lost */
  206.           
  207.           quant = getbits(5);
  208.           //if (trace)
  209.           //  printf("GQUANT: %dn", quant);
  210.           xpos = 0;
  211.           ypos = gob;
  212.           MBA = ypos * mb_width;
  213.           
  214.           newgob = 1;
  215.           gobheader_read = 1;
  216.           if (syntax_arith_coding) 
  217.             decoder_reset(); /* init. arithmetic decoder buffer after gob */
  218.         }
  219.       }
  220.     }
  221.   finish_gob:  /* SAC specific label */
  222.     if (!gobheader_read) {
  223.       xpos = MBA%mb_width;
  224.       ypos = MBA/mb_width;
  225.       if (xpos == 0 && ypos > 0)
  226.         newgob = 0;
  227.     }
  228.     else 
  229.       gobheader_read = 0;
  230.     if (MBA>=MBAmax) 
  231.       return; /* all macroblocks decoded */
  232.   read_cod:
  233.     if (syntax_arith_coding) { 
  234.       if (pict_type == PCT_INTER) {
  235.         COD_index = decode_a_symbol(cumf_COD);
  236.         COD = codtab[COD_index];
  237.         if (trace) {
  238.           fputs("Arithmetic Decoding Debug n",dlog);
  239.           //printf("COD Index: %d COD: %d n", COD_index, COD);
  240.         }
  241.       }
  242.       else
  243.         COD = 0;  /* COD not used in I-pictures, set to zero */
  244.     }
  245.     else {
  246.       if (pict_type == PCT_INTER) 
  247.         COD = showbits(1);
  248.       else
  249.         COD = 0; /* Intra picture -> not skipped */
  250.     }
  251.     if (!COD) {  /* COD == 0 --> not skipped */    
  252.       if (syntax_arith_coding)  {
  253.         if (pict_type == PCT_INTER) {
  254.           MCBPC_index = decode_a_symbol(cumf_MCBPC);
  255.           MCBPC = mcbpctab[MCBPC_index];
  256.         }
  257.         else {
  258.           MCBPC_index = decode_a_symbol(cumf_MCBPC_intra);
  259.           MCBPC = mcbpc_intratab[MCBPC_index];
  260.         }
  261.         //if (trace) 
  262.         //  printf("MCBPC Index: %d MCBPC: %d n",MCBPC_index, MCBPC);
  263.       }
  264.       else {
  265.         if (pict_type == PCT_INTER)
  266.           flushbits(1); /* flush COD bit */
  267.         if (pict_type == PCT_INTRA) 
  268.           MCBPC = getMCBPCintra();
  269.         else
  270.           MCBPC = getMCBPC();
  271.       }
  272.       if (fault) goto resync;
  273.       
  274.       if (MCBPC == 255) { /* stuffing */
  275.         goto read_cod;   /* read next COD without advancing MB count */
  276.       }
  277.       else {             /* normal MB data */
  278.         Mode = MCBPC & 7;
  279.         /* MODB and CBPB */
  280.         if (pb_frame) {
  281.           CBPB = 0;
  282.           if (syntax_arith_coding)  {
  283.             MODB_index = decode_a_symbol(cumf_MODB);
  284.             MODB = modb_tab[MODB_index];
  285.           }
  286.           else 
  287.             MODB = getMODB();
  288.           //if (trace)
  289.            // printf("MODB: %dn", MODB);
  290.           if (MODB == PBMODE_CBPB_MVDB) {
  291.             if (syntax_arith_coding)  {
  292.               for(i=0; i<4; i++) {
  293.         YCBPB_index = decode_a_symbol(cumf_YCBPB);
  294.         YCBPB = ycbpb_tab[YCBPB_index];
  295.         CBPB |= (YCBPB << (6-1-i));
  296.               }
  297.  
  298.               for(i=4; i<6; i++) {
  299.         UVCBPB_index = decode_a_symbol(cumf_UVCBPB);
  300.         UVCBPB = uvcbpb_tab[UVCBPB_index];
  301.         CBPB |= (UVCBPB << (6-1-i));
  302.               }
  303.             }
  304.             else
  305.               CBPB = getbits(6);
  306.             //if (trace)
  307.             //  printf("CBPB = %dn",CBPB);
  308.           }
  309.         }
  310.         if (syntax_arith_coding) {
  311.           if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q) { /* Intra */
  312.             CBPY_index = decode_a_symbol(cumf_CBPY_intra);
  313.             CBPY = cbpy_intratab[CBPY_index];
  314.           }
  315.           else {
  316.             CBPY_index = decode_a_symbol(cumf_CBPY);
  317.             CBPY = cbpytab[CBPY_index];
  318.         
  319.           }
  320.          // if (trace)
  321.          //   printf("CBPY Index: %d CBPY %d n",CBPY_index, CBPY);
  322.         }
  323.         else 
  324.           CBPY = getCBPY();
  325.  
  326.         /* Decode Mode and CBP */
  327.         
  328.         
  329.         if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)
  330.           {/* Intra */
  331.             if (!syntax_arith_coding)
  332.               CBPY = CBPY^15;        /* needed in huffman coding only */
  333.           }
  334.         CBP = (CBPY << 2) | (MCBPC >> 4);
  335.       }
  336.       if (Mode == MODE_INTER4V && !adv_pred_mode) 
  337.         if (!quiet)
  338.           fputs("8x8 vectors not allowed in normal prediction moden",dlog);
  339.           /* Could set fault-flag and resync */
  340.       if (Mode == MODE_INTER_Q || Mode == MODE_INTRA_Q) {
  341.         /* Read DQUANT if necessary */
  342.         if (syntax_arith_coding) {
  343.           DQUANT_index = decode_a_symbol(cumf_DQUANT);
  344.           DQUANT = dquanttab[DQUANT_index] - 2; 
  345.           quant +=DQUANT;
  346.           //if (trace)
  347.             //printf("DQUANT Index: %d DQUANT %d n",DQUANT_index, DQUANT);
  348.         }
  349.         else {
  350.           DQUANT = getbits(2);
  351.           quant += DQ_tab[DQUANT];
  352.           if (trace) {
  353.             fputs("DQUANT (",dlog);
  354.             printbits(DQUANT,2,2);
  355.             //printf("): %d = %dn",DQUANT,DQ_tab[DQUANT]);
  356.           }
  357.         }
  358.         if (quant > 31 || quant < 1) {
  359.           if (!quiet)
  360.             fputs("Quantizer out of range: clippingn",dlog);
  361.           quant = mmax(1,mmin(31,quant));
  362.           /* could set fault-flag and resync here */
  363.         }
  364.       }
  365.       /* motion vectors */
  366.       if (Mode == MODE_INTER || Mode == MODE_INTER_Q || 
  367.           Mode == MODE_INTER4V || pb_frame) {
  368.         if (Mode == MODE_INTER4V) { startmv = 1; stopmv = 4;}
  369.         else { startmv = 0; stopmv = 0;}
  370.         for (k = startmv; k <= stopmv; k++) {
  371.           if (syntax_arith_coding) {
  372.             mvx_index = decode_a_symbol(cumf_MVD);
  373.             mvx = mvdtab[mvx_index];
  374.             mvy_index = decode_a_symbol(cumf_MVD);
  375.             mvy = mvdtab[mvy_index];
  376.             //if (trace)
  377.             //  printf("mvx_index: %d mvy_index: %d n", mvy_index, mvx_index);
  378.           }
  379.           else {
  380.             mvx = getTMNMV();
  381.             mvy = getTMNMV();
  382.           }
  383.           pmv0 = find_pmv(xpos,ypos,k,0);
  384.           pmv1 = find_pmv(xpos,ypos,k,1);
  385.           mvx = motion_decode(mvx, pmv0);
  386.           mvy = motion_decode(mvy, pmv1);
  387.          /* if (trace) {
  388.             printf("mvx: %dn", mvx);
  389.             printf("mvy: %dn", mvy);
  390.           }
  391.   */
  392.           /* Check mv's to prevent seg.faults when error rate is high */
  393.           if (!mv_outside_frame) {
  394.             bsize = k ? 8 : 16;
  395.             offset = k ? (((k-1)&1)<<3) : 0;
  396.             /* checking only integer component */
  397.             if ((xpos<<4) + (mvx/2) + offset < 0 ||
  398.         (xpos<<4) + (mvx/2) + offset > (mb_width<<4) - bsize) {
  399.               if (!quiet)
  400.               fputs("mvx out of range: searching for syncn",dlog);
  401.               fault = 1;
  402.             }
  403.             offset = k ? (((k-1)&2)<<2) : 0;
  404.             if ((ypos<<4) + (mvy/2) + offset < 0 ||
  405.         (ypos<<4) + (mvy/2) + offset > (mb_height<<4) - bsize) {
  406.               if (!quiet)
  407.               fputs("mvy out of range: searching for syncn",dlog);
  408.               fault = 1;
  409.             }
  410.           }
  411.           MV[0][k][ypos+1][xpos+1] = mvx;
  412.           MV[1][k][ypos+1][xpos+1] = mvy;
  413.         }
  414.         /* PB frame delta vectors */
  415.         if (pb_frame) {
  416.           if (MODB == PBMODE_MVDB || MODB == PBMODE_CBPB_MVDB) {
  417.             if (syntax_arith_coding) {
  418.               mvdbx_index = decode_a_symbol(cumf_MVD);
  419.               mvdbx = mvdtab[mvdbx_index];
  420.               
  421.               mvdby_index = decode_a_symbol(cumf_MVD);
  422.               mvdby = mvdtab[mvdby_index];
  423.             }
  424.             else {
  425.               mvdbx = getTMNMV();
  426.               mvdby = getTMNMV();
  427.             }
  428.             mvdbx = motion_decode(mvdbx, 0);
  429.             mvdby = motion_decode(mvdby, 0);
  430.             /* This will not work if the PB deltas are so large they
  431.                require the second colums of the motion vector VLC
  432.                table to be used.  To fix this it is necessary to
  433.                calculate the MV predictor for the PB delta: TRB*MV/TRD
  434.                here, and use this as the second parameter to
  435.                motion_decode(). The B vector itself will then be
  436.                returned from motion_decode(). This will have to be
  437.                changed to the PB delta again, since it is the PB delta
  438.                which is used later in this program. I don't think PB
  439.                deltas outside the range mentioned above is useful, but
  440.                you never know... */
  441.             /*if (trace) {
  442.               printf("MVDB x: %dn", mvdbx);
  443.               printf("MVDB y: %dn", mvdby);
  444.             }
  445.           
  446. */
  447. }
  448.           else {
  449.             mvdbx = 0; 
  450.             mvdby = 0;
  451.           }
  452.         }
  453.       }
  454.       if (fault) goto resync;
  455.     }
  456.     else { /* COD == 1 --> skipped MB */
  457.       if (MBA>=MBAmax)
  458.         return; /* all macroblocks decoded */
  459.       if (!syntax_arith_coding)
  460.         if (pict_type == PCT_INTER)
  461.           flushbits(1);
  462.       Mode = MODE_INTER;
  463.       
  464.       /* Reset CBP */
  465.       CBP = CBPB = 0;
  466.       /* reset motion vectors */
  467.       MV[0][0][ypos+1][xpos+1] = 0;
  468.       MV[1][0][ypos+1][xpos+1] = 0;
  469.       mvdbx = 0;
  470.       mvdby = 0;
  471.     }
  472.     /* Store Mode*/
  473.     modemap[ypos+1][xpos+1] = Mode;
  474.     if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q) 
  475.       if (!pb_frame)
  476.         MV[0][0][ypos+1][xpos+1]=MV[1][0][ypos+1][xpos+1] = 0;
  477.   reconstruct_mb:
  478.     /* pixel coordinates of top left corner of current macroblock */
  479.     /* one delayed because of OBMC */
  480.     if (xpos > 0) {
  481.       bx = 16*(xpos-1);
  482.       by = 16*ypos;
  483.     }
  484.     else {
  485.       bx = coded_picture_width-16;
  486.       by = 16*(ypos-1);
  487.     }
  488.     if (MBA > 0) {
  489.       Mode = modemap[by/16+1][bx/16+1];
  490.       /* forward motion compensation for B-frame */
  491.       if (pb_frame)
  492.         reconstruct(bx,by,0,pmvdbx,pmvdby);
  493.       
  494.       /* motion compensation for P-frame */
  495.       if (Mode == MODE_INTER || Mode == MODE_INTER_Q || Mode == MODE_INTER4V)
  496.         reconstruct(bx,by,1,0,0);
  497.       /* copy or add block data into P-picture */
  498.       for (comp=0; comp<blk_cnt; comp++) {
  499.         /* inverse DCT */
  500.         if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q) {
  501.           if (refidct)
  502.             idctref(ld->block[comp]);
  503.           else
  504.             idct(ld->block[comp]);
  505.           addblock(comp,bx,by,0);
  506.         }
  507.         else if ( (pCBP & (1<<(blk_cnt-1-comp))) ) {
  508.           /* No need to to do this for blocks with no coeffs */
  509.           if (refidct)
  510.             idctref(ld->block[comp]);
  511.           else
  512.             idct(ld->block[comp]);
  513.           addblock(comp,bx,by,1);
  514.         }
  515.       }
  516.       
  517.       
  518.       if (pb_frame) {
  519.         /* add block data into B-picture */
  520.         for (comp = 6; comp<blk_cnt+6; comp++) {
  521.           if (!pCOD || adv_pred_mode)
  522.             reconblock_b(comp-6,bx,by,Mode,pmvdbx,pmvdby);
  523.           if ( (pCBPB & (1<<(blk_cnt-1-comp%6))) ) {
  524.             if (refidct)
  525.               idctref(ld->block[comp]);
  526.             else
  527.               idct(ld->block[comp]);
  528.             addblock(comp,bx,by,1);
  529.           }
  530.         }
  531.       }
  532.       
  533.     } /* end if (MBA > 0) */
  534.     if (!COD) {
  535.       Mode = modemap[ypos+1][xpos+1];
  536.       /* decode blocks */
  537.       for (comp=0; comp<blk_cnt; comp++) {
  538.         clearblock(comp);
  539.         if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q) { /* Intra */
  540.           bp = ld->block[comp];
  541.           if(syntax_arith_coding) {
  542.             INTRADC_index = decode_a_symbol(cumf_INTRADC);
  543.             bp[0] = intradctab[INTRADC_index];
  544.             //if (trace)
  545.             //  printf("INTRADC Index: %d INTRADC: %d n", INTRADC_index, bp[0]);
  546.           }
  547.           else {
  548.             bp[0] = getbits(8);
  549.             /*if (trace) {
  550.               printf("DC[%d]: (",comp);
  551.               printbits((int)bp[0],8,8);
  552.               printf("): %dn",(int)bp[0]);
  553.             }
  554. */ 
  555. }
  556.           if (bp[0] == 128)
  557.             if (!quiet)
  558.               fputs("Illegal DC-coeff: 1000000n",dlog);
  559.           if (bp[0] == 255)  /* Spec. in H.26P, not in TMN4 */
  560.             bp[0] = 128;
  561.           bp[0] *= 8; /* Iquant */
  562.           if ( (CBP & (1<<(blk_cnt-1-comp))) ) {
  563.             if (!syntax_arith_coding)
  564.               getblock(comp,0);
  565.             else 
  566.               get_sac_block(comp,0);
  567.           }
  568.         }
  569.         else { /* Inter */
  570.           if ( (CBP & (1<<(blk_cnt-1-comp))) ) {
  571.             if (!syntax_arith_coding)
  572.               getblock(comp,1);
  573.             else
  574.               get_sac_block(comp,1);
  575.           }
  576.         }
  577.         if (fault) goto resync;
  578.       }
  579.       /* Decode B blocks */
  580.       if (pb_frame) {
  581.         for (comp=6; comp<blk_cnt+6; comp++) {
  582.           clearblock(comp);
  583.           if ( (CBPB & (1<<(blk_cnt-1-comp%6))) ) {
  584.             if (!syntax_arith_coding)
  585.               getblock(comp,1);
  586.             else
  587.               get_sac_block(comp,1);
  588.           }
  589.           if (fault) goto resync;
  590.         }
  591.       }
  592.           
  593.     }
  594.     /* advance to next macroblock */
  595.     MBA++;
  596.     pCBP = CBP; pCBPB = CBPB; pCOD = COD;
  597.     pmvdbx = mvdbx; pmvdby = mvdby;
  598.     fflush(stdout);
  599.     if (MBA >= MBAmax && !last_done) {
  600.       COD = 1;
  601.       xpos = 0;
  602.       ypos++;
  603.       last_done = 1;
  604.       goto reconstruct_mb;
  605.     }
  606.   }
  607. }
  608. /* set block to zero */
  609. static void clearblock(int comp)
  610. {
  611.   int *bp;
  612.   int i;
  613.   bp = (int *)ld->block[comp];
  614.   for (i=0; i<8; i++)
  615.   {
  616.     bp[0] = bp[1] = bp[2] = bp[3] = 0;
  617.     bp += 4;
  618.   }
  619. }
  620. /* move/add 8x8-Block from block[comp] to refframe or bframe */
  621. static void addblock(int comp,int bx,int by,int addflag)
  622. {
  623.   int cc,i, iincr, P = 1;
  624.   unsigned char *rfp;
  625.   short *bp;
  626.   bp = ld->block[comp];
  627.   if (comp >= 6) {
  628.     /* This is a component for B-frame forward prediction */
  629.     P = 0;
  630.     addflag = 1;
  631.     comp -= 6;
  632.   }
  633.   cc = (comp<4) ? 0 : (comp&1)+1; /* color component index */
  634.   if (cc==0) {
  635.     /* luminance */
  636.     
  637.     /* frame DCT coding */
  638.     if (P)
  639.       rfp = newframe[0]
  640.         + coded_picture_width*(by+((comp&2)<<2)) + bx + ((comp&1)<<3);
  641.     else
  642.       rfp = bframe[0]
  643.         + coded_picture_width*(by+((comp&2)<<2)) + bx + ((comp&1)<<3);
  644.     iincr = coded_picture_width;
  645.   }
  646.   else {
  647.     /* chrominance */
  648.     /* scale coordinates */
  649.     bx >>= 1;
  650.     by >>= 1;
  651.     /* frame DCT coding */
  652.     if (P)
  653.       rfp = newframe[cc] + chrom_width*by + bx;
  654.     else
  655.       rfp = bframe[cc] + chrom_width*by + bx;
  656.     iincr = chrom_width;
  657.   }
  658.   if (addflag) {
  659.     for (i=0; i<8; i++) {
  660.       rfp[0] = clp[bp[0]+rfp[0]];
  661.       rfp[1] = clp[bp[1]+rfp[1]];
  662.       rfp[2] = clp[bp[2]+rfp[2]];
  663.       rfp[3] = clp[bp[3]+rfp[3]];
  664.       rfp[4] = clp[bp[4]+rfp[4]];
  665.       rfp[5] = clp[bp[5]+rfp[5]];
  666.       rfp[6] = clp[bp[6]+rfp[6]];
  667.       rfp[7] = clp[bp[7]+rfp[7]];
  668.       bp += 8;
  669.       rfp+= iincr;
  670.     }
  671.   }
  672.   else  {
  673.     for (i=0; i<8; i++) {
  674.       rfp[0] = clp[bp[0]];
  675.       rfp[1] = clp[bp[1]];
  676.       rfp[2] = clp[bp[2]];
  677.       rfp[3] = clp[bp[3]];
  678.       rfp[4] = clp[bp[4]];
  679.       rfp[5] = clp[bp[5]];
  680.       rfp[6] = clp[bp[6]];
  681.       rfp[7] = clp[bp[7]];
  682.       bp += 8;
  683.       rfp += iincr;
  684.     }
  685.   }
  686. }
  687. /* bidirectionally reconstruct 8x8-Block from block[comp] to bframe */
  688. static void reconblock_b(int comp,int bx,int by,int mode,int bdx,int bdy)
  689. {
  690.   int cc,i,j,k, ii;
  691.   unsigned char *bfr, *ffr;
  692.   int BMVx, BMVy;
  693.   int xa,xb,ya,yb,x,y,xvec,yvec,mvx,mvy;
  694.   int xint,xhalf,yint,yhalf,pel;
  695.   x = bx/16+1;y=by/16+1;
  696.   if (mode == MODE_INTER4V) {
  697.     if (comp < 4) {
  698.       /* luma */
  699.       mvx = MV[0][comp+1][y][x];
  700.       mvy = MV[1][comp+1][y][x];
  701.       BMVx = (bdx == 0 ? (trb-trd)* mvx/trd : trb * mvx/trd + bdx - mvx);
  702.       BMVy = (bdy == 0 ? (trb-trd)* mvy/trd : trb * mvy/trd + bdy - mvy);
  703.     }
  704.     else {
  705.       /* chroma */
  706.       xvec = yvec = 0;
  707.       for (k = 1; k <= 4; k++) {
  708.         mvx = MV[0][k][y][x];
  709.         mvy = MV[1][k][y][x];
  710.         xvec += (bdx == 0 ? (trb-trd)* mvx/trd : trb * mvx/trd + bdx - mvx);
  711.         yvec += (bdy == 0 ? (trb-trd)* mvy/trd : trb * mvy/trd + bdy - mvy);
  712.       }
  713.       
  714.       /* chroma rounding (table 16/H.263) */
  715.       BMVx = sign(xvec)*(roundtab[abs(xvec)%16] + (abs(xvec)/16)*2);
  716.       BMVy = sign(yvec)*(roundtab[abs(yvec)%16] + (abs(yvec)/16)*2);
  717.     }
  718.   }
  719.   else {
  720.     if (comp < 4) {
  721.       /* luma */
  722.       mvx = MV[0][0][y][x];
  723.       mvy = MV[1][0][y][x];
  724.       BMVx = (bdx == 0 ? (trb-trd)* mvx/trd : trb * mvx/trd + bdx - mvx);
  725.       BMVy = (bdy == 0 ? (trb-trd)* mvy/trd : trb * mvy/trd + bdy - mvy);
  726.     }
  727.     else {
  728.       /* chroma */
  729.       mvx = MV[0][0][y][x];
  730.       mvy = MV[1][0][y][x];
  731.       xvec = (bdx == 0 ? (trb-trd)* mvx/trd : trb * mvx/trd + bdx - mvx);
  732.       yvec = (bdy == 0 ? (trb-trd)* mvy/trd : trb * mvy/trd + bdy - mvy);
  733.       xvec *= 4;
  734.       yvec *= 4;
  735.       
  736.       /* chroma rounding (table 16/H.263) */
  737.       BMVx = sign(xvec)*(roundtab[abs(xvec)%16] + (abs(xvec)/16)*2);
  738.       BMVy = sign(yvec)*(roundtab[abs(yvec)%16] + (abs(yvec)/16)*2);
  739.     }
  740.   }
  741.   cc = (comp<4) ? 0 : (comp&1)+1; /* color component index */
  742.   if (cc==0) {
  743.     /* luminance */
  744.     find_bidir_limits(BMVx,&xa,&xb,comp&1);
  745.     find_bidir_limits(BMVy,&ya,&yb,(comp&2)>>1);
  746.     bfr = bframe[0] +
  747.       coded_picture_width*(by+((comp&2)<<2)) + bx + ((comp&1)<<3);
  748.     ffr = newframe[0] +
  749.       coded_picture_width*(by+((comp&2)<<2)) + bx + ((comp&1)<<3);
  750.     ii = coded_picture_width;
  751.   }
  752.   else {
  753.     /* chrominance */
  754.     /* scale coordinates and vectors*/
  755.     bx >>= 1;
  756.     by >>= 1;
  757.     find_bidir_chroma_limits(BMVx,&xa,&xb);
  758.     find_bidir_chroma_limits(BMVy,&ya,&yb);
  759.     bfr = bframe[cc]      + chrom_width*(by+((comp&2)<<2)) + bx + (comp&8);
  760.     ffr = newframe[cc]    + chrom_width*(by+((comp&2)<<2)) + bx + (comp&8);
  761.     ii = chrom_width;
  762.   }
  763.   xint = BMVx>>1;
  764.   xhalf = BMVx - 2*xint;
  765.   yint = BMVy>>1;
  766.   yhalf = BMVy - 2*yint;
  767.   ffr += xint + (yint+ya)*ii;
  768.   bfr += ya*ii;
  769.   
  770.   if (!xhalf && !yhalf) {
  771.     for (j = ya; j < yb; j++) {
  772.       for (i = xa; i < xb; i++) {
  773.         pel = ffr[i];
  774.         bfr[i] = ((unsigned int)(pel + bfr[i]))>>1;
  775.       }
  776.       bfr += ii;
  777.       ffr += ii;
  778.     }
  779.   }
  780.   else if (xhalf && !yhalf) {
  781.     for (j = ya; j < yb; j++) {
  782.       for (i = xa; i < xb; i++) {
  783.         pel = ((unsigned int)(ffr[i]+ffr[i+1]+1))>>1;
  784.         bfr[i] = ((unsigned int)(pel + bfr[i]))>>1;
  785.       }
  786.       bfr += ii;
  787.       ffr += ii;
  788.     }
  789.   }
  790.   else if (!xhalf && yhalf) {
  791.     for (j = ya; j < yb; j++) {
  792.       for (i = xa; i < xb; i++) {
  793.         pel = ((unsigned int)(ffr[i]+ffr[ii+i]+1))>>1;
  794.         bfr[i] = ((unsigned int)(pel + bfr[i]))>>1;
  795.       }
  796.       bfr += ii;
  797.       ffr += ii;
  798.     }
  799.   }
  800.   else { /* if (xhalf && yhalf) */
  801.     for (j = ya; j < yb; j++) {
  802.       for (i = xa; i < xb; i++) {
  803.         pel = ((unsigned int)(ffr[i]+ffr[i+1]+ffr[ii+i]+ffr[ii+i+1]+2))>>2;
  804.         bfr[i] = ((unsigned int)(pel + bfr[i]))>>1;
  805.       }
  806.       bfr += ii;
  807.       ffr += ii;
  808.     }
  809.   }
  810.   return;
  811. }
  812. int motion_decode(int vec,int pmv)
  813. {
  814.   if (vec > 31) vec -= 64;
  815.   vec += pmv;
  816.   if (!long_vectors) {
  817.     if (vec > 31)
  818.       vec -= 64;
  819.     if (vec < -32)
  820.       vec += 64;
  821.   }
  822.   else {
  823.     if (pmv < -31 && vec < -63)
  824.       vec += 64;
  825.     if (pmv > 32 && vec > 63)
  826.       vec -= 64;
  827.   }
  828.   return vec;
  829. }
  830. int find_pmv(int x,int  y,int  block,int comp)
  831. {
  832.   int p1,p2,p3;
  833.   int xin1,xin2,xin3;
  834.   int yin1,yin2,yin3;
  835.   int vec1,vec2,vec3;
  836.   int l8,o8,or8;
  837.   x++;y++;
  838.   l8 = (modemap[y][x-1] == MODE_INTER4V ? 1 : 0);
  839.   o8 =  (modemap[y-1][x] == MODE_INTER4V ? 1 : 0);
  840.   or8 = (modemap[y-1][x+1] == MODE_INTER4V ? 1 : 0);
  841.   switch (block) {
  842.   case 0: 
  843.     vec1 = (l8 ? 2 : 0) ; yin1 = y  ; xin1 = x-1;
  844.     vec2 = (o8 ? 3 : 0) ; yin2 = y-1; xin2 = x;
  845.     vec3 = (or8? 3 : 0) ; yin3 = y-1; xin3 = x+1;
  846.     break;
  847.   case 1:
  848.     vec1 = (l8 ? 2 : 0) ; yin1 = y  ; xin1 = x-1;
  849.     vec2 = (o8 ? 3 : 0) ; yin2 = y-1; xin2 = x;
  850.     vec3 = (or8? 3 : 0) ; yin3 = y-1; xin3 = x+1;
  851.     break;
  852.   case 2:
  853.     vec1 = 1            ; yin1 = y  ; xin1 = x;
  854.     vec2 = (o8 ? 4 : 0) ; yin2 = y-1; xin2 = x;
  855.     vec3 = (or8? 3 : 0) ; yin3 = y-1; xin3 = x+1;
  856.     break;
  857.   case 3:
  858.     vec1 = (l8 ? 4 : 0) ; yin1 = y  ; xin1 = x-1;
  859.     vec2 = 1            ; yin2 = y  ; xin2 = x;
  860.     vec3 = 2            ; yin3 = y  ; xin3 = x;
  861.     break;
  862.   case 4:
  863.     vec1 = 3            ; yin1 = y  ; xin1 = x;
  864.     vec2 = 1            ; yin2 = y  ; xin2 = x;
  865.     vec3 = 2            ; yin3 = y  ; xin3 = x;
  866.     break;
  867.   default:
  868.     if(trace)
  869. fputs("Illegal block number in find_pmv (getpic.c)n",dlog);
  870.     return 1;
  871.     break;
  872.   }
  873.   p1 = MV[comp][vec1][yin1][xin1];
  874.   p2 = MV[comp][vec2][yin2][xin2];
  875.   p3 = MV[comp][vec3][yin3][xin3];
  876.   if (newgob && (block == 0 || block == 1 || block == 2))
  877.     p2 = NO_VEC;
  878.   if (p2 == NO_VEC) { p2 = p3 = p1; }
  879.   return p1+p2+p3 - mmax(p1,mmax(p2,p3)) - mmin(p1,mmin(p2,p3));
  880. }
  881. void find_bidir_limits(int vec, int *start, int *stop, int nhv)
  882. {
  883.   /* limits taken from C loop in section G5 in H.263 */
  884.   *start = mmax(0,(-vec+1)/2 - nhv*8);
  885.   *stop = mmin(7,15-(vec+1)/2 - nhv*8);
  886.   (*stop)++; /* I use < and not <= in the loop */
  887. }
  888. void find_bidir_chroma_limits(int vec, int *start,int * stop)
  889. {
  890.   /* limits taken from C loop in section G5 in H.263 */
  891.   *start = mmax(0,(-vec+1)/2);
  892.   *stop = mmin(7,7-(vec+1)/2);
  893.   (*stop)++; /* I use < and not <= in the loop */
  894.   return;
  895. }
  896. void make_edge_image(unsigned char *src,unsigned char *dst,int width,int height,int edge)
  897. {
  898.   int i,j;
  899.   unsigned char *p1,*p2,*p3,*p4;
  900.   unsigned char *o1,*o2,*o3,*o4;
  901.   /* center image */
  902.   p1 = dst;
  903.   o1 = src;
  904.   for (j = 0; j < height;j++) {
  905.     for (i = 0; i < width; i++) {
  906.       *(p1 + i) = *(o1 + i);
  907.     }
  908.     p1 += width + (edge<<1);
  909.     o1 += width;
  910.   }
  911.   /* left and right edges */
  912.   p1 = dst-1;
  913.   o1 = src;
  914.   for (j = 0; j < height;j++) {
  915.     for (i = 0; i < edge; i++) {
  916.       *(p1 - i) = *o1;
  917.       *(p1 + width + i + 1) = *(o1 + width - 1);
  918.     }
  919.     p1 += width + (edge<<1);
  920.     o1 += width;
  921.   }    
  922.     
  923.   /* top and bottom edges */
  924.   p1 = dst;
  925.   p2 = dst + (width + (edge<<1))*(height-1);
  926.   o1 = src;
  927.   o2 = src + width*(height-1);
  928.   for (j = 0; j < edge;j++) {
  929.     p1 = p1 - (width + (edge<<1));
  930.     p2 = p2 + (width + (edge<<1));
  931.     for (i = 0; i < width; i++) {
  932.       *(p1 + i) = *(o1 + i);
  933.       *(p2 + i) = *(o2 + i);
  934.     }
  935.   }    
  936.   /* corners */
  937.   p1 = dst - (width+(edge<<1)) - 1;
  938.   p2 = p1 + width + 1;
  939.   p3 = dst + (width+(edge<<1))*(height)-1;
  940.   p4 = p3 + width + 1;
  941.   o1 = src;
  942.   o2 = o1 + width - 1;
  943.   o3 = src + width*(height-1);
  944.   o4 = o3 + width - 1;
  945.   for (j = 0; j < edge; j++) {
  946.     for (i = 0; i < edge; i++) {
  947.       *(p1 - i) = *o1;
  948.       *(p2 + i) = *o2;
  949.       *(p3 - i) = *o3;
  950.       *(p4 + i) = *o4; 
  951.     }
  952.     p1 = p1 - (width + (edge<<1));
  953.     p2 = p2 - (width + (edge<<1));
  954.     p3 = p3 + width + (edge<<1);
  955.     p4 = p4 + width + (edge<<1);
  956.   }
  957. }
  958.   
  959. void interpolate_image(unsigned char *in, unsigned char *out,int  width,int height)
  960. /* only used for displayed interpolated frames, not reconstructed ones */
  961. {
  962.   int x,xx,y,w2;
  963.   unsigned char *pp,*ii;
  964.   w2 = 2*width;
  965.   /* Horizontally */
  966.   pp = out;
  967.   ii = in;
  968.   for (y = 0; y < height-1; y++) {
  969.     for (x = 0,xx=0; x < width-1; x++,xx+=2) {
  970.       *(pp + xx) = *(ii + x);
  971.       *(pp + xx+1) = ((unsigned int)(*(ii + x)  + *(ii + x + 1)))>>1;
  972.       *(pp + w2 + xx) = ((unsigned int)(*(ii + x) + *(ii + x + width)))>>1;
  973.       *(pp + w2 + xx+1) = ((unsigned int)(*(ii + x) + *(ii + x + 1) + 
  974.            *(ii + x + width) + *(ii + x + width + 1)))>>2;
  975.       
  976.     }
  977.     *(pp + w2 - 2) = *(ii + width - 1);
  978.     *(pp + w2 - 1) = *(ii + width - 1);
  979.     *(pp + w2 + w2 - 2) = *(ii + width + width - 1);
  980.     *(pp + w2 + w2 - 1) = *(ii + width + width - 1);
  981.     pp += w2<<1;
  982.     ii += width;
  983.   }
  984.   /* last lines */
  985.   for (x = 0,xx=0; x < width-1; x++,xx+=2) {
  986.     *(pp+ xx) = *(ii + x);    
  987.     *(pp+ xx+1) = ((unsigned int)(*(ii + x) + *(ii + x + 1) + 1))>>1;
  988.     *(pp+ w2+ xx) = *(ii + x);    
  989.     *(pp+ w2+ xx+1) = ((unsigned int)(*(ii + x) + *(ii + x + 1) + 1))>>1;
  990.   }
  991.   
  992.   /* bottom right corner pels */
  993.   *(pp + (width<<1) - 2) = *(ii + width -1);
  994.   *(pp + (width<<1) - 1) = *(ii + width -1);
  995.   *(pp + (width<<2) - 2) = *(ii + width -1);
  996.   *(pp + (width<<2) - 1) = *(ii + width -1);
  997.   return;
  998. }
  999.