Merge commit '3c5cf2a31b4b29a8e4282cbe6a3f0617c14698b8'
* commit '3c5cf2a31b4b29a8e4282cbe6a3f0617c14698b8': screenpresso: Drop parameter change check Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
This commit is contained in:
commit
564eabeebb
@ -80,6 +80,12 @@ static av_cold int screenpresso_init(AVCodecContext *avctx)
|
|||||||
|
|
||||||
avctx->pix_fmt = AV_PIX_FMT_BGR24;
|
avctx->pix_fmt = AV_PIX_FMT_BGR24;
|
||||||
|
|
||||||
|
/* Allocate maximum size possible, a full frame */
|
||||||
|
ctx->inflated_size = avctx->width * avctx->height * 3;
|
||||||
|
ctx->inflated_buf = av_malloc(ctx->inflated_size);
|
||||||
|
if (!ctx->inflated_buf)
|
||||||
|
return AVERROR(ENOMEM);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -100,6 +106,7 @@ static int screenpresso_decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
{
|
{
|
||||||
ScreenpressoContext *ctx = avctx->priv_data;
|
ScreenpressoContext *ctx = avctx->priv_data;
|
||||||
AVFrame *frame = data;
|
AVFrame *frame = data;
|
||||||
|
uLongf length = ctx->inflated_size;
|
||||||
int keyframe;
|
int keyframe;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
@ -117,30 +124,18 @@ static int screenpresso_decode_frame(AVCodecContext *avctx, void *data,
|
|||||||
}
|
}
|
||||||
keyframe = (avpkt->data[0] == 0x73);
|
keyframe = (avpkt->data[0] == 0x73);
|
||||||
|
|
||||||
/* Resize deflate buffer and frame on resolution change */
|
|
||||||
if (ctx->inflated_size != avctx->width * avctx->height * 3) {
|
|
||||||
av_frame_unref(ctx->current);
|
|
||||||
ret = ff_get_buffer(avctx, ctx->current, AV_GET_BUFFER_FLAG_REF);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
/* If malloc fails, reset len to avoid preserving an invalid value */
|
|
||||||
ctx->inflated_size = avctx->width * avctx->height * 3;
|
|
||||||
ret = av_reallocp(&ctx->inflated_buf, ctx->inflated_size);
|
|
||||||
if (ret < 0) {
|
|
||||||
ctx->inflated_size = 0;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Inflate the frame after the 2 byte header */
|
/* Inflate the frame after the 2 byte header */
|
||||||
ret = uncompress(ctx->inflated_buf, &ctx->inflated_size,
|
ret = uncompress(ctx->inflated_buf, &length,
|
||||||
avpkt->data + 2, avpkt->size - 2);
|
avpkt->data + 2, avpkt->size - 2);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
av_log(avctx, AV_LOG_ERROR, "Deflate error %d.\n", ret);
|
av_log(avctx, AV_LOG_ERROR, "Deflate error %d.\n", ret);
|
||||||
return AVERROR_UNKNOWN;
|
return AVERROR_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret = ff_reget_buffer(avctx, ctx->current);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
/* When a keyframe is found, copy it (flipped) */
|
/* When a keyframe is found, copy it (flipped) */
|
||||||
if (keyframe)
|
if (keyframe)
|
||||||
av_image_copy_plane(ctx->current->data[0] +
|
av_image_copy_plane(ctx->current->data[0] +
|
||||||
|
Loading…
x
Reference in New Issue
Block a user