From c1eb3e7fecdc270e03a700d61ef941600a6af491 Mon Sep 17 00:00:00 2001 From: Janne Grunau Date: Fri, 26 Apr 2013 14:47:08 +0200 Subject: swscale: add support for endianness only conversion Use bitfields in FormatEntry array to avoid wasting an int for each flag. --- libswscale/utils.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'libswscale/utils.c') diff --git a/libswscale/utils.c b/libswscale/utils.c index 93cb60fdf1..538a3df665 100644 --- a/libswscale/utils.c +++ b/libswscale/utils.c @@ -70,7 +70,9 @@ const char *swscale_license(void) #define RET 0xC3 // near return opcode for x86 typedef struct FormatEntry { - int is_supported_in, is_supported_out; + uint8_t is_supported_in :1; + uint8_t is_supported_out :1; + uint8_t is_supported_endianness :1; } FormatEntry; static const FormatEntry format_entries[AV_PIX_FMT_NB] = { @@ -184,6 +186,12 @@ int sws_isSupportedOutput(enum AVPixelFormat pix_fmt) format_entries[pix_fmt].is_supported_out : 0; } +int sws_isSupportedEndiannessConversion(enum AVPixelFormat pix_fmt) +{ + return (unsigned)pix_fmt < AV_PIX_FMT_NB ? + format_entries[pix_fmt].is_supported_endianness : 0; +} + extern const int32_t ff_yuv2rgb_coeffs[8][4]; const char *sws_format_name(enum AVPixelFormat format) @@ -880,6 +888,8 @@ av_cold int sws_init_context(SwsContext *c, SwsFilter *srcFilter, unscaled = (srcW == dstW && srcH == dstH); + if (!(unscaled && sws_isSupportedEndiannessConversion(srcFormat) && + av_pix_fmt_swap_endianness(srcFormat) == dstFormat)) { if (!sws_isSupportedInput(srcFormat)) { av_log(c, AV_LOG_ERROR, "%s is not supported as input pixel format\n", sws_format_name(srcFormat)); @@ -890,6 +900,7 @@ av_cold int sws_init_context(SwsContext *c, SwsFilter *srcFilter, sws_format_name(dstFormat)); return AVERROR(EINVAL); } + } i = flags & (SWS_POINT | SWS_AREA | -- cgit v1.2.3