[cvs] / xvidcore / src / image / image.c Repository:
ViewVC logotype

Diff of /xvidcore/src/image/image.c

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

revision 1.20.2.7, Thu Nov 7 10:28:15 2002 UTC revision 1.20.2.10, Thu Dec 12 12:40:19 2002 UTC
# Line 59  Line 59 
59  #include "image.h"  #include "image.h"
60  #include "colorspace.h"  #include "colorspace.h"
61  #include "interpolate8x8.h"  #include "interpolate8x8.h"
62    #include "reduced.h"
63  #include "../divx4.h"  #include "../divx4.h"
64  #include "../utils/mem_align.h"  #include "../utils/mem_align.h"
65    
# Line 323  Line 324 
324                                  h_ptr += 8;                                  h_ptr += 8;
325                          }                          }
326    
327                          hv_ptr += EDGE_SIZE2;                          hv_ptr += EDGE_SIZE;
328                          h_ptr += EDGE_SIZE2;                          h_ptr += EDGE_SIZE;
329    
330                          hv_ptr += stride_add;                          hv_ptr += stride_add;
331                          h_ptr += stride_add;                          h_ptr += stride_add;
# Line 475  Line 476 
476  }  }
477    
478    
479    /*
480    chroma optimize filter, invented by mf
481    a chroma pixel is average from the surrounding pixels, when the
482    correpsonding luma pixels are pure black or white.
483    */
484    
485    void
486    image_chroma_optimize(IMAGE * img, int width, int height, int edged_width)
487    {
488            int x,y;
489            int pixels = 0;
490    
491            for (y = 1; y < height/2 - 1; y++)
492            for (x = 1; x < width/2 - 1; x++)
493            {
494    #define IS_PURE(a)  ((a)<=16||(a)>=235)
495    #define IMG_Y(Y,X)      img->y[(Y)*edged_width + (X)]
496    #define IMG_U(Y,X)      img->u[(Y)*edged_width/2 + (X)]
497    #define IMG_V(Y,X)      img->v[(Y)*edged_width/2 + (X)]
498    
499                    if (IS_PURE(IMG_Y(y*2  ,x*2  )) &&
500                            IS_PURE(IMG_Y(y*2  ,x*2+1)) &&
501                            IS_PURE(IMG_Y(y*2+1,x*2  )) &&
502                            IS_PURE(IMG_Y(y*2+1,x*2+1)))
503                    {
504                            IMG_U(y,x) = (IMG_U(y,x-1) + IMG_U(y-1, x) + IMG_U(y, x+1) + IMG_U(y+1, x)) / 4;
505                            IMG_V(y,x) = (IMG_V(y,x-1) + IMG_V(y-1, x) + IMG_V(y, x+1) + IMG_V(y+1, x)) / 4;
506                            pixels++;
507                    }
508    
509    #undef IS_PURE
510    #undef IMG_Y
511    #undef IMG_U
512    #undef IMG_V
513            }
514    
515            DPRINTF(DPRINTF_DEBUG,"chroma_optimized_pixels = %i/%i", pixels, width*height/4);
516    }
517    
518    
519    
520    
521    
522  /*  /*
523    perform safe packed colorspace conversion, by splitting    perform safe packed colorspace conversion, by splitting
# Line 1055  Line 1098 
1098      sV += std2;      sV += std2;
1099    }    }
1100  }  }
1101    
1102    
1103    /* reduced resolution deblocking filter */
1104    void
1105    image_deblock_rrv(IMAGE * img, int edged_width,
1106                                    const MACROBLOCK * mbs, int mb_width, int mb_height, int mb_stride)
1107    {
1108            const int edged_width2 = edged_width /2;
1109            int i,j;
1110    
1111            /* horizontal deblocking */
1112    
1113            for (j = 1; j < mb_height*2; j++)       // luma: j,i in block units
1114            for (i = 0; i < mb_width*2; i++)
1115            {
1116                    if (mbs[(j-1)/2*mb_stride + (i/2)].mode != MODE_NOT_CODED ||
1117                            mbs[(j+0)/2*mb_stride + (i/2)].mode != MODE_NOT_CODED)
1118                    {
1119                            xvid_HFilter_31_C(img->y + (j*16 - 1)*edged_width + i*16,
1120                                                              img->y + (j*16 + 0)*edged_width + i*16, 2);
1121                    }
1122            }
1123    
1124            for (j = 1; j < mb_height; j++) // chroma
1125            for (i = 0; i < mb_width; i++)
1126            {
1127                    if (mbs[(j-1)*mb_stride + i].mode != MODE_NOT_CODED ||
1128                            mbs[(j+0)*mb_stride + i].mode != MODE_NOT_CODED)
1129                    {
1130                            hfilter_31(img->u + (j*16 - 1)*edged_width2 + i*16,
1131                                               img->u + (j*16 + 0)*edged_width2 + i*16, 2);
1132                            hfilter_31(img->v + (j*16 - 1)*edged_width2 + i*16,
1133                                               img->v + (j*16 + 0)*edged_width2 + i*16, 2);
1134                    }
1135            }
1136    
1137            /* vertical deblocking */
1138    
1139            for (j = 0; j < mb_height*2; j++)               // luma: i,j in block units
1140            for (i = 1; i < mb_width*2; i++)
1141            {
1142                    if (mbs[(j/2)*mb_stride + (i-1)/2].mode != MODE_NOT_CODED ||
1143                            mbs[(j/2)*mb_stride + (i+0)/2].mode != MODE_NOT_CODED)
1144                    {
1145                            vfilter_31(img->y + (j*16)*edged_width + i*16 - 1,
1146                                               img->y + (j*16)*edged_width + i*16 + 0,
1147                                               edged_width, 2);
1148                    }
1149            }
1150    
1151            for (j = 0; j < mb_height; j++) // chroma
1152            for (i = 1; i < mb_width; i++)
1153            {
1154                    if (mbs[j*mb_stride + i - 1].mode != MODE_NOT_CODED ||
1155                            mbs[j*mb_stride + i + 0].mode != MODE_NOT_CODED)
1156                    {
1157                            vfilter_31(img->u + (j*16)*edged_width2 + i*16 - 1,
1158                                               img->u + (j*16)*edged_width2 + i*16 + 0,
1159                                               edged_width2, 2);
1160                            vfilter_31(img->v + (j*16)*edged_width2 + i*16 - 1,
1161                                               img->v + (j*16)*edged_width2 + i*16 + 0,
1162                                               edged_width2, 2);
1163                    }
1164            }
1165    }

Legend:
Removed from v.1.20.2.7  
changed lines
  Added in v.1.20.2.10

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