mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-11-21 10:55:51 +02:00
swscale: add nv12/nv21->yuv420 converter
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
722fb81dc5
commit
ef627bf9ec
@ -83,6 +83,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,
|
void (*interleaveBytes)(const uint8_t *src1, const uint8_t *src2, uint8_t *dst,
|
||||||
int width, int height, int src1Stride,
|
int width, int height, int src1Stride,
|
||||||
int src2Stride, int dstStride);
|
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,
|
void (*vu9_to_vu12)(const uint8_t *src1, const uint8_t *src2,
|
||||||
uint8_t *dst1, uint8_t *dst2,
|
uint8_t *dst1, uint8_t *dst2,
|
||||||
int width, int height,
|
int width, int height,
|
||||||
|
@ -135,6 +135,10 @@ extern void (*interleaveBytes)(const uint8_t *src1, const uint8_t *src2, uint8_t
|
|||||||
int width, int height, int src1Stride,
|
int width, int height, int src1Stride,
|
||||||
int src2Stride, int dstStride);
|
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,
|
extern void (*vu9_to_vu12)(const uint8_t *src1, const uint8_t *src2,
|
||||||
uint8_t *dst1, uint8_t *dst2,
|
uint8_t *dst1, uint8_t *dst2,
|
||||||
int width, int height,
|
int width, int height,
|
||||||
|
@ -693,6 +693,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,
|
static inline void vu9_to_vu12_c(const uint8_t *src1, const uint8_t *src2,
|
||||||
uint8_t *dst1, uint8_t *dst2,
|
uint8_t *dst1, uint8_t *dst2,
|
||||||
int width, int height,
|
int width, int height,
|
||||||
@ -922,6 +940,7 @@ static av_cold void rgb2rgb_init_c(void)
|
|||||||
planar2x = planar2x_c;
|
planar2x = planar2x_c;
|
||||||
ff_rgb24toyv12 = ff_rgb24toyv12_c;
|
ff_rgb24toyv12 = ff_rgb24toyv12_c;
|
||||||
interleaveBytes = interleaveBytes_c;
|
interleaveBytes = interleaveBytes_c;
|
||||||
|
deinterleaveBytes = deinterleaveBytes_c;
|
||||||
vu9_to_vu12 = vu9_to_vu12_c;
|
vu9_to_vu12 = vu9_to_vu12_c;
|
||||||
yvu9_to_yuy2 = yvu9_to_yuy2_c;
|
yvu9_to_yuy2 = yvu9_to_yuy2_c;
|
||||||
|
|
||||||
|
@ -176,6 +176,27 @@ static int planarToNv12Wrapper(SwsContext *c, const uint8_t *src[],
|
|||||||
return srcSliceH;
|
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[],
|
static int planarToYuy2Wrapper(SwsContext *c, const uint8_t *src[],
|
||||||
int srcStride[], int srcSliceY, int srcSliceH,
|
int srcStride[], int srcSliceY, int srcSliceH,
|
||||||
uint8_t *dstParam[], int dstStride[])
|
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)) {
|
(dstFormat == AV_PIX_FMT_NV12 || dstFormat == AV_PIX_FMT_NV21)) {
|
||||||
c->swscale = planarToNv12Wrapper;
|
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 */
|
/* yuv2bgr */
|
||||||
if ((srcFormat == AV_PIX_FMT_YUV420P || srcFormat == AV_PIX_FMT_YUV422P ||
|
if ((srcFormat == AV_PIX_FMT_YUV420P || srcFormat == AV_PIX_FMT_YUV422P ||
|
||||||
srcFormat == AV_PIX_FMT_YUVA420P) && isAnyRGB(dstFormat) &&
|
srcFormat == AV_PIX_FMT_YUVA420P) && isAnyRGB(dstFormat) &&
|
||||||
|
Loading…
Reference in New Issue
Block a user