On 2012-01-12 12:03:14 -0800, Ronald S. Bultje wrote:
> From: "Ronald S. Bultje" <[email protected]>
>
> Fixes problems in swscale-test where it gives a 3-member array to a
> function expecting a 4-member array. Secondly, fixes problems where
> rgbToRgbWrapper() is called even though it doesn't support this
> particular conversion (e.g. converting from RGB444 to anything).
> Thirdly, fixes issues where rgbToRgbWrapper() is called for non-native
> endiannness conversions (e.g. RGB555BE on a LE system). Fourthly,
> fixes crashes when converting from e.g. monowhite to monowhite, which
> calls planarCopyWrapper() and overwrites/reads because a n_bytes !=
> n_pixels.
> ---
> libswscale/swscale-test.c | 4 +-
> libswscale/swscale_unscaled.c | 47 +++++++++++++++++++++++-----------------
> 2 files changed, 29 insertions(+), 22 deletions(-)
>
> diff --git a/libswscale/swscale-test.c b/libswscale/swscale-test.c
> index 7ea01a6..3497dff 100644
> --- a/libswscale/swscale-test.c
> +++ b/libswscale/swscale-test.c
> @@ -337,8 +337,8 @@ int main(int argc, char **argv)
> enum PixelFormat srcFormat = PIX_FMT_NONE;
> enum PixelFormat dstFormat = PIX_FMT_NONE;
> uint8_t *rgb_data = av_malloc(W * H * 4);
> - uint8_t *rgb_src[3] = { rgb_data, NULL, NULL };
> - int rgb_stride[3] = { 4 * W, 0, 0 };
> + uint8_t *rgb_src[4] = { rgb_data, NULL, NULL, NULL };
> + int rgb_stride[4] = { 4 * W, 0, 0, 0 };
> uint8_t *data = av_malloc(4 * W * H);
> uint8_t *src[4] = { data, data + W * H, data + W * H * 2, data + W *
> H * 3 };
> int stride[4] = { W, W, W, W };
care to split this from the rest. ok
> diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c
> index a1b7199..de9e77d 100644
> --- a/libswscale/swscale_unscaled.c
> +++ b/libswscale/swscale_unscaled.c
> @@ -352,17 +352,20 @@ static int palToRgbWrapper(SwsContext *c, const uint8_t
> *src[], int srcStride[],
> )
>
> /* {RGB,BGR}{15,16,24,32,32_1} -> {RGB,BGR}{15,16,24,32} */
> -static int rgbToRgbWrapper(SwsContext *c, const uint8_t *src[], int
> srcStride[],
> - int srcSliceY, int srcSliceH, uint8_t *dst[],
> - int dstStride[])
> +typedef void (* rgbConvFn) (const uint8_t *, uint8_t *, int);
> +static rgbConvFn findRgbConvFn(SwsContext *c)
> {
> const enum PixelFormat srcFormat = c->srcFormat;
> const enum PixelFormat dstFormat = c->dstFormat;
> - const int srcBpp = (c->srcFormatBpp + 7) >> 3;
> - const int dstBpp = (c->dstFormatBpp + 7) >> 3;
> const int srcId = c->srcFormatBpp;
> const int dstId = c->dstFormatBpp;
> - void (*conv)(const uint8_t *src, uint8_t *dst, int src_size) = NULL;
> + rgbConvFn conv = NULL;
> +
> +#define IS_NNE(bpp, fmt) \
This macro needs either a comment or a different name. even NOT_NE
would be an improvement
> + (((bpp + 7) >> 3) == 2 && \
> + (!(av_pix_fmt_descriptors[fmt].flags & PIX_FMT_BE) != !HAVE_BIGENDIAN))
why the double negative? HAVE_BIGENDIAN is guaranteed 0 or 1
and please add an empty line after the macro
> + if (IS_NNE(srcId, srcFormat) || IS_NNE(dstId, dstFormat))
> + return NULL;
>
> #define CONV_IS(src, dst) (srcFormat == PIX_FMT_##src && dstFormat ==
> PIX_FMT_##dst)
>
> @@ -419,6 +422,21 @@ static int rgbToRgbWrapper(SwsContext *c, const uint8_t
> *src[], int srcStride[],
> }
> }
>
> + return conv;
> +}
> +
> +/* {RGB,BGR}{15,16,24,32,32_1} -> {RGB,BGR}{15,16,24,32} */
> +static int rgbToRgbWrapper(SwsContext *c, const uint8_t *src[], int
> srcStride[],
> + int srcSliceY, int srcSliceH, uint8_t *dst[],
> + int dstStride[])
> +
> +{
> + const enum PixelFormat srcFormat = c->srcFormat;
> + const enum PixelFormat dstFormat = c->dstFormat;
> + const int srcBpp = (c->srcFormatBpp + 7) >> 3;
> + const int dstBpp = (c->dstFormatBpp + 7) >> 3;
> + rgbConvFn conv = findRgbConvFn(c);
> +
> if (!conv) {
> av_log(c, AV_LOG_ERROR, "internal error %s -> %s converter\n",
> sws_format_name(srcFormat), sws_format_name(dstFormat));
> @@ -716,6 +734,8 @@ static int planarCopyWrapper(SwsContext *c, const uint8_t
> *src[],
> } else {
> if (is16BPS(c->srcFormat) && is16BPS(c->dstFormat))
> length *= 2;
> + else if
> (!av_pix_fmt_descriptors[c->srcFormat].comp[0].depth_minus1)
> + length >>= 3; // monowhite/black
> for (i = 0; i < height; i++) {
> memcpy(dstPtr, srcPtr, length);
> srcPtr += srcStride[plane];
> @@ -770,20 +790,7 @@ void ff_get_unscaled_swscale(SwsContext *c)
> c->swScale = bgr24ToYv12Wrapper;
>
> /* RGB/BGR -> RGB/BGR (no dither needed forms) */
> - if ( isAnyRGB(srcFormat)
> - && isAnyRGB(dstFormat)
> - && srcFormat != PIX_FMT_BGR8 && dstFormat != PIX_FMT_BGR8
> - && srcFormat != PIX_FMT_RGB8 && dstFormat != PIX_FMT_RGB8
> - && srcFormat != PIX_FMT_BGR4 && dstFormat != PIX_FMT_BGR4
> - && srcFormat != PIX_FMT_RGB4 && dstFormat != PIX_FMT_RGB4
> - && srcFormat != PIX_FMT_BGR4_BYTE && dstFormat != PIX_FMT_BGR4_BYTE
> - && srcFormat != PIX_FMT_RGB4_BYTE && dstFormat != PIX_FMT_RGB4_BYTE
> - && srcFormat != PIX_FMT_MONOBLACK && dstFormat != PIX_FMT_MONOBLACK
> - && srcFormat != PIX_FMT_MONOWHITE && dstFormat != PIX_FMT_MONOWHITE
> - && srcFormat != PIX_FMT_RGB48LE && dstFormat != PIX_FMT_RGB48LE
> - && srcFormat != PIX_FMT_RGB48BE && dstFormat != PIX_FMT_RGB48BE
> - && srcFormat != PIX_FMT_BGR48LE && dstFormat != PIX_FMT_BGR48LE
> - && srcFormat != PIX_FMT_BGR48BE && dstFormat != PIX_FMT_BGR48BE
> + if (isAnyRGB(srcFormat) && isAnyRGB(dstFormat) && findRgbConvFn(c)
> && (!needsDither || (c->flags&(SWS_FAST_BILINEAR|SWS_POINT))))
> c->swScale= rgbToRgbWrapper;
>
ok otherwise
Janne
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel