summaryrefslogtreecommitdiff
path: root/libswscale/swscale_unscaled.c
diff options
context:
space:
mode:
authorMark Reid <mindmark@gmail.com>2020-05-03 16:10:04 -0700
committerMichael Niedermayer <michael@niedermayer.cc>2020-05-05 20:06:58 +0200
commitb4967fc71c63eae8cd96f9c46cd3e1fbd705bbf9 (patch)
tree3596a2ed253605b9f3f29a7b66dcc755a0c7b482 /libswscale/swscale_unscaled.c
parentba5d0515a6dc0e34d578e5ef94b6ca5f17fc979d (diff)
libswscale: add output support for AV_PIX_FMT_GBRAPF32
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libswscale/swscale_unscaled.c')
-rw-r--r--libswscale/swscale_unscaled.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c
index 67440cdb4a..5fb572b51a 100644
--- a/libswscale/swscale_unscaled.c
+++ b/libswscale/swscale_unscaled.c
@@ -491,6 +491,34 @@ static int bswap_16bpc(SwsContext *c, const uint8_t *src[],
return srcSliceH;
}
+static int bswap_32bpc(SwsContext *c, const uint8_t *src[],
+ int srcStride[], int srcSliceY, int srcSliceH,
+ uint8_t *dst[], int dstStride[])
+{
+ int i, j, p;
+
+ for (p = 0; p < 4; p++) {
+ int srcstr = srcStride[p] / 4;
+ int dststr = dstStride[p] / 4;
+ uint32_t *dstPtr = (uint32_t *) dst[p];
+ const uint32_t *srcPtr = (const uint32_t *) src[p];
+ int min_stride = FFMIN(FFABS(srcstr), FFABS(dststr));
+ if(!dstPtr || !srcPtr)
+ continue;
+ dstPtr += (srcSliceY >> c->chrDstVSubSample) * dststr;
+ for (i = 0; i < (srcSliceH >> c->chrDstVSubSample); i++) {
+ for (j = 0; j < min_stride; j++) {
+ dstPtr[j] = av_bswap32(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[])
@@ -2077,6 +2105,11 @@ void ff_get_unscaled_swscale(SwsContext *c)
IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV444P16))
c->swscale = bswap_16bpc;
+ /* bswap 32 bits per pixel/component formats */
+ if (IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GBRPF32) ||
+ IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GBRAPF32))
+ c->swscale = bswap_32bpc;
+
if (usePal(srcFormat) && isByteRGB(dstFormat))
c->swscale = palToRgbWrapper;