diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2013-07-11 16:10:18 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2013-07-11 16:10:18 +0200 |
commit | 8024b4880ccc4b3d6f2ce9274c8fe79993f20143 (patch) | |
tree | 82b822419889328e10bca112c882bc173c465b84 | |
parent | 96747e6cbe755f448e978987e57096ef1452e340 (diff) | |
download | ffmpeg-8024b4880ccc4b3d6f2ce9274c8fe79993f20143.tar.gz |
avcodec/jpeglsdec: support xfrm 1-3
Fixes 75% of Ticket893
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libavcodec/jpeglsdec.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/libavcodec/jpeglsdec.c b/libavcodec/jpeglsdec.c index 3af230d1db..d9eb8e80ba 100644 --- a/libavcodec/jpeglsdec.c +++ b/libavcodec/jpeglsdec.c @@ -361,6 +361,43 @@ int ff_jpegls_decode_picture(MJpegDecodeContext *s, int near, goto end; } + if (s->xfrm && s->nb_components == 3) { + int x, w; + + w = s->width * s->nb_components; + + if (s->bits <= 8) { + uint8_t *src = s->picture.data[0]; + + for (i = 0; i < s->height; i++) { + switch(s->xfrm) { + case 1: + for (x = off; x < w; x += 3) { + src[x ] += src[x+1] + 128; + src[x+2] += src[x+1] + 128; + } + break; + case 2: + for (x = off; x < w; x += 3) { + src[x ] += src[x+1] + 128; + src[x+2] += ((src[x ] + src[x+1])>>1) + 128; + } + break; + case 3: + for (x = off; x < w; x += 3) { + int g = src[x+0] - ((src[x+2]+src[x+1])>>2) + 64; + src[x+0] = src[x+2] + g + 128; + src[x+2] = src[x+1] + g + 128; + src[x+1] = g; + } + break; + } + src += s->picture.linesize[0]; + } + }else + avpriv_report_missing_feature(s->avctx, "16bit xfrm"); + } + if (shift) { /* we need to do point transform or normalize samples */ int x, w; |