Use reget buffer instead of copying from prev frame
authorRoberto Togni <r_togni@tiscali.it>
Sun, 25 Jan 2004 16:43:09 +0000 (16:43 +0000)
committerRoberto Togni <r_togni@tiscali.it>
Sun, 25 Jan 2004 16:43:09 +0000 (16:43 +0000)
Added buffer hints, replaced printf with av_log

Originally committed as revision 2723 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/flicvideo.c

index b5cd366..248fc84 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * FLI/FLC Animation Video Decoder
- * Copyright (C) 2003 the ffmpeg project
+ * Copyright (C) 2003, 2004 the ffmpeg project
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -60,7 +60,6 @@
 typedef struct FlicDecodeContext {
     AVCodecContext *avctx;
     AVFrame frame;
-    AVFrame prev_frame;
 
     unsigned int palette[256];
     int new_palette;
@@ -82,11 +81,11 @@ static int flic_decode_init(AVCodecContext *avctx)
     } else if (s->avctx->extradata_size == 128) {
         s->fli_type = LE_16(&fli_header[4]);
     } else {
-        printf (" FLI video: expected extradata of 12 or 128 bytes\n");
+        av_log(avctx, AV_LOG_ERROR, "Expected extradata of 12 or 128 bytes\n");
         return -1;
     }
 
-    s->frame.data[0] = s->prev_frame.data[0] = NULL;
+    s->frame.data[0] = NULL;
     s->new_palette = 0;
 
     return 0;
