/*
+ * Copyright (c) 2019 Paul B Mahol
+ *
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
int ret;
s->zstream.avail_in = FFMIN(length, bytestream2_get_bytes_left(&s->gb));
s->zstream.next_in = s->gb.buffer;
+
+ if (length <= 0)
+ return AVERROR_INVALIDDATA;
+
bytestream2_skip(&s->gb, length);
/* decode one line if possible */
{
LSCRContext *const s = avctx->priv_data;
GetByteContext *gb = &s->gb;
- AVFrame *frame = data;
+ AVFrame *frame = s->last_picture;
int ret, nb_blocks, offset = 0;
if (avpkt->size < 2)
bytestream2_init(gb, avpkt->data, avpkt->size);
- if ((ret = ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF)) < 0)
- return ret;
-
nb_blocks = bytestream2_get_le16(gb);
if (bytestream2_get_bytes_left(gb) < 2 + nb_blocks * (12 + 8))
return AVERROR_INVALIDDATA;
- if (s->last_picture->data[0]) {
- ret = av_frame_copy(frame, s->last_picture);
- if (ret < 0)
- return ret;
- }
+ ret = ff_reget_buffer(avctx, frame,
+ nb_blocks ? 0 : FF_REGET_BUFFER_FLAG_READONLY);
+ if (ret < 0)
+ return ret;
for (int b = 0; b < nb_blocks; b++) {
int x, y, x2, y2, w, h, left;
frame->pict_type = frame->key_frame ? AV_PICTURE_TYPE_I : AV_PICTURE_TYPE_P;
- av_frame_unref(s->last_picture);
- if ((ret = av_frame_ref(s->last_picture, frame)) < 0)
+ if ((ret = av_frame_ref(data, frame)) < 0)
return ret;
*got_frame = 1;
av_frame_unref(s->last_picture);
}
-AVCodec ff_lscr_decoder = {
+const AVCodec ff_lscr_decoder = {
.name = "lscr",
.long_name = NULL_IF_CONFIG_SMALL("LEAD Screen Capture"),
.type = AVMEDIA_TYPE_VIDEO,
.decode = decode_frame_lscr,
.flush = lscr_decode_flush,
.capabilities = AV_CODEC_CAP_DR1,
- .caps_internal = FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM | FF_CODEC_CAP_INIT_THREADSAFE |
- FF_CODEC_CAP_ALLOCATE_PROGRESS,
+ .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE,
};