Mercurial > libavcodec.hg
annotate vp56.h @ 6323:e6da66f378c7 libavcodec
mpegvideo.h has two function declarations with the 'inline' specifier
but no definition for those functions. The C standard requires a
definition to appear in the same translation unit for any function
declared with 'inline'. Most of the files including mpegvideo.h do not
define those functions. Fix this by removing the 'inline' specifiers
from the header.
patch by Uoti Urpala
author | diego |
---|---|
date | Sun, 03 Feb 2008 17:54:30 +0000 |
parents | 1b91ce6c758c |
children | 7fa807dd7958 |
rev | line source |
---|---|
3695 | 1 /** |
2 * @file vp56.h | |
3 * VP5 and VP6 compatible video decoder (common features) | |
4 * | |
5 * Copyright (C) 2006 Aurelien Jacobs <aurel@gnuage.org> | |
6 * | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3759
diff
changeset
|
7 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3759
diff
changeset
|
8 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3759
diff
changeset
|
9 * FFmpeg is free software; you can redistribute it and/or |
3695 | 10 * modify it under the terms of the GNU Lesser General Public |
11 * License as published by the Free Software Foundation; either | |
12 * version 2.1 of the License, or (at your option) any later version. | |
13 * | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3759
diff
changeset
|
14 * FFmpeg is distributed in the hope that it will be useful, |
3695 | 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
17 * Lesser General Public License for more details. | |
18 * | |
19 * You should have received a copy of the GNU Lesser General Public | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3759
diff
changeset
|
20 * License along with FFmpeg; if not, write to the Free Software |
5215 | 21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
3695 | 22 */ |
23 | |
5830
1d83e9c34641
Add FFMPEG_ prefix to all multiple inclusion guards.
diego
parents:
5821
diff
changeset
|
24 #ifndef FFMPEG_VP56_H |
1d83e9c34641
Add FFMPEG_ prefix to all multiple inclusion guards.
diego
parents:
5821
diff
changeset
|
25 #define FFMPEG_VP56_H |
3695 | 26 |
27 #include "vp56data.h" | |
28 #include "dsputil.h" | |
29 #include "mpegvideo.h" | |
5089 | 30 #include "bytestream.h" |
3695 | 31 |
32 | |
33 typedef struct vp56_context vp56_context_t; | |
34 typedef struct vp56_mv vp56_mv_t; | |
35 | |
36 typedef void (*vp56_parse_vector_adjustment_t)(vp56_context_t *s, | |
3759 | 37 vp56_mv_t *vect); |
3695 | 38 typedef int (*vp56_adjust_t)(int v, int t); |
39 typedef void (*vp56_filter_t)(vp56_context_t *s, uint8_t *dst, uint8_t *src, | |
40 int offset1, int offset2, int stride, | |
41 vp56_mv_t mv, int mask, int select, int luma); | |
42 typedef void (*vp56_parse_coeff_t)(vp56_context_t *s); | |
43 typedef void (*vp56_default_models_init_t)(vp56_context_t *s); | |
44 typedef void (*vp56_parse_vector_models_t)(vp56_context_t *s); | |
45 typedef void (*vp56_parse_coeff_models_t)(vp56_context_t *s); | |
6297 | 46 typedef int (*vp56_parse_header_t)(vp56_context_t *s, const uint8_t *buf, |
3695 | 47 int buf_size, int *golden_frame); |
48 | |
49 typedef struct { | |
50 int high; | |
51 int bits; | |
6297 | 52 const uint8_t *buffer; |
3695 | 53 unsigned long code_word; |
54 } vp56_range_coder_t; | |
55 | |
56 typedef struct { | |
57 uint8_t not_null_dc; | |
58 vp56_frame_t ref_frame; | |
59 DCTELEM dc_coeff; | |
60 } vp56_ref_dc_t; | |
61 | |
62 struct vp56_mv { | |
63 int x; | |
64 int y; | |
65 }; | |
66 | |
67 typedef struct { | |
68 uint8_t type; | |
69 vp56_mv_t mv; | |
70 } vp56_macroblock_t; | |
71 | |
5711 | 72 typedef struct { |
73 uint8_t coeff_reorder[64]; /* used in vp6 only */ | |
74 uint8_t coeff_index_to_pos[64]; /* used in vp6 only */ | |
75 uint8_t vector_sig[2]; /* delta sign */ | |
76 uint8_t vector_dct[2]; /* delta coding types */ | |
77 uint8_t vector_pdi[2][2]; /* predefined delta init */ | |
78 uint8_t vector_pdv[2][7]; /* predefined delta values */ | |
79 uint8_t vector_fdv[2][8]; /* 8 bit delta value definition */ | |
80 uint8_t coeff_dccv[2][11]; /* DC coeff value */ | |
81 uint8_t coeff_ract[2][3][6][11]; /* Run/AC coding type and AC coeff value */ | |
82 uint8_t coeff_acct[2][3][3][6][5];/* vp5 only AC coding type for coding group < 3 */ | |
83 uint8_t coeff_dcct[2][36][5]; /* DC coeff coding type */ | |
84 uint8_t coeff_runv[2][14]; /* run value (vp6 only) */ | |
85 uint8_t mb_type[3][10][10]; /* model for decoding MB type */ | |
86 uint8_t mb_types_stats[3][10][2];/* contextual, next MB type stats */ | |
87 } vp56_model_t; | |
88 | |
3695 | 89 struct vp56_context { |
90 AVCodecContext *avctx; | |
91 DSPContext dsp; | |
92 ScanTable scantable; | |
5714
314be1cfdcb0
add a new vp6a codec (add alpha plan support to vp6)
aurel
parents:
5711
diff
changeset
|
93 AVFrame frames[4]; |
314be1cfdcb0
add a new vp6a codec (add alpha plan support to vp6)
aurel
parents:
5711
diff
changeset
|
94 AVFrame *framep[6]; |
3695 | 95 uint8_t *edge_emu_buffer_alloc; |
96 uint8_t *edge_emu_buffer; | |
97 vp56_range_coder_t c; | |
4348 | 98 vp56_range_coder_t cc; |
99 vp56_range_coder_t *ccp; | |
4308 | 100 int sub_version; |
3695 | 101 |
102 /* frame info */ | |
5714
314be1cfdcb0
add a new vp6a codec (add alpha plan support to vp6)
aurel
parents:
5711
diff
changeset
|
103 int plane_width[4]; |
314be1cfdcb0
add a new vp6a codec (add alpha plan support to vp6)
aurel
parents:
5711
diff
changeset
|
104 int plane_height[4]; |
3695 | 105 int mb_width; /* number of horizontal MB */ |
106 int mb_height; /* number of vertical MB */ | |
107 int block_offset[6]; | |
108 | |
109 int quantizer; | |
110 uint16_t dequant_dc; | |
111 uint16_t dequant_ac; | |
112 | |
113 /* DC predictors management */ | |
114 vp56_ref_dc_t *above_blocks; | |
115 vp56_ref_dc_t left_block[4]; | |
116 int above_block_idx[6]; | |
117 DCTELEM prev_dc[3][3]; /* [plan][ref_frame] */ | |
118 | |
119 /* blocks / macroblock */ | |
120 vp56_mb_t mb_type; | |
121 vp56_macroblock_t *macroblocks; | |
122 DECLARE_ALIGNED_16(DCTELEM, block_coeff[6][64]); | |
123 | |
124 /* motion vectors */ | |
125 vp56_mv_t mv[6]; /* vectors for each block in MB */ | |
126 vp56_mv_t vector_candidate[2]; | |
127 int vector_candidate_pos; | |
128 | |
129 /* filtering hints */ | |
4348 | 130 int filter_header; /* used in vp6 only */ |
3695 | 131 int deblock_filtering; |
132 int filter_selection; | |
133 int filter_mode; | |
134 int max_vector_length; | |
135 int sample_variance_threshold; | |
136 | |
137 uint8_t coeff_ctx[4][64]; /* used in vp5 only */ | |
138 uint8_t coeff_ctx_last[4]; /* used in vp5 only */ | |
139 | |
5714
314be1cfdcb0
add a new vp6a codec (add alpha plan support to vp6)
aurel
parents:
5711
diff
changeset
|
140 int has_alpha; |
314be1cfdcb0
add a new vp6a codec (add alpha plan support to vp6)
aurel
parents:
5711
diff
changeset
|
141 |
3695 | 142 /* upside-down flipping hints */ |
143 int flip; /* are we flipping ? */ | |
144 int frbi; /* first row block index in MB */ | |
145 int srbi; /* second row block index in MB */ | |
5714
314be1cfdcb0
add a new vp6a codec (add alpha plan support to vp6)
aurel
parents:
5711
diff
changeset
|
146 int stride[4]; /* stride for each plan */ |
3695 | 147 |
148 const uint8_t *vp56_coord_div; | |
149 vp56_parse_vector_adjustment_t parse_vector_adjustment; | |
150 vp56_adjust_t adjust; | |
151 vp56_filter_t filter; | |
152 vp56_parse_coeff_t parse_coeff; | |
153 vp56_default_models_init_t default_models_init; | |
154 vp56_parse_vector_models_t parse_vector_models; | |
155 vp56_parse_coeff_models_t parse_coeff_models; | |
156 vp56_parse_header_t parse_header; | |
5711 | 157 |
158 vp56_model_t *modelp; | |
5714
314be1cfdcb0
add a new vp6a codec (add alpha plan support to vp6)
aurel
parents:
5711
diff
changeset
|
159 vp56_model_t models[2]; |
5821 | 160 |
161 /* huffman decoding */ | |
162 int use_huffman; | |
163 GetBitContext gb; | |
164 VLC dccv_vlc[2]; | |
165 VLC runv_vlc[2]; | |
166 VLC ract_vlc[2][3][6]; | |
167 unsigned int nb_null[2][2]; /* number of consecutive NULL DC/AC */ | |
3695 | 168 }; |
169 | |
170 | |
5714
314be1cfdcb0
add a new vp6a codec (add alpha plan support to vp6)
aurel
parents:
5711
diff
changeset
|
171 void vp56_init(AVCodecContext *avctx, int flip, int has_alpha); |
3695 | 172 int vp56_free(AVCodecContext *avctx); |
173 void vp56_init_dequant(vp56_context_t *s, int quantizer); | |
174 int vp56_decode_frame(AVCodecContext *avctx, void *data, int *data_size, | |
6297 | 175 const uint8_t *buf, int buf_size); |
3695 | 176 |
177 | |
178 /** | |
179 * vp56 specific range coder implementation | |
180 */ | |
181 | |
182 static inline void vp56_init_range_decoder(vp56_range_coder_t *c, | |
6297 | 183 const uint8_t *buf, int buf_size) |
3695 | 184 { |
185 c->high = 255; | |
186 c->bits = 8; | |
187 c->buffer = buf; | |
5089 | 188 c->code_word = bytestream_get_be16(&c->buffer); |
3695 | 189 } |
190 | |
191 static inline int vp56_rac_get_prob(vp56_range_coder_t *c, uint8_t prob) | |
192 { | |
193 unsigned int low = 1 + (((c->high - 1) * prob) / 256); | |
194 unsigned int low_shift = low << 8; | |
195 int bit = c->code_word >= low_shift; | |
196 | |
197 if (bit) { | |
198 c->high -= low; | |
199 c->code_word -= low_shift; | |
200 } else { | |
201 c->high = low; | |
202 } | |
203 | |
204 /* normalize */ | |
205 while (c->high < 128) { | |
206 c->high <<= 1; | |
207 c->code_word <<= 1; | |
208 if (--c->bits == 0) { | |
209 c->bits = 8; | |
210 c->code_word |= *c->buffer++; | |
211 } | |
212 } | |
213 return bit; | |
214 } | |
215 | |
216 static inline int vp56_rac_get(vp56_range_coder_t *c) | |
217 { | |
218 /* equiprobable */ | |
219 int low = (c->high + 1) >> 1; | |
220 unsigned int low_shift = low << 8; | |
221 int bit = c->code_word >= low_shift; | |
222 if (bit) { | |
223 c->high = (c->high - low) << 1; | |
224 c->code_word -= low_shift; | |
225 } else { | |
226 c->high = low << 1; | |
227 } | |
228 | |
229 /* normalize */ | |
230 c->code_word <<= 1; | |
231 if (--c->bits == 0) { | |
232 c->bits = 8; | |
233 c->code_word |= *c->buffer++; | |
234 } | |
235 return bit; | |
236 } | |
237 | |
238 static inline int vp56_rac_gets(vp56_range_coder_t *c, int bits) | |
239 { | |
240 int value = 0; | |
241 | |
242 while (bits--) { | |
243 value = (value << 1) | vp56_rac_get(c); | |
244 } | |
245 | |
246 return value; | |
247 } | |
248 | |
249 static inline int vp56_rac_gets_nn(vp56_range_coder_t *c, int bits) | |
250 { | |
251 int v = vp56_rac_gets(c, 7) << 1; | |
252 return v + !v; | |
253 } | |
254 | |
255 static inline int vp56_rac_get_tree(vp56_range_coder_t *c, | |
256 const vp56_tree_t *tree, | |
257 const uint8_t *probs) | |
258 { | |
259 while (tree->val > 0) { | |
260 if (vp56_rac_get_prob(c, probs[tree->prob_idx])) | |
261 tree += tree->val; | |
262 else | |
263 tree++; | |
264 } | |
265 return -tree->val; | |
266 } | |
267 | |
5830
1d83e9c34641
Add FFMPEG_ prefix to all multiple inclusion guards.
diego
parents:
5821
diff
changeset
|
268 #endif /* FFMPEG_VP56_H */ |