|
|
|
@@ -176,6 +176,27 @@ static int planarToNv12Wrapper(SwsContext *c, const uint8_t *src[], |
|
|
|
return srcSliceH; |
|
|
|
} |
|
|
|
|
|
|
|
static int nv12ToPlanarWrapper(SwsContext *c, const uint8_t *src[], |
|
|
|
int srcStride[], int srcSliceY, |
|
|
|
int srcSliceH, uint8_t *dstParam[], |
|
|
|
int dstStride[]) |
|
|
|
{ |
|
|
|
uint8_t *dst1 = dstParam[1] + dstStride[1] * srcSliceY / 2; |
|
|
|
uint8_t *dst2 = dstParam[2] + dstStride[2] * srcSliceY / 2; |
|
|
|
|
|
|
|
copyPlane(src[0], srcStride[0], srcSliceY, srcSliceH, c->srcW, |
|
|
|
dstParam[0], dstStride[0]); |
|
|
|
|
|
|
|
if (c->srcFormat == AV_PIX_FMT_NV12) |
|
|
|
deinterleaveBytes(src[1], dst1, dst2,c->srcW / 2, srcSliceH / 2, |
|
|
|
srcStride[1], dstStride[1], dstStride[2]); |
|
|
|
else |
|
|
|
deinterleaveBytes(src[1], dst2, dst1, c->srcW / 2, srcSliceH / 2, |
|
|
|
srcStride[1], dstStride[2], dstStride[1]); |
|
|
|
|
|
|
|
return srcSliceH; |
|
|
|
} |
|
|
|
|
|
|
|
static int planarToYuy2Wrapper(SwsContext *c, const uint8_t *src[], |
|
|
|
int srcStride[], int srcSliceY, int srcSliceH, |
|
|
|
uint8_t *dstParam[], int dstStride[]) |
|
|
|
@@ -1212,6 +1233,11 @@ void ff_get_unscaled_swscale(SwsContext *c) |
|
|
|
(dstFormat == AV_PIX_FMT_NV12 || dstFormat == AV_PIX_FMT_NV21)) { |
|
|
|
c->swscale = planarToNv12Wrapper; |
|
|
|
} |
|
|
|
/* nv12_to_yv12 */ |
|
|
|
if (dstFormat == AV_PIX_FMT_YUV420P && |
|
|
|
(srcFormat == AV_PIX_FMT_NV12 || srcFormat == AV_PIX_FMT_NV21)) { |
|
|
|
c->swscale = nv12ToPlanarWrapper; |
|
|
|
} |
|
|
|
/* yuv2bgr */ |
|
|
|
if ((srcFormat == AV_PIX_FMT_YUV420P || srcFormat == AV_PIX_FMT_YUV422P || |
|
|
|
srcFormat == AV_PIX_FMT_YUVA420P) && isAnyRGB(dstFormat) && |
|
|
|
|