diff options
author | Oskar Arvidsson <oskar@irock.se> | 2011-03-29 17:48:47 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2011-04-10 22:33:41 +0200 |
commit | d4497f6dfb8dddf25b7be441f16d387aa18a65d6 (patch) | |
tree | a688c802bf50f533e5c66798c2aecc247c0e3a20 /libswscale/swscale_template.c | |
parent | af0b2d6736a99203fed3014a3e83f8226dade2af (diff) | |
download | ffmpeg-d4497f6dfb8dddf25b7be441f16d387aa18a65d6.tar.gz |
Add pixel formats for 9- and 10-bit yuv420p.
Also add support for these formats in libswscale.
Needed for high bit depth h264 decoding.
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libswscale/swscale_template.c')
-rw-r--r-- | libswscale/swscale_template.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/libswscale/swscale_template.c b/libswscale/swscale_template.c index 0ee5181e2e..d616036646 100644 --- a/libswscale/swscale_template.c +++ b/libswscale/swscale_template.c @@ -1826,6 +1826,29 @@ static inline void RENAME(nv21ToUV)(uint8_t *dstU, uint8_t *dstV, RENAME(nvXXtoUV)(dstV, dstU, src1, width); } +// FIXME Maybe dither instead. +#define YUV_NBPS(depth) \ +static inline void RENAME(yuv ## depth ## ToUV)(uint8_t *dstU, uint8_t *dstV, \ + const uint16_t *srcU, const uint16_t *srcV, \ + long width, uint32_t *unused) \ +{ \ + int i; \ + for (i = 0; i < width; i++) { \ + dstU[i] = srcU[i]>>(depth-8); \ + dstV[i] = srcV[i]>>(depth-8); \ + } \ +} \ +\ +static inline void RENAME(yuv ## depth ## ToY)(uint8_t *dstY, const uint16_t *srcY, long width, uint32_t *unused) \ +{ \ + int i; \ + for (i = 0; i < width; i++) \ + dstY[i] = srcY[i]>>(depth-8); \ +} \ + +YUV_NBPS( 9) +YUV_NBPS(10) + #if COMPILE_TEMPLATE_MMX static inline void RENAME(bgr24ToY_mmx)(uint8_t *dst, const uint8_t *src, long width, enum PixelFormat srcFormat) { @@ -2955,6 +2978,8 @@ static void RENAME(sws_init_swScale)(SwsContext *c) case PIX_FMT_PAL8 : case PIX_FMT_BGR4_BYTE: case PIX_FMT_RGB4_BYTE: c->chrToYV12 = palToUV; break; + case PIX_FMT_YUV420P9 : c->chrToYV12 = (void*)RENAME(yuv9ToUV ); break; + case PIX_FMT_YUV420P10: c->chrToYV12 = (void*)RENAME(yuv10ToUV); break; case PIX_FMT_YUV420P16BE: case PIX_FMT_YUV422P16BE: case PIX_FMT_YUV444P16BE: c->chrToYV12 = RENAME(BEToUV); break; @@ -3001,6 +3026,8 @@ static void RENAME(sws_init_swScale)(SwsContext *c) c->lumToYV12 = NULL; c->alpToYV12 = NULL; switch (srcFormat) { + case PIX_FMT_YUV420P9 : c->lumToYV12 = (void*)RENAME(yuv9ToY ); break; + case PIX_FMT_YUV420P10: c->lumToYV12 = (void*)RENAME(yuv10ToY); break; case PIX_FMT_YUYV422 : case PIX_FMT_YUV420P16BE: case PIX_FMT_YUV422P16BE: |