[FFmpeg-devel] [PATCH v3] swscale: Add support for unscaled 8-bit Packed RGB -> Planar RGB
Michael Niedermayer
michaelni at gmx.at
Sun Feb 24 03:24:59 CET 2013
On Sat, Feb 23, 2013 at 02:57:07PM -0500, Derek Buitenhuis wrote:
> Signed-off-by: Derek Buitenhuis <derek.buitenhuis at gmail.com>
> ---
> libswscale/swscale_unscaled.c | 85 +++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 85 insertions(+)
>
> diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c
> index 20c76d6..5fec38d 100644
> --- a/libswscale/swscale_unscaled.c
> +++ b/libswscale/swscale_unscaled.c
> @@ -488,6 +488,87 @@ static int planarRgbToRgbWrapper(SwsContext *c, const uint8_t *src[],
> return srcSliceH;
> }
>
> +static void packedtogbr24p(const uint8_t *src, int srcStride,
> + uint8_t *dst[], int dstStride[], int srcSliceH,
> + int alpha_first, int inc_size, int width)
> +{
> + uint8_t *dest[3];
> + int x, h;
> +
> + dest[0] = dst[0];
> + dest[1] = dst[1];
> + dest[2] = dst[2];
unneeded
or you can drop all the 102/201 stuff and do a
dest[0] = dst[ 2*isRGB];
dest[1] = dst[1];
dest[2] = dst[2-2*isRGB];
inc_size = 3 + hasalpha
4 lines instead of 30
> +
> + if (alpha_first)
> + src++;
> +
> + for (h = 0; h < srcSliceH; h++) {
> + for (x = 0; x < width; x++) {
> + dest[0][x] = src[0];
> + dest[1][x] = src[1];
> + dest[2][x] = src[2];
> +
> + src += inc_size;
> + }
> + src += srcStride - width * inc_size;
> + dest[0] += dstStride[0];
> + dest[1] += dstStride[1];
> + dest[2] += dstStride[2];
> + }
> +}
> +
> +static int rgbToPlanarRgbWrapper(SwsContext *c, const uint8_t *src[],
> + int srcStride[], int srcSliceY, int srcSliceH,
> + uint8_t *dst[], int dstStride[])
> +{
> + int alpha_first = 0;
> + int stride102[] = { dstStride[1], dstStride[0], dstStride[2] };
> + int stride201[] = { dstStride[2], dstStride[0], dstStride[1] };
> + uint8_t *dst102[] = { dst[1] + srcSliceY * dstStride[1],
> + dst[0] + srcSliceY * dstStride[0],
> + dst[2] + srcSliceY * dstStride[2] };
> + uint8_t *dst201[] = { dst[2] + srcSliceY * dstStride[2],
> + dst[0] + srcSliceY * dstStride[0],
> + dst[1] + srcSliceY * dstStride[1] };
> +
> + if (c->dstFormat != PIX_FMT_GBRP) {
> + av_log(c, AV_LOG_ERROR, "unsupported planar RGB conversion %s -> %s\n",
> + av_get_pix_fmt_name(c->srcFormat),
> + av_get_pix_fmt_name(c->dstFormat));
> + return srcSliceH;
> + }
this can only happen if the code is buggy thus should be not here or
a av_assert
> +
> + switch (c->srcFormat) {
> + case PIX_FMT_RGB24:
> + packedtogbr24p((const uint8_t *) src[0], srcStride[0], dst201,
> + stride201, srcSliceH, alpha_first, 3, c->srcW);
> + break;
> + case PIX_FMT_BGR24:
> + packedtogbr24p((const uint8_t *) src[0], srcStride[0], dst102,
> + stride102, srcSliceH, alpha_first, 3, c->srcW);
> + break;
> + case PIX_FMT_ARGB:
> + alpha_first = 1;
> + case PIX_FMT_RGBA:
> + packedtogbr24p((const uint8_t *) src[0], srcStride[0], dst201,
> + stride201, srcSliceH, alpha_first, 4, c->srcW);
> + break;
> + case PIX_FMT_ABGR:
> + alpha_first = 1;
> + case PIX_FMT_BGRA:
> + packedtogbr24p((const uint8_t *) src[0], srcStride[0], dst102,
> + stride102, srcSliceH, alpha_first, 4, c->srcW);
> + break;
> + default:
> + av_log(c, AV_LOG_ERROR,
> + "unsupported planar RGB conversion %s -> %s\n",
> + av_get_pix_fmt_name(c->srcFormat),
> + av_get_pix_fmt_name(c->dstFormat));
> + }
similar issue, unneeded or av_assert
IMHO av_assert would be better from these 2 options
> +
> + return srcSliceH;
> +}
> +
> #define isRGBA32(x) ( \
> (x) == AV_PIX_FMT_ARGB \
> || (x) == AV_PIX_FMT_RGBA \
> @@ -971,6 +1052,10 @@ void ff_get_unscaled_swscale(SwsContext *c)
> if (srcFormat == AV_PIX_FMT_GBRP && isPlanar(srcFormat) && isByteRGB(dstFormat))
> c->swScale = planarRgbToRgbWrapper;
>
> + if (av_pix_fmt_descriptors[srcFormat].comp[0].depth_minus1 == 7 &&
> + isPackedRGB(srcFormat) && dstFormat == AV_PIX_FMT_GBRP)
> + c->swScale = rgbToPlanarRgbWrapper;
this would break some msvc system again probably
you need av_pix_fmt_desc_get()
Thanks
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
It is what and why we do it that matters, not just one of them.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20130224/5f876c0a/attachment.asc>
More information about the ffmpeg-devel
mailing list