Ticket #1197: patchlagsyuy2.diff

File patchlagsyuy2.diff, 2.3 KB (added by Carl Eugen Hoyos, 14 years ago)
  • libavcodec/lagarith.c

    diff --git a/libavcodec/lagarith.c b/libavcodec/lagarith.c
    index 22d427e..99b5d3f 100644
    a b static void lag_pred_line(LagarithContext *l, uint8_t *buf,  
    258258        if (line == 1) {
    259259            /* Second line, left predict first pixel, the rest of the line is median predicted
    260260             * NOTE: In the case of RGB this pixel is top predicted */
    261             TL = l->avctx->pix_fmt == PIX_FMT_YUV420P ? buf[-stride] : L;
     261            TL = l->avctx->pix_fmt == PIX_FMT_YUV420P ||
     262                 l->avctx->pix_fmt == PIX_FMT_YUV422P ? buf[-stride] : L;
    262263        } else {
    263264            /* Top left is 2 rows back, last pixel */
    264265            TL = buf[width - (2 * stride) - 1];
    static int lag_decode_frame(AVCodecContext *avctx,  
    590591                               avctx->height / 2, p->linesize[1],
    591592                               buf + offset_bv, buf_size - offset_bv);
    592593        break;
     594    case FRAME_ARITH_YUY2:
     595        avctx->pix_fmt = PIX_FMT_YUV422P;
     596
     597        if (avctx->get_buffer(avctx, p) < 0) {
     598            av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
     599            return -1;
     600        }
     601        if (buf_size <= offset_ry || buf_size <= offset_gu || buf_size <= offset_bv) {
     602            return AVERROR_INVALIDDATA;
     603        }
     604
     605        if (offset_ry >= buf_size ||
     606            offset_gu >= buf_size ||
     607            offset_bv >= buf_size) {
     608            av_log(avctx, AV_LOG_ERROR,
     609                   "Invalid frame offsets\n");
     610            return AVERROR_INVALIDDATA;
     611        }
     612
     613        lag_decode_arith_plane(l, p->data[0], avctx->width, avctx->height,
     614                               p->linesize[0], buf + offset_ry,
     615                               buf_size - offset_ry);
     616        lag_decode_arith_plane(l, p->data[2], avctx->width / 2,
     617                               avctx->height, p->linesize[2],
     618                               buf + offset_bv, buf_size - offset_bv);
     619        lag_decode_arith_plane(l, p->data[1], avctx->width / 2,
     620                               avctx->height, p->linesize[1],
     621                               buf + offset_gu, buf_size - offset_gu);
     622        break;
    593623    default:
    594624        av_log(avctx, AV_LOG_ERROR,
    595625               "Unsupported Lagarith frame type: %#x\n", frametype);