mirror of https://git.ffmpeg.org/ffmpeg.git
swscale: add support for endianness only conversion
Use bitfields in FormatEntry array to avoid wasting an int for each flag.
This commit is contained in:
parent
74652af821
commit
c1eb3e7fec
|
@ -140,6 +140,13 @@ int sws_isSupportedInput(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
|
||||
* sws_init_context(). For filling see AVOptions, options.c and
|
||||
|
|
|
@ -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 |
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
|
||||
#define LIBSWSCALE_VERSION_MAJOR 2
|
||||
#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, \
|
||||
LIBSWSCALE_VERSION_MINOR, \
|
||||
|
|
Loading…
Reference in New Issue