FFmpeg
ffv1dec_template.c
Go to the documentation of this file.
1 /*
2  * FFV1 decoder template
3  *
4  * Copyright (c) 2003-2016 Michael Niedermayer <michaelni@gmx.at>
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 #include "ffv1_template.c"
24 
25 static av_always_inline int
27  GetBitContext *gb,
28  int w, TYPE *sample[2], int plane_index, int bits,
29  int ac)
30 {
31  PlaneContext *const p = &sc->plane[plane_index];
32  RangeCoder *const c = &sc->c;
33  const int16_t (*quant_table)[256] = f->quant_tables[p->quant_table_index];
34  int x;
35  int run_count = 0;
36  int run_mode = 0;
37  int run_index = sc->run_index;
38 
39  if (bits == 0) {
40  for (x = 0; x < w; x++)
41  sample[1][x] = 0;
42  return 0;
43  }
44 
45  if (is_input_end(c, gb, ac))
46  return AVERROR_INVALIDDATA;
47 
48  if (sc->slice_coding_mode == 1) {
49  int i;
50  for (x = 0; x < w; x++) {
51  int v = 0;
52  for (i=0; i<bits; i++) {
53  uint8_t state = 128;
54  v += v + get_rac(c, &state);
55  }
56  sample[1][x] = v;
57  }
58  return 0;
59  }
60 
61  for (x = 0; x < w; x++) {
62  int diff, context, sign;
63 
64  if (!(x & 1023)) {
65  if (is_input_end(c, gb, ac))
66  return AVERROR_INVALIDDATA;
67  }
68 
69  context = RENAME(get_context)(quant_table,
70  sample[1] + x, sample[0] + x, sample[1] + x);
71  if (context < 0) {
72  context = -context;
73  sign = 1;
74  } else
75  sign = 0;
76 
77  av_assert2(context < p->context_count);
78 
79  if (ac != AC_GOLOMB_RICE) {
81  } else {
82  if (context == 0 && run_mode == 0)
83  run_mode = 1;
84 
85  if (run_mode) {
86  if (run_count == 0 && run_mode == 1) {
87  if (get_bits1(gb)) {
88  run_count = 1 << ff_log2_run[run_index];
89  if (x + run_count <= w)
90  run_index++;
91  } else {
92  if (ff_log2_run[run_index])
93  run_count = get_bits(gb, ff_log2_run[run_index]);
94  else
95  run_count = 0;
96  if (run_index)
97  run_index--;
98  run_mode = 2;
99  }
100  }
101  if (sample[1][x - 1] == sample[0][x - 1]) {
102  while (run_count > 1 && w-x > 1) {
103  sample[1][x] = sample[0][x];
104  x++;
105  run_count--;
106  }
107  } else {
108  while (run_count > 1 && w-x > 1) {
109  sample[1][x] = RENAME(predict)(sample[1] + x, sample[0] + x);
110  x++;
111  run_count--;
112  }
113  }
114  run_count--;
115  if (run_count < 0) {
116  run_mode = 0;
117  run_count = 0;
119  bits);
120  if (diff >= 0)
121  diff++;
122  } else
123  diff = 0;
124  } else
126 
127  ff_dlog(f->avctx, "count:%d index:%d, mode:%d, x:%d pos:%d\n",
128  run_count, run_index, run_mode, x, get_bits_count(gb));
129  }
130 
131  if (sign)
132  diff = -(unsigned)diff;
133 
134  sample[1][x] = av_zero_extend(RENAME(predict)(sample[1] + x, sample[0] + x) + (SUINT)diff, bits);
135  }
136  sc->run_index = run_index;
137  return 0;
138 }
139 
141  GetBitContext *gb,
142  uint8_t *src[4], int w, int h, int stride[4])
143 {
144  int x, y, p;
145  TYPE *sample[4][2];
146  int lbd = f->avctx->bits_per_raw_sample <= 8;
147  int bits[4], offset;
148  int transparency = f->transparency;
149  int ac = f->ac;
150  unsigned mask[4];
151 
152  ff_ffv1_compute_bits_per_plane(f, sc, bits, &offset, mask, f->avctx->bits_per_raw_sample);
153 
154  if (sc->slice_coding_mode == 1)
155  ac = 1;
156 
157  for (x = 0; x < 4; x++) {
158  sample[x][0] = RENAME(sc->sample_buffer) + x * 2 * (w + 6) + 3;
159  sample[x][1] = RENAME(sc->sample_buffer) + (x * 2 + 1) * (w + 6) + 3;
160  }
161 
162  sc->run_index = 0;
163 
164  memset(RENAME(sc->sample_buffer), 0, 8 * (w + 6) * sizeof(*RENAME(sc->sample_buffer)));
165 
166  for (y = 0; y < h; y++) {
167  for (p = 0; p < 3 + transparency; p++) {
168  int ret;
169  TYPE *temp = sample[p][0]; // FIXME: try a normal buffer
170 
171  sample[p][0] = sample[p][1];
172  sample[p][1] = temp;
173 
174  sample[p][1][-1]= sample[p][0][0 ];
175  sample[p][0][ w]= sample[p][0][w-1];
176  if (bits[p] == 9)
177  ret = RENAME(decode_line)(f, sc, gb, w, sample[p], (p + 1)/2, 9, ac);
178  else
179  ret = RENAME(decode_line)(f, sc, gb, w, sample[p], (p + 1)/2, bits[p], ac);
180  if (ret < 0)
181  return ret;
182  }
183  for (x = 0; x < w; x++) {
184  int g = sample[0][1][x];
185  int b = sample[1][1][x];
186  int r = sample[2][1][x];
187  int a = sample[3][1][x];
188 
189  if (sc->slice_coding_mode != 1) {
190  b -= offset;
191  r -= offset;
192  g -= (b * sc->slice_rct_by_coef + r * sc->slice_rct_ry_coef) >> 2;
193  b += g;
194  r += g;
195  }
196  if (sc->remap) {
197  if (f->avctx->bits_per_raw_sample == 32) {
198  g = sc->fltmap32[0][g & mask[0]];
199  b = sc->fltmap32[1][b & mask[1]];
200  r = sc->fltmap32[2][r & mask[2]];
201  if (transparency)
202  a = sc->fltmap32[3][a & mask[3]];
203  } else {
204  g = sc->fltmap[0][g & mask[0]];
205  b = sc->fltmap[1][b & mask[1]];
206  r = sc->fltmap[2][r & mask[2]];
207  if (transparency)
208  a = sc->fltmap[3][a & mask[3]];
209  }
210  }
211 
212  if (lbd) {
213  *((uint32_t*)(src[0] + x*4 + stride[0]*y)) = b + ((unsigned)g<<8) + ((unsigned)r<<16) + ((unsigned)a<<24);
214  } else if (f->avctx->bits_per_raw_sample == 32) {
215  *((uint32_t*)(src[0] + x*4 + stride[0]*y)) = g;
216  *((uint32_t*)(src[1] + x*4 + stride[1]*y)) = b;
217  *((uint32_t*)(src[2] + x*4 + stride[2]*y)) = r;
218  if (transparency)
219  *((uint32_t*)(src[3] + x*4 + stride[3]*y)) = a;
220  } else if (sizeof(TYPE) == 4 || transparency) {
221  *((uint16_t*)(src[0] + x*2 + stride[0]*y)) = g;
222  *((uint16_t*)(src[1] + x*2 + stride[1]*y)) = b;
223  *((uint16_t*)(src[2] + x*2 + stride[2]*y)) = r;
224  if (transparency)
225  *((uint16_t*)(src[3] + x*2 + stride[3]*y)) = a;
226  } else {
227  *((uint16_t*)(src[0] + x*2 + stride[0]*y)) = b;
228  *((uint16_t*)(src[1] + x*2 + stride[1]*y)) = g;
229  *((uint16_t*)(src[2] + x*2 + stride[2]*y)) = r;
230  }
231  }
232  }
233  return 0;
234 }
r
const char * r
Definition: vf_curves.c:127
get_bits_count
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:249
mask
int mask
Definition: mediacodecdec_common.c:154
w
uint8_t w
Definition: llviddspenc.c:38
b
#define b
Definition: input.c:42
predict
static av_always_inline void predict(PredictorState *ps, int *coef, int output_enable)
Definition: aacdec_fixed_prediction.h:77
PlaneContext::state
uint8_t(* state)[CONTEXT_SIZE]
Definition: ffv1.h:67
decode_line
static av_always_inline int RENAME() decode_line(FFV1Context *f, FFV1SliceContext *sc, GetBitContext *gb, int w, TYPE *sample[2], int plane_index, int bits, int ac)
Definition: ffv1dec_template.c:26
state
static struct @488 state
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:318
GetBitContext
Definition: get_bits.h:108
decode_rgb_frame
static int RENAME() decode_rgb_frame(FFV1Context *f, FFV1SliceContext *sc, GetBitContext *gb, uint8_t *src[4], int w, int h, int stride[4])
Definition: ffv1dec_template.c:140
g
const char * g
Definition: vf_curves.c:128
bits
uint8_t bits
Definition: vp3data.h:128
is_input_end
static int is_input_end(RangeCoder *c, GetBitContext *gb, int ac)
Definition: ffv1dec.c:73
ffv1_template.c
get_vlc_symbol
static int get_vlc_symbol(GetBitContext *gb, VlcState *const state, int bits)
Definition: ffv1dec.c:48
context
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option keep it simple and lowercase description are in without and describe what they for example set the foo of the bar offset is the offset of the field in your context
Definition: writing_filters.txt:91
quant_table
static const int16_t quant_table[64]
Definition: intrax8.c:511
TYPE
#define TYPE
Definition: ffv1dec.c:91
PlaneContext::vlc_state
VlcState * vlc_state
Definition: ffv1.h:68
AC_GOLOMB_RICE
#define AC_GOLOMB_RICE
Definition: ffv1.h:52
get_bits1
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:371
PlaneContext
Definition: ffv1.h:64
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
ff_dlog
#define ff_dlog(a,...)
Definition: tableprint_vlc.h:28
f
f
Definition: af_crystalizer.c:122
sample
#define sample
Definition: flacdsp_template.c:44
get_symbol_inline
static av_flatten int get_symbol_inline(RangeCoder *c, uint8_t *state, int is_signed)
Definition: ffv1.h:251
diff
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
Definition: vf_paletteuse.c:166
a
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Definition: undefined.txt:41
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
PlaneContext::quant_table_index
int quant_table_index
Definition: ffv1.h:65
av_zero_extend
#define av_zero_extend
Definition: common.h:151
av_assert2
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
Definition: avassert.h:67
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
av_always_inline
#define av_always_inline
Definition: attributes.h:49
SUINT
#define SUINT
Definition: dct32_template.c:30
FFV1SliceContext
Definition: ffv1.h:73
get_rac
static int get_rac(RangeCoder *c, uint8_t *const state)
Definition: rangecoder.h:118
stride
#define stride
Definition: h264pred_template.c:536
ret
ret
Definition: filter_design.txt:187
RENAME
#define RENAME(element)
Definition: ac3enc_template.c:44
temp
else temp
Definition: vf_mcdeint.c:263
FFV1Context
Definition: ffv1.h:122
ff_log2_run
const uint8_t ff_log2_run[41]
Definition: mathtables.c:116
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
h
h
Definition: vp9dsp_template.c:2070
RangeCoder
Definition: mss3.c:63
ff_ffv1_compute_bits_per_plane
void ff_ffv1_compute_bits_per_plane(const FFV1Context *f, FFV1SliceContext *sc, int bits[4], int *offset, int mask[4], int bits_per_raw_sample)
Definition: ffv1.c:222
src
#define src
Definition: vp8dsp.c:248