Browse code

swscale: add unscaled packed 16 bit per component endianess conversion

Janne Grunau authored on 2011/12/16 08:44:26
Showing 1 changed files
... ...
@@ -252,6 +252,27 @@ static void gray8aToPacked24(const uint8_t *src, uint8_t *dst, int num_pixels, c
252 252
     }
253 253
 }
254 254
 
255
+static int packed_16bpc_bswap(SwsContext *c, const uint8_t* src[],
256
+                              int srcStride[], int srcSliceY, int srcSliceH,
257
+                              uint8_t* dst[], int dstStride[])
258
+{
259
+    int i, j;
260
+    int srcstr = srcStride[0] >> 1;
261
+    int dststr = dstStride[0] >> 1;
262
+    uint16_t       *dstPtr =       (uint16_t *)dst[0];
263
+    const uint16_t *srcPtr = (const uint16_t *)src[0];
264
+
265
+    for (i = 0; i < srcSliceH; i++) {
266
+        for (j = 0; j < srcstr; j++) {
267
+            dstPtr[j] = av_bswap16(srcPtr[j]);
268
+        }
269
+        srcPtr += srcstr;
270
+        dstPtr += dststr;
271
+    }
272
+
273
+    return srcSliceH;
274
+}
275
+
255 276
 static int palToRgbWrapper(SwsContext *c, const uint8_t* src[], int srcStride[], int srcSliceY,
256 277
                            int srcSliceH, uint8_t* dst[], int dstStride[])
257 278
 {
... ...
@@ -697,6 +718,15 @@ void ff_get_unscaled_swscale(SwsContext *c)
697 697
     if (srcFormat==PIX_FMT_BGR24 && (dstFormat==PIX_FMT_YUV420P || dstFormat==PIX_FMT_YUVA420P) && !(flags & SWS_ACCURATE_RND))
698 698
         c->swScale= bgr24ToYv12Wrapper;
699 699
 
700
+    /* bswap 16 bits per component packed formats */
701
+    if ((srcFormat == PIX_FMT_RGB48LE  && dstFormat == PIX_FMT_RGB48BE)  ||
702
+        (srcFormat == PIX_FMT_RGB48BE  && dstFormat == PIX_FMT_RGB48LE)  ||
703
+        (srcFormat == PIX_FMT_BGR48LE  && dstFormat == PIX_FMT_BGR48BE)  ||
704
+        (srcFormat == PIX_FMT_BGR48BE  && dstFormat == PIX_FMT_BGR48LE)  ||
705
+        (srcFormat == PIX_FMT_GRAY16LE && dstFormat == PIX_FMT_GRAY16BE) ||
706
+        (srcFormat == PIX_FMT_GRAY16BE && dstFormat == PIX_FMT_GRAY16LE))
707
+        c->swScale = packed_16bpc_bswap;
708
+
700 709
     /* RGB/BGR -> RGB/BGR (no dither needed forms) */
701 710
     if (   isAnyRGB(srcFormat)
702 711
         && isAnyRGB(dstFormat)