[FFmpeg-devel] [PATCH] Swscale - RGB48 to YUV conversion

Jason Garrett-Glaser darkshikari
Tue May 26 15:02:48 CEST 2009


On Tue, May 26, 2009 at 8:16 AM, Michael Niedermayer <michaelni at gmx.at> wrote:
> On Tue, May 26, 2009 at 10:13:13AM +0300, Kostya wrote:
>> $subj
>
>> ?swscale.c ? ? ? ? ?| ? 44 ++++++++++++++++++++++++++++++++++++++++++++
>> ?swscale_internal.h | ? ?4 +++-
>> ?swscale_template.c | ? 14 ++++++++++++++
>> ?3 files changed, 61 insertions(+), 1 deletion(-)
>> 0eba08c312b5c5477da219eed3a8a8f2d53f85ee ?48bpp-in.patch
>> Index: swscale.c
>> ===================================================================
>> --- swscale.c (revision 29324)
>> +++ swscale.c (working copy)
>> @@ -108,6 +108,8 @@
>> ? ? ? ? ?|| (x)==PIX_FMT_YUVA420P ? ?\
>> ? ? ? ? ?|| (x)==PIX_FMT_YUYV422 ? ? \
>> ? ? ? ? ?|| (x)==PIX_FMT_UYVY422 ? ? \
>> + ? ? ? ?|| (x)==PIX_FMT_RGB48BE ? ? \
>> + ? ? ? ?|| (x)==PIX_FMT_RGB48LE ? ? \
>> ? ? ? ? ?|| (x)==PIX_FMT_RGB32 ? ? ? \
>> ? ? ? ? ?|| (x)==PIX_FMT_RGB32_1 ? ? \
>> ? ? ? ? ?|| (x)==PIX_FMT_BGR24 ? ? ? \
>> @@ -1122,6 +1124,48 @@
>> ? ? ?}
>> ?}
>>
>> +static inline void rgb48ToY(uint8_t *dst, const uint8_t *src, int width)
>> +{
>> + ? ?int i;
>> + ? ?for (i = 0; i < width; i++) {
>> + ? ? ? ?int r = src[i*6+0];
>> + ? ? ? ?int g = src[i*6+2];
>> + ? ? ? ?int b = src[i*6+4];
>> +
>> + ? ? ? ?dst[i] = (RY*r + GY*g + BY*b + (33<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
>> + ? ?}
>> +}
>> +
>> +static inline void rgb48ToUV(uint8_t *dstU, uint8_t *dstV,
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? uint8_t *src1, uint8_t *src2, int width)
>> +{
>> + ? ?int i;
>> + ? ?assert(src1==src2);
>> + ? ?for (i = 0; i < width; i++) {
>> + ? ? ? ?int r = src1[6*i + 0];
>> + ? ? ? ?int g = src1[6*i + 2];
>> + ? ? ? ?int b = src1[6*i + 4];
>> +
>> + ? ? ? ?dstU[i] = (RU*r + GU*g + BU*b + (257<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
>> + ? ? ? ?dstV[i] = (RV*r + GV*g + BV*b + (257<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
>> + ? ?}
>> +}
>> +
>> +static inline void rgb48ToUV_half(uint8_t *dstU, uint8_t *dstV,
>> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?uint8_t *src1, uint8_t *src2, int width)
>> +{
>> + ? ?int i;
>> + ? ?assert(src1==src2);
>> + ? ?for (i = 0; i < width; i++) {
>> + ? ? ? ?int r= src1[12*i + 0] + src1[12*i + 6];
>> + ? ? ? ?int g= src1[12*i + 2] + src1[12*i + 8];
>> + ? ? ? ?int b= src1[12*i + 4] + src1[12*i + 10];
>> +
>> + ? ? ? ?dstU[i]= (RU*r + GU*g + BU*b + (257<<RGB2YUV_SHIFT)) >> (RGB2YUV_SHIFT+1);
>> + ? ? ? ?dstV[i]= (RV*r + GV*g + BV*b + (257<<RGB2YUV_SHIFT)) >> (RGB2YUV_SHIFT+1);
>> + ? ?}
>> +}
>> +
>> ?#define BGR2Y(type, name, shr, shg, shb, maskr, maskg, maskb, RY, GY, BY, S)\
>> ?static inline void name(uint8_t *dst, const uint8_t *src, long width, uint32_t *unused)\
>> ?{\
>
> it would be nice if this wouldnt loose the 16bit per component

Well I assume 16-bit YUV can be added separately; we're going to need
both RGB48 -> YUV24 and RGB48 -> YUV48.

Dark Shikari



More information about the ffmpeg-devel mailing list