X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Flagarith.c;h=33dd8b0c53d52e41ca387230aaa80d92271487a7;hb=932117171f32fc3160f3d92943290238945fcb28;hp=35f5a07e4c64e27ea8adb9ef8be90b2256cba6ce;hpb=464e9ab011897a1220c2a1b8af336bdf4d0b1dd9;p=ffmpeg diff --git a/libavcodec/lagarith.c b/libavcodec/lagarith.c index 35f5a07e4c6..33dd8b0c53d 100644 --- a/libavcodec/lagarith.c +++ b/libavcodec/lagarith.c @@ -30,6 +30,7 @@ #include "mathops.h" #include "dsputil.h" #include "lagarithrac.h" +#include "thread.h" enum LagarithFrameType { FRAME_RAW = 1, /**< uncompressed */ @@ -197,8 +198,8 @@ static int lag_read_prob_header(lag_rac *rac, GetBitContext *gb) } /* Comment from reference source: * if (b & 0x80 == 0) { // order of operations is 'wrong'; it has been left this way - * // since the compression change is negligable and fixing it - * // breaks backwards compatibilty + * // since the compression change is negligible and fixing it + * // breaks backwards compatibility * b =- (signed int)b; * b &= 0xFF; * } else { @@ -258,7 +259,7 @@ static void lag_pred_line(LagarithContext *l, uint8_t *buf, if (line == 1) { /* Second line, left predict first pixel, the rest of the line is median predicted * NOTE: In the case of RGB this pixel is top predicted */ - TL = l->avctx->pix_fmt == PIX_FMT_YUV420P ? buf[-stride] : L; + TL = l->avctx->pix_fmt == AV_PIX_FMT_YUV420P ? buf[-stride] : L; } else { /* Top left is 2 rows back, last pixel */ TL = buf[width - (2 * stride) - 1]; @@ -360,6 +361,11 @@ static int lag_decode_zero_run_line(LagarithContext *l, uint8_t *dst, output_zeros: if (l->zeros_rem) { count = FFMIN(l->zeros_rem, width - i); + if (end - dst < count) { + av_log(l->avctx, AV_LOG_ERROR, "Too many zeros remaining.\n"); + return AVERROR_INVALIDDATA; + } + memset(dst, 0, count); l->zeros_rem -= count; dst += count; @@ -466,7 +472,7 @@ static int lag_decode_arith_plane(LagarithContext *l, uint8_t *dst, return -1; } - if (l->avctx->pix_fmt != PIX_FMT_YUV422P) { + if (l->avctx->pix_fmt != AV_PIX_FMT_YUV422P) { for (i = 0; i < height; i++) { lag_pred_line(l, dst, width, stride, i); dst += stride; @@ -491,7 +497,7 @@ static int lag_decode_arith_plane(LagarithContext *l, uint8_t *dst, * @return number of consumed bytes on success or negative if decode fails */ static int lag_decode_frame(AVCodecContext *avctx, - void *data, int *data_size, AVPacket *avpkt) + void *data, int *got_frame, AVPacket *avpkt) { const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; @@ -506,7 +512,7 @@ static int lag_decode_frame(AVCodecContext *avctx, AVFrame *picture = data; if (p->data[0]) - avctx->release_buffer(avctx, p); + ff_thread_release_buffer(avctx, p); p->reference = 0; p->key_frame = 1; @@ -518,9 +524,9 @@ static int lag_decode_frame(AVCodecContext *avctx, switch (frametype) { case FRAME_SOLID_RGBA: - avctx->pix_fmt = PIX_FMT_RGB32; + avctx->pix_fmt = AV_PIX_FMT_RGB32; - if (avctx->get_buffer(avctx, p) < 0) { + if (ff_thread_get_buffer(avctx, p) < 0) { av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); return -1; } @@ -533,16 +539,16 @@ static int lag_decode_frame(AVCodecContext *avctx, } break; case FRAME_ARITH_RGBA: - avctx->pix_fmt = PIX_FMT_RGB32; + avctx->pix_fmt = AV_PIX_FMT_RGB32; planes = 4; offset_ry += 4; offs[3] = AV_RL32(buf + 9); case FRAME_ARITH_RGB24: case FRAME_U_RGB24: if (frametype == FRAME_ARITH_RGB24 || frametype == FRAME_U_RGB24) - avctx->pix_fmt = PIX_FMT_RGB24; + avctx->pix_fmt = AV_PIX_FMT_RGB24; - if (avctx->get_buffer(avctx, p) < 0) { + if (ff_thread_get_buffer(avctx, p) < 0) { av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); return -1; } @@ -553,7 +559,7 @@ static int lag_decode_frame(AVCodecContext *avctx, if (!l->rgb_planes) { l->rgb_stride = FFALIGN(avctx->width, 16); - l->rgb_planes = av_malloc(l->rgb_stride * avctx->height * planes); + l->rgb_planes = av_malloc(l->rgb_stride * avctx->height * planes + 1); if (!l->rgb_planes) { av_log(avctx, AV_LOG_ERROR, "cannot allocate temporary buffer\n"); return AVERROR(ENOMEM); @@ -600,9 +606,9 @@ static int lag_decode_frame(AVCodecContext *avctx, } break; case FRAME_ARITH_YUY2: - avctx->pix_fmt = PIX_FMT_YUV422P; + avctx->pix_fmt = AV_PIX_FMT_YUV422P; - if (avctx->get_buffer(avctx, p) < 0) { + if (ff_thread_get_buffer(avctx, p) < 0) { av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); return -1; } @@ -618,17 +624,17 @@ static int lag_decode_frame(AVCodecContext *avctx, lag_decode_arith_plane(l, p->data[0], avctx->width, avctx->height, p->linesize[0], buf + offset_ry, buf_size - offset_ry); - lag_decode_arith_plane(l, p->data[2], avctx->width / 2, - avctx->height, p->linesize[2], - buf + offset_gu, buf_size - offset_gu); lag_decode_arith_plane(l, p->data[1], avctx->width / 2, avctx->height, p->linesize[1], + buf + offset_gu, buf_size - offset_gu); + lag_decode_arith_plane(l, p->data[2], avctx->width / 2, + avctx->height, p->linesize[2], buf + offset_bv, buf_size - offset_bv); break; case FRAME_ARITH_YV12: - avctx->pix_fmt = PIX_FMT_YUV420P; + avctx->pix_fmt = AV_PIX_FMT_YUV420P; - if (avctx->get_buffer(avctx, p) < 0) { + if (ff_thread_get_buffer(avctx, p) < 0) { av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); return -1; } @@ -658,7 +664,7 @@ static int lag_decode_frame(AVCodecContext *avctx, } *picture = *p; - *data_size = sizeof(AVFrame); + *got_frame = 1; return buf_size; } @@ -678,7 +684,7 @@ static av_cold int lag_decode_end(AVCodecContext *avctx) LagarithContext *l = avctx->priv_data; if (l->picture.data[0]) - avctx->release_buffer(avctx, &l->picture); + ff_thread_release_buffer(avctx, &l->picture); av_freep(&l->rgb_planes); return 0; @@ -687,11 +693,11 @@ static av_cold int lag_decode_end(AVCodecContext *avctx) AVCodec ff_lagarith_decoder = { .name = "lagarith", .type = AVMEDIA_TYPE_VIDEO, - .id = CODEC_ID_LAGARITH, + .id = AV_CODEC_ID_LAGARITH, .priv_data_size = sizeof(LagarithContext), .init = lag_decode_init, .close = lag_decode_end, .decode = lag_decode_frame, - .capabilities = CODEC_CAP_DR1, + .capabilities = CODEC_CAP_DR1 | CODEC_CAP_FRAME_THREADS, .long_name = NULL_IF_CONFIG_SMALL("Lagarith lossless"), };