Browse Source

swscale: add support for endianness only conversion

Use bitfields in FormatEntry array to avoid wasting an int for each flag.
tags/n2.0
Janne Grunau 12 years ago
parent
commit
c1eb3e7fec
3 changed files with 20 additions and 2 deletions
  1. +7
    -0
      libswscale/swscale.h
  2. +12
    -1
      libswscale/utils.c
  3. +1
    -1
      libswscale/version.h

+ 7
- 0
libswscale/swscale.h View File

@@ -140,6 +140,13 @@ int sws_isSupportedInput(enum AVPixelFormat pix_fmt);
*/ */
int sws_isSupportedOutput(enum AVPixelFormat pix_fmt); int sws_isSupportedOutput(enum AVPixelFormat pix_fmt);


/**
* @param[in] pix_fmt the pixel format
* @return a positive value if an endianness conversion for pix_fmt is
* supported, 0 otherwise.
*/
int sws_isSupportedEndiannessConversion(enum AVPixelFormat pix_fmt);

/** /**
* Allocate an empty SwsContext. This must be filled and passed to * Allocate an empty SwsContext. This must be filled and passed to
* sws_init_context(). For filling see AVOptions, options.c and * sws_init_context(). For filling see AVOptions, options.c and


+ 12
- 1
libswscale/utils.c View File

@@ -70,7 +70,9 @@ const char *swscale_license(void)
#define RET 0xC3 // near return opcode for x86 #define RET 0xC3 // near return opcode for x86


typedef struct FormatEntry { 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; } FormatEntry;


static const FormatEntry format_entries[AV_PIX_FMT_NB] = { 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; 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]; extern const int32_t ff_yuv2rgb_coeffs[8][4];


const char *sws_format_name(enum AVPixelFormat format) 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); unscaled = (srcW == dstW && srcH == dstH);


if (!(unscaled && sws_isSupportedEndiannessConversion(srcFormat) &&
av_pix_fmt_swap_endianness(srcFormat) == dstFormat)) {
if (!sws_isSupportedInput(srcFormat)) { if (!sws_isSupportedInput(srcFormat)) {
av_log(c, AV_LOG_ERROR, "%s is not supported as input pixel format\n", av_log(c, AV_LOG_ERROR, "%s is not supported as input pixel format\n",
sws_format_name(srcFormat)); sws_format_name(srcFormat));
@@ -890,6 +900,7 @@ av_cold int sws_init_context(SwsContext *c, SwsFilter *srcFilter,
sws_format_name(dstFormat)); sws_format_name(dstFormat));
return AVERROR(EINVAL); return AVERROR(EINVAL);
} }
}


i = flags & (SWS_POINT | i = flags & (SWS_POINT |
SWS_AREA | SWS_AREA |


+ 1
- 1
libswscale/version.h View File

@@ -28,7 +28,7 @@


#define LIBSWSCALE_VERSION_MAJOR 2 #define LIBSWSCALE_VERSION_MAJOR 2
#define LIBSWSCALE_VERSION_MINOR 1 #define LIBSWSCALE_VERSION_MINOR 1
#define LIBSWSCALE_VERSION_MICRO 1
#define LIBSWSCALE_VERSION_MICRO 2


#define LIBSWSCALE_VERSION_INT AV_VERSION_INT(LIBSWSCALE_VERSION_MAJOR, \ #define LIBSWSCALE_VERSION_INT AV_VERSION_INT(LIBSWSCALE_VERSION_MAJOR, \
LIBSWSCALE_VERSION_MINOR, \ LIBSWSCALE_VERSION_MINOR, \


Loading…
Cancel
Save