/src/ffmpeg/libavcodec/vp56.h
Line | Count | Source |
1 | | /* |
2 | | * Copyright (C) 2006 Aurelien Jacobs <aurel@gnuage.org> |
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 | | * VP5 and VP6 compatible video decoder (common features) |
24 | | */ |
25 | | |
26 | | #ifndef AVCODEC_VP56_H |
27 | | #define AVCODEC_VP56_H |
28 | | |
29 | | #include "libavutil/mem_internal.h" |
30 | | |
31 | | #include "avcodec.h" |
32 | | #include "get_bits.h" |
33 | | #include "hpeldsp.h" |
34 | | #include "h264chroma.h" |
35 | | #include "videodsp.h" |
36 | | #include "vp3dsp.h" |
37 | | #include "vp56dsp.h" |
38 | | #include "vpx_rac.h" |
39 | | |
40 | | typedef struct vp56_context VP56Context; |
41 | | |
42 | | typedef enum { |
43 | | VP56_FRAME_NONE =-1, |
44 | | VP56_FRAME_CURRENT = 0, |
45 | | VP56_FRAME_PREVIOUS = 1, |
46 | | VP56_FRAME_GOLDEN = 2, |
47 | | } VP56Frame; |
48 | | |
49 | | typedef enum { |
50 | | VP56_MB_INTER_NOVEC_PF = 0, /**< Inter MB, no vector, from previous frame */ |
51 | | VP56_MB_INTRA = 1, /**< Intra MB */ |
52 | | VP56_MB_INTER_DELTA_PF = 2, /**< Inter MB, above/left vector + delta, from previous frame */ |
53 | | VP56_MB_INTER_V1_PF = 3, /**< Inter MB, first vector, from previous frame */ |
54 | | VP56_MB_INTER_V2_PF = 4, /**< Inter MB, second vector, from previous frame */ |
55 | | VP56_MB_INTER_NOVEC_GF = 5, /**< Inter MB, no vector, from golden frame */ |
56 | | VP56_MB_INTER_DELTA_GF = 6, /**< Inter MB, above/left vector + delta, from golden frame */ |
57 | | VP56_MB_INTER_4V = 7, /**< Inter MB, 4 vectors, from previous frame */ |
58 | | VP56_MB_INTER_V1_GF = 8, /**< Inter MB, first vector, from golden frame */ |
59 | | VP56_MB_INTER_V2_GF = 9, /**< Inter MB, second vector, from golden frame */ |
60 | | } VP56mb; |
61 | | |
62 | | typedef struct VP56Tree { |
63 | | int8_t val; |
64 | | int8_t prob_idx; |
65 | | } VP56Tree; |
66 | | |
67 | | typedef struct VP56mv { |
68 | | DECLARE_ALIGNED(4, int16_t, x); |
69 | | int16_t y; |
70 | | } VP56mv; |
71 | | |
72 | 700k | #define VP56_SIZE_CHANGE 1 |
73 | | |
74 | | typedef void (*VP56ParseVectorAdjustment)(VP56Context *s, |
75 | | VP56mv *vect); |
76 | | typedef void (*VP56Filter)(VP56Context *s, uint8_t *dst, uint8_t *src, |
77 | | int offset1, int offset2, ptrdiff_t stride, |
78 | | VP56mv mv, int mask, int select, int luma); |
79 | | typedef int (*VP56ParseCoeff)(VP56Context *s); |
80 | | typedef void (*VP56DefaultModelsInit)(VP56Context *s); |
81 | | typedef void (*VP56ParseVectorModels)(VP56Context *s); |
82 | | typedef int (*VP56ParseCoeffModels)(VP56Context *s); |
83 | | typedef int (*VP56ParseHeader)(VP56Context *s, const uint8_t *buf, |
84 | | int buf_size); |
85 | | |
86 | | typedef struct VP56RefDc { |
87 | | uint8_t not_null_dc; |
88 | | VP56Frame ref_frame; |
89 | | int16_t dc_coeff; |
90 | | } VP56RefDc; |
91 | | |
92 | | typedef struct VP56Macroblock { |
93 | | uint8_t type; |
94 | | VP56mv mv; |
95 | | } VP56Macroblock; |
96 | | |
97 | | typedef struct VP56Model { |
98 | | uint8_t coeff_reorder[64]; /* used in vp6 only */ |
99 | | uint8_t coeff_index_to_pos[64]; /* used in vp6 only */ |
100 | | uint8_t coeff_index_to_idct_selector[64]; /* used in vp6 only */ |
101 | | uint8_t vector_sig[2]; /* delta sign */ |
102 | | uint8_t vector_dct[2]; /* delta coding types */ |
103 | | uint8_t vector_pdi[2][2]; /* predefined delta init */ |
104 | | uint8_t vector_pdv[2][7]; /* predefined delta values */ |
105 | | uint8_t vector_fdv[2][8]; /* 8 bit delta value definition */ |
106 | | uint8_t coeff_dccv[2][11]; /* DC coeff value */ |
107 | | uint8_t coeff_ract[2][3][6][11]; /* Run/AC coding type and AC coeff value */ |
108 | | uint8_t coeff_acct[2][3][3][6][5];/* vp5 only AC coding type for coding group < 3 */ |
109 | | uint8_t coeff_dcct[2][36][5]; /* DC coeff coding type */ |
110 | | uint8_t coeff_runv[2][14]; /* run value (vp6 only) */ |
111 | | uint8_t mb_type[3][10][10]; /* model for decoding MB type */ |
112 | | uint8_t mb_types_stats[3][10][2];/* contextual, next MB type stats */ |
113 | | } VP56Model; |
114 | | |
115 | | struct vp56_context { |
116 | | AVCodecContext *avctx; |
117 | | H264ChromaContext h264chroma; |
118 | | HpelDSPContext hdsp; |
119 | | VideoDSPContext vdsp; |
120 | | VP3DSPContext vp3dsp; |
121 | | union { |
122 | | VP5DSPContext vp5dsp; |
123 | | VP6DSPContext vp6dsp; |
124 | | }; |
125 | | uint8_t idct_scantable[64]; |
126 | | AVFrame *frames[4]; |
127 | | uint8_t *edge_emu_buffer_alloc; |
128 | | uint8_t *edge_emu_buffer; |
129 | | VPXRangeCoder c; |
130 | | VPXRangeCoder cc; |
131 | | VPXRangeCoder *ccp; |
132 | | int sub_version; |
133 | | |
134 | | /* frame info */ |
135 | | int golden_frame; |
136 | | int plane_width[4]; |
137 | | int plane_height[4]; |
138 | | int mb_width; /* number of horizontal MB */ |
139 | | int mb_height; /* number of vertical MB */ |
140 | | int block_offset[6]; |
141 | | |
142 | | int quantizer; |
143 | | uint16_t dequant_dc; |
144 | | uint16_t dequant_ac; |
145 | | |
146 | | /* DC predictors management */ |
147 | | VP56RefDc *above_blocks; |
148 | | VP56RefDc left_block[4]; |
149 | | int above_block_idx[6]; |
150 | | int16_t prev_dc[3][3]; /* [plan][ref_frame] */ |
151 | | |
152 | | /* blocks / macroblock */ |
153 | | VP56mb mb_type; |
154 | | VP56Macroblock *macroblocks; |
155 | | DECLARE_ALIGNED(16, int16_t, block_coeff)[6][64]; |
156 | | int idct_selector[6]; |
157 | | const uint8_t *def_coeff_reorder;/* used in vp6 only */ |
158 | | |
159 | | /* motion vectors */ |
160 | | VP56mv mv[6]; /* vectors for each block in MB */ |
161 | | VP56mv vector_candidate[2]; |
162 | | int vector_candidate_pos; |
163 | | |
164 | | /* filtering hints */ |
165 | | int filter_header; /* used in vp6 only */ |
166 | | int deblock_filtering; |
167 | | int filter_selection; |
168 | | int filter_mode; |
169 | | int max_vector_length; |
170 | | int sample_variance_threshold; |
171 | | DECLARE_ALIGNED(8, int, bounding_values_array)[256]; |
172 | | |
173 | | uint8_t coeff_ctx[4][64]; /* used in vp5 only */ |
174 | | uint8_t coeff_ctx_last[4]; /* used in vp5 only */ |
175 | | |
176 | | int has_alpha; |
177 | | |
178 | | /* interlacing params */ |
179 | | int interlaced; |
180 | | int il_prob; |
181 | | int il_block; |
182 | | |
183 | | /* upside-down flipping hints */ |
184 | | int flip; /* are we flipping ? */ |
185 | | int frbi; /* first row block index in MB */ |
186 | | int srbi; /* second row block index in MB */ |
187 | | ptrdiff_t stride[4]; /* stride for each plan */ |
188 | | |
189 | | const uint8_t *vp56_coord_div; |
190 | | VP56ParseVectorAdjustment parse_vector_adjustment; |
191 | | VP56Filter filter; |
192 | | VP56ParseCoeff parse_coeff; |
193 | | VP56DefaultModelsInit default_models_init; |
194 | | VP56ParseVectorModels parse_vector_models; |
195 | | VP56ParseCoeffModels parse_coeff_models; |
196 | | VP56ParseHeader parse_header; |
197 | | |
198 | | /* for "slice" parallelism between YUV and A */ |
199 | | VP56Context *alpha_context; |
200 | | |
201 | | VP56Model *modelp; |
202 | | VP56Model model; |
203 | | |
204 | | /* huffman decoding */ |
205 | | int use_huffman; |
206 | | GetBitContext gb; |
207 | | VLC dccv_vlc[2]; |
208 | | VLC runv_vlc[2]; |
209 | | VLC ract_vlc[2][3][4]; |
210 | | unsigned int nb_null[2][2]; /* number of consecutive NULL DC/AC */ |
211 | | |
212 | | int have_undamaged_frame; |
213 | | int discard_frame; |
214 | | }; |
215 | | |
216 | | |
217 | | /** |
218 | | * Initializes an VP56Context. Expects its caller to clean up |
219 | | * in case of error. |
220 | | */ |
221 | | int ff_vp56_init_context(AVCodecContext *avctx, VP56Context *s, |
222 | | int flip, int has_alpha); |
223 | | int ff_vp56_free_context(VP56Context *s); |
224 | | void ff_vp56_init_dequant(VP56Context *s, int quantizer); |
225 | | int ff_vp56_decode_frame(AVCodecContext *avctx, AVFrame *frame, |
226 | | int *got_frame, AVPacket *avpkt); |
227 | | |
228 | | |
229 | | /** |
230 | | * vp56 specific range coder implementation |
231 | | */ |
232 | | |
233 | | static int vp56_rac_gets(VPXRangeCoder *c, int bits) |
234 | 38.9M | { |
235 | 38.9M | int value = 0; |
236 | | |
237 | 297M | while (bits--) { |
238 | 258M | value = (value << 1) | vpx_rac_get(c); |
239 | 258M | } |
240 | | |
241 | 38.9M | return value; |
242 | 38.9M | } Line | Count | Source | 234 | 20.8M | { | 235 | 20.8M | int value = 0; | 236 | | | 237 | 156M | while (bits--) { | 238 | 135M | value = (value << 1) | vpx_rac_get(c); | 239 | 135M | } | 240 | | | 241 | 20.8M | return value; | 242 | 20.8M | } |
Line | Count | Source | 234 | 4.45M | { | 235 | 4.45M | int value = 0; | 236 | | | 237 | 32.6M | while (bits--) { | 238 | 28.1M | value = (value << 1) | vpx_rac_get(c); | 239 | 28.1M | } | 240 | | | 241 | 4.45M | return value; | 242 | 4.45M | } |
Unexecuted instantiation: vp56data.c:vp56_rac_gets Line | Count | Source | 234 | 13.6M | { | 235 | 13.6M | int value = 0; | 236 | | | 237 | 108M | while (bits--) { | 238 | 94.9M | value = (value << 1) | vpx_rac_get(c); | 239 | 94.9M | } | 240 | | | 241 | 13.6M | return value; | 242 | 13.6M | } |
|
243 | | |
244 | | // P(7) |
245 | | av_unused static int vp56_rac_gets_nn(VPXRangeCoder *c, int bits) |
246 | 30.8M | { |
247 | 30.8M | int v = vp56_rac_gets(c, 7) << 1; |
248 | 30.8M | return v + !v; |
249 | 30.8M | } Line | Count | Source | 246 | 17.5M | { | 247 | 17.5M | int v = vp56_rac_gets(c, 7) << 1; | 248 | 17.5M | return v + !v; | 249 | 17.5M | } |
Unexecuted instantiation: vp56.c:vp56_rac_gets_nn Unexecuted instantiation: vp56data.c:vp56_rac_gets_nn Line | Count | Source | 246 | 13.3M | { | 247 | 13.3M | int v = vp56_rac_gets(c, 7) << 1; | 248 | 13.3M | return v + !v; | 249 | 13.3M | } |
|
250 | | |
251 | | static av_always_inline |
252 | | int vp56_rac_get_tree(VPXRangeCoder *c, |
253 | | const VP56Tree *tree, |
254 | | const uint8_t *probs) |
255 | 111M | { |
256 | 440M | while (tree->val > 0) { |
257 | 329M | if (vpx_rac_get_prob_branchy(c, probs[tree->prob_idx])) |
258 | 318M | tree += tree->val; |
259 | 10.6M | else |
260 | 10.6M | tree++; |
261 | 329M | } |
262 | 111M | return -tree->val; |
263 | 111M | } Line | Count | Source | 255 | 87.8M | { | 256 | 350M | while (tree->val > 0) { | 257 | 262M | if (vpx_rac_get_prob_branchy(c, probs[tree->prob_idx])) | 258 | 257M | tree += tree->val; | 259 | 5.34M | else | 260 | 5.34M | tree++; | 261 | 262M | } | 262 | 87.8M | return -tree->val; | 263 | 87.8M | } |
Line | Count | Source | 255 | 5.32M | { | 256 | 17.6M | while (tree->val > 0) { | 257 | 12.3M | if (vpx_rac_get_prob_branchy(c, probs[tree->prob_idx])) | 258 | 7.85M | tree += tree->val; | 259 | 4.45M | else | 260 | 4.45M | tree++; | 261 | 12.3M | } | 262 | 5.32M | return -tree->val; | 263 | 5.32M | } |
Unexecuted instantiation: vp56data.c:vp56_rac_get_tree Line | Count | Source | 255 | 18.0M | { | 256 | 72.2M | while (tree->val > 0) { | 257 | 54.1M | if (vpx_rac_get_prob_branchy(c, probs[tree->prob_idx])) | 258 | 53.2M | tree += tree->val; | 259 | 883k | else | 260 | 883k | tree++; | 261 | 54.1M | } | 262 | 18.0M | return -tree->val; | 263 | 18.0M | } |
|
264 | | |
265 | | #endif /* AVCODEC_VP56_H */ |