X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Flagarith.c;h=e9b00982d3e024ae2abff98ea11bebdfbef176c6;hb=a536a4e4bc52d05f59869761337452fb1f1977f6;hp=9d84d263c95f948fc761252211792ea8cbe3ea6e;hpb=759001c534287a96dc96d1e274665feb7059145d;p=ffmpeg diff --git a/libavcodec/lagarith.c b/libavcodec/lagarith.c index 9d84d263c95..e9b00982d3e 100644 --- a/libavcodec/lagarith.c +++ b/libavcodec/lagarith.c @@ -25,10 +25,12 @@ * @author Nathan Caldwell */ +#include + #include "avcodec.h" #include "get_bits.h" #include "mathops.h" -#include "dsputil.h" +#include "huffyuvdsp.h" #include "lagarithrac.h" #include "thread.h" @@ -48,10 +50,11 @@ enum LagarithFrameType { typedef struct LagarithContext { AVCodecContext *avctx; - DSPContext dsp; + HuffYUVDSPContext hdsp; int zeros; /**< number of consecutive zero bytes encountered */ int zeros_rem; /**< number of zero bytes remaining to output */ uint8_t *rgb_planes; + int rgb_planes_allocated; int rgb_stride; } LagarithContext; @@ -222,7 +225,7 @@ static void add_lag_median_prediction(uint8_t *dst, uint8_t *src1, uint8_t *diff, int w, int *left, int *left_top) { - /* This is almost identical to add_hfyu_median_prediction in dsputil.h. + /* This is almost identical to add_hfyu_median_pred in huffyuvdsp.h. * However the &0xFF on the gradient predictor yealds incorrect output * for lagarith. */ @@ -248,9 +251,11 @@ static void lag_pred_line(LagarithContext *l, uint8_t *buf, int L, TL; if (!line) { + int i, align_width = (width - 1) & ~31; /* Left prediction only for first line */ - L = l->dsp.add_hfyu_left_prediction(buf + 1, buf + 1, - width - 1, buf[0]); + L = l->hdsp.add_hfyu_left_pred(buf + 1, buf + 1, align_width, buf[0]); + for (i = align_width + 1; i < width; i++) + buf[i] += buf[i - 1]; } else { /* Left pixel is actually prev_row[width] */ L = buf[width - stride - 1]; @@ -276,11 +281,18 @@ static void lag_pred_line_yuy2(LagarithContext *l, uint8_t *buf, int L, TL; if (!line) { + int i, align_width; if (is_luma) { buf++; width--; } - l->dsp.add_hfyu_left_prediction(buf + 1, buf + 1, width - 1, buf[0]); + + align_width = (width - 1) & ~31; + l->hdsp.add_hfyu_left_pred(buf + 1, buf + 1, align_width, buf[0]); + + for (i = align_width + 1; i < width; i++) + buf[i] += buf[i - 1]; + return; } if (line == 1) { @@ -293,14 +305,16 @@ static void lag_pred_line_yuy2(LagarithContext *l, uint8_t *buf, L += buf[i]; buf[i] = L; } - buf += HEAD; - width -= HEAD; + for (; i < width; i++) { + L = mid_pred(L & 0xFF, buf[i - stride], (L + buf[i - stride] - TL) & 0xFF) + buf[i]; + TL = buf[i - stride]; + buf[i] = L; + } } else { TL = buf[width - (2 * stride) - 1]; L = buf[width - stride - 1]; + l->hdsp.add_hfyu_median_pred(buf, buf - stride, buf, width, &L, &TL); } - l->dsp.add_hfyu_median_prediction(buf, buf - stride, buf, width, - &L, &TL); } static int lag_decode_line(LagarithContext *l, lag_rac *rac, @@ -435,7 +449,7 @@ static int lag_decode_arith_plane(LagarithContext *l, uint8_t *dst, if (read > length) av_log(l->avctx, AV_LOG_WARNING, - "Output more bytes than length (%d of %d)\n", read, + "Output more bytes than length (%d of %"PRIu32")\n", read, length); } else if (esc_count < 8) { esc_count -= 4; @@ -551,13 +565,12 @@ static int lag_decode_frame(AVCodecContext *avctx, offs[1] = offset_gu; offs[2] = offset_ry; + l->rgb_stride = FFALIGN(avctx->width, 16); + av_fast_malloc(&l->rgb_planes, &l->rgb_planes_allocated, + l->rgb_stride * avctx->height * planes + 1); if (!l->rgb_planes) { - l->rgb_stride = FFALIGN(avctx->width, 16); - 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); - } + av_log(avctx, AV_LOG_ERROR, "cannot allocate temporary buffer\n"); + return AVERROR(ENOMEM); } for (i = 0; i < planes; i++) srcs[i] = l->rgb_planes + (i + 1) * l->rgb_stride * avctx->height - l->rgb_stride; @@ -653,7 +666,7 @@ static int lag_decode_frame(AVCodecContext *avctx, break; default: av_log(avctx, AV_LOG_ERROR, - "Unsupported Lagarith frame type: %#x\n", frametype); + "Unsupported Lagarith frame type: %#"PRIx8"\n", frametype); return -1; } @@ -667,7 +680,7 @@ static av_cold int lag_decode_init(AVCodecContext *avctx) LagarithContext *l = avctx->priv_data; l->avctx = avctx; - ff_dsputil_init(&l->dsp, avctx); + ff_huffyuvdsp_init(&l->hdsp); return 0; } @@ -683,6 +696,7 @@ static av_cold int lag_decode_end(AVCodecContext *avctx) AVCodec ff_lagarith_decoder = { .name = "lagarith", + .long_name = NULL_IF_CONFIG_SMALL("Lagarith lossless"), .type = AVMEDIA_TYPE_VIDEO, .id = AV_CODEC_ID_LAGARITH, .priv_data_size = sizeof(LagarithContext), @@ -690,5 +704,4 @@ AVCodec ff_lagarith_decoder = { .close = lag_decode_end, .decode = lag_decode_frame, .capabilities = CODEC_CAP_DR1 | CODEC_CAP_FRAME_THREADS, - .long_name = NULL_IF_CONFIG_SMALL("Lagarith lossless"), };