[svn] / trunk / xvidcore / src / image / colorspace.c Repository:
ViewVC logotype

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

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

revision 1741, Sun Oct 29 08:04:02 2006 UTC revision 2177, Sun Nov 3 11:50:49 2019 UTC
# Line 19  Line 19 
19   *  along with this program ; if not, write to the Free Software   *  along with this program ; if not, write to the Free Software
20   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
21   *   *
22   * $Id: colorspace.c,v 1.12 2006-10-29 08:04:02 chl Exp $   * $Id$
23   *   *
24   ****************************************************************************/   ****************************************************************************/
25    
# Line 33  Line 33 
33  /* input */  /* input */
34  packedFuncPtr rgb555_to_yv12;  packedFuncPtr rgb555_to_yv12;
35  packedFuncPtr rgb565_to_yv12;  packedFuncPtr rgb565_to_yv12;
36    packedFuncPtr rgb_to_yv12;
37  packedFuncPtr bgr_to_yv12;  packedFuncPtr bgr_to_yv12;
38  packedFuncPtr bgra_to_yv12;  packedFuncPtr bgra_to_yv12;
39  packedFuncPtr abgr_to_yv12;  packedFuncPtr abgr_to_yv12;
# Line 43  Line 44 
44    
45  packedFuncPtr rgb555i_to_yv12;  packedFuncPtr rgb555i_to_yv12;
46  packedFuncPtr rgb565i_to_yv12;  packedFuncPtr rgb565i_to_yv12;
47    packedFuncPtr rgbi_to_yv12;
48  packedFuncPtr bgri_to_yv12;  packedFuncPtr bgri_to_yv12;
49  packedFuncPtr bgrai_to_yv12;  packedFuncPtr bgrai_to_yv12;
50  packedFuncPtr abgri_to_yv12;  packedFuncPtr abgri_to_yv12;
# Line 57  Line 59 
59  packedFuncPtr yv12_to_bgr;  packedFuncPtr yv12_to_bgr;
60  packedFuncPtr yv12_to_bgra;  packedFuncPtr yv12_to_bgra;
61  packedFuncPtr yv12_to_abgr;  packedFuncPtr yv12_to_abgr;
62    packedFuncPtr yv12_to_rgb;
63  packedFuncPtr yv12_to_rgba;  packedFuncPtr yv12_to_rgba;
64  packedFuncPtr yv12_to_argb;  packedFuncPtr yv12_to_argb;
65  packedFuncPtr yv12_to_yuyv;  packedFuncPtr yv12_to_yuyv;
# Line 67  Line 70 
70  packedFuncPtr yv12_to_bgri;  packedFuncPtr yv12_to_bgri;
71  packedFuncPtr yv12_to_bgrai;  packedFuncPtr yv12_to_bgrai;
72  packedFuncPtr yv12_to_abgri;  packedFuncPtr yv12_to_abgri;
73    packedFuncPtr yv12_to_rgbi;
74  packedFuncPtr yv12_to_rgbai;  packedFuncPtr yv12_to_rgbai;
75  packedFuncPtr yv12_to_argbi;  packedFuncPtr yv12_to_argbi;
76  packedFuncPtr yv12_to_yuyvi;  packedFuncPtr yv12_to_yuyvi;
# Line 98  Line 102 
102          int y_dif = y_stride - fixed_width;                             \          int y_dif = y_stride - fixed_width;                             \
103          int uv_dif = uv_stride - (fixed_width / 2);             \          int uv_dif = uv_stride - (fixed_width / 2);             \
104          int x, y;                                                                               \          int x, y;                                                                               \
105            if ((x_ptr == NULL) || (x_dif < 0)) return;             \
106          if (vflip) {                                                            \          if (vflip) {                                                            \
107                  x_ptr += (height - 1) * x_stride;                       \                  x_ptr += (height - 1) * x_stride;                       \
108                  x_dif = -(SIZE)*fixed_width - x_stride;         \                  x_dif = -(SIZE)*fixed_width - x_stride;         \
# Line 148  Line 153 
153  #define V_B_IN                  0.071  #define V_B_IN                  0.071
154  #define V_ADD_IN                128  #define V_ADD_IN                128
155    
156  #define SCALEBITS_IN    8  #define SCALEBITS_IN            13
157  #define FIX_IN(x)               ((uint16_t) ((x) * (1L<<SCALEBITS_IN) + 0.5))  #define FIX_IN(x)               ((uint16_t) ((x) * (1L<<SCALEBITS_IN) + 0.5))
158    #define FIX_ROUND               (1L<<(SCALEBITS_IN-1))
159    
160  /* rgb16/rgb16i input */  /* rgb16/rgb16i input */
161    
# Line 170  Line 175 
175          r##UVID += r = C1##_R(rgb);                             \          r##UVID += r = C1##_R(rgb);                             \
176          y_ptr[(ROW)*y_stride+0] =                               \          y_ptr[(ROW)*y_stride+0] =                               \
177                  (uint8_t) ((FIX_IN(Y_R_IN) * r + FIX_IN(Y_G_IN) * g +   \                  (uint8_t) ((FIX_IN(Y_R_IN) * r + FIX_IN(Y_G_IN) * g +   \
178                                          FIX_IN(Y_B_IN) * b) >> SCALEBITS_IN) + Y_ADD_IN;        \                                          FIX_IN(Y_B_IN) * b + FIX_ROUND) >> SCALEBITS_IN) + Y_ADD_IN;    \
179          rgb = *(uint16_t *) (x_ptr + ((ROW)*x_stride) + 2);     \          rgb = *(uint16_t *) (x_ptr + ((ROW)*x_stride) + 2);     \
180          b##UVID += b = C1##_B(rgb);                             \          b##UVID += b = C1##_B(rgb);                             \
181          g##UVID += g = C1##_G(rgb);                             \          g##UVID += g = C1##_G(rgb);                             \
182          r##UVID += r = C1##_R(rgb);                             \          r##UVID += r = C1##_R(rgb);                             \
183          y_ptr[(ROW)*y_stride+1] =                               \          y_ptr[(ROW)*y_stride+1] =                               \
184                  (uint8_t) ((FIX_IN(Y_R_IN) * r + FIX_IN(Y_G_IN) * g +                   \                  (uint8_t) ((FIX_IN(Y_R_IN) * r + FIX_IN(Y_G_IN) * g +                   \
185                                          FIX_IN(Y_B_IN) * b) >> SCALEBITS_IN) + Y_ADD_IN;                                          FIX_IN(Y_B_IN) * b + FIX_ROUND) >> SCALEBITS_IN) + Y_ADD_IN;
186    
187  #define READ_RGB16_UV(UV_ROW,UVID)      \  #define READ_RGB16_UV(UV_ROW,UVID)      \
188          u_ptr[(UV_ROW)*uv_stride] =                                                                                                             \          u_ptr[(UV_ROW)*uv_stride] =                                                                                                             \
189                  (uint8_t) ((-FIX_IN(U_R_IN) * r##UVID - FIX_IN(U_G_IN) * g##UVID +                      \                  (uint8_t) ((-FIX_IN(U_R_IN) * r##UVID - FIX_IN(U_G_IN) * g##UVID +                      \
190                                          FIX_IN(U_B_IN) * b##UVID) >> (SCALEBITS_IN + 2)) + U_ADD_IN;    \                                          FIX_IN(U_B_IN) * b##UVID + 4*FIX_ROUND) >> (SCALEBITS_IN + 2)) + U_ADD_IN;      \
191          v_ptr[(UV_ROW)*uv_stride] =                                                                                                             \          v_ptr[(UV_ROW)*uv_stride] =                                                                                                             \
192                  (uint8_t) ((FIX_IN(V_R_IN) * r##UVID - FIX_IN(V_G_IN) * g##UVID -                       \                  (uint8_t) ((FIX_IN(V_R_IN) * r##UVID - FIX_IN(V_G_IN) * g##UVID -                       \
193                                          FIX_IN(V_B_IN) * b##UVID) >> (SCALEBITS_IN + 2)) + V_ADD_IN;                                          FIX_IN(V_B_IN) * b##UVID + 4*FIX_ROUND) >> (SCALEBITS_IN + 2)) + V_ADD_IN;
194    
195  #define RGB16_TO_YV12_ROW(SIZE,C1,C2,C3,C4) \  #define RGB16_TO_YV12_ROW(SIZE,C1,C2,C3,C4) \
196          /* nothing */          /* nothing */
# Line 218  Line 223 
223          b##UVID += b = x_ptr[(ROW)*x_stride+(C3)];                                              \          b##UVID += b = x_ptr[(ROW)*x_stride+(C3)];                                              \
224          y_ptr[(ROW)*y_stride+0] =                                                                       \          y_ptr[(ROW)*y_stride+0] =                                                                       \
225                  (uint8_t) ((FIX_IN(Y_R_IN) * r + FIX_IN(Y_G_IN) * g +   \                  (uint8_t) ((FIX_IN(Y_R_IN) * r + FIX_IN(Y_G_IN) * g +   \
226                                          FIX_IN(Y_B_IN) * b) >> SCALEBITS_IN) + Y_ADD_IN;        \                                          FIX_IN(Y_B_IN) * b + FIX_ROUND) >> SCALEBITS_IN) + Y_ADD_IN;    \
227          r##UVID += r = x_ptr[(ROW)*x_stride+(SIZE)+(C1)];                               \          r##UVID += r = x_ptr[(ROW)*x_stride+(SIZE)+(C1)];                               \
228          g##UVID += g = x_ptr[(ROW)*x_stride+(SIZE)+(C2)];                               \          g##UVID += g = x_ptr[(ROW)*x_stride+(SIZE)+(C2)];                               \
229          b##UVID += b = x_ptr[(ROW)*x_stride+(SIZE)+(C3)];                               \          b##UVID += b = x_ptr[(ROW)*x_stride+(SIZE)+(C3)];                               \
230          y_ptr[(ROW)*y_stride+1] =                                                                       \          y_ptr[(ROW)*y_stride+1] =                                                                       \
231                  (uint8_t) ((FIX_IN(Y_R_IN) * r + FIX_IN(Y_G_IN) * g +   \                  (uint8_t) ((FIX_IN(Y_R_IN) * r + FIX_IN(Y_G_IN) * g +   \
232                                          FIX_IN(Y_B_IN) * b) >> SCALEBITS_IN) + Y_ADD_IN;                                          FIX_IN(Y_B_IN) * b + FIX_ROUND) >> SCALEBITS_IN) + Y_ADD_IN;
233    
234  #define READ_RGB_UV(UV_ROW,UVID)        \  #define READ_RGB_UV(UV_ROW,UVID)        \
235          u_ptr[(UV_ROW)*uv_stride] =                                                                                                             \          u_ptr[(UV_ROW)*uv_stride] =                                                                                                             \
236                  (uint8_t) ((-FIX_IN(U_R_IN) * r##UVID - FIX_IN(U_G_IN) * g##UVID +                      \                  (uint8_t) ((-FIX_IN(U_R_IN) * r##UVID - FIX_IN(U_G_IN) * g##UVID +                      \
237                                          FIX_IN(U_B_IN) * b##UVID) >> (SCALEBITS_IN + 2)) + U_ADD_IN;    \                                          FIX_IN(U_B_IN) * b##UVID + 4*FIX_ROUND) >> (SCALEBITS_IN + 2)) + U_ADD_IN;      \
238          v_ptr[(UV_ROW)*uv_stride] =                                                                                                             \          v_ptr[(UV_ROW)*uv_stride] =                                                                                                             \
239                  (uint8_t) ((FIX_IN(V_R_IN) * r##UVID - FIX_IN(V_G_IN) * g##UVID -                       \                  (uint8_t) ((FIX_IN(V_R_IN) * r##UVID - FIX_IN(V_G_IN) * g##UVID -                       \
240                                          FIX_IN(V_B_IN) * b##UVID) >> (SCALEBITS_IN + 2)) + V_ADD_IN;                                          FIX_IN(V_B_IN) * b##UVID + 4*FIX_ROUND) >> (SCALEBITS_IN + 2)) + V_ADD_IN;
241    
242    
243  #define RGB_TO_YV12_ROW(SIZE,C1,C2,C3,C4) \  #define RGB_TO_YV12_ROW(SIZE,C1,C2,C3,C4) \
# Line 288  Line 293 
293  MAKE_COLORSPACE(rgb565_to_yv12_c,  2,2,2, RGB16_TO_YV12,  MK_RGB565, 0,0,0)  MAKE_COLORSPACE(rgb565_to_yv12_c,  2,2,2, RGB16_TO_YV12,  MK_RGB565, 0,0,0)
294  MAKE_COLORSPACE(bgr_to_yv12_c,     3,2,2, RGB_TO_YV12,    2,1,0, 0)  MAKE_COLORSPACE(bgr_to_yv12_c,     3,2,2, RGB_TO_YV12,    2,1,0, 0)
295  MAKE_COLORSPACE(bgra_to_yv12_c,    4,2,2, RGB_TO_YV12,    2,1,0, 0)  MAKE_COLORSPACE(bgra_to_yv12_c,    4,2,2, RGB_TO_YV12,    2,1,0, 0)
296    MAKE_COLORSPACE(rgb_to_yv12_c,     3,2,2, RGB_TO_YV12,    0,1,2, 0)
297  MAKE_COLORSPACE(abgr_to_yv12_c,    4,2,2, RGB_TO_YV12,    3,2,1, 0)  MAKE_COLORSPACE(abgr_to_yv12_c,    4,2,2, RGB_TO_YV12,    3,2,1, 0)
298  MAKE_COLORSPACE(rgba_to_yv12_c,    4,2,2, RGB_TO_YV12,    0,1,2, 0)  MAKE_COLORSPACE(rgba_to_yv12_c,    4,2,2, RGB_TO_YV12,    0,1,2, 0)
299  MAKE_COLORSPACE(argb_to_yv12_c,    4,2,2, RGB_TO_YV12,    1,2,3, 0)  MAKE_COLORSPACE(argb_to_yv12_c,    4,2,2, RGB_TO_YV12,    1,2,3, 0)
# Line 299  Line 305 
305  MAKE_COLORSPACE(bgri_to_yv12_c,    3,2,4, RGBI_TO_YV12,   2,1,0, 0)  MAKE_COLORSPACE(bgri_to_yv12_c,    3,2,4, RGBI_TO_YV12,   2,1,0, 0)
306  MAKE_COLORSPACE(bgrai_to_yv12_c,   4,2,4, RGBI_TO_YV12,   2,1,0, 0)  MAKE_COLORSPACE(bgrai_to_yv12_c,   4,2,4, RGBI_TO_YV12,   2,1,0, 0)
307  MAKE_COLORSPACE(abgri_to_yv12_c,   4,2,4, RGBI_TO_YV12,   3,2,1, 0)  MAKE_COLORSPACE(abgri_to_yv12_c,   4,2,4, RGBI_TO_YV12,   3,2,1, 0)
308    MAKE_COLORSPACE(rgbi_to_yv12_c,    3,2,4, RGBI_TO_YV12,   0,1,2, 0)
309  MAKE_COLORSPACE(rgbai_to_yv12_c,   4,2,4, RGBI_TO_YV12,   0,1,2, 0)  MAKE_COLORSPACE(rgbai_to_yv12_c,   4,2,4, RGBI_TO_YV12,   0,1,2, 0)
310  MAKE_COLORSPACE(argbi_to_yv12_c,   4,2,4, RGBI_TO_YV12,   1,2,3, 0)  MAKE_COLORSPACE(argbi_to_yv12_c,   4,2,4, RGBI_TO_YV12,   1,2,3, 0)
311  MAKE_COLORSPACE(yuyvi_to_yv12_c,   2,2,4, YUYVI_TO_YV12,  0,1,2,3)  MAKE_COLORSPACE(yuyvi_to_yv12_c,   2,2,4, YUYVI_TO_YV12,  0,1,2,3)
# Line 443  Line 450 
450  MAKE_COLORSPACE(yv12_to_bgr_c,     3,2,2, YV12_TO_RGB,    2,1,0, 0)  MAKE_COLORSPACE(yv12_to_bgr_c,     3,2,2, YV12_TO_RGB,    2,1,0, 0)
451  MAKE_COLORSPACE(yv12_to_bgra_c,    4,2,2, YV12_TO_RGB,    2,1,0,3)  MAKE_COLORSPACE(yv12_to_bgra_c,    4,2,2, YV12_TO_RGB,    2,1,0,3)
452  MAKE_COLORSPACE(yv12_to_abgr_c,    4,2,2, YV12_TO_RGB,    3,2,1,0)  MAKE_COLORSPACE(yv12_to_abgr_c,    4,2,2, YV12_TO_RGB,    3,2,1,0)
453    MAKE_COLORSPACE(yv12_to_rgb_c,     3,2,2, YV12_TO_RGB,    0,1,2,0)
454  MAKE_COLORSPACE(yv12_to_rgba_c,    4,2,2, YV12_TO_RGB,    0,1,2,3)  MAKE_COLORSPACE(yv12_to_rgba_c,    4,2,2, YV12_TO_RGB,    0,1,2,3)
455  MAKE_COLORSPACE(yv12_to_argb_c,    4,2,2, YV12_TO_RGB,    1,2,3,0)  MAKE_COLORSPACE(yv12_to_argb_c,    4,2,2, YV12_TO_RGB,    1,2,3,0)
456  MAKE_COLORSPACE(yv12_to_yuyv_c,    2,2,2, YV12_TO_YUYV,   0,1,2,3)  MAKE_COLORSPACE(yv12_to_yuyv_c,    2,2,2, YV12_TO_YUYV,   0,1,2,3)
# Line 453  Line 461 
461  MAKE_COLORSPACE(yv12_to_bgri_c,    3,2,4, YV12_TO_RGBI,   2,1,0, 0)  MAKE_COLORSPACE(yv12_to_bgri_c,    3,2,4, YV12_TO_RGBI,   2,1,0, 0)
462  MAKE_COLORSPACE(yv12_to_bgrai_c,   4,2,4, YV12_TO_RGBI,   2,1,0,3)  MAKE_COLORSPACE(yv12_to_bgrai_c,   4,2,4, YV12_TO_RGBI,   2,1,0,3)
463  MAKE_COLORSPACE(yv12_to_abgri_c,   4,2,4, YV12_TO_RGBI,   3,2,1,0)  MAKE_COLORSPACE(yv12_to_abgri_c,   4,2,4, YV12_TO_RGBI,   3,2,1,0)
464    MAKE_COLORSPACE(yv12_to_rgbi_c,    3,2,4, YV12_TO_RGBI,   0,1,2,0)
465  MAKE_COLORSPACE(yv12_to_rgbai_c,   4,2,4, YV12_TO_RGBI,   0,1,2,3)  MAKE_COLORSPACE(yv12_to_rgbai_c,   4,2,4, YV12_TO_RGBI,   0,1,2,3)
466  MAKE_COLORSPACE(yv12_to_argbi_c,   4,2,4, YV12_TO_RGBI,   1,2,3,0)  MAKE_COLORSPACE(yv12_to_argbi_c,   4,2,4, YV12_TO_RGBI,   1,2,3,0)
467  MAKE_COLORSPACE(yv12_to_yuyvi_c,   2,2,4, YV12_TO_YUYVI,  0,1,2,3)  MAKE_COLORSPACE(yv12_to_yuyvi_c,   2,2,4, YV12_TO_YUYVI,  0,1,2,3)
# Line 472  Line 481 
481          int width2 = width / 2;          int width2 = width / 2;
482          int height2 = height / 2;          int height2 = height / 2;
483          int y;          int y;
484            const int with_uv = (u_src!=0 && v_src!=0);
485    
486          if (vflip) {          if (vflip) {
487                  y_src += (height - 1) * y_src_stride;                  y_src += (height - 1) * y_src_stride;
488                    if (with_uv) {
489                  u_src += (height2 - 1) * uv_src_stride;                  u_src += (height2 - 1) * uv_src_stride;
490                  v_src += (height2 - 1) * uv_src_stride;                  v_src += (height2 - 1) * uv_src_stride;
491                    }
492                  y_src_stride = -y_src_stride;                  y_src_stride = -y_src_stride;
493                  uv_src_stride = -uv_src_stride;                  uv_src_stride = -uv_src_stride;
494          }          }
# Line 487  Line 499 
499                  y_dst += y_dst_stride;                  y_dst += y_dst_stride;
500          }          }
501    
502          if (u_src)          if (with_uv) {
503                  for (y = height2; y; y--) {                  for (y = height2; y; y--) {
504                          memcpy(u_dst, u_src, width2);                          memcpy(u_dst, u_src, width2);
505                            memcpy(v_dst, v_src, width2);
506                          u_src += uv_src_stride;                          u_src += uv_src_stride;
507                          u_dst += uv_dst_stride;                          u_dst += uv_dst_stride;
                 }  
         else  
                 for (y = height2; y; y--) {  
                         memset(u_dst, 0x80, width2);  
                         u_dst += uv_dst_stride;  
                 }  
   
         if (v_src)  
                 for (y = height2; y; y--) {  
                         memcpy(v_dst, v_src, width2);  
508                          v_src += uv_src_stride;                          v_src += uv_src_stride;
509                          v_dst += uv_dst_stride;                          v_dst += uv_dst_stride;
510                  }                  }
511          else          }
512            else {
513                  for (y = height2; y; y--) {                  for (y = height2; y; y--) {
514                            memset(u_dst, 0x80, width2);
515                          memset(v_dst, 0x80, width2);                          memset(v_dst, 0x80, width2);
516                            u_dst += uv_dst_stride;
517                          v_dst += uv_dst_stride;                          v_dst += uv_dst_stride;
518                  }                  }
519  }  }
520    }
521    
522    
523    

Legend:
Removed from v.1741  
changed lines
  Added in v.2177

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