]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/bink.c
avformat/avio: Add Metacube support
[ffmpeg] / libavcodec / bink.c
index 9fdfa373959e036f6e2bfdb2bfd2ee2c7de2bee0..36d1ab6c0a9472136e88d725056d9d831f229305 100644 (file)
@@ -23,6 +23,7 @@
 #include "libavutil/attributes.h"
 #include "libavutil/imgutils.h"
 #include "libavutil/internal.h"
+#include "libavutil/mem_internal.h"
 
 #define BITSTREAM_READER_LE
 #include "avcodec.h"
@@ -114,7 +115,7 @@ typedef struct Bundle {
 typedef struct BinkContext {
     AVCodecContext *avctx;
     BlockDSPContext bdsp;
-    HpelDSPContext hdsp;
+    op_pixels_func put_pixels_tab;
     BinkDSPContext binkdsp;
     AVFrame        *last;
     int            version;              ///< internal Bink file version
@@ -927,7 +928,7 @@ static int binkb_decode_plane(BinkContext *c, AVFrame *frame, GetBitContext *gb,
                 if (ref < ref_start || ref + 8*stride > ref_end) {
                     av_log(c->avctx, AV_LOG_WARNING, "Reference block is out of bounds\n");
                 } else if (ref + 8*stride < dst || ref >= dst + 8*stride) {
-                    c->hdsp.put_pixels_tab[1][0](dst, ref, stride, 8);
+                    c->put_pixels_tab(dst, ref, stride, 8);
                 } else {
                     put_pixels8x8_overlapped(dst, ref, stride);
                 }
@@ -943,7 +944,7 @@ static int binkb_decode_plane(BinkContext *c, AVFrame *frame, GetBitContext *gb,
                 if (ref < ref_start || ref + 8 * stride > ref_end) {
                     av_log(c->avctx, AV_LOG_WARNING, "Reference block is out of bounds\n");
                 } else if (ref + 8*stride < dst || ref >= dst + 8*stride) {
-                    c->hdsp.put_pixels_tab[1][0](dst, ref, stride, 8);
+                    c->put_pixels_tab(dst, ref, stride, 8);
                 } else {
                     put_pixels8x8_overlapped(dst, ref, stride);
                 }
@@ -975,7 +976,7 @@ static int binkb_decode_plane(BinkContext *c, AVFrame *frame, GetBitContext *gb,
                 if (ref < ref_start || ref + 8 * stride > ref_end) {
                     av_log(c->avctx, AV_LOG_WARNING, "Reference block is out of bounds\n");
                 } else if (ref + 8*stride < dst || ref >= dst + 8*stride) {
-                    c->hdsp.put_pixels_tab[1][0](dst, ref, stride, 8);
+                    c->put_pixels_tab(dst, ref, stride, 8);
                 } else {
                     put_pixels8x8_overlapped(dst, ref, stride);
                 }
@@ -1010,7 +1011,7 @@ static int bink_put_pixels(BinkContext *c,
                xoff, yoff);
         return AVERROR_INVALIDDATA;
     }
-    c->hdsp.put_pixels_tab[1][0](dst, ref, stride, 8);
+    c->put_pixels_tab(dst, ref, stride, 8);
 
     return 0;
 }
@@ -1093,7 +1094,7 @@ static int bink_decode_plane(BinkContext *c, AVFrame *frame, GetBitContext *gb,
             }
             switch (blk) {
             case SKIP_BLOCK:
-                c->hdsp.put_pixels_tab[1][0](dst, prev, stride, 8);
+                c->put_pixels_tab(dst, prev, stride, 8);
                 break;
             case SCALED_BLOCK:
                 blk = get_value(c, BINK_SRC_SUB_BLOCK_TYPES);
@@ -1345,6 +1346,7 @@ static av_cold int decode_init(AVCodecContext *avctx)
     BinkContext * const c = avctx->priv_data;
     static VLC_TYPE table[16 * 128][2];
     static int binkb_initialised = 0;
+    HpelDSPContext hdsp;
     int i, ret;
     int flags;
 
@@ -1379,7 +1381,8 @@ static av_cold int decode_init(AVCodecContext *avctx)
     avctx->color_range = c->version == 'k' ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG;
 
     ff_blockdsp_init(&c->bdsp, avctx);
-    ff_hpeldsp_init(&c->hdsp, avctx->flags);
+    ff_hpeldsp_init(&hdsp, avctx->flags);
+    c->put_pixels_tab = hdsp.put_pixels_tab[1][0];
     ff_binkdsp_init(&c->binkdsp);
 
     if ((ret = init_bundles(c)) < 0)
@@ -1412,7 +1415,7 @@ static void flush(AVCodecContext *avctx)
     c->frame_num = 0;
 }
 
-AVCodec ff_bink_decoder = {
+const AVCodec ff_bink_decoder = {
     .name           = "binkvideo",
     .long_name      = NULL_IF_CONFIG_SMALL("Bink video"),
     .type           = AVMEDIA_TYPE_VIDEO,