[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 676, Mon Nov 25 13:38:56 2002 UTC revision 677, Tue Nov 26 23:44:11 2002 UTC
# Line 50  Line 50 
50   *  exception also makes it possible to release a modified version which   *  exception also makes it possible to release a modified version which
51   *  carries forward this exception.   *  carries forward this exception.
52   *   *
53   * $Id: mbcoding.c,v 1.33 2002-11-17 00:57:57 edgomez Exp $   * $Id: mbcoding.c,v 1.34 2002-11-26 23:44:10 edgomez Exp $
54   *   *
55   ****************************************************************************/   ****************************************************************************/
56    
# Line 107  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 134  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 283  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 315  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 326  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 380  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                          DPRINTF(DPRINTF_DEBUG, "codep: field_dct: %d", 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                          DPRINTF(DPRINTF_DEBUG, "codep: field_pred: %d", 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 418  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 441  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 455  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 662  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 686  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);
# Line 718  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 767  Line 767 
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                          DPRINTF(DPRINTF_DEBUG, "warning: intra_overflow: %d", level);                          DPRINTF(DPRINTF_DEBUG, "warning: intra_overflow: %d", level);

Legend:
Removed from v.676  
changed lines
  Added in v.677

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