diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2014-03-31 15:27:41 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-03-31 17:47:04 +0200 |
commit | f9059ce79441c15623ec0b4d4567b36fbf14e7ae (patch) | |
tree | 7dd0b086534381d624d43b3de119c02d9cc53c13 /libavcodec/mjpegdec.c | |
parent | 1b28d9b357db2b6f8360e68c03247d3b81655b10 (diff) | |
download | ffmpeg-f9059ce79441c15623ec0b4d4567b36fbf14e7ae.tar.gz |
avcodec/mjpegdec: upgrade upscale_h to support multiple planes
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/mjpegdec.c')
-rw-r--r-- | libavcodec/mjpegdec.c | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c index 123e4d0da2..931c28ab68 100644 --- a/libavcodec/mjpegdec.c +++ b/libavcodec/mjpegdec.c @@ -415,7 +415,7 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s) goto unk_pixfmt; s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG; s->upscale_v = 2; - s->upscale_h = (pix_fmt_id == 0x22122100); + s->upscale_h = 2*(pix_fmt_id == 0x22122100); s->chroma_height = s->height; break; case 0x21211100: @@ -425,7 +425,7 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s) goto unk_pixfmt; s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG; s->upscale_v = (pix_fmt_id == 0x22211200); - s->upscale_h = 2; + s->upscale_h = 4; s->chroma_height = s->height; break; case 0x22221100: @@ -434,7 +434,7 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s) goto unk_pixfmt; s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG; s->upscale_v = 2; - s->upscale_h = 2; + s->upscale_h = 4; s->chroma_height = s->height / 2; break; case 0x11000000: @@ -458,7 +458,7 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s) else goto unk_pixfmt; s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG; - s->upscale_h = (pix_fmt_id == 0x22211100) * 2 + (pix_fmt_id == 0x22112100); + s->upscale_h = 4 * (pix_fmt_id == 0x22211100) + 2 * (pix_fmt_id == 0x22112100); s->chroma_height = s->height / 2; break; case 0x21111100: @@ -2035,15 +2035,20 @@ fail: return ret; the_end: if (s->upscale_h) { - uint8_t *line = s->picture_ptr->data[s->upscale_h]; + int p; av_assert0(avctx->pix_fmt == AV_PIX_FMT_YUVJ444P || avctx->pix_fmt == AV_PIX_FMT_YUV444P || avctx->pix_fmt == AV_PIX_FMT_YUVJ440P || avctx->pix_fmt == AV_PIX_FMT_YUV440P); - for (i = 0; i < s->chroma_height; i++) { - for (index = s->width - 1; index; index--) - line[index] = (line[index / 2] + line[(index + 1) / 2]) >> 1; - line += s->linesize[s->upscale_h]; + for (p = 1; p<4; p++) { + uint8_t *line = s->picture_ptr->data[p]; + if (!(s->upscale_h & (1<<p))) + continue; + for (i = 0; i < s->chroma_height; i++) { + for (index = s->width - 1; index; index--) + line[index] = (line[index / 2] + line[(index + 1) / 2]) >> 1; + line += s->linesize[p]; + } } } if (s->upscale_v) { |