- Remove unused #include "libavutil/avassert.h" - Remove write-only fields first_frame_pts and frame_count from context - Convert file_has_infinite_loop and webp_data to local variables - Narrow variable scope for anim_info - Simplify redundant loop-wrap boundary checks - Split long AVOption line
Based on an initial patch by Peter Xia <[email protected]> Signed-off-by: heipa <[email protected]> --- libavcodec/libwebpdec.c | 38 ++++++++++++-------------------------- 1 file changed, 12 insertions(+), 26 deletions(-) diff --git a/libavcodec/libwebpdec.c b/libavcodec/libwebpdec.c index 8f0b687..b19d5b0 100644 --- a/libavcodec/libwebpdec.c +++ b/libavcodec/libwebpdec.c @@ -28,7 +28,6 @@ #include "avcodec.h" #include "codec_internal.h" #include "decode.h" -#include "libavutil/avassert.h" #include "libavutil/imgutils.h" #include "libavutil/opt.h" @@ -46,16 +45,12 @@ typedef struct AnimatedWebPContext { WebPAnimDecoderOptions dec_options; /**< decoder configuration options */ WebPAnimDecoder *dec; /**< libwebp animation decoder instance */ AVBufferRef *file_content; /**< reference to the input packet buffer */ - WebPData webp_data; /**< libwebp data wrapper for the input */ uint32_t loop_count; /**< effective loop count to play */ uint32_t loop_sent; /**< number of completed loops */ - uint32_t frame_count; /**< total frames in the animation */ uint32_t frame_sent; /**< frames output so far in current loop */ int prev_timestamp_ms; /**< timestamp of the previous frame in ms */ int ignore_loop; /**< user option to ignore file loop setting */ int infinite_loop; /**< effective infinite loop mode */ - int file_has_infinite_loop; /**< loop_count == 0 in the source file */ - int first_frame_pts; /**< PTS of the first frame for duration calc */ int64_t timestamp_offset; /**< accumulated offset across loop restarts */ } AnimatedWebPContext; @@ -85,8 +80,6 @@ static av_cold int libwebp_decode_init(AVCodecContext *avctx) s->frame_sent = 0; s->prev_timestamp_ms = 0; s->infinite_loop = 0; - s->file_has_infinite_loop = 0; - s->first_frame_pts = -1; s->timestamp_offset = 0; avctx->pix_fmt = AV_PIX_FMT_RGBA; @@ -116,12 +109,15 @@ static int libwebp_decode_frame(AVCodecContext *avctx, AVFrame *p, int *got_frame, AVPacket *avpkt) { AnimatedWebPContext *s = avctx->priv_data; - WebPAnimInfo anim_info; uint8_t *frame_rgba; int timestamp_ms; int ret; if (!s->dec) { + WebPAnimInfo anim_info; + WebPData webp_data; + int file_has_infinite_loop; + if (!avpkt || avpkt->size <= 0) return AVERROR(EINVAL); @@ -129,10 +125,10 @@ static int libwebp_decode_frame(AVCodecContext *avctx, AVFrame *p, if (!s->file_content) return AVERROR(ENOMEM); - s->webp_data.bytes = s->file_content->data; - s->webp_data.size = s->file_content->size; + webp_data.bytes = s->file_content->data; + webp_data.size = s->file_content->size; - s->dec = WebPAnimDecoderNew(&s->webp_data, &s->dec_options); + s->dec = WebPAnimDecoderNew(&webp_data, &s->dec_options); if (!s->dec) { av_log(avctx, AV_LOG_ERROR, "Error creating WebPAnimDecoder.\n"); av_buffer_unref(&s->file_content); @@ -148,10 +144,9 @@ static int libwebp_decode_frame(AVCodecContext *avctx, AVFrame *p, } s->loop_count = anim_info.loop_count; - s->frame_count = anim_info.frame_count; - s->file_has_infinite_loop = (anim_info.loop_count == 0); - s->infinite_loop = s->file_has_infinite_loop && !s->ignore_loop; - if (s->file_has_infinite_loop && s->ignore_loop) + file_has_infinite_loop = (anim_info.loop_count == 0); + s->infinite_loop = file_has_infinite_loop && !s->ignore_loop; + if (file_has_infinite_loop && s->ignore_loop) s->loop_count = 1; av_log(avctx, AV_LOG_DEBUG, @@ -165,10 +160,6 @@ static int libwebp_decode_frame(AVCodecContext *avctx, AVFrame *p, avctx->coded_height = anim_info.canvas_height; } else if (!avpkt || avpkt->size <= 0) { if (!WebPAnimDecoderHasMoreFrames(s->dec)) { - if (!s->infinite_loop && s->loop_sent >= s->loop_count) { - *got_frame = 0; - return 0; - } s->timestamp_offset += s->prev_timestamp_ms; s->loop_sent++; if (!s->infinite_loop && s->loop_sent >= s->loop_count) { @@ -178,7 +169,6 @@ static int libwebp_decode_frame(AVCodecContext *avctx, AVFrame *p, WebPAnimDecoderReset(s->dec); s->frame_sent = 0; s->prev_timestamp_ms = 0; - s->first_frame_pts = -1; av_log(avctx, AV_LOG_DEBUG, "Loop %u/%u (flush)\n", s->loop_sent + 1, s->infinite_loop ? 0 : s->loop_count); } @@ -194,7 +184,6 @@ static int libwebp_decode_frame(AVCodecContext *avctx, AVFrame *p, WebPAnimDecoderReset(s->dec); s->frame_sent = 0; s->prev_timestamp_ms = 0; - s->first_frame_pts = -1; av_log(avctx, AV_LOG_DEBUG, "Loop %u/%u\n", s->loop_sent + 1, s->infinite_loop ? 0 : s->loop_count); } @@ -222,9 +211,6 @@ static int libwebp_decode_frame(AVCodecContext *avctx, AVFrame *p, p->pict_type = AV_PICTURE_TYPE_I; p->flags |= AV_FRAME_FLAG_KEY; - if (s->first_frame_pts < 0) - s->first_frame_pts = timestamp_ms; - if (s->frame_sent > 0) p->duration = timestamp_ms - s->prev_timestamp_ms; @@ -288,13 +274,13 @@ static void libwebp_decode_flush(AVCodecContext *avctx) s->loop_sent = 0; s->frame_sent = 0; s->prev_timestamp_ms = 0; - s->first_frame_pts = -1; s->timestamp_offset = 0; } } static const AVOption options[] = { - { "ignore_loop", "ignore loop setting", offsetof(AnimatedWebPContext, ignore_loop), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, AV_OPT_FLAG_DECODING_PARAM }, + { "ignore_loop", "ignore loop setting", offsetof(AnimatedWebPContext, ignore_loop), + AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, AV_OPT_FLAG_DECODING_PARAM }, { NULL }, }; -- 2.43.0 _______________________________________________ ffmpeg-devel mailing list -- [email protected] To unsubscribe send an email to [email protected]
