X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fzmbv.c;h=99e735cfd93d8242432c9142dad658cc46e698f8;hb=5e546864b09379910721b35a14713982d933d9dd;hp=79e0892070412b4a54d6748032dfe8d1dd651191;hpb=cd8087444bb459c7c62e21913adfef5ec09675cc;p=ffmpeg diff --git a/libavcodec/zmbv.c b/libavcodec/zmbv.c index 79e08920704..99e735cfd93 100644 --- a/libavcodec/zmbv.c +++ b/libavcodec/zmbv.c @@ -121,6 +121,8 @@ static int zmbv_decode_xor_8(ZmbvContext *c) for (j = 0; j < bh2; j++) { if (my + j < 0 || my + j >= c->height) { memset(out, 0, bw2); + } else if (mx >= 0 && mx + bw2 <= c->width){ + memcpy(out, tprev, sizeof(*out) * bw2); } else { for (i = 0; i < bw2; i++) { if (mx + i < 0 || mx + i >= c->width) @@ -193,6 +195,8 @@ static int zmbv_decode_xor_16(ZmbvContext *c) for (j = 0; j < bh2; j++) { if (my + j < 0 || my + j >= c->height) { memset(out, 0, bw2 * 2); + } else if (mx >= 0 && mx + bw2 <= c->width){ + memcpy(out, tprev, sizeof(*out) * bw2); } else { for (i = 0; i < bw2; i++) { if (mx + i < 0 || mx + i >= c->width) @@ -270,6 +274,8 @@ static int zmbv_decode_xor_24(ZmbvContext *c) for (j = 0; j < bh2; j++) { if (my + j < 0 || my + j >= c->height) { memset(out, 0, bw2 * 3); + } else if (mx >= 0 && mx + bw2 <= c->width){ + memcpy(out, tprev, 3 * bw2); } else { for (i = 0; i < bw2; i++){ if (mx + i < 0 || mx + i >= c->width) { @@ -303,7 +309,7 @@ static int zmbv_decode_xor_24(ZmbvContext *c) prev += stride * c->bh; } if (src - c->decomp_buf != c->decomp_len) - av_log(c->avctx, AV_LOG_ERROR, "Used %i of %i bytes\n", + av_log(c->avctx, AV_LOG_ERROR, "Used %"PTRDIFF_SPECIFIER" of %i bytes\n", src-c->decomp_buf, c->decomp_len); return 0; } @@ -351,6 +357,8 @@ static int zmbv_decode_xor_32(ZmbvContext *c) for (j = 0; j < bh2; j++) { if (my + j < 0 || my + j >= c->height) { memset(out, 0, bw2 * 4); + } else if (mx >= 0 && mx + bw2 <= c->width){ + memcpy(out, tprev, sizeof(*out) * bw2); } else { for (i = 0; i < bw2; i++){ if (mx + i < 0 || mx + i >= c->width) @@ -473,7 +481,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPac c->bpp = 24; decode_intra = zmbv_decode_intra; c->decode_xor = zmbv_decode_xor_24; - avctx->pix_fmt = AV_PIX_FMT_RGB24; + avctx->pix_fmt = AV_PIX_FMT_BGR24; c->stride = c->width * 3; break; #endif //ZMBV_ENABLE_24BPP @@ -525,9 +533,6 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPac return AVERROR_INVALIDDATA; } - if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) - return ret; - if (c->comp == 0) { // uncompressed data if (c->decomp_size < len) { av_log(avctx, AV_LOG_ERROR, "Buffer too small\n"); @@ -553,6 +558,9 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPac av_log(avctx, AV_LOG_ERROR, "decompressed size %d is incorrect, expected %d\n", c->decomp_len, expected_size); return AVERROR_INVALIDDATA; } + if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) + return ret; + if (c->flags & ZMBV_KEYFRAME) { frame->key_frame = 1; frame->pict_type = AV_PICTURE_TYPE_I;