@@ -126,18 +125,16 @@ static int flic_decode_frame(AVCodecContext *avctx,
     signed char byte_run;
     int pixel_skip;
     int pixel_countdown;
-    int height_countdown;
     unsigned char *pixels;
-    unsigned char *prev_pixels;
 
     s->frame.reference = 1;
-    if (avctx->get_buffer(avctx, &s->frame) < 0) {
-        fprintf(stderr, "  FLI: get_buffer() failed\n");
+    s->frame.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE | FF_BUFFER_HINTS_REUSABLE;
+    if (avctx->reget_buffer(avctx, &s->frame) < 0) {
+        av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
         return -1;
     }
 
     pixels = s->frame.data[0];
-    prev_pixels = s->prev_frame.data[0];
 
     frame_size = LE_32(&buf[stream_ptr]);
     stream_ptr += 6;  /* skip the magic number */
@@ -146,11 +143,6 @@ static int flic_decode_frame(AVCodecContext *avctx,
 
     frame_size -= 16;
 
-    /* if there is no data, copy previous frame */
-    if (frame_size == 0) {
-        memcpy(pixels, prev_pixels, s->frame.linesize[0] * s->avctx->height);
-    }
-
     /* iterate through the chunks */
     while ((frame_size > 0) && (num_chunks > 0)) {
         chunk_size = LE_32(&buf[stream_ptr]);
@@ -210,7 +202,6 @@ static int flic_decode_frame(AVCodecContext *avctx,
 
         case FLI_DELTA:
             y_ptr = 0;
-            height_countdown = s->avctx->height;
             compressed_lines = LE_16(&buf[stream_ptr]);
             stream_ptr += 2;
             while (compressed_lines > 0) {
@@ -218,25 +209,14 @@ static int flic_decode_frame(AVCodecContext *avctx,
                 stream_ptr += 2;
                 if (line_packets < 0) {
                     line_packets = -line_packets;
-                    /* height_countdown was already decremented once on
-                     * this iteration */
-                    height_countdown -= line_packets;
-                    /* copy the skipped lines from the previous frame */
-                    while (line_packets--) {
-                        memcpy(&pixels[y_ptr], &prev_pixels[y_ptr], 
-                            s->avctx->width);
-                        y_ptr += s->frame.linesize[0];
-                    }
+                    y_ptr += line_packets * s->frame.linesize[0];
                 } else {
-                    height_countdown--;
                     compressed_lines--;
                     pixel_ptr = y_ptr;
                     pixel_countdown = s->avctx->width;
                     for (i = 0; i < line_packets; i++) {
                         /* account for the skip bytes */
                         pixel_skip = buf[stream_ptr++];
-                        memcpy(&pixels[pixel_ptr], &prev_pixels[pixel_ptr],
-                            pixel_skip);
                         pixel_ptr += pixel_skip;
                         pixel_countdown -= pixel_skip;
                         byte_run = buf[stream_ptr++];
@@ -256,36 +236,17 @@ static int flic_decode_frame(AVCodecContext *avctx,
                         }
                     }
 
-                    /* copy the remaining pixels in the line from the
-                     * previous frame */
-                    memcpy(&pixels[pixel_ptr], &prev_pixels[pixel_ptr],
-                        pixel_countdown);
-
                     y_ptr += s->frame.linesize[0];
                 }
             }
-
-            /* copy the remainder of the lines from the previous frame */
-            while (height_countdown--) {
-                memcpy(&pixels[y_ptr], &prev_pixels[y_ptr], s->avctx->width);
-                y_ptr += s->frame.linesize[0];
-            }
             break;
 
         case FLI_LC:
             /* line compressed */
-            height_countdown = s->avctx->height;
             starting_line = LE_16(&buf[stream_ptr]);
             stream_ptr += 2;
-
-            /* copy from the previous frame all of the lines prior to the
-             * starting line */
             y_ptr = 0;
-            height_countdown -= starting_line;
-            while (starting_line--) {
-                memcpy(&pixels[y_ptr], &prev_pixels[y_ptr], s->avctx->width);
-                y_ptr += s->frame.linesize[0];
-            }
+            y_ptr += starting_line * s->frame.linesize[0];
 
             compressed_lines = LE_16(&buf[stream_ptr]);
             stream_ptr += 2;
@@ -297,8 +258,6 @@ static int flic_decode_frame(AVCodecContext *avctx,
                     for (i = 0; i < line_packets; i++) {
                         /* account for the skip bytes */
                         pixel_skip = buf[stream_ptr++];
-                        memcpy(&pixels[pixel_ptr],
-                            &prev_pixels[pixel_ptr], pixel_skip);
                         pixel_ptr += pixel_skip;
                         pixel_countdown -= pixel_skip;
                         byte_run = buf[stream_ptr++];
@@ -317,19 +276,8 @@ static int flic_decode_frame(AVCodecContext *avctx,
                     }
                 }
 
-                /* copy the remainder of the line from the previous frame */
-                memcpy(&pixels[pixel_ptr], &prev_pixels[pixel_ptr],
-                    pixel_countdown);
-
                 y_ptr += s->frame.linesize[0];
                 compressed_lines--;
-                height_countdown--;
-            }
-
-            /* copy the remainder of the lines from the previous frame */
-            while (height_countdown--) {
-                memcpy(&pixels[y_ptr], &prev_pixels[y_ptr], s->avctx->width);
-                y_ptr += s->frame.linesize[0];
             }
             break;
 
@@ -357,8 +305,8 @@ static int flic_decode_frame(AVCodecContext *avctx,
                             pixels[pixel_ptr++] = palette_idx1;
                             pixel_countdown--;
                             if (pixel_countdown < 0)
-                                printf ("fli warning: pixel_countdown < 0 (%d)\n",
-                                    pixel_countdown);
+                                av_log(avctx, AV_LOG_ERROR, "pixel_countdown < 0 (%d)\n",
+                                       pixel_countdown);
                         }
                     } else {  /* copy bytes if byte_run < 0 */
                         byte_run = -byte_run;
@@ -367,8 +315,8 @@ static int flic_decode_frame(AVCodecContext *avctx,
                             pixels[pixel_ptr++] = palette_idx1;
                             pixel_countdown--;
                             if (pixel_countdown < 0)
-                                printf ("fli warning: pixel_countdown < 0 (%d)\n",
-                                    pixel_countdown);
+                                av_log(avctx, AV_LOG_ERROR, "pixel_countdown < 0 (%d)\n",
+                                       pixel_countdown);
                         }
                     }
                 }
@@ -378,13 +326,10 @@ static int flic_decode_frame(AVCodecContext *avctx,
             break;
 
         case FLI_COPY:
-            /* copy the chunk (uncompressed frame) to the ghost image and
-             * schedule the whole frame to be updated */
+            /* copy the chunk (uncompressed frame) */
             if (chunk_size - 6 > s->avctx->width * s->avctx->height) {
-                printf(
-                "FLI: in chunk FLI_COPY : source data (%d bytes) bigger than" \
-                " image, skipping chunk\n",
-                chunk_size - 6);
+                av_log(avctx, AV_LOG_ERROR, "In chunk FLI_COPY : source data (%d bytes) " \
+                       "bigger than image, skipping chunk\n", chunk_size - 6);
                 stream_ptr += chunk_size - 6;
             } else {
                 for (y_ptr = 0; y_ptr < s->frame.linesize[0] * s->avctx->height;
@@ -402,7 +347,7 @@ static int flic_decode_frame(AVCodecContext *avctx,
             break;
 
         default:
-            printf ("FLI: Unrecognized chunk type: %d\n", chunk_type);
+            av_log(avctx, AV_LOG_ERROR, "Unrecognized chunk type: %d\n", chunk_type);
             break;
         }
 
@@ -413,9 +358,8 @@ static int flic_decode_frame(AVCodecContext *avctx,
     /* by the end of the chunk, the stream ptr should equal the frame
      * size (minus 1, possibly); if it doesn't, issue a warning */
     if ((stream_ptr != buf_size) && (stream_ptr != buf_size - 1))
-        printf ("  warning: processed FLI chunk where chunk size = %d\n" \
-                "    and final chunk ptr = %d\n",
-            buf_size, stream_ptr);
+        av_log(avctx, AV_LOG_ERROR, "Processed FLI chunk where chunk size = %d " \
+               "and final chunk ptr = %d\n", buf_size, stream_ptr);
 
     /* make the palette available on the way out */
 //    if (s->new_palette) {
@@ -425,12 +369,6 @@ static int flic_decode_frame(AVCodecContext *avctx,
         s->new_palette = 0;
     }
 
-    if (s->prev_frame.data[0])
-        avctx->release_buffer(avctx, &s->prev_frame);
-
-    /* shuffle frames */
-    s->prev_frame = s->frame;
-
     *data_size=sizeof(AVFrame);
     *(AVFrame*)data = s->frame;
 
@@ -441,8 +379,8 @@ static int flic_decode_end(AVCodecContext *avctx)
 {
     FlicDecodeContext *s = avctx->priv_data;
 
-    if (s->prev_frame.data[0])
-        avctx->release_buffer(avctx, &s->prev_frame);
+    if (s->frame.data[0])
+        avctx->release_buffer(avctx, &s->frame);
 
     return 0;
 }