aboutsummaryrefslogtreecommitdiffstats
path: root/libswscale
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2012-01-12 20:28:47 +0000
committerRonald S. Bultje <rsbultje@gmail.com>2012-01-12 16:43:17 -0800
commit0cc1a86dc34b020d857f946e47edf9e425274330 (patch)
tree9164db0fea530ad8f4ddde01f2ea6c41bb0683b3 /libswscale
parent06b0246da07e7c9d95476b35275a63cd6dbc300c (diff)
downloadffmpeg-0cc1a86dc34b020d857f946e47edf9e425274330.tar.gz
rgb2rgb: rgb12to15()
Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>
Diffstat (limited to 'libswscale')
-rw-r--r--libswscale/rgb2rgb.c19
-rw-r--r--libswscale/rgb2rgb.h1
-rw-r--r--libswscale/swscale_unscaled.c1
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;