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

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

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

revision 1.5, Thu Nov 27 00:47:03 2008 UTC revision 1.6.2.1, Thu Apr 7 19:07:36 2011 UTC
# Line 3  Line 3 
3   *  XVID MPEG-4 VIDEO CODEC   *  XVID MPEG-4 VIDEO CODEC
4   *  - Postprocessing  functions -   *  - Postprocessing  functions -
5   *   *
6   *  Copyright(C) 2003-2004 Michael Militzer <isibaar@xvid.org>   *  Copyright(C) 2003-2010 Michael Militzer <isibaar@xvid.org>
7   *                    2004 Marc Fauconneau   *                    2004 Marc Fauconneau
8   *   *
9   *  This program is free software ; you can redistribute it and/or modify   *  This program is free software ; you can redistribute it and/or modify
# Line 54  Line 54 
54  }  }
55    
56  void  void
57  image_postproc(XVID_POSTPROC *tbls, IMAGE * img, int edged_width,  stripe_deblock_h(SMPDeblock *h)
                                 const MACROBLOCK * mbs, int mb_width, int mb_height, int mb_stride,  
                                 int flags, int brightness, int frame_num, int bvop)  
58  {  {
59          const int edged_width2 = edged_width /2;          const int stride = h->stride;
60            const int stride2 = stride /2;
61    
62          int i,j;          int i,j;
63          int quant;          int quant;
         int dering = flags & XVID_DERINGY;  
64    
65          /* luma: j,i in block units */          /* luma: j,i in block units */
66          if ((flags & XVID_DEBLOCKY))          if ((h->flags & XVID_DEBLOCKY))
67          {          {
68                  for (j = 1; j < mb_height*2; j++)               /* horizontal deblocking */                  int dering = h->flags & XVID_DERINGY;
69                  for (i = 0; i < mb_width*2; i++)  
70                    for (j = 1; j < h->stop_y; j++)         /* horizontal luma deblocking */
71                    for (i = h->start_x; i < h->stop_x; i++)
72                  {                  {
73                          quant = mbs[(j+0)/2*mb_stride + (i/2)].quant;                          quant = h->mbs[(j+0)/2*h->mb_stride + (i/2)].quant;
74                          deblock8x8_h(tbls, img->y + j*8*edged_width + i*8, edged_width, quant, dering);                          deblock8x8_h(h->tbls, h->img->y + j*8*stride + i*8, stride, quant, dering);
75                  }                  }
76            }
77    
78            /* chroma */
79            if ((h->flags & XVID_DEBLOCKUV))
80            {
81                    int dering = h->flags & XVID_DERINGUV;
82    
83                  for (j = 0; j < mb_height*2; j++)               /* vertical deblocking */                  for (j = 1; j < h->stop_y/2; j++)               /* horizontal deblocking */
84                  for (i = 1; i < mb_width*2; i++)                  for (i = h->start_x/2; i < h->stop_x/2; i++)
85                  {                  {
86                          quant = mbs[(j+0)/2*mb_stride + (i/2)].quant;                          quant = h->mbs[(j+0)*h->mb_stride + i].quant;
87                          deblock8x8_v(tbls, img->y + j*8*edged_width + i*8, edged_width, quant, dering);                          deblock8x8_h(h->tbls, h->img->u + j*8*stride2 + i*8, stride2, quant, dering);
88                            deblock8x8_h(h->tbls, h->img->v + j*8*stride2 + i*8, stride2, quant, dering);
89                    }
90                  }                  }
91          }          }
92    
93    void
94    stripe_deblock_v(SMPDeblock *h)
95    {
96            const int stride = h->stride;
97            const int stride2 = stride /2;
98    
99          /* chroma */          int i,j;
100          if ((flags & XVID_DEBLOCKUV))          int quant;
101    
102            /* luma: j,i in block units */
103            if ((h->flags & XVID_DEBLOCKY))
104          {          {
105                  dering = flags & XVID_DERINGUV;                  int dering = h->flags & XVID_DERINGY;
106    
107                  for (j = 1; j < mb_height; j++)         /* horizontal deblocking */                  for (j = h->start_y; j < h->stop_y; j++)                /* vertical deblocking */
108                  for (i = 0; i < mb_width; i++)                  for (i = 1; i < h->stop_x; i++)
109                  {                  {
110                          quant = mbs[(j+0)*mb_stride + i].quant;                          quant = h->mbs[(j+0)/2*h->mb_stride + (i/2)].quant;
111                          deblock8x8_h(tbls, img->u + j*8*edged_width2 + i*8, edged_width2, quant, dering);                          deblock8x8_v(h->tbls, h->img->y + j*8*stride + i*8, stride, quant, dering);
112                          deblock8x8_h(tbls, img->v + j*8*edged_width2 + i*8, edged_width2, quant, dering);                  }
113                  }                  }
114    
115                  for (j = 0; j < mb_height; j++)         /* vertical deblocking */          /* chroma */
116                  for (i = 1; i < mb_width; i++)          if ((h->flags & XVID_DEBLOCKUV))
117                  {                  {
118                          quant = mbs[(j+0)*mb_stride + i].quant;                  int dering = h->flags & XVID_DERINGUV;
119                          deblock8x8_v(tbls, img->u + j*8*edged_width2 + i*8, edged_width2, quant, dering);  
120                          deblock8x8_v(tbls, img->v + j*8*edged_width2 + i*8, edged_width2, quant, dering);                  for (j = h->start_y/2; j < h->stop_y/2; j++)            /* vertical deblocking */
121                    for (i = 1; i < h->stop_x/2; i++)
122                    {
123                            quant = h->mbs[(j+0)*h->mb_stride + i].quant;
124                            deblock8x8_v(h->tbls, h->img->u + j*8*stride2 + i*8, stride2, quant, dering);
125                            deblock8x8_v(h->tbls, h->img->v + j*8*stride2 + i*8, stride2, quant, dering);
126                    }
127                  }                  }
128          }          }
129    
130    void
131    image_postproc(XVID_POSTPROC *tbls, IMAGE * img, int edged_width,
132                                    const MACROBLOCK * mbs, int mb_width, int mb_height, int mb_stride,
133                                    int flags, int brightness, int frame_num, int bvop, int threads)
134    {
135            int k;
136    #ifndef HAVE_PTHREAD
137            int num_threads = 1;
138    #else
139            int num_threads = MAX(1, MIN(threads, 4));
140            void *status = NULL;
141    #endif
142            SMPDeblock data[4];
143    
144            /* horizontal deblocking, dispatch threads */
145            for (k = 0; k < num_threads; k++) {
146                    data[k].flags = flags;
147                    data[k].img = img;
148                    data[k].mb_stride = mb_stride;
149                    data[k].mbs = mbs;
150                    data[k].stride = edged_width;
151                    data[k].tbls = tbls;
152    
153                    data[k].start_x = (k*mb_width / num_threads)*2;
154                    data[k].stop_x = ((k+1)*mb_width / num_threads)*2;
155    
156                    data[k].stop_y = mb_height*2;
157            }
158    #ifdef HAVE_PTHREAD
159            /* create threads */
160            for (k = 1; k < num_threads; k++) {
161                    pthread_create(&data[k].handle, NULL,
162                                   (void*)stripe_deblock_h, (void*)&data[k]);
163            }
164    #endif
165            stripe_deblock_h(&data[0]);
166    
167    #ifdef HAVE_PTHREAD
168            /* wait until all threads are finished */
169            for (k = 1; k < num_threads; k++) {
170                    pthread_join(data[k].handle, &status);
171            }
172    #endif
173    
174            /* vertical deblocking, dispatch threads */
175            for (k = 0; k < num_threads; k++) {
176                    data[k].start_y = (k*mb_height / num_threads)*2;
177                    data[k].stop_y = ((k+1)*mb_height / num_threads)*2;
178                    data[k].stop_x = mb_width*2;
179            }
180    
181    #ifdef HAVE_PTHREAD
182            /* create threads */
183            for (k = 1; k < num_threads; k++) {
184                    pthread_create(&data[k].handle, NULL,
185                                   (void*)stripe_deblock_v, (void*)&data[k]);
186            }
187    #endif
188            stripe_deblock_v(&data[0]);
189    
190    #ifdef HAVE_PTHREAD
191            /* wait until all threads are finished */
192            for (k = 1; k < num_threads; k++) {
193                    pthread_join(data[k].handle, &status);
194            }
195    #endif
196    
197          if (!bvop)          if (!bvop)
198                  tbls->prev_quant = mbs->quant;                  tbls->prev_quant = mbs->quant;
199    

Legend:
Removed from v.1.5  
changed lines
  Added in v.1.6.2.1

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