On 2011-12-15 16:18:26 -0800, Ronald S. Bultje wrote:
>
> On Thu, Dec 15, 2011 at 4:14 PM, Janne Grunau <[email protected]>wrote:
>
> > ---
> >  libswscale/swscale_unscaled.c |   26 ++++++++++++++++++++++++++
> >  1 files changed, 26 insertions(+), 0 deletions(-)
> >
> > diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c
> > index 86bc5ac..8de4f75 100644
> > --- a/libswscale/swscale_unscaled.c
> > +++ b/libswscale/swscale_unscaled.c
> > @@ -252,6 +252,25 @@ static void gray8aToPacked24(const uint8_t *src,
> > uint8_t *dst, int num_pixels, c
> >     }
> >  }
> >
> > +static int rgb48_bswap(SwsContext *c, const uint8_t* src[], int
> > srcStride[],
> > +                       int srcSliceY, int srcSliceH,
> > +                       uint8_t* dst[], int dstStride[])
> > +{
> > +    int i, j;
> > +    uint16_t       *dstPtr =       (uint16_t *)dst[0];
> > +    const uint16_t *srcPtr = (const uint16_t *)src[0];
> > +
> > +    for (i = 0; i < srcSliceH; i++) {
> > +        for (j = 0; j < srcStride[0]>>1; j++) {
> > +            dstPtr[j] = av_bswap16(srcPtr[j]);
> > +        }
> > +        srcPtr += srcStride[0]>>1;
> > +        dstPtr += dstStride[0]>>1;
> > +    }
> >
>
> Don't you want to do int srcstr = srcStride[0] >> 1, dststr = dstStride[0]
> >> 1; outside the loop?

done.

the same conversion works for GRAY16{BE,LE} too, so added that.

Janne
---8<---
---
 libswscale/swscale_unscaled.c |   30 ++++++++++++++++++++++++++++++
 1 files changed, 30 insertions(+), 0 deletions(-)

diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c
index 86bc5ac..ec8f1bb 100644
--- a/libswscale/swscale_unscaled.c
+++ b/libswscale/swscale_unscaled.c
@@ -252,6 +252,27 @@ static void gray8aToPacked24(const uint8_t *src, uint8_t 
*dst, int num_pixels, c
     }
 }
 
+static int packed_16bpc_bswap(SwsContext *c, const uint8_t* src[],
+                              int srcStride[], int srcSliceY, int srcSliceH,
+                              uint8_t* dst[], int dstStride[])
+{
+    int i, j;
+    int srcstr = srcStride[0] >> 1;
+    int dststr = dstStride[0] >> 1;
+    uint16_t       *dstPtr =       (uint16_t *)dst[0];
+    const uint16_t *srcPtr = (const uint16_t *)src[0];
+
+    for (i = 0; i < srcSliceH; i++) {
+        for (j = 0; j < srcstr; j++) {
+            dstPtr[j] = av_bswap16(srcPtr[j]);
+        }
+        srcPtr += srcstr;
+        dstPtr += dststr;
+    }
+
+    return srcSliceH;
+}
+
 static int palToRgbWrapper(SwsContext *c, const uint8_t* src[], int 
srcStride[], int srcSliceY,
                            int srcSliceH, uint8_t* dst[], int dstStride[])
 {
@@ -697,6 +718,15 @@ void ff_get_unscaled_swscale(SwsContext *c)
     if (srcFormat==PIX_FMT_BGR24 && (dstFormat==PIX_FMT_YUV420P || 
dstFormat==PIX_FMT_YUVA420P) && !(flags & SWS_ACCURATE_RND))
         c->swScale= bgr24ToYv12Wrapper;
 
+    /* bswap 16 bits per component packed formats */
+    if ((srcFormat == PIX_FMT_RGB48LE  && dstFormat == PIX_FMT_RGB48BE)  ||
+        (srcFormat == PIX_FMT_RGB48BE  && dstFormat == PIX_FMT_RGB48LE)  ||
+        (srcFormat == PIX_FMT_BGR48LE  && dstFormat == PIX_FMT_BGR48BE)  ||
+        (srcFormat == PIX_FMT_BGR48BE  && dstFormat == PIX_FMT_BGR48LE)  ||
+        (srcFormat == PIX_FMT_GRAY16LE && dstFormat == PIX_FMT_GRAY16BE) ||
+        (srcFormat == PIX_FMT_GRAY16BE && dstFormat == PIX_FMT_GRAY16LE))
+        c->swScale = packed_16bpc_bswap;
+
     /* RGB/BGR -> RGB/BGR (no dither needed forms) */
     if (   isAnyRGB(srcFormat)
         && isAnyRGB(dstFormat)
-- 
1.7.8

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to