Commit 9047491f authored by Michael Niedermayer's avatar Michael Niedermayer Committed by Anton Khirnov

swscale: add nv12/nv21->yuv420 converter

Signed-off-by: 's avatarAnton Khirnov <anton@khirnov.net>
parent eb01a25f
......@@ -82,6 +82,9 @@ void (*planar2x)(const uint8_t *src, uint8_t *dst, int width, int height,
void (*interleaveBytes)(const uint8_t *src1, const uint8_t *src2, uint8_t *dst,
int width, int height, int src1Stride,
int src2Stride, int dstStride);
void (*deinterleaveBytes)(const uint8_t *src, uint8_t *dst1, uint8_t *dst2,
int width, int height, int srcStride,
int dst1Stride, int dst2Stride);
void (*vu9_to_vu12)(const uint8_t *src1, const uint8_t *src2,
uint8_t *dst1, uint8_t *dst2,
int width, int height,
......
......@@ -129,6 +129,10 @@ extern void (*interleaveBytes)(const uint8_t *src1, const uint8_t *src2, uint8_t
int width, int height, int src1Stride,
int src2Stride, int dstStride);
extern void (*deinterleaveBytes)(const uint8_t *src, uint8_t *dst1, uint8_t *dst2,
int width, int height, int srcStride,
int dst1Stride, int dst2Stride);
extern void (*vu9_to_vu12)(const uint8_t *src1, const uint8_t *src2,
uint8_t *dst1, uint8_t *dst2,
int width, int height,
......
......@@ -708,6 +708,24 @@ static void interleaveBytes_c(const uint8_t *src1, const uint8_t *src2,
}
}
static void deinterleaveBytes_c(const uint8_t *src, uint8_t *dst1, uint8_t *dst2,
int width, int height, int srcStride,
int dst1Stride, int dst2Stride)
{
int h;
for (h = 0; h < height; h++) {
int w;
for (w = 0; w < width; w++) {
dst1[w] = src[2 * w + 0];
dst2[w] = src[2 * w + 1];
}
src += srcStride;
dst1 += dst1Stride;
dst2 += dst2Stride;
}
}
static inline void vu9_to_vu12_c(const uint8_t *src1, const uint8_t *src2,
uint8_t *dst1, uint8_t *dst2,
int width, int height,
......@@ -937,6 +955,7 @@ static av_cold void rgb2rgb_init_c(void)
planar2x = planar2x_c;
rgb24toyv12 = rgb24toyv12_c;
interleaveBytes = interleaveBytes_c;
deinterleaveBytes = deinterleaveBytes_c;
vu9_to_vu12 = vu9_to_vu12_c;
yvu9_to_yuy2 = yvu9_to_yuy2_c;
......
......@@ -155,6 +155,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[])
......@@ -981,6 +1002,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) &&
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment