mss12.h 4.92 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
/*
 * Copyright (c) 2012 Konstantin Shishkov
 *
 * This file is part of Libav.
 *
 * Libav is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * Libav is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with Libav; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

/**
 * @file
 * Common header for Microsoft Screen 1 and 2
 */

#ifndef AVCODEC_MSS12_H
#define AVCODEC_MSS12_H

Alberto Delmás's avatar
Alberto Delmás committed
29
#include "libavutil/intreadwrite.h"
30 31
#include "avcodec.h"
#include "get_bits.h"
Alberto Delmás's avatar
Alberto Delmás committed
32
#include "bytestream.h"
33 34 35 36 37 38 39 40

#define MODEL_MIN_SYMS    2
#define MODEL_MAX_SYMS  256
#define THRESH_ADAPTIVE  -1
#define THRESH_LOW       15
#define THRESH_HIGH      50

typedef struct Model {
41 42 43
    int16_t cum_prob[MODEL_MAX_SYMS + 1];
    int16_t weights[MODEL_MAX_SYMS + 1];
    uint8_t idx2sym[MODEL_MAX_SYMS + 1];
44 45 46 47 48 49
    int num_syms;
    int thr_weight, threshold;
} Model;

typedef struct ArithCoder {
    int low, high, value;
Alberto Delmás's avatar
Alberto Delmás committed
50 51 52 53
    union {
        GetBitContext *gb;
        GetByteContext *gB;
    } gbc;
54 55 56 57 58 59 60 61
    int (*get_model_sym)(struct ArithCoder *c, Model *m);
    int (*get_number)   (struct ArithCoder *c, int n);
} ArithCoder;

typedef struct PixContext {
    int cache_size, num_syms;
    uint8_t cache[12];
    Model cache_model, full_model;
62
    Model sec_models[15][4];
Alberto Delmás's avatar
Alberto Delmás committed
63
    int special_initial_cache;
64 65
} PixContext;

Alberto Delmás's avatar
Alberto Delmás committed
66 67 68 69 70 71 72 73 74
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;

75 76 77
typedef struct MSS12Context {
    AVCodecContext *avctx;
    uint32_t       pal[256];
Alberto Delmás's avatar
Alberto Delmás committed
78 79 80 81 82 83 84 85
    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;
86 87
    int            free_colours;
    int            keyframe;
Alberto Delmás's avatar
Alberto Delmás committed
88
    int            mvX, mvY;
89
    int            corrupted;
Alberto Delmás's avatar
Alberto Delmás committed
90 91
    int            slice_split;
    int            full_model_syms;
92 93
} MSS12Context;

Alberto Delmás's avatar
Alberto Delmás committed
94
int ff_mss12_decode_rect(SliceContext *ctx, ArithCoder *acoder,
95 96
                         int x, int y, int width, int height);
void ff_mss12_model_update(Model *m, int val);
97 98 99
void ff_mss12_slicecontext_reset(SliceContext *sc);
av_cold int ff_mss12_decode_init(MSS12Context *c, int version,
                                 SliceContext* sc1, SliceContext *sc2);
Alberto Delmás's avatar
Alberto Delmás committed
100 101 102 103 104 105
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;                                   \
106
    int bit   = 2 * c->value - c->low >= c->high;                       \
Alberto Delmás's avatar
Alberto Delmás committed
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
                                                                        \
    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;                                                         \
}
132 133

#endif /* AVCODEC_MSS12_H */