]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/truemotion1.c
const
[ffmpeg] / libavcodec / truemotion1.c
index 4b7aa976dfb33d8c0b9e28b2d987c86b882fe662..be95dd294b255843c11aaa2ccabfe0bc7ea97fcd 100644 (file)
@@ -22,7 +22,7 @@
 /**
  * @file truemotion1.c
  * Duck TrueMotion v1 Video Decoder by
- * Alex Beregszaszi (alex@fsn.hu) and
+ * Alex Beregszaszi and
  * Mike Melanson (melanson@pcisys.net)
  *
  * The TrueMotion v1 decoder presently only decodes 16-bit TM1 data and
@@ -34,7 +34,6 @@
 #include <string.h>
 #include <unistd.h>
 
-#include "common.h"
 #include "avcodec.h"
 #include "dsputil.h"
 
@@ -43,7 +42,6 @@
 typedef struct TrueMotion1Context {
     AVCodecContext *avctx;
     AVFrame frame;
-    AVFrame prev_frame;
 
     uint8_t *buf;
     int size;
@@ -374,10 +372,15 @@ static int truemotion1_decode_header(TrueMotion1Context *s)
 
     if (s->flags & FLAG_SPRITE) {
         av_log(s->avctx, AV_LOG_INFO, "SPRITE frame found, please report the sample to the developers\n");
+        /* FIXME header.width, height, xoffset and yoffset aren't initialized */
+#if 0
         s->w = header.width;
         s->h = header.height;
         s->x = header.xoffset;
         s->y = header.yoffset;
+#else
+        return -1;
+#endif
     } else {
         s->w = header.xsize;
         s->h = header.ysize;
@@ -412,9 +415,9 @@ static int truemotion1_decode_header(TrueMotion1Context *s)
 
     // FIXME: where to place this ?!?!
     if (compression_types[header.compression].algorithm == ALGO_RGB24H)
-        s->avctx->pix_fmt = PIX_FMT_RGBA32;
+        s->avctx->pix_fmt = PIX_FMT_RGB32;
     else
-        s->avctx->pix_fmt = PIX_FMT_RGB555; // RGB565 is supported aswell
+        s->avctx->pix_fmt = PIX_FMT_RGB555; // RGB565 is supported as well
 
     if ((header.deltaset != s->last_deltaset) || (header.vectable != s->last_vectable))
     {
@@ -460,7 +463,7 @@ static int truemotion1_decode_header(TrueMotion1Context *s)
 
 static int truemotion1_decode_init(AVCodecContext *avctx)
 {
-    TrueMotion1Context *s = (TrueMotion1Context *)avctx->priv_data;
+    TrueMotion1Context *s = avctx->priv_data;
 
     s->avctx = avctx;
 
@@ -470,8 +473,7 @@ static int truemotion1_decode_init(AVCodecContext *avctx)
 //    else
 //        avctx->pix_fmt = PIX_FMT_RGB555;
 
-    avctx->has_b_frames = 0;
-    s->frame.data[0] = s->prev_frame.data[0] = NULL;
+    s->frame.data[0] = NULL;
 
     /* there is a vertical predictor for each pixel in a line; each vertical
      * predictor is 0 to start with */
@@ -587,8 +589,7 @@ hres,vres,i,i%vres (0 < i < 4)
 
 #define OUTPUT_PIXEL_PAIR() \
     *current_pixel_pair = *vert_pred + horiz_pred; \
-    *vert_pred++ = *current_pixel_pair++; \
-    prev_pixel_pair++;
+    *vert_pred++ = *current_pixel_pair++;
 
 static void truemotion1_decode_16bit(TrueMotion1Context *s)
 {
@@ -598,9 +599,7 @@ static void truemotion1_decode_16bit(TrueMotion1Context *s)
     unsigned int horiz_pred;
     unsigned int *vert_pred;
     unsigned int *current_pixel_pair;
-    unsigned int *prev_pixel_pair;
     unsigned char *current_line = s->frame.data[0];
-    unsigned char *prev_line = s->prev_frame.data[0];
     int keyframe = s->flags & FLAG_KEYFRAME;
 
     /* these variables are for managing the stream of macroblock change bits */
@@ -623,7 +622,6 @@ static void truemotion1_decode_16bit(TrueMotion1Context *s)
         /* re-init variables for the next line iteration */
         horiz_pred = 0;
         current_pixel_pair = (unsigned int *)current_line;
-        prev_pixel_pair = (unsigned int *)prev_line;
         vert_pred = s->vert_pred;
         mb_change_index = 0;
         mb_change_byte = mb_change_bits[mb_change_index++];
@@ -692,9 +690,7 @@ static void truemotion1_decode_16bit(TrueMotion1Context *s)
 
                 /* skip (copy) four pixels, but reassign the horizontal
                  * predictor */
-                *current_pixel_pair = *prev_pixel_pair++;
                 *vert_pred++ = *current_pixel_pair++;
-                *current_pixel_pair = *prev_pixel_pair++;
                 horiz_pred = *current_pixel_pair - *vert_pred;
                 *vert_pred++ = *current_pixel_pair++;
 
@@ -718,7 +714,6 @@ static void truemotion1_decode_16bit(TrueMotion1Context *s)
             mb_change_bits += s->mb_change_bits_row_size;
 
         current_line += s->frame.linesize[0];
-        prev_line += s->prev_frame.linesize[0];
     }
 }
 
@@ -730,9 +725,7 @@ static void truemotion1_decode_24bit(TrueMotion1Context *s)
     unsigned int horiz_pred;
     unsigned int *vert_pred;
     unsigned int *current_pixel_pair;
-    unsigned int *prev_pixel_pair;
     unsigned char *current_line = s->frame.data[0];
-    unsigned char *prev_line = s->prev_frame.data[0];
     int keyframe = s->flags & FLAG_KEYFRAME;
 
     /* these variables are for managing the stream of macroblock change bits */
@@ -755,7 +748,6 @@ static void truemotion1_decode_24bit(TrueMotion1Context *s)
         /* re-init variables for the next line iteration */
         horiz_pred = 0;
         current_pixel_pair = (unsigned int *)current_line;
-        prev_pixel_pair = (unsigned int *)prev_line;
         vert_pred = s->vert_pred;
         mb_change_index = 0;
         mb_change_byte = mb_change_bits[mb_change_index++];
@@ -824,9 +816,7 @@ static void truemotion1_decode_24bit(TrueMotion1Context *s)
 
                 /* skip (copy) four pixels, but reassign the horizontal
                  * predictor */
-                *current_pixel_pair = *prev_pixel_pair++;
                 *vert_pred++ = *current_pixel_pair++;
-                *current_pixel_pair = *prev_pixel_pair++;
                 horiz_pred = *current_pixel_pair - *vert_pred;
                 *vert_pred++ = *current_pixel_pair++;
 
@@ -850,7 +840,6 @@ static void truemotion1_decode_24bit(TrueMotion1Context *s)
             mb_change_bits += s->mb_change_bits_row_size;
 
         current_line += s->frame.linesize[0];
-        prev_line += s->prev_frame.linesize[0];
     }
 }
 
