Browse code

libswcale: PIX_FMT_BGR48LE and PIX_FMT_BGR48BE scaler implementation

Peter Ross authored on 2011/03/17 19:07:18
Showing 12 changed files
... ...
@@ -698,6 +698,18 @@ static inline void yuv2nv12XinC(const int16_t *lumFilter, const int16_t **lumSrc
698 698
             dest+=12;\
699 699
         }\
700 700
         break;\
701
+    case PIX_FMT_BGR48BE:\
702
+    case PIX_FMT_BGR48LE:\
703
+        func(uint8_t,0)\
704
+            ((uint8_t*)dest)[ 0] = ((uint8_t*)dest)[ 1] = b[Y1];\
705
+            ((uint8_t*)dest)[ 2] = ((uint8_t*)dest)[ 3] = g[Y1];\
706
+            ((uint8_t*)dest)[ 4] = ((uint8_t*)dest)[ 5] = r[Y1];\
707
+            ((uint8_t*)dest)[ 6] = ((uint8_t*)dest)[ 7] = b[Y2];\
708
+            ((uint8_t*)dest)[ 8] = ((uint8_t*)dest)[ 9] = g[Y2];\
709
+            ((uint8_t*)dest)[10] = ((uint8_t*)dest)[11] = r[Y2];\
710
+            dest+=12;\
711
+        }\
712
+        break;\
701 713
     case PIX_FMT_RGBA:\
702 714
     case PIX_FMT_BGRA:\
703 715
         if (CONFIG_SMALL) {\
... ...
@@ -1035,6 +1047,49 @@ static inline void rgb48ToUV_half(uint8_t *dstU, uint8_t *dstV,
1035 1035
     }
1036 1036
 }
1037 1037
 
