]>
git.saurik.com Git - wxWidgets.git/blob - src/tiff/tools/ycbcr.c
   1 float   ycbcrCoeffs
[3] = { .299, .587, .114 }; 
   2 /* default coding range is CCIR Rec 601-1 with no headroom/footroom */ 
   3 unsigned long refBlackWhite
[6] = { 0, 255, 128, 255, 128, 255 }; 
   5 #define LumaRed         ycbcrCoeffs[0] 
   6 #define LumaGreen       ycbcrCoeffs[1] 
   7 #define LumaBlue        ycbcrCoeffs[2] 
  15 unsigned long AbseRtotal 
= 0; 
  16 unsigned long AbseGtotal 
= 0; 
  17 unsigned long AbseBtotal 
= 0; 
  18 unsigned long eCodes 
= 0; 
  19 unsigned long preveCodes 
= 0; 
  20 unsigned long eBits 
= 0; 
  21 unsigned long preveBits 
= 0; 
  23 static  void setupLumaTables(); 
  24 static int abs(int v
) { return (v 
< 0 ? -v 
: v
); } 
  25 static double pct(int v
,double range
) { return (v
*100. / range
); } 
  26 static void check(int R
, int G
, int B
); 
  33 main(int argc
, char** argv
) 
  38         refBlackWhite
[0] = 16; 
  39         refBlackWhite
[1] = 235; 
  40         refBlackWhite
[2] = 128; 
  41         refBlackWhite
[3] = 240; 
  42         refBlackWhite
[4] = 128; 
  43         refBlackWhite
[5] = 240; 
  49     D5 
= D3
*LumaRed 
/ LumaGreen
; 
  50     D6 
= D4
*LumaBlue 
/ LumaGreen
; 
  52     for (R 
= 0; R 
< 256; R
++) { 
  53         for (G 
= 0; G 
< 256; G
++) 
  54             for (B 
= 0; B 
< 256; B
++) 
  56         printf("[%3u] c %u/%u b %u/%u (R %u/%d/%u G %u/%d/%u B %u/%d/%u)\n" 
  58             , eCodes 
- preveCodes
, eCodes
 
  59             , eBits 
- preveBits
, eBits
 
  60             , abs(AbseRtotal 
- preveRtotal
), eRtotal 
, AbseRtotal
 
  61             , abs(AbseGtotal 
- preveGtotal
), eGtotal 
, AbseGtotal
 
  62             , abs(AbseBtotal 
- preveBtotal
), eBtotal 
, AbseBtotal
 
  64         preveRtotal 
= AbseRtotal
; 
  65         preveGtotal 
= AbseGtotal
; 
  66         preveBtotal 
= AbseBtotal
; 
  70     printf("%u total codes\n", 256*256*256); 
  71     printf("total error: %u codes %u bits (R %d/%u G %d/%u B %d/%u)\n" 
  74         , eRtotal 
, AbseRtotal
 
  75         , eGtotal 
, AbseGtotal
 
  76         , eBtotal 
, AbseBtotal
 
  88     float *v 
= (float *)_TIFFmalloc(256 * sizeof (float)); 
  90     for (i 
= 0; i 
< 256; i
++) 
  98     lumaRed 
= setupLuma(LumaRed
); 
  99     lumaGreen 
= setupLuma(LumaGreen
); 
 100     lumaBlue 
= setupLuma(LumaBlue
); 
 104 V2Code(float f
, unsigned long RB
, unsigned long RW
, int CR
) 
 106     unsigned int c 
= (unsigned int)((((f
)*(RW
-RB
)/CR
)+RB
)+.5); 
 107     return (c 
> 255 ? 255 : c
); 
 110 #define Code2V(c, RB, RW, CR)   ((((c)-(int)RB)*(float)CR)/(float)(RW-RB)) 
 112 #define CLAMP(f,min,max) \ 
 113     (int)((f)+.5 < (min) ? (min) : (f)+.5 > (max) ? (max) : (f)+.5) 
 117 check(int R
, int G
, int B
) 
 125     Y 
= lumaRed
[R
] + lumaGreen
[G
] + lumaBlue
[B
]; 
 128     iY 
= V2Code(Y
, refBlackWhite
[0], refBlackWhite
[1], 255); 
 129     iCb 
= V2Code(Cb
, refBlackWhite
[2], refBlackWhite
[3], 127); 
 130     iCr 
= V2Code(Cr
, refBlackWhite
[4], refBlackWhite
[5], 127); 
 131     rCb 
= Code2V(iCb
, refBlackWhite
[2], refBlackWhite
[3], 127); 
 132     rCr 
= Code2V(iCr
, refBlackWhite
[4], refBlackWhite
[5], 127); 
 133     rY 
= Code2V(iY
, refBlackWhite
[0], refBlackWhite
[1], 255); 
 136     rG 
= rY 
- rCb
*D6 
- rCr
*D5
; 
 137     eR 
= R 
- CLAMP(rR
,0,255); 
 138     eG 
= G 
- CLAMP(rG
,0,255); 
 139     eB 
= B 
- CLAMP(rB
,0,255); 
 140     if (abs(eR
) > 1 || abs(eG
) > 1 || abs(eB
) > 1) { 
 141         printf("R %u G %u B %u", R
, G
, B
); 
 142         printf(" Y %g Cb %g Cr %g", Y
, Cb
, Cr
); 
 143         printf(" iY %u iCb %u iCr %u", iY
, iCb
, iCr
); 
 144         printf("\n -> Y %g Cb %g Cr %g", rY
, rCb
, rCr
); 
 145         printf(" R %g (%u) G %g (%u) B %g (%u) E=[%d %d %d])\n" 
 146             , rR
, CLAMP(rR
,0,255) 
 147             , rG
, CLAMP(rG
,0,255) 
 148             , rB
, CLAMP(rB
,0,255) 
 155     AbseRtotal 
+= abs(eR
); 
 156     AbseGtotal 
+= abs(eG
); 
 157     AbseBtotal 
+= abs(eB
); 
 160     eBits 
+= abs(eR
) + abs(eG
) + abs(eB
);