@@ -859,7 +848,7 @@ static int truemotion1_decode_frame(AVCodecContext *avctx,
                                     void *data, int *data_size,
                                     uint8_t *buf, int buf_size)
 {
-    TrueMotion1Context *s = (TrueMotion1Context *)avctx->priv_data;
+    TrueMotion1Context *s = avctx->priv_data;
 
     s->buf = buf;
     s->size = buf_size;
@@ -868,28 +857,19 @@ static int truemotion1_decode_frame(AVCodecContext *avctx,
         return -1;
 
     s->frame.reference = 1;
-    if (avctx->get_buffer(avctx, &s->frame) < 0) {
+    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(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
         return -1;
     }
 
-    /* check for a do-nothing frame and copy the previous frame */
-    if (compression_types[s->compression].algorithm == ALGO_NOP)
-    {
-        memcpy(s->frame.data[0], s->prev_frame.data[0],
-            s->frame.linesize[0] * s->avctx->height);
-    } else if (compression_types[s->compression].algorithm == ALGO_RGB24H) {
+    if (compression_types[s->compression].algorithm == ALGO_RGB24H) {
         truemotion1_decode_24bit(s);
-    } else {
+    } else if (compression_types[s->compression].algorithm != ALGO_NOP) {
         truemotion1_decode_16bit(s);
     }
 
-    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;
 
@@ -899,11 +879,10 @@ static int truemotion1_decode_frame(AVCodecContext *avctx,
 
 static int truemotion1_decode_end(AVCodecContext *avctx)
 {
-    TrueMotion1Context *s = (TrueMotion1Context *)avctx->priv_data;
+    TrueMotion1Context *s = avctx->priv_data;
 
-    /* release the last frame */
-    if (s->prev_frame.data[0])
-        avctx->release_buffer(avctx, &s->prev_frame);
+    if (s->frame.data[0])
+        avctx->release_buffer(avctx, &s->frame);
 
     av_free(s->vert_pred);