]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/truemotion1.c
Doxygenate put_bits_count() documentation.
[ffmpeg] / libavcodec / truemotion1.c
index 281ae83d534f436c58ebf92e1d2ef4ad5b7e4988..303dfb5c15fc5f46716697397ba13f47d97bb0b1 100644 (file)
@@ -20,7 +20,7 @@
  */
 
 /**
- * @file truemotion1.c
+ * @file libavcodec/truemotion1.c
  * Duck TrueMotion v1 Video Decoder by
  * Alex Beregszaszi and
  * Mike Melanson (melanson@pcisys.net)
 typedef struct TrueMotion1Context {
     AVCodecContext *avctx;
     AVFrame frame;
-    AVFrame prev_frame;
 
-    uint8_t *buf;
+    const uint8_t *buf;
     int size;
 
-    uint8_t *mb_change_bits;
+    const uint8_t *mb_change_bits;
     int mb_change_bits_row_size;
-    uint8_t *index_stream;
+    const uint8_t *index_stream;
     int index_stream_size;
 
     int flags;
@@ -118,7 +117,7 @@ typedef struct comp_types {
 } comp_types;
 
 /* { valid for metatype }, algorithm, num of deltas, vert res, horiz res */
-static comp_types compression_types[17] = {
+static const comp_types compression_types[17] = {
     { ALGO_NOP,    0, 0, 0 },
 
     { ALGO_RGB16V, 4, 4, BLOCK_4x4 },
@@ -177,7 +176,7 @@ static int make_ydt15_entry(int p1, int p2, int16_t *ydt)
     lo += (lo << 5) + (lo << 10);
     hi = ydt[p2];
     hi += (hi << 5) + (hi << 10);
-    return ((lo + (hi << 16)) << 1);
+    return (lo + (hi << 16)) << 1;
 }
 
 #ifdef WORDS_BIGENDIAN
@@ -191,7 +190,7 @@ static int make_cdt15_entry(int p1, int p2, int16_t *cdt)
     b = cdt[p2];
     r = cdt[p1] << 10;
     lo = b + r;
-    return ((lo + (lo << 16)) << 1);
+    return (lo + (lo << 16)) << 1;
 }
 
 #ifdef WORDS_BIGENDIAN
@@ -206,7 +205,7 @@ static int make_ydt16_entry(int p1, int p2, int16_t *ydt)
     lo += (lo << 6) + (lo << 11);
     hi = ydt[p2];
     hi += (hi << 6) + (hi << 11);
-    return ((lo + (hi << 16)) << 1);
+    return (lo + (hi << 16)) << 1;
 }
 
 #ifdef WORDS_BIGENDIAN
@@ -220,7 +219,7 @@ static int make_cdt16_entry(int p1, int p2, int16_t *cdt)
     b = cdt[p2];
     r = cdt[p1] << 11;
     lo = b + r;
-    return ((lo + (lo << 16)) << 1);
+    return (lo + (lo << 16)) << 1;
 }
 
 #ifdef WORDS_BIGENDIAN
@@ -233,7 +232,7 @@ static int make_ydt24_entry(int p1, int p2, int16_t *ydt)
 
     lo = ydt[p1];
     hi = ydt[p2];
-    return ((lo + (hi << 8) + (hi << 16)) << 1);
+    return (lo + (hi << 8) + (hi << 16)) << 1;
 }
 
 #ifdef WORDS_BIGENDIAN
@@ -246,7 +245,7 @@ static int make_cdt24_entry(int p1, int p2, int16_t *cdt)
 
     b = cdt[p2];
     r = cdt[p1]<<16;
-    return ((b+r) << 1);
+    return (b+r) << 1;
 }
 
 static void gen_vector_table15(TrueMotion1Context *s, const uint8_t *sel_vector_table)
@@ -394,7 +393,7 @@ static int truemotion1_decode_header(TrueMotion1Context *s)
         }
     }
 
-    if (header.compression > 17) {
+    if (header.compression >= 17) {
         av_log(s->avctx, AV_LOG_ERROR, "invalid compression type (%d)\n", header.compression);
         return -1;
     }
@@ -462,7 +461,7 @@ static int truemotion1_decode_header(TrueMotion1Context *s)
     return header.header_size;
 }
 
-static int truemotion1_decode_init(AVCodecContext *avctx)
+static av_cold int truemotion1_decode_init(AVCodecContext *avctx)
 {
     TrueMotion1Context *s = avctx->priv_data;
 
@@ -474,7 +473,7 @@ static int truemotion1_decode_init(AVCodecContext *avctx)
 //    else
 //        avctx->pix_fmt = PIX_FMT_RGB555;
 
-    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 */
@@ -590,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)
 {
@@ -601,13 +599,11 @@ 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 */
-    unsigned char *mb_change_bits = s->mb_change_bits;
+    const unsigned char *mb_change_bits = s->mb_change_bits;
     unsigned char mb_change_byte;
     unsigned char mb_change_byte_mask;
     int mb_change_index;
@@ -626,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++];
@@ -695,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++;
 
@@ -721,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];
     }
 }
 
@@ -733,13 +725,11 @@ 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 */
-    unsigned char *mb_change_bits = s->mb_change_bits;
+    const unsigned char *mb_change_bits = s->mb_change_bits;
     unsigned char mb_change_byte;
     unsigned char mb_change_byte_mask;
     int mb_change_index;
@@ -758,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++];
@@ -827,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++;
 
@@ -853,15 +840,16 @@ 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];
     }
 }
 
 
 static int truemotion1_decode_frame(AVCodecContext *avctx,
                                     void *data, int *data_size,
-                                    uint8_t *buf, int buf_size)
+                                    AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     TrueMotion1Context *s = avctx->priv_data;
 
     s->buf = buf;
@@ -871,28 +859,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;
 
@@ -900,13 +879,12 @@ static int truemotion1_decode_frame(AVCodecContext *avctx,
     return buf_size;
 }
 
-static int truemotion1_decode_end(AVCodecContext *avctx)
+static av_cold int truemotion1_decode_end(AVCodecContext *avctx)
 {
     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);
 
@@ -923,4 +901,5 @@ AVCodec truemotion1_decoder = {
     truemotion1_decode_end,
     truemotion1_decode_frame,
     CODEC_CAP_DR1,
+    .long_name = NULL_IF_CONFIG_SMALL("Duck TrueMotion 1.0"),
 };