]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/vima.c
Merge commit '507b1e454cf9953da3e18f33c9bd1fca78c97cb5'
[ffmpeg] / libavcodec / vima.c
index 705839e6b1867453927179c2070da44a960b3723..0513ee2f54698ff06d6348c10e10f70ec34aeba2 100644 (file)
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+/**
+ * @file
+ * LucasArts VIMA audio decoder
+ * @author Paul B Mahol
+ */
+
 #include "libavutil/channel_layout.h"
 #include "avcodec.h"
 #include "get_bits.h"
 #include "internal.h"
 #include "adpcm_data.h"
 
-typedef struct {
-    uint16_t    predict_table[5786 * 2];
-} VimaContext;
+static int predict_table_init = 0;
+static uint16_t predict_table[5786 * 2];
 
 static const uint8_t size_table[] =
 {
@@ -103,8 +108,12 @@ static const int8_t* const step_index_tables[] =
 
 static av_cold int decode_init(AVCodecContext *avctx)
 {
-    VimaContext *vima = avctx->priv_data;
-    int         start_pos;
+    int start_pos;
+
+    avctx->sample_fmt = AV_SAMPLE_FMT_S16;
+
+    if (predict_table_init)
+        return 0;
 
     for (start_pos = 0; start_pos < 64; start_pos++) {
         unsigned int dest_pos, table_pos;
@@ -120,11 +129,10 @@ static av_cold int decode_init(AVCodecContext *avctx)
                     put += table_value;
                 table_value >>= 1;
             }
-            vima->predict_table[dest_pos] = put;
+            predict_table[dest_pos] = put;
         }
     }
-
-    avctx->sample_fmt  = AV_SAMPLE_FMT_S16;
+    predict_table_init = 1;
 
     return 0;
 }
@@ -133,7 +141,6 @@ static int decode_frame(AVCodecContext *avctx, void *data,
                         int *got_frame_ptr, AVPacket *pkt)
 {
     GetBitContext  gb;
-    VimaContext    *vima = avctx->priv_data;
     AVFrame        *frame = data;
     int16_t        pcm_data[2];
     uint32_t       samples;
@@ -200,7 +207,7 @@ static int decode_frame(AVCodecContext *avctx, void *data,
 
                 predict_index = (lookup << (7 - lookup_size)) | (step_index << 6);
                 predict_index = av_clip(predict_index, 0, 5785);
-                diff          = vima->predict_table[predict_index];
+                diff          = predict_table[predict_index];
                 if (lookup)
                     diff += ff_adpcm_step_table[step_index] >> (lookup_size - 1);
                 if (highbit)
@@ -225,7 +232,6 @@ AVCodec ff_vima_decoder = {
     .name           = "vima",
     .type           = AVMEDIA_TYPE_AUDIO,
     .id             = AV_CODEC_ID_VIMA,
-    .priv_data_size = sizeof(VimaContext),
     .init           = decode_init,
     .decode         = decode_frame,
     .capabilities   = CODEC_CAP_DR1,