[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 497, Sat Sep 21 02:26:12 2002 UTC revision 677, Tue Nov 26 23:44:11 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.31 2002-09-21 02:26:12 suxen_drol 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.34 2002-11-26 23:44:10 edgomez Exp $
54   *   *
55   ****************************************************************************/   ****************************************************************************/
56    
# Line 86  Line 107 
107    
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 const *max_level_ptr = max_level[last + 2 * intra];                          int8_t const *max_level_ptr = max_level[last + 2 * intra];
112                          int8_t const *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;
116                                  ptr_t run = l;                                  ptr_t run = l;
117    
118                                  if ((abs(level) <= max_level_ptr[run]) && (run <= (uint32_t) max_run_ptr[abs(level)])) {        // level < max_level and run < max_run                                  if ((abs(level) <= max_level_ptr[run]) && (run <= (uint32_t) max_run_ptr[abs(level)])) {        /* level < max_level and run < max_run */
119    
120                                          vlc[intra]->code = 0;                                          vlc[intra]->code = 0;
121                                          vlc[intra]->len = 0;                                          vlc[intra]->len = 0;
122                                          goto loop_end;                                          goto loop_end;
123                                  } else {                                  } else {
124                                          if (level > 0)  // correct level                                          if (level > 0)  /* correct level */
125                                                  level -= max_level_ptr[run];                                                  level -= max_level_ptr[run];
126                                          else                                          else
127                                                  level += max_level_ptr[run];                                                  level += max_level_ptr[run];
# Line 113  Line 134 
134                                                  goto loop_end;                                                  goto loop_end;
135                                          }                                          }
136    
137                                          if (level > 0)  // still here?                                          if (level > 0)  /* still here? */
138                                                  level += max_level_ptr[run];    // restore level                                                  level += max_level_ptr[run];    /* restore level */
139                                          else                                          else
140                                                  level -= max_level_ptr[run];                                                  level -= max_level_ptr[run];
141    
142                                          run -= max_run_ptr[abs(level)] + 1;     // and change run                                          run -= max_run_ptr[abs(level)] + 1;     /* and change run */
143    
144                                          if ((abs(level) <= max_level_ptr[run]) &&                                          if ((abs(level) <= max_level_ptr[run]) &&
145                                                  (run <= (uint32_t) max_run_ptr[abs(level)])) {                                                  (run <= (uint32_t) max_run_ptr[abs(level)])) {
# Line 262  Line 283 
283                  vlc = table + 64 * 2047 + (v << 6) + j - last;                  vlc = table + 64 * 2047 + (v << 6) + j - last;
284                  last = ++j;                  last = ++j;
285    
286                  // count zeroes                  /* count zeroes */
287                  while (j < 64 && (v = qcoeff[zigzag[j]]) == 0)                  while (j < 64 && (v = qcoeff[zigzag[j]]) == 0)
288                          j++;                          j++;
289    
290                  // write code                  /* write code */
291                  if (j != 64) {                  if (j != 64) {
292                          BitstreamPutBits(bs, vlc->code, vlc->len);                          BitstreamPutBits(bs, vlc->code, vlc->len);
293                  } else {                  } else {
# Line 294  Line 315 
315    
316          cbpy = pMB->cbp >> 2;          cbpy = pMB->cbp >> 2;
317    
318          // write mcbpc          /* write mcbpc */
319          if (frame->coding_type == I_VOP) {          if (frame->coding_type == I_VOP) {
320                  mcbpc = ((pMB->mode >> 1) & 3) | ((pMB->cbp & 3) << 2);                  mcbpc = ((pMB->mode >> 1) & 3) | ((pMB->cbp & 3) << 2);
321                  BitstreamPutBits(bs, mcbpc_intra_tab[mcbpc].code,                  BitstreamPutBits(bs, mcbpc_intra_tab[mcbpc].code,
# Line 305  Line 326 
326                                                   mcbpc_inter_tab[mcbpc].len);                                                   mcbpc_inter_tab[mcbpc].len);
327          }          }
328    
329          // ac prediction flag          /* ac prediction flag */
330          if (pMB->acpred_directions[0])          if (pMB->acpred_directions[0])
331                  BitstreamPutBits(bs, 1, 1);                  BitstreamPutBits(bs, 1, 1);
332          else          else
333                  BitstreamPutBits(bs, 0, 1);                  BitstreamPutBits(bs, 0, 1);
334    
335          // write cbpy          /* write cbpy */
336          BitstreamPutBits(bs, cbpy_tab[cbpy].code, cbpy_tab[cbpy].len);          BitstreamPutBits(bs, cbpy_tab[cbpy].code, cbpy_tab[cbpy].len);
337    
338          // write dquant          /* write dquant */
339          if (pMB->mode == MODE_INTRA_Q)          if (pMB->mode == MODE_INTRA_Q)
340                  BitstreamPutBits(bs, pMB->dquant, 2);                  BitstreamPutBits(bs, pMB->dquant, 2);
341    
342          // write interlacing          /* write interlacing */
343          if (frame->global_flags & XVID_INTERLACING) {          if (frame->global_flags & XVID_INTERLACING) {
344                  BitstreamPutBit(bs, pMB->field_dct);                  BitstreamPutBit(bs, pMB->field_dct);
345          }          }
346          // code block coeffs          /* code block coeffs */
347          for (i = 0; i < 6; i++) {          for (i = 0; i < 6; i++) {
348                  if (i < 4)                  if (i < 4)
349                          BitstreamPutBits(bs, dcy_tab[qcoeff[i * 64 + 0] + 255].code,                          BitstreamPutBits(bs, dcy_tab[qcoeff[i * 64 + 0] + 255].code,
# Line 359  Line 380 
380          mcbpc = (pMB->mode & 7) | ((pMB->cbp & 3) << 3);          mcbpc = (pMB->mode & 7) | ((pMB->cbp & 3) << 3);
381          cbpy = 15 - (pMB->cbp >> 2);          cbpy = 15 - (pMB->cbp >> 2);
382    
383          // write mcbpc          /* write mcbpc */
384          BitstreamPutBits(bs, mcbpc_inter_tab[mcbpc].code,          BitstreamPutBits(bs, mcbpc_inter_tab[mcbpc].code,
385                                           mcbpc_inter_tab[mcbpc].len);                                           mcbpc_inter_tab[mcbpc].len);
386    
387          // write cbpy          /* write cbpy */
388          BitstreamPutBits(bs, cbpy_tab[cbpy].code, cbpy_tab[cbpy].len);          BitstreamPutBits(bs, cbpy_tab[cbpy].code, cbpy_tab[cbpy].len);
389    
390          // write dquant          /* write dquant */
391          if (pMB->mode == MODE_INTER_Q)          if (pMB->mode == MODE_INTER_Q)
392                  BitstreamPutBits(bs, pMB->dquant, 2);                  BitstreamPutBits(bs, pMB->dquant, 2);
393    
394          // interlacing          /* interlacing */
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) {
408                                  BitstreamPutBit(bs, pMB->field_for_top);                                  BitstreamPutBit(bs, pMB->field_for_top);
409                                  BitstreamPutBit(bs, pMB->field_for_bot);                                  BitstreamPutBit(bs, pMB->field_for_bot);
410                          }                          }
411                  }                  }
412          }          }
413          // code motion vector(s)          /* code motion vector(s) */
414          for (i = 0; i < (pMB->mode == MODE_INTER4V ? 4 : 1); i++) {          for (i = 0; i < (pMB->mode == MODE_INTER4V ? 4 : 1); i++) {
415                  CodeVector(bs, pMB->pmvs[i].x, frame->fcode, pStat);                  CodeVector(bs, pMB->pmvs[i].x, frame->fcode, pStat);
416                  CodeVector(bs, pMB->pmvs[i].y, frame->fcode, pStat);                  CodeVector(bs, pMB->pmvs[i].y, frame->fcode, pStat);
# Line 397  Line 418 
418    
419          bits = BitstreamPos(bs);          bits = BitstreamPos(bs);
420    
421          // code block coeffs          /* code block coeffs */
422          for (i = 0; i < 6; i++)          for (i = 0; i < 6; i++)
423                  if (pMB->cbp & (1 << (5 - i)))                  if (pMB->cbp & (1 << (5 - i)))
424                          CodeCoeff(bs, &qcoeff[i * 64], inter_table, scan_tables[0], 0);                          CodeCoeff(bs, &qcoeff[i * 64], inter_table, scan_tables[0], 0);
# Line 420  Line 441 
441  {  {
442    
443          if (frame->coding_type == P_VOP) {          if (frame->coding_type == P_VOP) {
444                          BitstreamPutBit(bs, 0); // coded                          BitstreamPutBit(bs, 0); /* coded */
445          }          }
446    
447          if (pMB->mode == MODE_INTRA || pMB->mode == MODE_INTRA_Q)          if (pMB->mode == MODE_INTRA || pMB->mode == MODE_INTRA_Q)
# Line 434  Line 455 
455  void  void
456  MBSkip(Bitstream * bs)  MBSkip(Bitstream * bs)
457  {  {
458          BitstreamPutBit(bs, 1); // not coded          BitstreamPutBit(bs, 1); /* not coded */
459          return;          return;
460  }  }
461    
# Line 641  Line 662 
662          const VLC *tab;          const VLC *tab;
663          int32_t level;          int32_t level;
664    
665          if (short_video_header)         // inter-VLCs will be used for both intra and inter blocks          if (short_video_header)         /* inter-VLCs will be used for both intra and inter blocks */
666                  intra = 0;                  intra = 0;
667    
668          tab = &DCT3D[intra][BitstreamShowBits(bs, 12)];          tab = &DCT3D[intra][BitstreamShowBits(bs, 12)];
# Line 665  Line 686 
686          }          }
687    
688          if (short_video_header) {          if (short_video_header) {
689                  // escape mode 4 - H.263 type, only used if short_video_header = 1                  /* escape mode 4 - H.263 type, only used if short_video_header = 1  */
690                  *last = BitstreamGetBit(bs);                  *last = BitstreamGetBit(bs);
691                  *run = BitstreamGetBits(bs, 6);                  *run = BitstreamGetBits(bs, 6);
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 697  Line 718 
718                          *last = (tab->code >> 16) & 1;                          *last = (tab->code >> 16) & 1;
719                  }                  }
720    
721                  if (mode < 2)                   // first escape mode, level is offset                  if (mode < 2)                   /* first escape mode, level is offset */
722                          level += max_level[*last + (!intra << 1)][*run];        // need to add back the max level                          level += max_level[*last + (!intra << 1)][*run];        /* need to add back the max level */
723                  else if (mode == 2)             // second escape mode, run is offset                  else if (mode == 2)             /* second escape mode, run is offset */
724                          *run += max_run[*last + (!intra << 1)][level] + 1;                          *run += max_run[*last + (!intra << 1)][level] + 1;
725    
726                  return BitstreamGetBit(bs) ? -level : level;                  return BitstreamGetBit(bs) ? -level : level;
727          }          }
728          // third escape mode - fixed length codes          /* third escape mode - fixed length codes */
729          BitstreamSkip(bs, 2);          BitstreamSkip(bs, 2);
730          *last = BitstreamGetBits(bs, 1);          *last = BitstreamGetBits(bs, 1);
731          *run = BitstreamGetBits(bs, 6);          *run = BitstreamGetBits(bs, 6);
732          BitstreamSkip(bs, 1);           // marker          BitstreamSkip(bs, 1);           /* marker */
733          level = BitstreamGetBits(bs, 12);          level = BitstreamGetBits(bs, 12);
734          BitstreamSkip(bs, 1);           // marker          BitstreamSkip(bs, 1);           /* marker */
735    
736          return (level & 0x800) ? (level | (-1 ^ 0xfff)) : level;          return (level & 0x800) ? (level | (-1 ^ 0xfff)) : level;
737    
# Line 739  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;
767                  block[scan[coeff]] = level;                  block[scan[coeff]] = level;
768    
769                  DPRINTF(DPRINTF_COEFF,"block[%i] %i", scan[coeff], level);                  DPRINTF(DPRINTF_COEFF,"block[%i] %i", scan[coeff], level);
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 771  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 779  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.497  
changed lines
  Added in v.677

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