From: heipa <[email protected]>

- 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]

Reply via email to