[FFmpeg-devel] [PATCH] swscale: unscaled rgb48 <-> bgr48
Paul B Mahol
onemda at gmail.com
Fri Jun 8 13:42:18 CEST 2012
On 6/8/12, Paul B Mahol <onemda at gmail.com> wrote:
> 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 ...
rgb48le<->bgr48be actually.
More information about the ffmpeg-devel
mailing list