[svn] / trunk / xvidcore / src / bitstream / mbcoding.c Repository:
ViewVC logotype

Diff of /trunk/xvidcore/src/bitstream/mbcoding.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 454, Sun Sep 8 15:40:02 2002 UTC revision 655, Sun Nov 17 00:57:58 2002 UTC
# Line 5  Line 5 
5   *   *
6   *  Copyright(C) 2002 Michael Militzer <isibaar@xvid.org>   *  Copyright(C) 2002 Michael Militzer <isibaar@xvid.org>
7   *   *
8     *  This file is part of XviD, a free MPEG-4 video encoder/decoder
9   *   *
10   *  This program is an implementation of a part of one or more MPEG-4   *  XviD is free software; you can redistribute it and/or modify it
11   *  Video tools as specified in ISO/IEC 14496-2 standard.  Those intending   *  under the terms of the GNU General Public License as published by
  *  to use this software module in hardware or software products are  
  *  advised that its use may infringe existing patents or copyrights, and  
  *  any such use would be at such party's own risk.  The original  
  *  developer of this software module and his/her company, and subsequent  
  *  editors and their companies, will have no liability for use of this  
  *  software or modifications or derivatives thereof.  
  *  
  *  This program is free software; you can redistribute it and/or modify  
  *  it under the terms of the GNU General Public License as published by  
