diff options
author | Paul B Mahol <onemda@gmail.com> | 2012-01-12 20:28:47 +0000 |
---|---|---|
committer | Ronald S. Bultje <rsbultje@gmail.com> | 2012-01-12 16:43:17 -0800 |
commit | 0cc1a86dc34b020d857f946e47edf9e425274330 (patch) | |
tree | 9164db0fea530ad8f4ddde01f2ea6c41bb0683b3 /libswscale | |
parent | 06b0246da07e7c9d95476b35275a63cd6dbc300c (diff) | |
download | ffmpeg-0cc1a86dc34b020d857f946e47edf9e425274330.tar.gz |
rgb2rgb: rgb12to15()
Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>
Diffstat (limited to 'libswscale')
-rw-r--r-- | libswscale/rgb2rgb.c | 19 | ||||
-rw-r--r-- | libswscale/rgb2rgb.h | 1 | ||||
-rw-r--r-- | libswscale/swscale_unscaled.c | 1 |
3 files changed, 21 insertions, 0 deletions
diff --git a/libswscale/rgb2rgb.c b/libswscale/rgb2rgb.c index 9fbb6cfd60..47b06f53fc 100644 --- a/libswscale/rgb2rgb.c +++ b/libswscale/rgb2rgb.c @@ -183,6 +183,25 @@ void rgb16tobgr32(const uint8_t *src, uint8_t *dst, int src_size) } } +void rgb12to15(const uint8_t *src, uint8_t *dst, int src_size) +{ + const uint16_t *end; + uint16_t *d = (uint16_t *)dst; + const uint16_t *s = (const uint16_t *)src; + uint16_t rgb, r, g, b; + end = s + src_size / 2; + while (s < end) { + rgb = *s++; + r = rgb & 0xF00; + g = rgb & 0x0F0; + b = rgb & 0x00F; + r = (r << 3) | ((r & 0x800) >> 1); + g = (g << 2) | ((g & 0x080) >> 2); + b = (b << 1) | ( b >> 3); + *d++ = r | g | b; + } +} + void rgb16to24(const uint8_t *src, uint8_t *dst, int src_size) { const uint16_t *end; diff --git a/libswscale/rgb2rgb.h b/libswscale/rgb2rgb.h index bfb85d722f..42f468fe21 100644 --- a/libswscale/rgb2rgb.h +++ b/libswscale/rgb2rgb.h @@ -63,6 +63,7 @@ void rgb15to24(const uint8_t *src, uint8_t *dst, int src_size); void rgb15tobgr16(const uint8_t *src, uint8_t *dst, int src_size); void rgb15tobgr15(const uint8_t *src, uint8_t *dst, int src_size); void rgb12tobgr12(const uint8_t *src, uint8_t *dst, int src_size); +void rgb12to15(const uint8_t *src, uint8_t *dst, int src_size); void bgr8torgb8(const uint8_t *src, uint8_t *dst, int src_size); void shuffle_bytes_0321(const uint8_t *src, uint8_t *dst, int src_size); diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c index e497fef84f..5fe2b14256 100644 --- a/libswscale/swscale_unscaled.c +++ b/libswscale/swscale_unscaled.c @@ -389,6 +389,7 @@ static rgbConvFn findRgbConvFn(SwsContext *c) if ((isBGRinInt(srcFormat) && isBGRinInt(dstFormat)) || (isRGBinInt(srcFormat) && isRGBinInt(dstFormat))) { switch (srcId | (dstId << 16)) { + case 0x000F000C: conv = rgb12to15; break; case 0x000F0010: conv = rgb16to15; break; case 0x000F0018: conv = rgb24to15; break; case 0x000F0020: conv = rgb32to15; break; |