Browse code

sws: Update rgb24toyv12_c() to user supplied rgb2yuv tables

As the function arguments change, we also change the function name
to ensure that anyone using this (non public) function doesnt end
with hard to debug crashes. The new name also has a proper prefix.

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>

Michael Niedermayer authored on 2013/04/15 10:01:04
Showing 5 changed files
... ...
@@ -73,10 +73,11 @@ void (*yuy2toyv12)(const uint8_t *src, uint8_t *ydst,
73 73
                    uint8_t *udst, uint8_t *vdst,
74 74
                    int width, int height,
75 75
                    int lumStride, int chromStride, int srcStride);
76
-void (*rgb24toyv12)(const uint8_t *src, uint8_t *ydst,
77
-                    uint8_t *udst, uint8_t *vdst,
78
-                    int width, int height,
79
-                    int lumStride, int chromStride, int srcStride);
76
+void (*ff_rgb24toyv12)(const uint8_t *src, uint8_t *ydst,
77
+                       uint8_t *udst, uint8_t *vdst,
78
+                       int width, int height,
79
+                       int lumStride, int chromStride, int srcStride,
80
+                       int32_t *rgb2yuv);
80 81
 void (*planar2x)(const uint8_t *src, uint8_t *dst, int width, int height,
81 82
                  int srcStride, int dstStride);
