aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/mjpegdec.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2014-03-31 15:27:41 +0200
committerMichael Niedermayer <michaelni@gmx.at>2014-03-31 17:47:04 +0200
commitf9059ce79441c15623ec0b4d4567b36fbf14e7ae (patch)
tree7dd0b086534381d624d43b3de119c02d9cc53c13 /libavcodec/mjpegdec.c
parent1b28d9b357db2b6f8360e68c03247d3b81655b10 (diff)
downloadffmpeg-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.c23
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) {