annotate rl.h @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents 7dd2a45249a9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5270
5e6d44208f91 Add standard licensing header to files that lack it.
diego
parents: 5269
diff changeset
1 /*
5e6d44208f91 Add standard licensing header to files that lack it.
diego
parents: 5269
diff changeset
2 * Copyright (c) 2000-2002 Fabrice Bellard
5e6d44208f91 Add standard licensing header to files that lack it.
diego
parents: 5269
diff changeset
3 * Copyright (c) 2002-2004 Michael Niedermayer
5e6d44208f91 Add standard licensing header to files that lack it.
diego
parents: 5269
diff changeset
4 *
5e6d44208f91 Add standard licensing header to files that lack it.
diego
parents: 5269
diff changeset
5 * This file is part of FFmpeg.
5e6d44208f91 Add standard licensing header to files that lack it.
diego
parents: 5269
diff changeset
6 *
5e6d44208f91 Add standard licensing header to files that lack it.
diego
parents: 5269
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
5e6d44208f91 Add standard licensing header to files that lack it.
diego
parents: 5269
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
5e6d44208f91 Add standard licensing header to files that lack it.
diego
parents: 5269
diff changeset
9 * License as published by the Free Software Foundation; either
5e6d44208f91 Add standard licensing header to files that lack it.
diego
parents: 5269
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
5e6d44208f91 Add standard licensing header to files that lack it.
diego
parents: 5269
diff changeset
11 *
5e6d44208f91 Add standard licensing header to files that lack it.
diego
parents: 5269
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
5e6d44208f91 Add standard licensing header to files that lack it.
diego
parents: 5269
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
5e6d44208f91 Add standard licensing header to files that lack it.
diego
parents: 5269
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5e6d44208f91 Add standard licensing header to files that lack it.
diego
parents: 5269
diff changeset
15 * Lesser General Public License for more details.
5e6d44208f91 Add standard licensing header to files that lack it.
diego
parents: 5269
diff changeset
16 *
5e6d44208f91 Add standard licensing header to files that lack it.
diego
parents: 5269
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
5e6d44208f91 Add standard licensing header to files that lack it.
diego
parents: 5269
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
5e6d44208f91 Add standard licensing header to files that lack it.
diego
parents: 5269
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
5e6d44208f91 Add standard licensing header to files that lack it.
diego
parents: 5269
diff changeset
20 */
5e6d44208f91 Add standard licensing header to files that lack it.
diego
parents: 5269
diff changeset
21
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1098
diff changeset
22 /**
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 9428
diff changeset
23 * @file
4667
b3f099adfb36 move RLTable stuff to its own header
michael
parents: 4327
diff changeset
24 * rl header.
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1098
diff changeset
25 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2805
diff changeset
26
7760
c4a4495715dd Globally rename the header inclusion guard names.
stefano
parents: 6940
diff changeset
27 #ifndef AVCODEC_RL_H
c4a4495715dd Globally rename the header inclusion guard names.
stefano
parents: 6940
diff changeset
28 #define AVCODEC_RL_H
745
25d7fb7c89be better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents: 726
diff changeset
29
5162
4394344397d8 include all prerequisites in header files
mru
parents: 4668
diff changeset
30 #include <stdint.h>
9428
0dce4fe6e6f3 Rename bitstream.h to get_bits.h.
stefano
parents: 8718
diff changeset
31 #include "get_bits.h"
6446
42fc209231cb move run length table constants to rl.h
aurel
parents: 5830
diff changeset
32
42fc209231cb move run length table constants to rl.h
aurel
parents: 5830
diff changeset
33 /* run length table */
42fc209231cb move run length table constants to rl.h
aurel
parents: 5830
diff changeset
34 #define MAX_RUN 64
42fc209231cb move run length table constants to rl.h
aurel
parents: 5830
diff changeset
35 #define MAX_LEVEL 64
5162
4394344397d8 include all prerequisites in header files
mru
parents: 4668
diff changeset
36
1110
d4096635b7b9 doxy / cosmetics
michaelni
parents: 1106
diff changeset
37 /** RLTable. */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
38 typedef struct RLTable {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2805
diff changeset
39 int n; ///< number of entries of table_vlc minus 1
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2805
diff changeset
40 int last; ///< number of values for last = 0
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
41 const uint16_t (*table_vlc)[2];
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
42 const int8_t *table_run;
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1057
diff changeset
43 const int8_t *table_level;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2805
diff changeset
44 uint8_t *index_run[2]; ///< encoding only
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2805
diff changeset
45 int8_t *max_level[2]; ///< encoding & decoding
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2805
diff changeset
46 int8_t *max_run[2]; ///< encoding & decoding
5269
e0e53ab5a77a cosmetics: typo
diego
parents: 5162
diff changeset
47 VLC vlc; ///< decoding only deprecated FIXME remove
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2805
diff changeset
48 RL_VLC_ELEM *rl_vlc[32]; ///< decoding only
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
49 } RLTable;
986e461dc072 Initial revision
glantau
parents:
diff changeset
50
4668
1f1a0e67b961 kill av_mallocz_static() calls in init_rl()
michael
parents: 4667
diff changeset
51 /**
1f1a0e67b961 kill av_mallocz_static() calls in init_rl()
michael
parents: 4667
diff changeset
52 *
1f1a0e67b961 kill av_mallocz_static() calls in init_rl()
michael
parents: 4667
diff changeset
53 * @param static_store static uint8_t array[2][2*MAX_RUN + MAX_LEVEL + 3] which will hold
1f1a0e67b961 kill av_mallocz_static() calls in init_rl()
michael
parents: 4667
diff changeset
54 * the level and run tables, if this is NULL av_malloc() will be used
1f1a0e67b961 kill av_mallocz_static() calls in init_rl()
michael
parents: 4667
diff changeset
55 */
1f1a0e67b961 kill av_mallocz_static() calls in init_rl()
michael
parents: 4667
diff changeset
56 void init_rl(RLTable *rl, uint8_t static_store[2][2*MAX_RUN + MAX_LEVEL + 3]);
6940
778ecab25dd8 Change init_vlc_rl() so it does not use *alloc_static() anymore.
michael
parents: 6446
diff changeset
57 void init_vlc_rl(RLTable *rl);
778ecab25dd8 Change init_vlc_rl() so it does not use *alloc_static() anymore.
michael
parents: 6446
diff changeset
58
778ecab25dd8 Change init_vlc_rl() so it does not use *alloc_static() anymore.
michael
parents: 6446
diff changeset
59 #define INIT_VLC_RL(rl, static_size)\
778ecab25dd8 Change init_vlc_rl() so it does not use *alloc_static() anymore.
michael
parents: 6446
diff changeset
60 {\
778ecab25dd8 Change init_vlc_rl() so it does not use *alloc_static() anymore.
michael
parents: 6446
diff changeset
61 int q;\
778ecab25dd8 Change init_vlc_rl() so it does not use *alloc_static() anymore.
michael
parents: 6446
diff changeset
62 static RL_VLC_ELEM rl_vlc_table[32][static_size];\
778ecab25dd8 Change init_vlc_rl() so it does not use *alloc_static() anymore.
michael
parents: 6446
diff changeset
63 INIT_VLC_STATIC(&rl.vlc, 9, rl.n + 1,\
778ecab25dd8 Change init_vlc_rl() so it does not use *alloc_static() anymore.
michael
parents: 6446
diff changeset
64 &rl.table_vlc[0][1], 4, 2,\
778ecab25dd8 Change init_vlc_rl() so it does not use *alloc_static() anymore.
michael
parents: 6446
diff changeset
65 &rl.table_vlc[0][0], 4, 2, static_size);\
778ecab25dd8 Change init_vlc_rl() so it does not use *alloc_static() anymore.
michael
parents: 6446
diff changeset
66 \
778ecab25dd8 Change init_vlc_rl() so it does not use *alloc_static() anymore.
michael
parents: 6446
diff changeset
67 if(!rl.rl_vlc[0]){\
778ecab25dd8 Change init_vlc_rl() so it does not use *alloc_static() anymore.
michael
parents: 6446
diff changeset
68 for(q=0; q<32; q++)\
778ecab25dd8 Change init_vlc_rl() so it does not use *alloc_static() anymore.
michael
parents: 6446
diff changeset
69 rl.rl_vlc[q]= rl_vlc_table[q];\
778ecab25dd8 Change init_vlc_rl() so it does not use *alloc_static() anymore.
michael
parents: 6446
diff changeset
70 \
778ecab25dd8 Change init_vlc_rl() so it does not use *alloc_static() anymore.
michael
parents: 6446
diff changeset
71 init_vlc_rl(&rl);\
778ecab25dd8 Change init_vlc_rl() so it does not use *alloc_static() anymore.
michael
parents: 6446
diff changeset
72 }\
778ecab25dd8 Change init_vlc_rl() so it does not use *alloc_static() anymore.
michael
parents: 6446
diff changeset
73 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
74
243
a6519f773064 * using static instead of extern
kabi
parents: 239
diff changeset
75 static inline int get_rl_index(const RLTable *rl, int last, int run, int level)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
76 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
77 int index;
986e461dc072 Initial revision
glantau
parents:
diff changeset
78 index = rl->index_run[last][run];
986e461dc072 Initial revision
glantau
parents:
diff changeset
79 if (index >= rl->n)
986e461dc072 Initial revision
glantau
parents:
diff changeset
80 return rl->n;
986e461dc072 Initial revision
glantau
parents:
diff changeset
81 if (level > rl->max_level[last][run])
986e461dc072 Initial revision
glantau
parents:
diff changeset
82 return rl->n;
986e461dc072 Initial revision
glantau
parents:
diff changeset
83 return index + level - 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
84 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
85
7760
c4a4495715dd Globally rename the header inclusion guard names.
stefano
parents: 6940
diff changeset
86 #endif /* AVCODEC_RL_H */