summaryrefslogtreecommitdiff
path: root/libavcodec/mss12.h
diff options
context:
space:
mode:
authorAlberto Delmás <adelmas@gmail.com>2012-08-24 17:45:57 +0200
committerKostya Shishkov <kostya.shishkov@gmail.com>2012-08-31 07:37:16 +0200
commitee769c6a7c1d4ec6560f5e5a6f457b770b10fb33 (patch)
treec1a3fc95ccfc0d84bfa9edfa22adc85cdcdbd6da /libavcodec/mss12.h
parentd96d6ba61888c6a97d9426ca80bf36f3812cac76 (diff)
MSS2 decoder
Signed-off-by: Kostya Shishkov <kostya.shishkov@gmail.com>
Diffstat (limited to 'libavcodec/mss12.h')
-rw-r--r--libavcodec/mss12.h70
1 files changed, 62 insertions, 8 deletions
diff --git a/libavcodec/mss12.h b/libavcodec/mss12.h
index 383d86c904..93d1f6146f 100644
--- a/libavcodec/mss12.h
+++ b/libavcodec/mss12.h
@@ -26,8 +26,10 @@
#ifndef AVCODEC_MSS12_H
#define AVCODEC_MSS12_H
+#include "libavutil/intreadwrite.h"
#include "avcodec.h"
#include "get_bits.h"
+#include "bytestream.h"
#define MODEL_MIN_SYMS 2
#define MODEL_MAX_SYMS 256
@@ -46,7 +48,10 @@ typedef struct Model {
typedef struct ArithCoder {
int low, high, value;
- GetBitContext *gb;
+ union {
+ GetBitContext *gb;
+ GetByteContext *gB;
+ } gbc;
int (*get_model_sym)(struct ArithCoder *c, Model *m);
int (*get_number) (struct ArithCoder *c, int n);
} ArithCoder;
@@ -56,28 +61,77 @@ typedef struct PixContext {
uint8_t cache[12];
Model cache_model, full_model;
Model sec_models[4][8][4];
+ int special_initial_cache;
} PixContext;
+struct MSS12Context;
+
+typedef struct SliceContext {
+ struct MSS12Context *c;
+ Model intra_region, inter_region;
+ Model pivot, edge_mode, split_mode;
+ PixContext intra_pix_ctx, inter_pix_ctx;
+} SliceContext;
+
typedef struct MSS12Context {
AVCodecContext *avctx;
- uint8_t *pic_start;
- int pic_stride;
- uint8_t *mask;
- int mask_linesize;
uint32_t pal[256];
+ uint8_t *pal_pic;
+ uint8_t *last_pal_pic;
+ int pal_stride;
+ uint8_t *mask;
+ int mask_stride;
+ uint8_t *rgb_pic;
+ uint8_t *last_rgb_pic;
+ int rgb_stride;
int free_colours;
int keyframe;
Model intra_region, inter_region;
Model pivot, edge_mode, split_mode;
PixContext intra_pix_ctx, inter_pix_ctx;
+ int mvX, mvY;
int corrupted;
+ int slice_split;
+ int full_model_syms;
+ SliceContext sc[2];
} MSS12Context;
-int ff_mss12_decode_rect(MSS12Context *ctx, ArithCoder *acoder,
+int ff_mss12_decode_rect(SliceContext *ctx, ArithCoder *acoder,
int x, int y, int width, int height);
void ff_mss12_model_update(Model *m, int val);
void ff_mss12_codec_reset(MSS12Context *ctx);
-av_cold int ff_mss12_decode_init(AVCodecContext *avctx, int version);
-av_cold int ff_mss12_decode_end(AVCodecContext *avctx);
+av_cold int ff_mss12_decode_init(MSS12Context *ctx, int version);
+av_cold int ff_mss12_decode_end(MSS12Context *ctx);
+
+#define ARITH_GET_BIT(VERSION) \
+static int arith ## VERSION ## _get_bit(ArithCoder *c) \
+{ \
+ int range = c->high - c->low + 1; \
+ int bit = (((c->value - c->low) << 1) + 1) / range; \
+ \
+ if (bit) \
+ c->low += range >> 1; \
+ else \
+ c->high = c->low + (range >> 1) - 1; \
+ \
+ arith ## VERSION ## _normalise(c); \
+ \
+ return bit; \
+}
+
+#define ARITH_GET_MODEL_SYM(VERSION) \
+static int arith ## VERSION ## _get_model_sym(ArithCoder *c, Model *m) \
+{ \
+ int idx, val; \
+ \
+ idx = arith ## VERSION ## _get_prob(c, m->cum_prob); \
+ \
+ val = m->idx2sym[idx]; \
+ ff_mss12_model_update(m, idx); \
+ \
+ arith ## VERSION ## _normalise(c); \
+ \
+ return val; \
+}
#endif /* AVCODEC_MSS12_H */