1038
+static inline void bgr48ToY(uint8_t *dst, const uint8_t *src, long width,
1039
+                            uint32_t *unused)
1040
+{
1041
+    int i;
1042
+    for (i = 0; i < width; i++) {
1043
+        int b = src[i*6+0];
1044
+        int g = src[i*6+2];
1045
+        int r = src[i*6+4];
1046
+
1047
+        dst[i] = (RY*r + GY*g + BY*b + (33<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
1048
+    }
1049
+}
1050
+
1051
+static inline void bgr48ToUV(uint8_t *dstU, uint8_t *dstV,
1052
+                             const uint8_t *src1, const uint8_t *src2,
1053
+                             long width, uint32_t *unused)
1054
+{
1055
+    int i;
1056
+    for (i = 0; i < width; i++) {
1057
+        int b = src1[6*i + 0];
1058
+        int g = src1[6*i + 2];
1059
+        int r = src1[6*i + 4];
1060
+
1061
+        dstU[i] = (RU*r + GU*g + BU*b + (257<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
1062
+        dstV[i] = (RV*r + GV*g + BV*b + (257<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
1063
+    }
1064
+}
1065
+
1066
+static inline void bgr48ToUV_half(uint8_t *dstU, uint8_t *dstV,
1067
+                                  const uint8_t *src1, const uint8_t *src2,
1068
+                                  long width, uint32_t *unused)
1069
+{
1070
+    int i;
1071
+    for (i = 0; i < width; i++) {
1072
+        int b= src1[12*i + 0] + src1[12*i + 6];
1073
+        int g= src1[12*i + 2] + src1[12*i + 8];
1074
+        int r= src1[12*i + 4] + src1[12*i + 10];
1075
+
1076
+        dstU[i]= (RU*r + GU*g + BU*b + (257<<RGB2YUV_SHIFT)) >> (RGB2YUV_SHIFT+1);
1077
+        dstV[i]= (RV*r + GV*g + BV*b + (257<<RGB2YUV_SHIFT)) >> (RGB2YUV_SHIFT+1);
1078
+    }
1079
+}
1080
+
1038 1081
 #define BGR2Y(type, name, shr, shg, shb, maskr, maskg, maskb, RY, GY, BY, S)\
1039 1082
 static inline void name(uint8_t *dst, const uint8_t *src, long width, uint32_t *unused)\
1040 1083
 {\
... ...
@@ -1788,6 +1843,8 @@ void ff_get_unscaled_swscale(SwsContext *c)
1788 1788
         && srcFormat != PIX_FMT_MONOWHITE && dstFormat != PIX_FMT_MONOWHITE
1789 1789
         && srcFormat != PIX_FMT_RGB48LE   && dstFormat != PIX_FMT_RGB48LE
1790 1790
         && srcFormat != PIX_FMT_RGB48BE   && dstFormat != PIX_FMT_RGB48BE
1791
+        && srcFormat != PIX_FMT_BGR48LE   && dstFormat != PIX_FMT_BGR48LE
1792
+        && srcFormat != PIX_FMT_BGR48BE   && dstFormat != PIX_FMT_BGR48BE
1791 1793
         && (!needsDither || (c->flags&(SWS_FAST_BILINEAR|SWS_POINT))))
1792 1794
         c->swScale= rgbToRgbWrapper;
1793 1795
 
... ...
@@ -30,7 +30,7 @@
30 30
 #include "libavutil/avutil.h"
31 31
 
32 32
 #define LIBSWSCALE_VERSION_MAJOR 0
33
-#define LIBSWSCALE_VERSION_MINOR 12
33
+#define LIBSWSCALE_VERSION_MINOR 13
34 34
 #define LIBSWSCALE_VERSION_MICRO 0
35 35
 
36 36
 #define LIBSWSCALE_VERSION_INT  AV_VERSION_INT(LIBSWSCALE_VERSION_MAJOR, \
... ...
@@ -341,6 +341,8 @@ const char *sws_format_name(enum PixelFormat format);
341 341
 #define is16BPS(x)      (           \
342 342
            (x)==PIX_FMT_GRAY16BE    \
343 343
         || (x)==PIX_FMT_GRAY16LE    \
344
+        || (x)==PIX_FMT_BGR48BE     \
345
+        || (x)==PIX_FMT_BGR48LE     \
344 346
         || (x)==PIX_FMT_RGB48BE     \
345 347
         || (x)==PIX_FMT_RGB48LE     \
346 348
         || (x)==PIX_FMT_YUV420P16LE \
... ...
@@ -405,7 +407,9 @@ const char *sws_format_name(enum PixelFormat format);
405 405
         || (x)==PIX_FMT_MONOWHITE   \
406 406
     )
407 407
 #define isBGRinInt(x)   (           \
408
-           (x)==PIX_FMT_BGR32       \
408
+           (x)==PIX_FMT_BGR48BE     \
409
+        || (x)==PIX_FMT_BGR48LE     \
410
+        || (x)==PIX_FMT_BGR32       \
409 411
         || (x)==PIX_FMT_BGR32_1     \
410 412
         || (x)==PIX_FMT_BGR24       \
411 413
         || (x)==PIX_FMT_BGR565BE    \
... ...
@@ -428,7 +432,9 @@ const char *sws_format_name(enum PixelFormat format);
428 428
         || (x)==PIX_FMT_RGB24       \
429 429
     )
430 430
 #define isBGRinBytes(x) (           \
431
-           (x)==PIX_FMT_BGRA        \
431
+           (x)==PIX_FMT_BGR48BE     \
432
+        || (x)==PIX_FMT_BGR48LE     \
433
+        || (x)==PIX_FMT_BGRA        \
432 434
         || (x)==PIX_FMT_ABGR        \
433 435
         || (x)==PIX_FMT_BGR24       \
434 436
     )
... ...
@@ -2966,6 +2966,8 @@ static void RENAME(sws_init_swScale)(SwsContext *c)
2966 2966
         switch(srcFormat) {
2967 2967
         case PIX_FMT_RGB48BE:
2968 2968
         case PIX_FMT_RGB48LE: c->chrToYV12 = rgb48ToUV_half; break;
2969
+        case PIX_FMT_BGR48BE:
2970
+        case PIX_FMT_BGR48LE: c->chrToYV12 = bgr48ToUV_half; break;
2969 2971
         case PIX_FMT_RGB32  : c->chrToYV12 = bgr32ToUV_half;  break;
2970 2972
         case PIX_FMT_RGB32_1: c->chrToYV12 = bgr321ToUV_half; break;
2971 2973
         case PIX_FMT_BGR24  : c->chrToYV12 = RENAME(bgr24ToUV_half); break;
... ...
@@ -2981,6 +2983,8 @@ static void RENAME(sws_init_swScale)(SwsContext *c)
2981 2981
         switch(srcFormat) {
2982 2982
         case PIX_FMT_RGB48BE:
2983 2983
         case PIX_FMT_RGB48LE: c->chrToYV12 = rgb48ToUV; break;
2984
+        case PIX_FMT_BGR48BE:
2985
+        case PIX_FMT_BGR48LE: c->chrToYV12 = bgr48ToUV; break;
2984 2986
         case PIX_FMT_RGB32  : c->chrToYV12 = bgr32ToUV;  break;
2985 2987
         case PIX_FMT_RGB32_1: c->chrToYV12 = bgr321ToUV; break;
2986 2988
         case PIX_FMT_BGR24  : c->chrToYV12 = RENAME(bgr24ToUV); break;
... ...
@@ -3027,6 +3031,8 @@ static void RENAME(sws_init_swScale)(SwsContext *c)
3027 3027
     case PIX_FMT_BGR32_1: c->lumToYV12 = rgb321ToY; break;
3028 3028
     case PIX_FMT_RGB48BE:
3029 3029
     case PIX_FMT_RGB48LE: c->lumToYV12 = rgb48ToY; break;
3030
+    case PIX_FMT_BGR48BE:
3031
+    case PIX_FMT_BGR48LE: c->lumToYV12 = bgr48ToY; break;
3030 3032
     }
3031 3033
     if (c->alpPixBuf) {
3032 3034
         switch (srcFormat) {
... ...
@@ -3047,6 +3053,7 @@ static void RENAME(sws_init_swScale)(SwsContext *c)
3047 3047
         c->alpSrcOffset = 3;
3048 3048
         break;
3049 3049
     case PIX_FMT_RGB48LE:
3050
+    case PIX_FMT_BGR48LE:
3050 3051
         c->lumSrcOffset = 1;
3051 3052
         c->chrSrcOffset = 1;
3052 3053
         c->alpSrcOffset = 1;
... ...
@@ -73,6 +73,8 @@ const char *swscale_license(void)
73 73
         || (x)==PIX_FMT_RGB48LE     \
74 74
         || (x)==PIX_FMT_RGB32       \
75 75
         || (x)==PIX_FMT_RGB32_1     \
76
+        || (x)==PIX_FMT_BGR48BE     \
77
+        || (x)==PIX_FMT_BGR48LE     \
76 78
         || (x)==PIX_FMT_BGR24       \
77 79
         || (x)==PIX_FMT_BGR565      \
78 80
         || (x)==PIX_FMT_BGR555      \
... ...
@@ -99,6 +99,16 @@ const int *sws_getCoefficients(int colorspace)
99 99
     dst[12*i+ 8] = dst[12*i+ 9] = g[Y]; \
100 100
     dst[12*i+10] = dst[12*i+11] = b[Y];
101 101
 
102
+#define PUTBGR48(dst,src,i)             \
103
+    Y = src[2*i];                       \
104
+    dst[12*i+ 0] = dst[12*i+ 1] = b[Y]; \
105
+    dst[12*i+ 2] = dst[12*i+ 3] = g[Y]; \
106
+    dst[12*i+ 4] = dst[12*i+ 5] = r[Y]; \
107
+    Y = src[2*i+1];                     \
108
+    dst[12*i+ 6] = dst[12*i+ 7] = b[Y]; \
109
+    dst[12*i+ 8] = dst[12*i+ 9] = g[Y]; \
110
+    dst[12*i+10] = dst[12*i+11] = r[Y];
111
+
102 112
 #define YUV2RGBFUNC(func_name, dst_type, alpha) \
103 113
 static int func_name(SwsContext *c, const uint8_t* src[], int srcStride[], int srcSliceY, \
104 114
                      int srcSliceH, uint8_t* dst[], int dstStride[]) \
... ...
@@ -175,6 +185,32 @@ ENDYUV2RGBLINE(48)
175 175
     PUTRGB48(dst_1,py_1,1);
176 176
 ENDYUV2RGBFUNC()
177 177
 
178
+YUV2RGBFUNC(yuv2rgb_c_bgr48, uint8_t, 0)
179
+    LOADCHROMA(0);
180
+    PUTBGR48(dst_1,py_1,0);
181
+    PUTBGR48(dst_2,py_2,0);
182
+
183
+    LOADCHROMA(1);
184
+    PUTBGR48(dst_2,py_2,1);
185
+    PUTBGR48(dst_1,py_1,1);
186
+
187
+    LOADCHROMA(2);
188
+    PUTBGR48(dst_1,py_1,2);
189
+    PUTBGR48(dst_2,py_2,2);
190
+
191
+    LOADCHROMA(3);
192
+    PUTBGR48(dst_2,py_2,3);
193
+    PUTBGR48(dst_1,py_1,3);
194
+ENDYUV2RGBLINE(48)
195
+    LOADCHROMA(0);
196
+    PUTBGR48(dst_1,py_1,0);
197
+    PUTBGR48(dst_2,py_2,0);
198
+
199
+    LOADCHROMA(1);
200
+    PUTBGR48(dst_2,py_2,1);
201
+    PUTBGR48(dst_1,py_1,1);
202
+ENDYUV2RGBFUNC()
203
+
178 204
 YUV2RGBFUNC(yuv2rgb_c_32, uint32_t, 0)
179 205
     LOADCHROMA(0);
180 206
     PUTRGB(dst_1,py_1,0);
... ...
@@ -568,6 +604,8 @@ SwsFunc ff_yuv2rgb_get_func_ptr(SwsContext *c)
568 568
     av_log(c, AV_LOG_WARNING, "No accelerated colorspace conversion found from %s to %s.\n", sws_format_name(c->srcFormat), sws_format_name(c->dstFormat));
569 569
 
570 570
     switch (c->dstFormat) {
571
+    case PIX_FMT_BGR48BE:
572
+    case PIX_FMT_BGR48LE:    return yuv2rgb_c_bgr48;
571 573
     case PIX_FMT_RGB48BE:
572 574
     case PIX_FMT_RGB48LE:    return yuv2rgb_c_48;
573 575
     case PIX_FMT_ARGB:
... ...
@@ -1,6 +1,8 @@
1 1
 abgr                037bf9df6a765520ad6d490066bf4b89
2 2
 argb                c442a8261c2265a07212ef0f72e35f5a
3 3
 bgr24               0d0cb38ab3fa0b2ec0865c14f78b217b
4
+bgr48be             4ba0ff7fc9e011ea264610ad1585bb1f
5
+bgr48le             d022bfdd6a07d5dcc693799322a386b4
4 6
 bgr4_byte           50d23cc82d9dcef2fd12adb81fb9b806
5 7
 bgr555be            49f01b1f1f0c84fd9e776dd34cc3c280
6 8
 bgr565be            257cf78afa35dc31e9696f139c916715
... ...
@@ -1,6 +1,8 @@
1 1
 abgr                037bf9df6a765520ad6d490066bf4b89
2 2
 argb                c442a8261c2265a07212ef0f72e35f5a
3 3
 bgr24               0d0cb38ab3fa0b2ec0865c14f78b217b
4
+bgr48be             4ba0ff7fc9e011ea264610ad1585bb1f
5
+bgr48le             d022bfdd6a07d5dcc693799322a386b4
4 6
 bgr4_byte           50d23cc82d9dcef2fd12adb81fb9b806
5 7
 bgr555le            378d6ac4223651a1adcbf94a3d0d807b
6 8
 bgr565le            1dfdd03995c287e3c754b164bf26a355
... ...
@@ -1,6 +1,8 @@
1 1
 abgr                037bf9df6a765520ad6d490066bf4b89
2 2
 argb                c442a8261c2265a07212ef0f72e35f5a
3 3
 bgr24               0d0cb38ab3fa0b2ec0865c14f78b217b
4
+bgr48be             4ba0ff7fc9e011ea264610ad1585bb1f
5
+bgr48le             d022bfdd6a07d5dcc693799322a386b4
4 6
 bgr4_byte           50d23cc82d9dcef2fd12adb81fb9b806
5 7
 bgr555le            378d6ac4223651a1adcbf94a3d0d807b
6 8
 bgr565le            1dfdd03995c287e3c754b164bf26a355
... ...
@@ -1,6 +1,8 @@
1 1
 abgr                037bf9df6a765520ad6d490066bf4b89
2 2
 argb                c442a8261c2265a07212ef0f72e35f5a
3 3
 bgr24               0d0cb38ab3fa0b2ec0865c14f78b217b
4
+bgr48be             4ba0ff7fc9e011ea264610ad1585bb1f
5
+bgr48le             d022bfdd6a07d5dcc693799322a386b4
4 6
 bgr4_byte           50d23cc82d9dcef2fd12adb81fb9b806
5 7
 bgr555le            378d6ac4223651a1adcbf94a3d0d807b
6 8
 bgr565le            1dfdd03995c287e3c754b164bf26a355
... ...
@@ -1,6 +1,8 @@
1 1
 abgr                d894cb97f6c80eb21bdbe8a4eea62d86
2 2
 argb                54346f2b2eef10919e0f247241df3b24
3 3
 bgr24               570f8d6b51a838aed022ef67535f6bdc
4
+bgr48be             fcc0f2dbf45d325f84f816c74cbeeebe
5
+bgr48le             3f9c2b23eed3b8d196d1c14b38ce50f5
4 6
 bgr4_byte           ee1d35a7baf8e9016891929a2f565c0b
5 7
 bgr555le            36b745067197f9ca8c1731cac51329c9
6 8
 bgr565le            3a514a298c6161a071ddf9963c06509d
... ...
@@ -1,6 +1,8 @@
1 1
 abgr                25e72e9dbd01ab00727c976d577f7be5
2 2
 argb                19869bf1a5ac0b6af4d8bbe2c104533c
3 3
 bgr24               89108a4ba00201f79b75b9305c42352d
4
+bgr48be             ed82382da09b64a8e04728fcf76e6814
5
+bgr48le             0f1f135608c2ff24d26d03e939fc2112
4 6
 bgr4_byte           407fcf564ed764c38e1d748f700ab921
5 7
 bgr555le            bd7b3ec4d684dfad075d89a606cb8b74
6 8
 bgr565le            fdb617533e1e7ff512ea5b6b6233e738