[FFmpeg-devel] [PATCH] swscale: unscaled rgb48 <-> bgr48

Paul B Mahol onemda at gmail.com
Fri Jun 8 13:40:12 CEST 2012


On 6/8/12, Michael Niedermayer <michaelni at gmx.at> wrote:
> On Fri, Jun 08, 2012 at 10:55:20AM +0000, Paul B Mahol wrote:
>> Signed-off-by: Paul B Mahol <onemda at gmail.com>
>> ---
>>  libswscale/rgb2rgb.c          |   21 ++++++++++++++++++++-
>>  libswscale/rgb2rgb.h          |    4 ++++
>>  libswscale/swscale_unscaled.c |   18 +++++++++++++++++-
>>  3 files changed, 41 insertions(+), 2 deletions(-)
>>
>> diff --git a/libswscale/rgb2rgb.c b/libswscale/rgb2rgb.c
>> index ba7d6de..6b3a01a 100644
>> --- a/libswscale/rgb2rgb.c
>> +++ b/libswscale/rgb2rgb.c
>> @@ -26,6 +26,7 @@
>>  #include <inttypes.h>
>>
>>  #include "libavutil/bswap.h"
>> +#include "libavutil/intreadwrite.h"
>>  #include "config.h"
>>  #include "rgb2rgb.h"
>>  #include "swscale.h"
>> @@ -314,7 +315,6 @@ void rgb12tobgr12(const uint8_t *src, uint8_t *dst,
>> int src_size)
>>      }
>>  }
>>
>> -
>>  #define DEFINE_SHUFFLE_BYTES(a, b, c, d)
>> \
>>  void shuffle_bytes_ ## a ## b ## c ## d(const uint8_t *src,
>> \
>>                                          uint8_t *dst, int src_size)
>> \
>> @@ -333,3 +333,22 @@ DEFINE_SHUFFLE_BYTES(0, 3, 2, 1)
>>  DEFINE_SHUFFLE_BYTES(1, 2, 3, 0)
>>  DEFINE_SHUFFLE_BYTES(3, 0, 1, 2)
>>  DEFINE_SHUFFLE_BYTES(3, 2, 1, 0)
>> +
>> +#define DEFINE_RGB48TOBGR48(i, o)
>>    \
>> +void rgb48tobgr48_ ## i ## o(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 ## o ## 16(&d[i    ], AV_R ## i ## 16(&s[i + 2]));
>>    \
>> +        AV_W ## o ## 16(&d[i + 1], AV_R ## i ## 16(&s[i + 1]));
>>    \
>> +        AV_W ## o ## 16(&d[i + 2], AV_R ## i ## 16(&s[i    ]));
>>    \
>> +    }
>>    \
>> +}
>
> the macro argument "i" and the variable "i" should use different
> identifiers to avoid unexpected bugs when something more complex is
> passed in as i
>
>
>> +
>> +DEFINE_RGB48TOBGR48(L, L)
>> +DEFINE_RGB48TOBGR48(B, B)
>> +DEFINE_RGB48TOBGR48(L, B)
>> +DEFINE_RGB48TOBGR48(B, L)
>
> only 2 are needed
>
> LL = BB
> LB = BL
>
>
>
>> diff --git a/libswscale/rgb2rgb.h b/libswscale/rgb2rgb.h
>> index c447986..89be977 100644
>> --- a/libswscale/rgb2rgb.h
>> +++ b/libswscale/rgb2rgb.h
>> @@ -52,6 +52,10 @@ 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);
>>
>> +void rgb48tobgr48_LL(const uint8_t *src, uint8_t *dst, int src_size);
>> +void rgb48tobgr48_BB(const uint8_t *src, uint8_t *dst, int src_size);
>> +void rgb48tobgr48_LB(const uint8_t *src, uint8_t *dst, int src_size);
>> +void rgb48tobgr48_BL(const uint8_t *src, uint8_t *dst, int src_size);
>
> they should have a sws_ prefix to avoid name clashes with other libs

All functions in that header do not have any prefix, and I do not
think prefix is really needed, because
those functions should be internal only.
>
> [...]
>> @@ -532,7 +539,7 @@ static rgbConvFn findRgbConvFn(SwsContext *c)
>>      rgbConvFn conv = NULL;
>>
>>  #define IS_NOT_NE(bpp, fmt) \
>> -    (((bpp + 7) >> 3) == 2 && \
>> +    (bpp <= 16 && \
>>       (!(av_pix_fmt_descriptors[fmt].flags & PIX_FMT_BE) !=
>> !HAVE_BIGENDIAN))
>>
>>      /* if this is non-native rgb444/555/565, don't handle it here. */
>
> this looks unrelated

It is related, because rgb48be <-> rgb48le would use scaled variant
which is extremely stupid idea.

>
> otherwise LGTM
>
> [...]


More information about the ffmpeg-devel mailing list