82 83
 void (*interleaveBytes)(const uint8_t *src1, const uint8_t *src2, uint8_t *dst,
... ...
@@ -76,9 +76,9 @@ void shuffle_bytes_1230(const uint8_t *src, uint8_t *dst, int src_size);
76 76
 void shuffle_bytes_3012(const uint8_t *src, uint8_t *dst, int src_size);
77 77
 void shuffle_bytes_3210(const uint8_t *src, uint8_t *dst, int src_size);
78 78
 
79
-void rgb24toyv12_c(const uint8_t *src, uint8_t *ydst, uint8_t *udst,
80
-                   uint8_t *vdst, int width, int height, int lumStride,
81
-                   int chromStride, int srcStride);
79
+void ff_rgb24toyv12_c(const uint8_t *src, uint8_t *ydst, uint8_t *udst,
80
+                      uint8_t *vdst, int width, int height, int lumStride,
81
+                      int chromStride, int srcStride, int32_t *rgb2yuv);
82 82
 
83 83
 /**
84 84
  * Height should be a multiple of 2 and width should be a multiple of 16.
... ...
@@ -124,9 +124,10 @@ extern void (*yuv422ptouyvy)(const uint8_t *ysrc, const uint8_t *usrc, const uin
124 124
  * Chrominance data is only taken from every second line, others are ignored.
125 125
  * FIXME: Write high quality version.
126 126
  */
127
-extern void (*rgb24toyv12)(const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
128
-                           int width, int height,
129
-                           int lumStride, int chromStride, int srcStride);
127
+extern void (*ff_rgb24toyv12)(const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
128
+                              int width, int height,
129
+                              int lumStride, int chromStride, int srcStride,
130
+                              int32_t *rgb2yuv);
130 131
 extern void (*planar2x)(const uint8_t *src, uint8_t *dst, int width, int height,
131 132
                         int srcStride, int dstStride);
132 133
 
... ...
@@ -612,10 +612,13 @@ static inline void uyvytoyv12_c(const uint8_t *src, uint8_t *ydst,
612 612
  * others are ignored in the C version.
613 613
  * FIXME: Write HQ version.
614 614
  */
615
-void rgb24toyv12_c(const uint8_t *src, uint8_t *ydst, uint8_t *udst,
615
+void ff_rgb24toyv12_c(const uint8_t *src, uint8_t *ydst, uint8_t *udst,
616 616
                    uint8_t *vdst, int width, int height, int lumStride,
617
-                   int chromStride, int srcStride)
617
+                   int chromStride, int srcStride, int32_t *rgb2yuv)
618 618
 {
619
+    int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
620
+    int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
621
+    int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
619 622
     int y;
620 623
     const int chromWidth = width >> 1;
621 624
 
... ...
@@ -626,9 +629,9 @@ void rgb24toyv12_c(const uint8_t *src, uint8_t *ydst, uint8_t *udst,
626 626
             unsigned int g = src[6 * i + 1];
627 627
             unsigned int r = src[6 * i + 2];
628 628
 
629
-            unsigned int Y = ((RY * r + GY * g + BY * b) >> RGB2YUV_SHIFT) +  16;
630
-            unsigned int V = ((RV * r + GV * g + BV * b) >> RGB2YUV_SHIFT) + 128;
631
-            unsigned int U = ((RU * r + GU * g + BU * b) >> RGB2YUV_SHIFT) + 128;
629
+            unsigned int Y = ((ry * r + gy * g + by * b) >> RGB2YUV_SHIFT) +  16;
630
+            unsigned int V = ((rv * r + gv * g + bv * b) >> RGB2YUV_SHIFT) + 128;
631
+            unsigned int U = ((ru * r + gu * g + bu * b) >> RGB2YUV_SHIFT) + 128;
632 632
 
633 633
             udst[i]     = U;
634 634
             vdst[i]     = V;
... ...
@@ -638,7 +641,7 @@ void rgb24toyv12_c(const uint8_t *src, uint8_t *ydst, uint8_t *udst,
638 638
             g = src[6 * i + 4];
639 639
             r = src[6 * i + 5];
640 640
 
641
-            Y = ((RY * r + GY * g + BY * b) >> RGB2YUV_SHIFT) + 16;
641
+            Y = ((ry * r + gy * g + by * b) >> RGB2YUV_SHIFT) + 16;
642 642
             ydst[2 * i + 1] = Y;
643 643
         }
644 644
         ydst += lumStride;
... ...
@@ -652,7 +655,7 @@ void rgb24toyv12_c(const uint8_t *src, uint8_t *ydst, uint8_t *udst,
652 652
             unsigned int g = src[6 * i + 1];
653 653
             unsigned int r = src[6 * i + 2];
654 654
 
655
-            unsigned int Y = ((RY * r + GY * g + BY * b) >> RGB2YUV_SHIFT) + 16;
655
+            unsigned int Y = ((ry * r + gy * g + by * b) >> RGB2YUV_SHIFT) + 16;
656 656
 
657 657
             ydst[2 * i] = Y;
658 658
 
... ...
@@ -660,7 +663,7 @@ void rgb24toyv12_c(const uint8_t *src, uint8_t *ydst, uint8_t *udst,
660 660
             g = src[6 * i + 4];
661 661
             r = src[6 * i + 5];
662 662
 
663
-            Y = ((RY * r + GY * g + BY * b) >> RGB2YUV_SHIFT) + 16;
663
+            Y = ((ry * r + gy * g + by * b) >> RGB2YUV_SHIFT) + 16;
664 664
             ydst[2 * i + 1] = Y;
665 665
         }
666 666
         udst += chromStride;
... ...
@@ -915,7 +918,7 @@ static inline void rgb2rgb_init_c(void)
915 915
     yuv422ptouyvy      = yuv422ptouyvy_c;
916 916
     yuy2toyv12         = yuy2toyv12_c;
917 917
     planar2x           = planar2x_c;
918
-    rgb24toyv12        = rgb24toyv12_c;
918
+    ff_rgb24toyv12     = ff_rgb24toyv12_c;
919 919
     interleaveBytes    = interleaveBytes_c;
920 920
     vu9_to_vu12        = vu9_to_vu12_c;
921 921
     yvu9_to_yuy2       = yvu9_to_yuy2_c;
... ...
@@ -746,13 +746,14 @@ static int bgr24ToYv12Wrapper(SwsContext *c, const uint8_t *src[],
746 746
                               int srcStride[], int srcSliceY, int srcSliceH,
747 747
                               uint8_t *dst[], int dstStride[])
748 748
 {
749
-    rgb24toyv12(
749
+    ff_rgb24toyv12(
750 750
         src[0],
751 751
         dst[0] +  srcSliceY       * dstStride[0],
752 752
         dst[1] + (srcSliceY >> 1) * dstStride[1],
753 753
         dst[2] + (srcSliceY >> 1) * dstStride[2],
754 754
         c->srcW, srcSliceH,
755
-        dstStride[0], dstStride[1], srcStride[0]);
755
+        dstStride[0], dstStride[1], srcStride[0],
756
+        c->input_rgb2yuv_table);
756 757
     if (dst[3])
757 758
         fillPlane(dst[3], dstStride[3], c->srcW, srcSliceH, srcSliceY, 255);
758 759
     return srcSliceH;
... ...
@@ -1612,7 +1612,8 @@ static inline void RENAME(uyvytoyv12)(const uint8_t *src, uint8_t *ydst, uint8_t
1612 1612
  */
1613 1613
 static inline void RENAME(rgb24toyv12)(const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
1614 1614
                                        int width, int height,
1615
-                                       int lumStride, int chromStride, int srcStride)
1615
+                                       int lumStride, int chromStride, int srcStride,
1616
+                                       int32_t *rgb2yuv)
1616 1617
 {
1617 1618
     int y;
1618 1619
     const x86_reg chromWidth= width>>1;
... ...
@@ -1850,7 +1851,7 @@ static inline void RENAME(rgb24toyv12)(const uint8_t *src, uint8_t *ydst, uint8_
1850 1850
                      SFENCE"     \n\t"
1851 1851
                      :::"memory");
1852 1852
 
1853
-     rgb24toyv12_c(src, ydst, udst, vdst, width, height-y, lumStride, chromStride, srcStride);
1853
+     ff_rgb24toyv12_c(src, ydst, udst, vdst, width, height-y, lumStride, chromStride, srcStride, rgb2yuv);
1854 1854
 }
1855 1855
 #endif /* !COMPILE_TEMPLATE_SSE2 */
1856 1856
 
... ...
@@ -2486,7 +2487,7 @@ static inline void RENAME(rgb2rgb_init)(void)
2486 2486
 #if COMPILE_TEMPLATE_MMXEXT || COMPILE_TEMPLATE_AMD3DNOW
2487 2487
     planar2x           = RENAME(planar2x);
2488 2488
 #endif /* COMPILE_TEMPLATE_MMXEXT || COMPILE_TEMPLATE_AMD3DNOW */
2489
-    rgb24toyv12        = RENAME(rgb24toyv12);
2489
+    ff_rgb24toyv12     = RENAME(rgb24toyv12);
2490 2490
 
2491 2491
     yuyvtoyuv420       = RENAME(yuyvtoyuv420);
2492 2492
     uyvytoyuv420       = RENAME(uyvytoyuv420);