FFmpeg
mss12.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2012 Konstantin Shishkov
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 /**
22  * @file
23  * Common header for Microsoft Screen 1 and 2
24  */
25 
26 #ifndef AVCODEC_MSS12_H
27 #define AVCODEC_MSS12_H
28 
29 #include "libavutil/intreadwrite.h"
30 #include "avcodec.h"
31 #include "get_bits.h"
32 #include "bytestream.h"
33 
34 #define MODEL_MIN_SYMS 2
35 #define MODEL_MAX_SYMS 256
36 #define THRESH_ADAPTIVE -1
37 #define THRESH_LOW 15
38 #define THRESH_HIGH 50
39 
40 typedef struct Model {
41  int16_t cum_prob[MODEL_MAX_SYMS + 1];
42  int16_t weights[MODEL_MAX_SYMS + 1];
43  uint8_t idx2sym[MODEL_MAX_SYMS + 1];
44  int num_syms;
46 } Model;
47 
48 typedef struct ArithCoder {
49  int low, high, value;
50  int overread;
51 #define MAX_OVERREAD 16
52  union {
55  } gbc;
56  int (*get_model_sym)(struct ArithCoder *c, Model *m);
57  int (*get_number) (struct ArithCoder *c, int n);
58 } ArithCoder;
59 
60 typedef struct PixContext {
62  uint8_t cache[12];
64  Model sec_models[15][4];
66 } PixContext;
67 
68 struct MSS12Context;
69 
70 typedef struct SliceContext {
71  struct MSS12Context *c;
75 } SliceContext;
76 
77 typedef struct MSS12Context {
79  uint32_t pal[256];
80  uint8_t *pal_pic;
81  uint8_t *last_pal_pic;
82  ptrdiff_t pal_stride;
83  uint8_t *mask;
84  ptrdiff_t mask_stride;
85  uint8_t *rgb_pic;
86  uint8_t *last_rgb_pic;
87  ptrdiff_t rgb_stride;
89  int keyframe;
90  int mvX, mvY;
91  int corrupted;
94 } MSS12Context;
95 
97  int x, int y, int width, int height);
98 void ff_mss12_model_update(Model *m, int val);
101  SliceContext *sc1, SliceContext *sc2);
103 
104 #define ARITH_GET_BIT(prefix) \
105 static int prefix ## _get_bit(ArithCoder *c) \
106 { \
107  int range = c->high - c->low + 1; \
108  int bit = 2 * c->value - c->low >= c->high; \
109  \
110  if (bit) \
111  c->low += range >> 1; \
112  else \
113  c->high = c->low + (range >> 1) - 1; \
114  \
115  prefix ## _normalise(c); \
116  \
117  return bit; \
118 }
119 
120 #define ARITH_GET_MODEL_SYM(prefix) \
121 static int prefix ## _get_model_sym(ArithCoder *c, Model *m) \
122 { \
123  int idx, val; \
124  \
125  idx = prefix ## _get_prob(c, m->cum_prob); \
126  \
127  val = m->idx2sym[idx]; \
128  ff_mss12_model_update(m, idx); \
129  \
130  prefix ## _normalise(c); \
131  \
132  return val; \
133 }
134 
135 #endif /* AVCODEC_MSS12_H */
MSS12Context::mvY
int mvY
Definition: mss12.h:90
SliceContext::intra_region
Model intra_region
Definition: mss12.h:72
GetByteContext
Definition: bytestream.h:33
MSS12Context::avctx
AVCodecContext * avctx
Definition: mss12.h:78
ArithCoder::value
int value
Definition: mss12.h:49
Model::weights
int16_t weights[MODEL_MAX_SYMS+1]
Definition: mss12.h:42
SliceContext::inter_pix_ctx
PixContext inter_pix_ctx
Definition: mss12.h:74
PixContext::num_syms
int num_syms
Definition: mss12.h:61
SliceContext::intra_pix_ctx
PixContext intra_pix_ctx
Definition: mss12.h:74
PixContext
Definition: mss12.h:60
PixContext::cache_size
int cache_size
Definition: mss12.h:61
MSS12Context::pal_stride
ptrdiff_t pal_stride
Definition: mss12.h:82
ArithCoder::gbc
union ArithCoder::@98 gbc
ArithCoder::get_model_sym
int(* get_model_sym)(struct ArithCoder *c, Model *m)
Definition: mss12.h:56
ff_mss12_decode_rect
int ff_mss12_decode_rect(SliceContext *ctx, ArithCoder *acoder, int x, int y, int width, int height)
Definition: mss12.c:542
GetBitContext
Definition: get_bits.h:62
MSS12Context::free_colours
int free_colours
Definition: mss12.h:88
val
static double val(void *priv, double ch)
Definition: aeval.c:76
PixContext::sec_models
Model sec_models[15][4]
Definition: mss12.h:64
ArithCoder::gB
GetByteContext * gB
Definition: mss12.h:54
width
#define width
MSS12Context::mvX
int mvX
Definition: mss12.h:90
intreadwrite.h
MSS12Context::mask_stride
ptrdiff_t mask_stride
Definition: mss12.h:84
Model::thr_weight
int thr_weight
Definition: mss12.h:45
MSS12Context::pal_pic
uint8_t * pal_pic
Definition: mss12.h:80
ctx
AVFormatContext * ctx
Definition: movenc.c:48
get_bits.h
MSS12Context::last_rgb_pic
uint8_t * last_rgb_pic
Definition: mss12.h:86
ArithCoder
Definition: dstdec.c:56
SliceContext::split_mode
Model split_mode
Definition: mss12.h:73
MSS12Context::mask
uint8_t * mask
Definition: mss12.h:83
MODEL_MAX_SYMS
#define MODEL_MAX_SYMS
Definition: mss12.h:35
Model::idx2sym
uint8_t idx2sym[MODEL_MAX_SYMS+1]
Definition: mss12.h:43
MSS12Context::rgb_stride
ptrdiff_t rgb_stride
Definition: mss12.h:87
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
SliceContext
Definition: mss12.h:70
MSS12Context::slice_split
int slice_split
Definition: mss12.h:92
ArithCoder::c
unsigned int c
Definition: dstdec.c:58
ff_mss12_model_update
void ff_mss12_model_update(Model *m, int val)
Definition: mss12.c:95
Model::threshold
int threshold
Definition: mss12.h:45
SliceContext::edge_mode
Model edge_mode
Definition: mss12.h:73
PixContext::special_initial_cache
int special_initial_cache
Definition: mss12.h:65
height
#define height
version
version
Definition: libkvazaar.c:313
MSS12Context::keyframe
int keyframe
Definition: mss12.h:89
MSS12Context
Definition: mss12.h:77
SliceContext::pivot
Model pivot
Definition: mss12.h:73
ff_mss12_decode_end
int ff_mss12_decode_end(MSS12Context *ctx)
Definition: mss12.c:692
SliceContext::c
struct MSS12Context * c
Definition: mss12.h:71
Model::num_syms
int num_syms
Definition: mss12.h:44
avcodec.h
PixContext::cache
uint8_t cache[12]
Definition: mss12.h:62
ff_mss12_decode_init
int ff_mss12_decode_init(MSS12Context *c, int version, SliceContext *sc1, SliceContext *sc2)
Definition: mss12.c:580
MSS12Context::corrupted
int corrupted
Definition: mss12.h:91
AVCodecContext
main external API structure.
Definition: avcodec.h:383
ArithCoder::gb
GetBitContext * gb
Definition: mss12.h:53
MSS12Context::full_model_syms
int full_model_syms
Definition: mss12.h:93
MSS12Context::rgb_pic
uint8_t * rgb_pic
Definition: mss12.h:85
ff_mss12_slicecontext_reset
void ff_mss12_slicecontext_reset(SliceContext *sc)
Definition: mss12.c:436
PixContext::cache_model
Model cache_model
Definition: mss12.h:63
Model
Definition: mss12.h:40
ArithCoder::overread
int overread
Definition: mss12.h:50
ArithCoder::get_number
int(* get_number)(struct ArithCoder *c, int n)
Definition: mss12.h:57
bytestream.h
MSS12Context::pal
uint32_t pal[256]
Definition: mss12.h:79
MSS12Context::last_pal_pic
uint8_t * last_pal_pic
Definition: mss12.h:81
ArithCoder::low
int low
Definition: mss12.h:49
ArithCoder::high
int high
Definition: mss12.h:49
int
int
Definition: ffmpeg_filter.c:153
PixContext::full_model
Model full_model
Definition: mss12.h:63
SliceContext::inter_region
Model inter_region
Definition: mss12.h:72
Model::cum_prob
int16_t cum_prob[MODEL_MAX_SYMS+1]
Definition: mss12.h:41