summaryrefslogtreecommitdiff
path: root/libavcodec/utvideo.c
diff options
context:
space:
mode:
Diffstat (limited to 'libavcodec/utvideo.c')
-rw-r--r--libavcodec/utvideo.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/libavcodec/utvideo.c b/libavcodec/utvideo.c
index aac3969b15..5faaa15a0c 100644
--- a/libavcodec/utvideo.c
+++ b/libavcodec/utvideo.c
@@ -113,6 +113,7 @@ static int decode_plane(UtvideoContext *c, int plane_no,
VLC vlc;
GetBitContext gb;
int prev;
+ const int cmask = ~(!plane_no && c->avctx->pix_fmt == PIX_FMT_YUV420P);
if (build_huff(src, &vlc)) {
av_log(c->avctx, AV_LOG_ERROR, "Cannot build Huffman codes\n");
@@ -128,7 +129,7 @@ static int decode_plane(UtvideoContext *c, int plane_no,
int slice_data_start, slice_data_end, slice_size;
sstart = send;
- send = height * (slice + 1) / c->slices;
+ send = (height * (slice + 1) / c->slices) & cmask;
dest = dst + sstart * stride;
// slice offset and size validation was done earlier
@@ -204,16 +205,17 @@ static void restore_rgb_planes(uint8_t *src, int step, int stride, int width, in
}
static void restore_median(uint8_t *src, int step, int stride,
- int width, int height, int slices)
+ int width, int height, int slices, int rmode)
{
int i, j, slice;
int A, B, C;
uint8_t *bsrc;
int slice_start, slice_height;
+ const int cmask = ~rmode;
for (slice = 0; slice < slices; slice++) {
- slice_start = (slice * height) / slices;
- slice_height = ((slice + 1) * height) / slices - slice_start;
+ slice_start = ((slice * height) / slices) & cmask;
+ slice_height = ((((slice + 1) * height) / slices) & cmask) - slice_start;
bsrc = src + slice_start * stride;
@@ -337,7 +339,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPac
if (c->frame_pred == PRED_MEDIAN)
restore_median(c->pic.data[0] + rgb_order[i], c->planes,
c->pic.linesize[0], avctx->width, avctx->height,
- c->slices);
+ c->slices, 0);
}
restore_rgb_planes(c->pic.data[0], c->planes, c->pic.linesize[0],
avctx->width, avctx->height);
@@ -353,7 +355,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPac
if (c->frame_pred == PRED_MEDIAN)
restore_median(c->pic.data[i], 1, c->pic.linesize[i],
avctx->width >> !!i, avctx->height >> !!i,
- c->slices);
+ c->slices, !i);
}
break;
case PIX_FMT_YUV422P:
@@ -366,7 +368,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPac
return ret;
if (c->frame_pred == PRED_MEDIAN)
restore_median(c->pic.data[i], 1, c->pic.linesize[i],
- avctx->width >> !!i, avctx->height, c->slices);
+ avctx->width >> !!i, avctx->height, c->slices, 0);
}
break;
}