diff --git a/libavcodec/flashsvenc.c b/libavcodec/flashsvenc.c index bbfb41c899..71c81bd2f8 100644 --- a/libavcodec/flashsvenc.c +++ b/libavcodec/flashsvenc.c @@ -57,7 +57,6 @@ typedef struct FlashSVContext { AVCodecContext *avctx; uint8_t *previous_frame; - AVFrame frame; int image_width, image_height; int block_width, block_height; uint8_t *tmpblock; @@ -89,6 +88,21 @@ static int copy_region_enc(uint8_t *sptr, uint8_t *dptr, int dx, int dy, return 0; } +static av_cold int flashsv_encode_end(AVCodecContext *avctx) +{ + FlashSVContext *s = avctx->priv_data; + + deflateEnd(&s->zstream); + + av_free(s->encbuffer); + av_free(s->previous_frame); + av_free(s->tmpblock); + + av_frame_free(&avctx->coded_frame); + + return 0; +} + static av_cold int flashsv_encode_init(AVCodecContext *avctx) { FlashSVContext *s = avctx->priv_data; @@ -117,11 +131,17 @@ static av_cold int flashsv_encode_init(AVCodecContext *avctx) return AVERROR(ENOMEM); } + avctx->coded_frame = av_frame_alloc(); + if (!avctx->coded_frame) { + flashsv_encode_end(avctx); + return AVERROR(ENOMEM); + } + return 0; } -static int encode_bitstream(FlashSVContext *s, AVFrame *p, uint8_t *buf, +static int encode_bitstream(FlashSVContext *s, const AVFrame *p, uint8_t *buf, int buf_size, int block_width, int block_height, uint8_t *previous_frame, int *I_frame) { @@ -199,14 +219,12 @@ static int flashsv_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *pict, int *got_packet) { FlashSVContext * const s = avctx->priv_data; - AVFrame * const p = &s->frame; + const AVFrame * const p = pict; uint8_t *pfptr; int res; int I_frame = 0; int opt_w = 4, opt_h = 4; - *p = *pict; - /* First frame needs to be a keyframe */ if (avctx->frame_number == 0) { s->previous_frame = av_mallocz(FFABS(p->linesize[0]) * s->image_height); @@ -248,37 +266,22 @@ static int flashsv_encode_frame(AVCodecContext *avctx, AVPacket *pkt, //mark the frame type so the muxer can mux it correctly if (I_frame) { - p->pict_type = AV_PICTURE_TYPE_I; - p->key_frame = 1; + avctx->coded_frame->pict_type = AV_PICTURE_TYPE_I; + avctx->coded_frame->key_frame = 1; s->last_key_frame = avctx->frame_number; av_dlog(avctx, "Inserting keyframe at frame %d\n", avctx->frame_number); } else { - p->pict_type = AV_PICTURE_TYPE_P; - p->key_frame = 0; + avctx->coded_frame->pict_type = AV_PICTURE_TYPE_P; + avctx->coded_frame->key_frame = 0; } - avctx->coded_frame = p; - - if (p->key_frame) + if (avctx->coded_frame->key_frame) pkt->flags |= AV_PKT_FLAG_KEY; *got_packet = 1; return 0; } -static av_cold int flashsv_encode_end(AVCodecContext *avctx) -{ - FlashSVContext *s = avctx->priv_data; - - deflateEnd(&s->zstream); - - av_free(s->encbuffer); - av_free(s->previous_frame); - av_free(s->tmpblock); - - return 0; -} - AVCodec ff_flashsv_encoder = { .name = "flashsv", .long_name = NULL_IF_CONFIG_SMALL("Flash Screen Video"),