[svn] / branches / dev-api-4 / xvidcore / src / prediction / mbprediction.c Repository:
ViewVC logotype

Diff of /branches/dev-api-4/xvidcore/src/prediction/mbprediction.c

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

revision 251, Sat Jun 29 12:47:19 2002 UTC revision 252, Sun Jun 30 10:46:29 2002 UTC
# Line 92  Line 92 
92                           uint32_t current_quant,                           uint32_t current_quant,
93                           int32_t iDcScaler,                           int32_t iDcScaler,
94                           int16_t predictors[8],                           int16_t predictors[8],
95                          const unsigned int bound_x,                          const int bound)
                         const unsigned int bound_y)  
96    
97  {  {
98          const unsigned bound = (bound_y * mb_width) + bound_x;          const int mbpos = (y * mb_width) + x;
         const unsigned mbpos = (y * mb_width) + x;  
99          int16_t *left, *top, *diag, *current;          int16_t *left, *top, *diag, *current;
100    
101          int32_t left_quant = current_quant;          int32_t left_quant = current_quant;
# Line 127  Line 125 
125          }          }
126          // top macroblock          // top macroblock
127    
128          if (mbpos >= bound + mb_width &&          if (mbpos >= bound + (int)mb_width &&
129                  (pMBs[index - mb_width].mode == MODE_INTRA ||                  (pMBs[index - mb_width].mode == MODE_INTRA ||
130                   pMBs[index - mb_width].mode == MODE_INTRA_Q)) {                   pMBs[index - mb_width].mode == MODE_INTRA_Q)) {
131    
# Line 136  Line 134 
134          }          }
135          // diag macroblock          // diag macroblock
136    
137          if (x && mbpos >= bound + mb_width + 1 &&          if (x && mbpos >= bound + (int)mb_width + 1 &&
138                  (pMBs[index - 1 - mb_width].mode == MODE_INTRA ||                  (pMBs[index - 1 - mb_width].mode == MODE_INTRA ||
139                   pMBs[index - 1 - mb_width].mode == MODE_INTRA_Q)) {                   pMBs[index - 1 - mb_width].mode == MODE_INTRA_Q)) {
140    
# Line 247  Line 245 
245          int16_t *pCurrent = pMB->pred_values[block];          int16_t *pCurrent = pMB->pred_values[block];
246          uint32_t i;          uint32_t i;
247    
248            DPRINTF(DPRINTF_COEFF,"predictor[0] %i", predictors[0]);
249    
250          dct_codes[0] += predictors[0];  // dc prediction          dct_codes[0] += predictors[0];  // dc prediction
251          pCurrent[0] = dct_codes[0] * iDcScaler;          pCurrent[0] = dct_codes[0] * iDcScaler;
252    
# Line 254  Line 254 
254                  for (i = 1; i < 8; i++) {                  for (i = 1; i < 8; i++) {
255                          int level = dct_codes[i] + predictors[i];                          int level = dct_codes[i] + predictors[i];
256    
257                            DPRINTF(DPRINTF_COEFF,"predictor[%i] %i",i, predictors[i]);
258    
259                          dct_codes[i] = level;                          dct_codes[i] = level;
260                          pCurrent[i] = level;                          pCurrent[i] = level;
261                          pCurrent[i + 7] = dct_codes[i * 8];                          pCurrent[i + 7] = dct_codes[i * 8];
# Line 261  Line 263 
263          } else if (acpred_direction == 2) {          } else if (acpred_direction == 2) {
264                  for (i = 1; i < 8; i++) {                  for (i = 1; i < 8; i++) {
265                          int level = dct_codes[i * 8] + predictors[i];                          int level = dct_codes[i * 8] + predictors[i];
266                            DPRINTF(DPRINTF_COEFF,"predictor[%i] %i",i*8, predictors[i]);
267    
268                          dct_codes[i * 8] = level;                          dct_codes[i * 8] = level;
269                          pCurrent[i + 7] = level;                          pCurrent[i + 7] = level;
# Line 385  Line 388 
388                          iDcScaler = get_dc_scaler(iQuant, (j < 4) ? 1 : 0);                          iDcScaler = get_dc_scaler(iQuant, (j < 4) ? 1 : 0);
389    
390                          predict_acdc(frame->mbs, x, y, mb_width, j, &qcoeff[j * 64],                          predict_acdc(frame->mbs, x, y, mb_width, j, &qcoeff[j * 64],
391                                                   iQuant, iDcScaler, predictors[j], 0, 0);                                                   iQuant, iDcScaler, predictors[j], 0);
392    
393                          S += calc_acdc(pMB, j, &qcoeff[j * 64], iDcScaler, predictors[j]);                          S += calc_acdc(pMB, j, &qcoeff[j * 64], iDcScaler, predictors[j]);
394    
# Line 405  Line 408 
408          }          }
409    
410  }  }
411    
412    
413    
414    
415    /*
416      get_pmvdata2: get_pmvdata with bounding
417    */
418    #define OFFSET(x,y,stride)   ((x)+((y)*(stride)))
419    
420    int
421    get_pmvdata2(const MACROBLOCK * const pMBs,
422                            const uint32_t x,
423                            const uint32_t y,
424                            const uint32_t x_dim,
425                            const uint32_t block,
426                            VECTOR * const pmv,
427                            int32_t * const psad,
428                            const int bound)
429    {
430            const int mbpos = OFFSET(x, y ,x_dim);
431    
432            /*
433             * pmv are filled with:
434             *  [0]: Median (or whatever is correct in a special case)
435             *  [1]: left neighbour
436             *  [2]: top neighbour
437             *  [3]: topright neighbour
438             * psad are filled with:
439             *  [0]: minimum of [1] to [3]
440             *  [1]: left neighbour's SAD (NB:[1] to [3] are actually not needed)
441             *  [2]: top neighbour's SAD
442             *  [3]: topright neighbour's SAD
443             */
444    
445            int xin1, xin2, xin3;
446            int yin1, yin2, yin3;
447            int vec1, vec2, vec3;
448    
449            int pos1, pos2, pos3;
450            int num_cand = 0;               // number of candidates
451            int last_cand;                  // last candidate
452    
453            uint32_t index = x + y * x_dim;
454            const VECTOR zeroMV = { 0, 0 };
455    
456            /*
457             * MODE_INTER, vm18 page 48
458             * MODE_INTER4V vm18 page 51
459             *
460             *  (x,y-1)      (x+1,y-1)
461             *  [   |   ]    [   |   ]
462             *  [ 2 | 3 ]    [ 2 |   ]
463             *
464             *  (x-1,y)      (x,y)        (x+1,y)
465             *  [   | 1 ]    [ 0 | 1 ]    [ 0 |   ]
466             *  [   | 3 ]    [ 2 | 3 ]    [   |   ]
467             */
468    
469            switch (block) {
470            case 0:
471                    xin1 = x - 1;
472                    yin1 = y;
473                    vec1 = 1;                               /* left */
474                    xin2 = x;
475                    yin2 = y - 1;
476                    vec2 = 2;                               /* top */
477                    xin3 = x + 1;
478                    yin3 = y - 1;
479                    vec3 = 2;                               /* top right */
480                    break;
481            case 1:
482                    xin1 = x;
483                    yin1 = y;
484                    vec1 = 0;
485                    xin2 = x;
486                    yin2 = y - 1;
487                    vec2 = 3;
488                    xin3 = x + 1;
489                    yin3 = y - 1;
490                    vec3 = 2;
491                    break;
492            case 2:
493                    xin1 = x - 1;
494                    yin1 = y;
495                    vec1 = 3;
496                    xin2 = x;
497                    yin2 = y;
498                    vec2 = 0;
499                    xin3 = x;
500                    yin3 = y;
501                    vec3 = 1;
502                    break;
503            default:
504                    xin1 = x;
505                    yin1 = y;
506                    vec1 = 2;
507                    xin2 = x;
508                    yin2 = y;
509                    vec2 = 0;
510                    xin3 = x;
511                    yin3 = y;
512                    vec3 = 1;
513            }
514    
515            pos1 = OFFSET(xin1, yin1, x_dim);
516            pos2 = OFFSET(xin2, yin2, x_dim);
517            pos3 = OFFSET(xin3, yin3, x_dim);
518    
519            // left
520            if (xin1 < 0 || pos1 < bound) {
521                    pmv[1] = zeroMV;
522                    psad[1] = MV_MAX_ERROR;
523            } else {
524                    pmv[1] = pMBs[xin1 + yin1 * x_dim].mvs[vec1];
525                    psad[1] = pMBs[xin1 + yin1 * x_dim].sad8[vec1];
526                    num_cand++;
527                    last_cand = 1;
528            }
529    
530            // top
531            if (yin2 < 0 || pos2 < bound) {
532                    pmv[2] = zeroMV;
533                    psad[2] = MV_MAX_ERROR;
534            } else {
535                    pmv[2] = pMBs[xin2 + yin2 * x_dim].mvs[vec2];
536                    psad[2] = pMBs[xin2 + yin2 * x_dim].sad8[vec2];
537                    num_cand++;
538                    last_cand = 2;
539            }
540    
541    
542            // top right
543            if (yin3 < 0 || pos3 < bound || xin3 >= (int)x_dim) {
544                    pmv[3] = zeroMV;
545                    psad[3] = MV_MAX_ERROR;
546                    //DPRINTF(DPRINTF_MV, "top-right");
547            } else {
548                    pmv[3] = pMBs[xin3 + yin3 * x_dim].mvs[vec3];
549                    psad[3] = pMBs[xin2 + yin2 * x_dim].sad8[vec3];
550                    num_cand++;
551                    last_cand = 3;
552            }
553    
554            if (num_cand == 1)
555            {
556                    /* DPRINTF(DPRINTF_MV,"cand0=(%i,%i), cand1=(%i,%i) cand2=(%i,%i) last=%i",
557                            pmv[1].x, pmv[1].y,
558                            pmv[2].x, pmv[2].y,
559                            pmv[3].x, pmv[3].y, last_cand - 1);
560                    */
561    
562                    pmv[0] = pmv[last_cand];
563                    psad[0] = psad[last_cand];
564                    return 0;
565            }
566    
567            /* DPRINTF(DPRINTF_MV,"cand0=(%i,%i), cand1=(%i,%i) cand2=(%i,%i)",
568                    pmv[1].x, pmv[1].y,
569                    pmv[2].x, pmv[2].y,
570                    pmv[3].x, pmv[3].y);*/
571    
572            if ((MVequal(pmv[1], pmv[2])) && (MVequal(pmv[1], pmv[3]))) {
573                    pmv[0] = pmv[1];
574                    psad[0] = MIN(MIN(psad[1], psad[2]), psad[3]);
575                    return 1;
576            }
577    
578            /* median,minimum */
579    
580            pmv[0].x =
581                    MIN(MAX(pmv[1].x, pmv[2].x),
582                            MIN(MAX(pmv[2].x, pmv[3].x), MAX(pmv[1].x, pmv[3].x)));
583            pmv[0].y =
584                    MIN(MAX(pmv[1].y, pmv[2].y),
585                            MIN(MAX(pmv[2].y, pmv[3].y), MAX(pmv[1].y, pmv[3].y)));
586            psad[0] = MIN(MIN(psad[1], psad[2]), psad[3]);
587    
588            return 0;
589    }

Legend:
Removed from v.251  
changed lines
  Added in v.252

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