mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
swscale: unscaled rgb48 <-> bgr48
Signed-off-by: Paul B Mahol <onemda@gmail.com>
This commit is contained in:
parent
e400b95b32
commit
1d69dcb887
@ -26,6 +26,7 @@
|
|||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
|
||||||
#include "libavutil/bswap.h"
|
#include "libavutil/bswap.h"
|
||||||
|
#include "libavutil/intreadwrite.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "rgb2rgb.h"
|
#include "rgb2rgb.h"
|
||||||
#include "swscale.h"
|
#include "swscale.h"
|
||||||
@ -333,3 +334,21 @@ DEFINE_SHUFFLE_BYTES(0, 3, 2, 1)
|
|||||||
DEFINE_SHUFFLE_BYTES(1, 2, 3, 0)
|
DEFINE_SHUFFLE_BYTES(1, 2, 3, 0)
|
||||||
DEFINE_SHUFFLE_BYTES(3, 0, 1, 2)
|
DEFINE_SHUFFLE_BYTES(3, 0, 1, 2)
|
||||||
DEFINE_SHUFFLE_BYTES(3, 2, 1, 0)
|
DEFINE_SHUFFLE_BYTES(3, 2, 1, 0)
|
||||||
|
|
||||||
|
#define DEFINE_RGB48TOBGR48(ie, oe) \
|
||||||
|
void rgb48tobgr48_ ## ie ## oe(const uint8_t *src, \
|
||||||
|
uint8_t *dst, int src_size) \
|
||||||
|
{ \
|
||||||
|
uint16_t *d = (uint16_t *)dst; \
|
||||||
|
uint16_t *s = (uint16_t *)src; \
|
||||||
|
int i, num_pixels = src_size >> 1; \
|
||||||
|
\
|
||||||
|
for (i = 0; i < num_pixels; i += 3) { \
|
||||||
|
AV_W ## oe ## 16(&d[i ], AV_R ## ie ## 16(&s[i + 2])); \
|
||||||
|
AV_W ## oe ## 16(&d[i + 1], AV_R ## ie ## 16(&s[i + 1])); \
|
||||||
|
AV_W ## oe ## 16(&d[i + 2], AV_R ## ie ## 16(&s[i ])); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
DEFINE_RGB48TOBGR48(L, L)
|
||||||
|
DEFINE_RGB48TOBGR48(L, B)
|
||||||
|
@ -52,6 +52,8 @@ extern void (*rgb32tobgr15)(const uint8_t *src, uint8_t *dst, int src_size);
|
|||||||
|
|
||||||
extern void (*shuffle_bytes_2103)(const uint8_t *src, uint8_t *dst, int src_size);
|
extern void (*shuffle_bytes_2103)(const uint8_t *src, uint8_t *dst, int src_size);
|
||||||
|
|
||||||
|
void rgb48tobgr48_LL(const uint8_t *src, uint8_t *dst, int src_size);
|
||||||
|
void rgb48tobgr48_LB(const uint8_t *src, uint8_t *dst, int src_size);
|
||||||
void rgb24to32(const uint8_t *src, uint8_t *dst, int src_size);
|
void rgb24to32(const uint8_t *src, uint8_t *dst, int src_size);
|
||||||
void rgb32to24(const uint8_t *src, uint8_t *dst, int src_size);
|
void rgb32to24(const uint8_t *src, uint8_t *dst, int src_size);
|
||||||
void rgb16tobgr32(const uint8_t *src, uint8_t *dst, int src_size);
|
void rgb16tobgr32(const uint8_t *src, uint8_t *dst, int src_size);
|
||||||
|
@ -521,6 +521,13 @@ static int planarRgbToRgbWrapper(SwsContext *c, const uint8_t *src[],
|
|||||||
|| (x) == PIX_FMT_ABGR \
|
|| (x) == PIX_FMT_ABGR \
|
||||||
)
|
)
|
||||||
|
|
||||||
|
#define isRGB48(x) ( \
|
||||||
|
(x) == PIX_FMT_RGB48LE \
|
||||||
|
|| (x) == PIX_FMT_RGB48BE \
|
||||||
|
|| (x) == PIX_FMT_BGR48LE \
|
||||||
|
|| (x) == PIX_FMT_BGR48BE \
|
||||||
|
)
|
||||||
|
|
||||||
/* {RGB,BGR}{15,16,24,32,32_1} -> {RGB,BGR}{15,16,24,32} */
|
/* {RGB,BGR}{15,16,24,32,32_1} -> {RGB,BGR}{15,16,24,32} */
|
||||||
typedef void (* rgbConvFn) (const uint8_t *, uint8_t *, int);
|
typedef void (* rgbConvFn) (const uint8_t *, uint8_t *, int);
|
||||||
static rgbConvFn findRgbConvFn(SwsContext *c)
|
static rgbConvFn findRgbConvFn(SwsContext *c)
|
||||||
@ -554,6 +561,15 @@ static rgbConvFn findRgbConvFn(SwsContext *c)
|
|||||||
|| CONV_IS(RGBA, BGRA)) conv = shuffle_bytes_2103;
|
|| CONV_IS(RGBA, BGRA)) conv = shuffle_bytes_2103;
|
||||||
else if (CONV_IS(BGRA, ABGR)
|
else if (CONV_IS(BGRA, ABGR)
|
||||||
|| CONV_IS(RGBA, ARGB)) conv = shuffle_bytes_3012;
|
|| CONV_IS(RGBA, ARGB)) conv = shuffle_bytes_3012;
|
||||||
|
} else if (isRGB48(srcFormat) && isRGB48(dstFormat)) {
|
||||||
|
if (CONV_IS(RGB48LE, BGR48LE)
|
||||||
|
|| CONV_IS(BGR48LE, RGB48LE)
|
||||||
|
|| CONV_IS(RGB48BE, BGR48BE)
|
||||||
|
|| CONV_IS(BGR48BE, RGB48BE)) conv = rgb48tobgr48_LL;
|
||||||
|
else if (CONV_IS(RGB48LE, BGR48BE)
|
||||||
|
|| CONV_IS(BGR48LE, RGB48BE)
|
||||||
|
|| CONV_IS(RGB48BE, BGR48LE)
|
||||||
|
|| CONV_IS(BGR48BE, RGB48LE)) conv = rgb48tobgr48_LB;
|
||||||
} else
|
} else
|
||||||
/* BGR -> BGR */
|
/* BGR -> BGR */
|
||||||
if ((isBGRinInt(srcFormat) && isBGRinInt(dstFormat)) ||
|
if ((isBGRinInt(srcFormat) && isBGRinInt(dstFormat)) ||
|
||||||
|
Loading…
Reference in New Issue
Block a user