]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/truemotion2.c
Use INIT_VLC_USE_STATIC and not its value "1".
[ffmpeg] / libavcodec / truemotion2.c
index 4a4ea7b41654e21550fca7a6295403f74cf7cbc3..b3289162ee0f943885fe01122345512cbdf1176f 100644 (file)
@@ -20,7 +20,7 @@
  */
 
 /**
- * @file truemotion2.c
+ * @file libavcodec/truemotion2.c
  * Duck TrueMotion2 decoder.
  */
 
@@ -232,7 +232,7 @@ static inline int tm2_read_header(TM2Context *ctx, const uint8_t *buf)
         return -1;
     }
 
-    return (buf - obuf);
+    return buf - obuf;
 }
 
 static int tm2_read_deltas(TM2Context *ctx, int stream_id) {
@@ -757,54 +757,50 @@ static int tm2_decode_blocks(TM2Context *ctx, AVFrame *p)
     return keyframe;
 }
 
+static const int tm2_stream_order[TM2_NUM_STREAMS] = {
+    TM2_C_HI, TM2_C_LO, TM2_L_HI, TM2_L_LO, TM2_UPD, TM2_MOT, TM2_TYPE
+};
+
 static int decode_frame(AVCodecContext *avctx,
                         void *data, int *data_size,
-                        const uint8_t *buf, int buf_size)
+                        AVPacket *avpkt)
 {
+    const uint8_t *buf = avpkt->data;
+    int buf_size = avpkt->size;
     TM2Context * const l = avctx->priv_data;
     AVFrame * const p= (AVFrame*)&l->pic;
-    int skip, t;
+    int i, skip, t;
+    uint8_t *swbuf;
 
+    swbuf = av_malloc(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
+    if(!swbuf){
+        av_log(avctx, AV_LOG_ERROR, "Cannot allocate temporary buffer\n");
+        return -1;
+    }
     p->reference = 1;
     p->buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE | FF_BUFFER_HINTS_REUSABLE;
     if(avctx->reget_buffer(avctx, p) < 0){
         av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
+        av_free(swbuf);
         return -1;
     }
 
-    l->dsp.bswap_buf((uint32_t*)buf, (const uint32_t*)buf, buf_size >> 2); //FIXME SERIOUS BUG
-    skip = tm2_read_header(l, buf);
+    l->dsp.bswap_buf((uint32_t*)swbuf, (const uint32_t*)buf, buf_size >> 2);
+    skip = tm2_read_header(l, swbuf);
 
-    if(skip == -1)
+    if(skip == -1){
+        av_free(swbuf);
         return -1;
+    }
 
-    t = tm2_read_stream(l, buf + skip, TM2_C_HI);
-    if(t == -1)
-        return -1;
-    skip += t;
-    t = tm2_read_stream(l, buf + skip, TM2_C_LO);
-    if(t == -1)
-        return -1;
-    skip += t;
-    t = tm2_read_stream(l, buf + skip, TM2_L_HI);
-    if(t == -1)
-        return -1;
-    skip += t;
-    t = tm2_read_stream(l, buf + skip, TM2_L_LO);
-    if(t == -1)
-        return -1;
-    skip += t;
-    t = tm2_read_stream(l, buf + skip, TM2_UPD);
-    if(t == -1)
-        return -1;
-    skip += t;
-    t = tm2_read_stream(l, buf + skip, TM2_MOT);
-    if(t == -1)
-        return -1;
-    skip += t;
-    t = tm2_read_stream(l, buf + skip, TM2_TYPE);
-    if(t == -1)
-        return -1;
+    for(i = 0; i < TM2_NUM_STREAMS; i++){
+        t = tm2_read_stream(l, swbuf + skip, tm2_stream_order[i]);
+        if(t == -1){
+            av_free(swbuf);
+            return -1;
+        }
+        skip += t;
+    }
     p->key_frame = tm2_decode_blocks(l, p);
     if(p->key_frame)
         p->pict_type = FF_I_TYPE;
@@ -814,11 +810,12 @@ static int decode_frame(AVCodecContext *avctx,
     l->cur = !l->cur;
     *data_size = sizeof(AVFrame);
     *(AVFrame*)data = l->pic;
+    av_free(swbuf);
 
     return buf_size;
 }
 
-static int decode_init(AVCodecContext *avctx){
+static av_cold int decode_init(AVCodecContext *avctx){
     TM2Context * const l = avctx->priv_data;
     int i;
 
@@ -855,7 +852,7 @@ static int decode_init(AVCodecContext *avctx){
     return 0;
 }
 
-static int decode_end(AVCodecContext *avctx){
+static av_cold int decode_end(AVCodecContext *avctx){
     TM2Context * const l = avctx->priv_data;
     int i;
 
@@ -887,4 +884,5 @@ AVCodec truemotion2_decoder = {
     decode_end,
     decode_frame,
     CODEC_CAP_DR1,
+    .long_name = NULL_IF_CONFIG_SMALL("Duck TrueMotion 2.0"),
 };