12   *  the Free Software Foundation; either version 2 of the License, or   *  the Free Software Foundation; either version 2 of the License, or
13   *  (at your option) any later version.   *  (at your option) any later version.
14   *   *
# Line 29  Line 21 
21   *  along with this program; if not, write to the Free Software   *  along with this program; if not, write to the Free Software
22   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
23   *   *
24   * $Id: mbcoding.c,v 1.28 2002-09-08 15:40:02 edgomez Exp $   *  Under section 8 of the GNU General Public License, the copyright
25     *  holders of XVID explicitly forbid distribution in the following
26     *  countries:
27     *
28     *    - Japan
29     *    - United States of America
30     *
31     *  Linking XviD statically or dynamically with other modules is making a
32     *  combined work based on XviD.  Thus, the terms and conditions of the
33     *  GNU General Public License cover the whole combination.
34     *
35     *  As a special exception, the copyright holders of XviD give you
36     *  permission to link XviD with independent modules that communicate with
37     *  XviD solely through the VFW1.1 and DShow interfaces, regardless of the
38     *  license terms of these independent modules, and to copy and distribute
39     *  the resulting combined work under terms of your choice, provided that
40     *  every copy of the combined work is accompanied by a complete copy of
41     *  the source code of XviD (the version of XviD used to produce the
42     *  combined work), being distributed under the terms of the GNU General
43     *  Public License plus this exception.  An independent module is a module
44     *  which is not derived from or based on XviD.
45     *
46     *  Note that people who make modified versions of XviD are not obligated
47     *  to grant this special exception for their modified versions; it is
48     *  their choice whether to do so.  The GNU General Public License gives
49     *  permission to release a modified version without this exception; this
50     *  exception also makes it possible to release a modified version which
51     *  carries forward this exception.
52     *
53     * $Id: mbcoding.c,v 1.33 2002-11-17 00:57:57 edgomez Exp $
54   *   *
55   ****************************************************************************/   ****************************************************************************/
56    
# Line 49  Line 70 
70   * Local data   * Local data
71   ****************************************************************************/   ****************************************************************************/
72    
73  static VLC intra_table[524032];  /* msvc sp5+pp gets confused if they globals are made static */
74  static VLC inter_table[524032];  VLC intra_table[524032];
75    VLC inter_table[524032];
76    
77  static VLC DCT3Dintra[4096];  static VLC DCT3Dintra[4096];
78  static VLC DCT3Dinter[4096];  static VLC DCT3Dinter[4096];
# Line 65  Line 87 
87    
88          int32_t k, l, i, intra, last;          int32_t k, l, i, intra, last;
89          VLC *vlc[2];          VLC *vlc[2];
90          VLC **coeff_ptr;          VLC const **coeff_ptr;
91          VLC *vlc1, *vlc2;          VLC *vlc1, *vlc2;
92    
93          vlc1 = DCT3Dintra;          vlc1 = DCT3Dintra;
# Line 86  Line 108 
108                  coeff_ptr = coeff_vlc[last + 2 * intra];                  coeff_ptr = coeff_vlc[last + 2 * intra];
109    
110                  for (k = -2047; k < 2048; k++) {        // level                  for (k = -2047; k < 2048; k++) {        // level
111                          int8_t *max_level_ptr = max_level[last + 2 * intra];                          int8_t const *max_level_ptr = max_level[last + 2 * intra];
112                          int8_t *max_run_ptr = max_run[last + 2 * intra];                          int8_t const *max_run_ptr = max_run[last + 2 * intra];
113    
114                          for (l = 0; l < 64; l++) {      // run                          for (l = 0; l < 64; l++) {      // run
115                                  int32_t level = k;                                  int32_t level = k;
# Line 373  Line 395 
395          if (frame->global_flags & XVID_INTERLACING) {          if (frame->global_flags & XVID_INTERLACING) {
396                  if (pMB->cbp) {                  if (pMB->cbp) {
397                          BitstreamPutBit(bs, pMB->field_dct);                          BitstreamPutBit(bs, pMB->field_dct);
398                          DEBUG1("codep: field_dct: ", pMB->field_dct);                          DPRINTF(DPRINTF_DEBUG, "codep: field_dct: %d", pMB->field_dct);
399                  }                  }
400    
401                  // if inter block, write field ME flag                  // if inter block, write field ME flag
402                  if (pMB->mode == MODE_INTER || pMB->mode == MODE_INTER_Q) {                  if (pMB->mode == MODE_INTER || pMB->mode == MODE_INTER_Q) {
403                          BitstreamPutBit(bs, pMB->field_pred);                          BitstreamPutBit(bs, pMB->field_pred);
404                          DEBUG1("codep: field_pred: ", pMB->field_pred);                          DPRINTF(DPRINTF_DEBUG, "codep: field_pred: %d", pMB->field_pred);
405    
406                          // write field prediction references                          // write field prediction references
407                          if (pMB->field_pred) {                          if (pMB->field_pred) {
# Line 437  Line 459 
459          return;          return;
460  }  }
461    
 #if 0  
 /***************************************************************  
  * bframe encoding start  
  ***************************************************************/  
   
 /*  
         mbtype  
         0       1b              direct(h263)            mvdb  
         1       01b             interpolate mc+q        dbquant, mvdf, mvdb  
         2       001b    backward mc+q           dbquant, mvdb  
         3       0001b   forward mc+q            dbquant, mvdf  
 */  
   
 void  
 put_bvop_mbtype(Bitstream * bs,  
                                 int value)  
 {  
         switch (value) {  
         case 0:  
                 BitstreamPutBit(bs, 1);  
                 return;  
   
         case 1:  
                 BitstreamPutBit(bs, 0);  
                 BitstreamPutBit(bs, 1);  
                 return;  
   
         case 2:  
                 BitstreamPutBit(bs, 0);  
                 BitstreamPutBit(bs, 0);  
                 BitstreamPutBit(bs, 1);  
                 return;  
   
         case 3:  
                 BitstreamPutBit(bs, 0);  
                 BitstreamPutBit(bs, 0);  
                 BitstreamPutBit(bs, 0);  
                 BitstreamPutBit(bs, 1);  
                 return;  
   
         default:;                                       // invalid!  
   
         }  
   
 }  
   
 /*  
         dbquant  
         -2      10b  
         0       0b  
         +2      11b  
 */  
   
 void  
 put_bvop_dbquant(Bitstream * bs,  
                                  int value)  
 {  
         switch (value) {  
         case 0:  
                 BitstreamPutBit(bs, 0);  
                 return;  
   
         case -2:  
                 BitstreamPutBit(bs, 1);  
                 BitstreamPutBit(bs, 0);  
                 return;  
   
         case 2:  
                 BitstreamPutBit(bs, 1);  
                 BitstreamPutBit(bs, 1);  
                 return;  
   
         default:;                                       // invalid  
         }  
 }  
   
 void  
 MBCodingBVOP(const MACROBLOCK * mb,  
                          const int16_t qcoeff[6 * 64],  
                          const int32_t fcode,  
                          const int32_t bcode,  
                          Bitstream * bs,  
                          Statistics * pStat)  
 {  
         int i;  
   
 /*      ------------------------------------------------------------------  
                 when a block is skipped it is decoded DIRECT(0,0)  
                 hence is interpolated from forward & backward frames  
         ------------------------------------------------------------------ */  
   
         if (mb->mode == MODE_DIRECT_NONE_MV) {  
                 BitstreamPutBit(bs, 1); // skipped  
                 return;  
         }  
   
         BitstreamPutBit(bs, 0);         // not skipped  
   
         if (mb->cbp == 0) {  
                 BitstreamPutBit(bs, 1); // cbp == 0  
         } else {  
                 BitstreamPutBit(bs, 0); // cbp == xxx  
         }  
   
         put_bvop_mbtype(bs, mb->mode);  
   
         if (mb->cbp) {  
                 BitstreamPutBits(bs, mb->cbp, 6);  
         }  
   
         if (mb->mode != MODE_DIRECT && mb->cbp != 0) {  
                 put_bvop_dbquant(bs, 0);        // todo: mb->dquant = 0  
         }  
   
         if (mb->mode == MODE_INTERPOLATE || mb->mode == MODE_FORWARD) {  
                 CodeVector(bs, mb->pmvs[0].x, fcode, pStat);  
                 CodeVector(bs, mb->pmvs[0].y, fcode, pStat);  
         }  
   
         if (mb->mode == MODE_INTERPOLATE || mb->mode == MODE_BACKWARD) {  
                 CodeVector(bs, mb->b_pmvs[0].x, bcode, pStat);  
                 CodeVector(bs, mb->b_pmvs[0].y, bcode, pStat);  
         }  
   
         if (mb->mode == MODE_DIRECT) {  
                 CodeVector(bs, mb->deltamv.x, 1, pStat);                /* fcode is always 1 for delta vector */  
                 CodeVector(bs, mb->deltamv.y, 1, pStat);                /* prediction is always (0,0) */  
         }  
   
         for (i = 0; i < 6; i++) {  
                 if (mb->cbp & (1 << (5 - i))) {  
                         CodeCoeff(bs, &qcoeff[i * 64], inter_table, scan_tables[0], 0);  
                 }  
         }  
 }  
 #endif  
   
   
462  /*****************************************************************************  /*****************************************************************************
463   * decoding stuff starts here   * decoding stuff starts here
464   ****************************************************************************/   ****************************************************************************/
# Line 808  Line 692 
692                  level = BitstreamGetBits(bs, 8);                  level = BitstreamGetBits(bs, 8);
693    
694                  if (level == 0 || level == 128)                  if (level == 0 || level == 128)
695                          DEBUG1("Illegal LEVEL for ESCAPE mode 4:", level);                          DPRINTF(DPRINTF_ERROR, "Illegal LEVEL for ESCAPE mode 4: %d", level);
696    
697                  return (level >= 128 ? -(256 - level) : level);                  return (level >= 128 ? -(256 - level) : level);
698          }          }
# Line 876  Line 760 
760          do {          do {
761                  level = get_coeff(bs, &run, &last, 1, 0);                  level = get_coeff(bs, &run, &last, 1, 0);
762                  if (run == -1) {                  if (run == -1) {
763                          DEBUG("fatal: invalid run");                          DPRINTF(DPRINTF_DEBUG, "fatal: invalid run");
764                          break;                          break;
765                  }                  }
766                  coeff += run;                  coeff += run;
# Line 886  Line 770 
770                  //DPRINTF(DPRINTF_COEFF,"block[%i] %i %08x", scan[coeff], level, BitstreamShowBits(bs, 32));                  //DPRINTF(DPRINTF_COEFF,"block[%i] %i %08x", scan[coeff], level, BitstreamShowBits(bs, 32));
771    
772                  if (level < -127 || level > 127) {                  if (level < -127 || level > 127) {
773                          DEBUG1("warning: intra_overflow", level);                          DPRINTF(DPRINTF_DEBUG, "warning: intra_overflow: %d", level);
774                  }                  }
775                  coeff++;                  coeff++;
776          } while (!last);          } while (!last);
# Line 908  Line 792 
792          do {          do {
793                  level = get_coeff(bs, &run, &last, 0, 0);                  level = get_coeff(bs, &run, &last, 0, 0);
794                  if (run == -1) {                  if (run == -1) {
795                          DEBUG("fatal: invalid run");                          DPRINTF(DPRINTF_ERROR, "fatal: invalid run");
796                          break;                          break;
797                  }                  }
798                  p += run;                  p += run;
# Line 916  Line 800 
800                  block[scan[p]] = level;                  block[scan[p]] = level;
801    
802                  DPRINTF(DPRINTF_COEFF,"block[%i] %i", scan[p], level);                  DPRINTF(DPRINTF_COEFF,"block[%i] %i", scan[p], level);
                 // DPRINTF(DPRINTF_COEFF,"block[%i] %i %08x", scan[p], level, BitstreamShowBits(bs, 32));  
803    
804                  if (level < -127 || level > 127) {                  if (level < -127 || level > 127) {
805                          DEBUG1("warning: inter_overflow", level);                          DPRINTF(DPRINTF_DEBUG, "warning: inter_overflow: %d", level);
806                  }                  }
807                  p++;                  p++;
808          } while (!last);          } while (!last);

Legend:
Removed from v.454  
changed lines
  Added in v.655

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.4