Mercurial > libavcodec.hg
annotate rv34.c @ 9930:32e856bd5ded libavcodec
Check for CONFIG_LIBFOO_DECODER/CONFIG_LIBFOO_ENCODER instead of just
CONFIG_LIBFOO in the external libraries section.
This is more consistent with the rest of the Makefiles, it makes clearer what
is actually implemented and should be advantageous if we implement an external
library encoder where we previously just had the decoder and vice versa.
author | diego |
---|---|
date | Tue, 07 Jul 2009 09:33:08 +0000 |
parents | 305536ce781f |
children | d0f2f4e4436c |
rev | line source |
---|---|
6026 | 1 /* |
2 * RV30/40 decoder common data | |
3 * Copyright (c) 2007 Mike Melanson, Konstantin Shishkov | |
4 * | |
5 * This file is part of FFmpeg. | |
6 * | |
7 * FFmpeg is free software; you can redistribute it and/or | |
8 * modify it under the terms of the GNU Lesser General Public | |
9 * License as published by the Free Software Foundation; either | |
10 * version 2.1 of the License, or (at your option) any later version. | |
11 * | |
12 * FFmpeg is distributed in the hope that it will be useful, | |
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Lesser General Public | |
18 * License along with FFmpeg; if not, write to the Free Software | |
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
20 */ | |
21 | |
22 /** | |
8718
e9d9d946f213
Use full internal pathname in doxygen @file directives.
diego
parents:
8693
diff
changeset
|
23 * @file libavcodec/rv34.c |
6026 | 24 * RV30/40 decoder common data |
25 */ | |
26 | |
27 #include "avcodec.h" | |
28 #include "dsputil.h" | |
29 #include "mpegvideo.h" | |
30 #include "golomb.h" | |
8627
d6bab465b82c
moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents:
8504
diff
changeset
|
31 #include "mathops.h" |
6026 | 32 #include "rectangle.h" |
33 | |
34 #include "rv34vlc.h" | |
35 #include "rv34data.h" | |
36 #include "rv34.h" | |
37 | |
38 //#define DEBUG | |
39 | |
40 /** translation of RV30/40 macroblock types to lavc ones */ | |
41 static const int rv34_mb_type_to_lavc[12] = { | |
42 MB_TYPE_INTRA, | |
8036
9b98b2261938
Mark some of RV3/4 block types as having separate DC subblock
kostya
parents:
6750
diff
changeset
|
43 MB_TYPE_INTRA16x16 | MB_TYPE_SEPARATE_DC, |
6026 | 44 MB_TYPE_16x16 | MB_TYPE_L0, |
45 MB_TYPE_8x8 | MB_TYPE_L0, | |
46 MB_TYPE_16x16 | MB_TYPE_L0, | |
47 MB_TYPE_16x16 | MB_TYPE_L1, | |
48 MB_TYPE_SKIP, | |
49 MB_TYPE_DIRECT2 | MB_TYPE_16x16, | |
50 MB_TYPE_16x8 | MB_TYPE_L0, | |
51 MB_TYPE_8x16 | MB_TYPE_L0, | |
52 MB_TYPE_16x16 | MB_TYPE_L0L1, | |
8036
9b98b2261938
Mark some of RV3/4 block types as having separate DC subblock
kostya
parents:
6750
diff
changeset
|
53 MB_TYPE_16x16 | MB_TYPE_L0 | MB_TYPE_SEPARATE_DC |
6026 | 54 }; |
55 | |
56 | |
57 static RV34VLC intra_vlcs[NUM_INTRA_TABLES], inter_vlcs[NUM_INTER_TABLES]; | |
58 | |
59 /** | |
60 * @defgroup vlc RV30/40 VLC generating functions | |
61 * @{ | |
62 */ | |
63 | |
9568
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
64 static const int table_offs[] = { |
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
65 0, 1818, 3622, 4144, 4698, 5234, 5804, 5868, 5900, 5932, |
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
66 5996, 6252, 6316, 6348, 6380, 7674, 8944, 10274, 11668, 12250, |
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
67 14060, 15846, 16372, 16962, 17512, 18148, 18180, 18212, 18244, 18308, |
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
68 18564, 18628, 18660, 18692, 20036, 21314, 22648, 23968, 24614, 26384, |
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
69 28190, 28736, 29366, 29938, 30608, 30640, 30672, 30704, 30768, 31024, |
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
70 31088, 31120, 31184, 32570, 33898, 35236, 36644, 37286, 39020, 40802, |
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
71 41368, 42052, 42692, 43348, 43380, 43412, 43444, 43476, 43604, 43668, |
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
72 43700, 43732, 45100, 46430, 47778, 49160, 49802, 51550, 53340, 53972, |
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
73 54648, 55348, 55994, 56122, 56154, 56186, 56218, 56346, 56410, 56442, |
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
74 56474, 57878, 59290, 60636, 62036, 62682, 64460, 64524, 64588, 64716, |
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
75 64844, 66076, 67466, 67978, 68542, 69064, 69648, 70296, 72010, 72074, |
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
76 72138, 72202, 72330, 73572, 74936, 75454, 76030, 76566, 77176, 77822, |
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
77 79582, 79646, 79678, 79742, 79870, 81180, 82536, 83064, 83672, 84242, |
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
78 84934, 85576, 87384, 87448, 87480, 87544, 87672, 88982, 90340, 90902, |
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
79 91598, 92182, 92846, 93488, 95246, 95278, 95310, 95374, 95502, 96878, |
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
80 98266, 98848, 99542, 100234, 100884, 101524, 103320, 103352, 103384, 103416, |
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
81 103480, 104874, 106222, 106910, 107584, 108258, 108902, 109544, 111366, 111398, |
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
82 111430, 111462, 111494, 112878, 114320, 114988, 115660, 116310, 116950, 117592 |
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
83 }; |
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
84 |
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
85 static VLC_TYPE table_data[117592][2]; |
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
86 |
6026 | 87 /** |
88 * Generate VLC from codeword lengths. | |
89 * @param bits codeword lengths (zeroes are accepted) | |
90 * @param size length of input data | |
8684 | 91 * @param vlc output VLC |
6026 | 92 * @param insyms symbols for input codes (NULL for default ones) |
9520
c9c23894f4ae
Make RV3/4 VLC tables use new static initialization method
kostya
parents:
9355
diff
changeset
|
93 * @param num VLC table number (for static initialization) |
6026 | 94 */ |
9568
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
95 static void rv34_gen_vlc(const uint8_t *bits, int size, VLC *vlc, const uint8_t *insyms, |
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
96 const int num) |
6026 | 97 { |
98 int i; | |
99 int counts[17] = {0}, codes[17]; | |
100 uint16_t cw[size], syms[size]; | |
101 uint8_t bits2[size]; | |
102 int maxbits = 0, realsize = 0; | |
103 | |
104 for(i = 0; i < size; i++){ | |
105 if(bits[i]){ | |
106 bits2[realsize] = bits[i]; | |
107 syms[realsize] = insyms ? insyms[i] : i; | |
108 realsize++; | |
109 maxbits = FFMAX(maxbits, bits[i]); | |
110 counts[bits[i]]++; | |
111 } | |
112 } | |
113 | |
114 codes[0] = 0; | |
115 for(i = 0; i < 16; i++) | |
116 codes[i+1] = (codes[i] + counts[i]) << 1; | |
117 for(i = 0; i < realsize; i++) | |
118 cw[i] = codes[bits2[i]]++; | |
119 | |
9568
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
120 vlc->table = &table_data[table_offs[num]]; |
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
121 vlc->table_allocated = table_offs[num + 1] - table_offs[num]; |
6026 | 122 init_vlc_sparse(vlc, FFMIN(maxbits, 9), realsize, |
123 bits2, 1, 1, | |
124 cw, 2, 2, | |
9568
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
125 syms, 2, 2, INIT_VLC_USE_NEW_STATIC); |
6026 | 126 } |
127 | |
128 /** | |
129 * Initialize all tables. | |
130 */ | |
8693
18737839ed27
Add missing void keyword to parameterless function declarations.
diego
parents:
8684
diff
changeset
|
131 static av_cold void rv34_init_tables(void) |
6026 | 132 { |
133 int i, j, k; | |
134 | |
135 for(i = 0; i < NUM_INTRA_TABLES; i++){ | |
136 for(j = 0; j < 2; j++){ | |
9568
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
137 rv34_gen_vlc(rv34_table_intra_cbppat [i][j], CBPPAT_VLC_SIZE, &intra_vlcs[i].cbppattern[j], NULL, 19*i + 0 + j); |
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
138 rv34_gen_vlc(rv34_table_intra_secondpat[i][j], OTHERBLK_VLC_SIZE, &intra_vlcs[i].second_pattern[j], NULL, 19*i + 2 + j); |
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
139 rv34_gen_vlc(rv34_table_intra_thirdpat [i][j], OTHERBLK_VLC_SIZE, &intra_vlcs[i].third_pattern[j], NULL, 19*i + 4 + j); |
9520
c9c23894f4ae
Make RV3/4 VLC tables use new static initialization method
kostya
parents:
9355
diff
changeset
|
140 for(k = 0; k < 4; k++){ |
9568
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
141 rv34_gen_vlc(rv34_table_intra_cbp[i][j+k*2], CBP_VLC_SIZE, &intra_vlcs[i].cbp[j][k], rv34_cbp_code, 19*i + 6 + j*4 + k); |
9520
c9c23894f4ae
Make RV3/4 VLC tables use new static initialization method
kostya
parents:
9355
diff
changeset
|
142 } |
6026 | 143 } |
9520
c9c23894f4ae
Make RV3/4 VLC tables use new static initialization method
kostya
parents:
9355
diff
changeset
|
144 for(j = 0; j < 4; j++){ |
9568
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
145 rv34_gen_vlc(rv34_table_intra_firstpat[i][j], FIRSTBLK_VLC_SIZE, &intra_vlcs[i].first_pattern[j], NULL, 19*i + 14 + j); |
9520
c9c23894f4ae
Make RV3/4 VLC tables use new static initialization method
kostya
parents:
9355
diff
changeset
|
146 } |
9568
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
147 rv34_gen_vlc(rv34_intra_coeff[i], COEFF_VLC_SIZE, &intra_vlcs[i].coefficient, NULL, 19*i + 18); |
6026 | 148 } |
149 | |
150 for(i = 0; i < NUM_INTER_TABLES; i++){ | |
9568
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
151 rv34_gen_vlc(rv34_inter_cbppat[i], CBPPAT_VLC_SIZE, &inter_vlcs[i].cbppattern[0], NULL, i*12 + 95); |
9520
c9c23894f4ae
Make RV3/4 VLC tables use new static initialization method
kostya
parents:
9355
diff
changeset
|
152 for(j = 0; j < 4; j++){ |
9568
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
153 rv34_gen_vlc(rv34_inter_cbp[i][j], CBP_VLC_SIZE, &inter_vlcs[i].cbp[0][j], rv34_cbp_code, i*12 + 96 + j); |
9520
c9c23894f4ae
Make RV3/4 VLC tables use new static initialization method
kostya
parents:
9355
diff
changeset
|
154 } |
6026 | 155 for(j = 0; j < 2; j++){ |
9568
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
156 rv34_gen_vlc(rv34_table_inter_firstpat [i][j], FIRSTBLK_VLC_SIZE, &inter_vlcs[i].first_pattern[j], NULL, i*12 + 100 + j); |
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
157 rv34_gen_vlc(rv34_table_inter_secondpat[i][j], OTHERBLK_VLC_SIZE, &inter_vlcs[i].second_pattern[j], NULL, i*12 + 102 + j); |
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
158 rv34_gen_vlc(rv34_table_inter_thirdpat [i][j], OTHERBLK_VLC_SIZE, &inter_vlcs[i].third_pattern[j], NULL, i*12 + 104 + j); |
6026 | 159 } |
9568
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
160 rv34_gen_vlc(rv34_inter_coeff[i], COEFF_VLC_SIZE, &inter_vlcs[i].coefficient, NULL, i*12 + 106); |
6026 | 161 } |
162 } | |
163 | |
164 /** @} */ // vlc group | |
165 | |
166 | |
167 /** | |
168 * @defgroup transform RV30/40 inverse transform functions | |
169 * @{ | |
170 */ | |
171 | |
172 static av_always_inline void rv34_row_transform(int temp[16], DCTELEM *block) | |
173 { | |
174 int i; | |
175 | |
176 for(i=0; i<4; i++){ | |
177 const int z0= 13*(block[i+8*0] + block[i+8*2]); | |
178 const int z1= 13*(block[i+8*0] - block[i+8*2]); | |
179 const int z2= 7* block[i+8*1] - 17*block[i+8*3]; | |
180 const int z3= 17* block[i+8*1] + 7*block[i+8*3]; | |
181 | |
182 temp[4*i+0]= z0+z3; | |
183 temp[4*i+1]= z1+z2; | |
184 temp[4*i+2]= z1-z2; | |
185 temp[4*i+3]= z0-z3; | |
186 } | |
187 } | |
188 | |
189 /** | |
190 * Real Video 3.0/4.0 inverse transform | |
191 * Code is almost the same as in SVQ3, only scaling is different. | |
192 */ | |
193 static void rv34_inv_transform(DCTELEM *block){ | |
194 int temp[16]; | |
195 int i; | |
196 | |
197 rv34_row_transform(temp, block); | |
198 | |
199 for(i=0; i<4; i++){ | |
200 const int z0= 13*(temp[4*0+i] + temp[4*2+i]) + 0x200; | |
201 const int z1= 13*(temp[4*0+i] - temp[4*2+i]) + 0x200; | |
202 const int z2= 7* temp[4*1+i] - 17*temp[4*3+i]; | |
203 const int z3= 17* temp[4*1+i] + 7*temp[4*3+i]; | |
204 | |
205 block[i*8+0]= (z0 + z3)>>10; | |
206 block[i*8+1]= (z1 + z2)>>10; | |
207 block[i*8+2]= (z1 - z2)>>10; | |
208 block[i*8+3]= (z0 - z3)>>10; | |
209 } | |
210 | |
211 } | |
212 | |
213 /** | |
214 * RealVideo 3.0/4.0 inverse transform for DC block | |
215 * | |
216 * Code is almost the same as rv34_inv_transform() | |
217 * but final coefficients are multiplied by 1.5 and have no rounding. | |
218 */ | |
219 static void rv34_inv_transform_noround(DCTELEM *block){ | |
220 int temp[16]; | |
221 int i; | |
222 | |
223 rv34_row_transform(temp, block); | |
224 | |
225 for(i=0; i<4; i++){ | |
226 const int z0= 13*(temp[4*0+i] + temp[4*2+i]); | |
227 const int z1= 13*(temp[4*0+i] - temp[4*2+i]); | |
228 const int z2= 7* temp[4*1+i] - 17*temp[4*3+i]; | |
229 const int z3= 17* temp[4*1+i] + 7*temp[4*3+i]; | |
230 | |
231 block[i*8+0]= ((z0 + z3)*3)>>11; | |
232 block[i*8+1]= ((z1 + z2)*3)>>11; | |
233 block[i*8+2]= ((z1 - z2)*3)>>11; | |
234 block[i*8+3]= ((z0 - z3)*3)>>11; | |
235 } | |
236 | |
237 } | |
238 | |
239 /** @} */ // transform | |
240 | |
241 | |
242 /** | |
243 * @defgroup block RV30/40 4x4 block decoding functions | |
244 * @{ | |
245 */ | |
246 | |
247 /** | |
248 * Decode coded block pattern. | |
249 */ | |
250 static int rv34_decode_cbp(GetBitContext *gb, RV34VLC *vlc, int table) | |
251 { | |
252 int pattern, code, cbp=0; | |
253 int ones; | |
254 static const int cbp_masks[3] = {0x100000, 0x010000, 0x110000}; | |
255 static const int shifts[4] = { 0, 2, 8, 10 }; | |
8721
42e258f2b931
Silence two pointer assignment compiler warnings in rv34.c
kostya
parents:
8718
diff
changeset
|
256 const int *curshift = shifts; |
6026 | 257 int i, t, mask; |
258 | |
259 code = get_vlc2(gb, vlc->cbppattern[table].table, 9, 2); | |
260 pattern = code & 0xF; | |
261 code >>= 4; | |
262 | |
263 ones = rv34_count_ones[pattern]; | |
264 | |
265 for(mask = 8; mask; mask >>= 1, curshift++){ | |
266 if(pattern & mask) | |
267 cbp |= get_vlc2(gb, vlc->cbp[table][ones].table, vlc->cbp[table][ones].bits, 1) << curshift[0]; | |
268 } | |
269 | |
270 for(i = 0; i < 4; i++){ | |
271 t = modulo_three_table[code][i]; | |
272 if(t == 1) | |
273 cbp |= cbp_masks[get_bits1(gb)] << i; | |
274 if(t == 2) | |
275 cbp |= cbp_masks[2] << i; | |
276 } | |
277 return cbp; | |
278 } | |
279 | |
280 /** | |
281 * Get one coefficient value from the bistream and store it. | |
282 */ | |
283 static inline void decode_coeff(DCTELEM *dst, int coef, int esc, GetBitContext *gb, VLC* vlc) | |
284 { | |
285 if(coef){ | |
286 if(coef == esc){ | |
287 coef = get_vlc2(gb, vlc->table, 9, 2); | |
288 if(coef > 23){ | |
289 coef -= 23; | |
290 coef = 22 + ((1 << coef) | get_bits(gb, coef)); | |
291 } | |
292 coef += esc; | |
293 } | |
294 if(get_bits1(gb)) | |
295 coef = -coef; | |
296 *dst = coef; | |
297 } | |
298 } | |
299 | |
300 /** | |
301 * Decode 2x2 subblock of coefficients. | |
302 */ | |
303 static inline void decode_subblock(DCTELEM *dst, int code, const int is_block2, GetBitContext *gb, VLC *vlc) | |
304 { | |
305 int coeffs[4]; | |
306 | |
307 coeffs[0] = modulo_three_table[code][0]; | |
308 coeffs[1] = modulo_three_table[code][1]; | |
309 coeffs[2] = modulo_three_table[code][2]; | |
310 coeffs[3] = modulo_three_table[code][3]; | |
311 decode_coeff(dst , coeffs[0], 3, gb, vlc); | |
312 if(is_block2){ | |
313 decode_coeff(dst+8, coeffs[1], 2, gb, vlc); | |
314 decode_coeff(dst+1, coeffs[2], 2, gb, vlc); | |
315 }else{ | |
316 decode_coeff(dst+1, coeffs[1], 2, gb, vlc); | |
317 decode_coeff(dst+8, coeffs[2], 2, gb, vlc); | |
318 } | |
319 decode_coeff(dst+9, coeffs[3], 2, gb, vlc); | |
320 } | |
321 | |
322 /** | |
323 * Decode coefficients for 4x4 block. | |
324 * | |
325 * This is done by filling 2x2 subblocks with decoded coefficients | |
326 * in this order (the same for subblocks and subblock coefficients): | |
327 * o--o | |
328 * / | |
329 * / | |
330 * o--o | |
331 */ | |
332 | |
333 static inline void rv34_decode_block(DCTELEM *dst, GetBitContext *gb, RV34VLC *rvlc, int fc, int sc) | |
334 { | |
335 int code, pattern; | |
336 | |
337 code = get_vlc2(gb, rvlc->first_pattern[fc].table, 9, 2); | |
338 | |
339 pattern = code & 0x7; | |
340 | |
341 code >>= 3; | |
342 decode_subblock(dst, code, 0, gb, &rvlc->coefficient); | |
343 | |
344 if(pattern & 4){ | |
345 code = get_vlc2(gb, rvlc->second_pattern[sc].table, 9, 2); | |
346 decode_subblock(dst + 2, code, 0, gb, &rvlc->coefficient); | |
347 } | |
348 if(pattern & 2){ // Looks like coefficients 1 and 2 are swapped for this block | |
349 code = get_vlc2(gb, rvlc->second_pattern[sc].table, 9, 2); | |
350 decode_subblock(dst + 8*2, code, 1, gb, &rvlc->coefficient); | |
351 } | |
352 if(pattern & 1){ | |
353 code = get_vlc2(gb, rvlc->third_pattern[sc].table, 9, 2); | |
354 decode_subblock(dst + 8*2+2, code, 0, gb, &rvlc->coefficient); | |
355 } | |
356 | |
357 } | |
358 | |
359 /** | |
360 * Dequantize ordinary 4x4 block. | |
361 * @todo optimize | |
362 */ | |
363 static inline void rv34_dequant4x4(DCTELEM *block, int Qdc, int Q) | |
364 { | |
365 int i, j; | |
366 | |
367 block[0] = (block[0] * Qdc + 8) >> 4; | |
368 for(i = 0; i < 4; i++) | |
369 for(j = !i; j < 4; j++) | |
370 block[j + i*8] = (block[j + i*8] * Q + 8) >> 4; | |
371 } | |
372 | |
373 /** | |
374 * Dequantize 4x4 block of DC values for 16x16 macroblock. | |
375 * @todo optimize | |
376 */ | |
377 static inline void rv34_dequant4x4_16x16(DCTELEM *block, int Qdc, int Q) | |
378 { | |
379 int i; | |
380 | |
381 for(i = 0; i < 3; i++) | |
382 block[rv34_dezigzag[i]] = (block[rv34_dezigzag[i]] * Qdc + 8) >> 4; | |
383 for(; i < 16; i++) | |
384 block[rv34_dezigzag[i]] = (block[rv34_dezigzag[i]] * Q + 8) >> 4; | |
385 } | |
386 /** @} */ //block functions | |
387 | |
388 | |
389 /** | |
390 * @defgroup bitstream RV30/40 bitstream parsing | |
391 * @{ | |
392 */ | |
393 | |
394 /** | |
395 * Decode starting slice position. | |
396 * @todo Maybe replace with ff_h263_decode_mba() ? | |
397 */ | |
398 int ff_rv34_get_start_offset(GetBitContext *gb, int mb_size) | |
399 { | |
400 int i; | |
401 for(i = 0; i < 5; i++) | |
8445
8621deaff8dc
352l: correct calculating number of bits for storing macroblock offset in RV3/4
kostya
parents:
8371
diff
changeset
|
402 if(rv34_mb_max_sizes[i] >= mb_size - 1) |
6026 | 403 break; |
404 return rv34_mb_bits_sizes[i]; | |
405 } | |
406 | |
407 /** | |
408 * Select VLC set for decoding from current quantizer, modifier and frame type. | |
409 */ | |
410 static inline RV34VLC* choose_vlc_set(int quant, int mod, int type) | |
411 { | |
412 if(mod == 2 && quant < 19) quant += 10; | |
413 else if(mod && quant < 26) quant += 5; | |
414 return type ? &inter_vlcs[rv34_quant_to_vlc_set[1][av_clip(quant, 0, 30)]] | |
415 : &intra_vlcs[rv34_quant_to_vlc_set[0][av_clip(quant, 0, 30)]]; | |
416 } | |
417 | |
418 /** | |
419 * Decode quantizer difference and return modified quantizer. | |
420 */ | |
421 static inline int rv34_decode_dquant(GetBitContext *gb, int quant) | |
422 { | |
423 if(get_bits1(gb)) | |
424 return rv34_dquant_tab[get_bits1(gb)][quant]; | |
425 else | |
426 return get_bits(gb, 5); | |
427 } | |
428 | |
429 /** @} */ //bitstream functions | |
430 | |
431 /** | |
432 * @defgroup mv motion vector related code (prediction, reconstruction, motion compensation) | |
433 * @{ | |
434 */ | |
435 | |
436 /** macroblock partition width in 8x8 blocks */ | |
437 static const uint8_t part_sizes_w[RV34_MB_TYPES] = { 2, 2, 2, 1, 2, 2, 2, 2, 2, 1, 2, 2 }; | |
438 | |
439 /** macroblock partition height in 8x8 blocks */ | |
440 static const uint8_t part_sizes_h[RV34_MB_TYPES] = { 2, 2, 2, 1, 2, 2, 2, 2, 1, 2, 2, 2 }; | |
441 | |
442 /** availability index for subblocks */ | |
443 static const uint8_t avail_indexes[4] = { 5, 6, 9, 10 }; | |
444 | |
445 /** | |
446 * motion vector prediction | |
447 * | |
448 * Motion prediction performed for the block by using median prediction of | |
449 * motion vectors from the left, top and right top blocks but in corner cases | |
450 * some other vectors may be used instead. | |
451 */ | |
452 static void rv34_pred_mv(RV34DecContext *r, int block_type, int subblock_no, int dmv_no) | |
453 { | |
454 MpegEncContext *s = &r->s; | |
455 int mv_pos = s->mb_x * 2 + s->mb_y * 2 * s->b8_stride; | |
456 int A[2] = {0}, B[2], C[2]; | |
457 int i, j; | |
458 int mx, my; | |
459 int avail_index = avail_indexes[subblock_no]; | |
460 int c_off = part_sizes_w[block_type]; | |
461 | |
462 mv_pos += (subblock_no & 1) + (subblock_no >> 1)*s->b8_stride; | |
463 if(subblock_no == 3) | |
464 c_off = -1; | |
465 | |
466 if(r->avail_cache[avail_index - 1]){ | |
467 A[0] = s->current_picture_ptr->motion_val[0][mv_pos-1][0]; | |
468 A[1] = s->current_picture_ptr->motion_val[0][mv_pos-1][1]; | |
469 } | |
470 if(r->avail_cache[avail_index - 4]){ | |
471 B[0] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride][0]; | |
472 B[1] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride][1]; | |
473 }else{ | |
474 B[0] = A[0]; | |
475 B[1] = A[1]; | |
476 } | |
477 if(!r->avail_cache[avail_index - 4 + c_off]){ | |
478 if(r->avail_cache[avail_index - 4] && (r->avail_cache[avail_index - 1] || r->rv30)){ | |
479 C[0] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride-1][0]; | |
480 C[1] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride-1][1]; | |
481 }else{ | |
482 C[0] = A[0]; | |
483 C[1] = A[1]; | |
484 } | |
485 }else{ | |
486 C[0] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride+c_off][0]; | |
487 C[1] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride+c_off][1]; | |
488 } | |
489 mx = mid_pred(A[0], B[0], C[0]); | |
490 my = mid_pred(A[1], B[1], C[1]); | |
491 mx += r->dmv[dmv_no][0]; | |
492 my += r->dmv[dmv_no][1]; | |
493 for(j = 0; j < part_sizes_h[block_type]; j++){ | |
494 for(i = 0; i < part_sizes_w[block_type]; i++){ | |
495 s->current_picture_ptr->motion_val[0][mv_pos + i + j*s->b8_stride][0] = mx; | |
496 s->current_picture_ptr->motion_val[0][mv_pos + i + j*s->b8_stride][1] = my; | |
497 } | |
498 } | |
499 } | |
500 | |
6714
05c3a4b419e9
Calculate motion vector information based on PTS provided in slice header
kostya
parents:
6693
diff
changeset
|
501 #define GET_PTS_DIFF(a, b) ((a - b + 8192) & 0x1FFF) |
05c3a4b419e9
Calculate motion vector information based on PTS provided in slice header
kostya
parents:
6693
diff
changeset
|
502 |
6026 | 503 /** |
6096
89140b93ae09
Direct blocks should use motion vectors from the second reference frame
kostya
parents:
6036
diff
changeset
|
504 * Calculate motion vector component that should be added for direct blocks. |
89140b93ae09
Direct blocks should use motion vectors from the second reference frame
kostya
parents:
6036
diff
changeset
|
505 */ |
6714
05c3a4b419e9
Calculate motion vector information based on PTS provided in slice header
kostya
parents:
6693
diff
changeset
|
506 static int calc_add_mv(RV34DecContext *r, int dir, int val) |
6096
89140b93ae09
Direct blocks should use motion vectors from the second reference frame
kostya
parents:
6036
diff
changeset
|
507 { |
6714
05c3a4b419e9
Calculate motion vector information based on PTS provided in slice header
kostya
parents:
6693
diff
changeset
|
508 int refdist = GET_PTS_DIFF(r->next_pts, r->last_pts); |
8086
ae146e429003
Correct motion vector scaling in B-frames for RV3/4
kostya
parents:
8074
diff
changeset
|
509 int dist = dir ? -GET_PTS_DIFF(r->next_pts, r->cur_pts) : GET_PTS_DIFF(r->cur_pts, r->last_pts); |
ae146e429003
Correct motion vector scaling in B-frames for RV3/4
kostya
parents:
8074
diff
changeset
|
510 int mul; |
6096
89140b93ae09
Direct blocks should use motion vectors from the second reference frame
kostya
parents:
6036
diff
changeset
|
511 |
6714
05c3a4b419e9
Calculate motion vector information based on PTS provided in slice header
kostya
parents:
6693
diff
changeset
|
512 if(!refdist) return 0; |
8086
ae146e429003
Correct motion vector scaling in B-frames for RV3/4
kostya
parents:
8074
diff
changeset
|
513 mul = (dist << 14) / refdist; |
ae146e429003
Correct motion vector scaling in B-frames for RV3/4
kostya
parents:
8074
diff
changeset
|
514 return (val * mul + 0x2000) >> 14; |
6096
89140b93ae09
Direct blocks should use motion vectors from the second reference frame
kostya
parents:
6036
diff
changeset
|
515 } |
89140b93ae09
Direct blocks should use motion vectors from the second reference frame
kostya
parents:
6036
diff
changeset
|
516 |
89140b93ae09
Direct blocks should use motion vectors from the second reference frame
kostya
parents:
6036
diff
changeset
|
517 /** |
6026 | 518 * Predict motion vector for B-frame macroblock. |
519 */ | |
520 static inline void rv34_pred_b_vector(int A[2], int B[2], int C[2], | |
521 int A_avail, int B_avail, int C_avail, | |
522 int *mx, int *my) | |
523 { | |
524 if(A_avail + B_avail + C_avail != 3){ | |
525 *mx = A[0] + B[0] + C[0]; | |
526 *my = A[1] + B[1] + C[1]; | |
527 if(A_avail + B_avail + C_avail == 2){ | |
528 *mx /= 2; | |
529 *my /= 2; | |
530 } | |
531 }else{ | |
532 *mx = mid_pred(A[0], B[0], C[0]); | |
533 *my = mid_pred(A[1], B[1], C[1]); | |
534 } | |
535 } | |
536 | |
537 /** | |
538 * motion vector prediction for B-frames | |
539 */ | |
540 static void rv34_pred_mv_b(RV34DecContext *r, int block_type, int dir) | |
541 { | |
542 MpegEncContext *s = &r->s; | |
543 int mb_pos = s->mb_x + s->mb_y * s->mb_stride; | |
544 int mv_pos = s->mb_x * 2 + s->mb_y * 2 * s->b8_stride; | |
545 int A[2], B[2], C[2]; | |
546 int has_A = 0, has_B = 0, has_C = 0; | |
547 int mx, my; | |
548 int i, j; | |
549 Picture *cur_pic = s->current_picture_ptr; | |
550 const int mask = dir ? MB_TYPE_L1 : MB_TYPE_L0; | |
551 int type = cur_pic->mb_type[mb_pos]; | |
552 | |
553 memset(A, 0, sizeof(A)); | |
554 memset(B, 0, sizeof(B)); | |
555 memset(C, 0, sizeof(C)); | |
556 if((r->avail_cache[5-1] & type) & mask){ | |
557 A[0] = cur_pic->motion_val[dir][mv_pos - 1][0]; | |
558 A[1] = cur_pic->motion_val[dir][mv_pos - 1][1]; | |
559 has_A = 1; | |
560 } | |
561 if((r->avail_cache[5-4] & type) & mask){ | |
562 B[0] = cur_pic->motion_val[dir][mv_pos - s->b8_stride][0]; | |
563 B[1] = cur_pic->motion_val[dir][mv_pos - s->b8_stride][1]; | |
564 has_B = 1; | |
565 } | |
9168
5de43b1eb9f4
Correct MV prediction for B-frame blocks in RV4 decoder
kostya
parents:
9162
diff
changeset
|
566 if(r->avail_cache[5-4] && (r->avail_cache[5-2] & type) & mask){ |
6026 | 567 C[0] = cur_pic->motion_val[dir][mv_pos - s->b8_stride + 2][0]; |
568 C[1] = cur_pic->motion_val[dir][mv_pos - s->b8_stride + 2][1]; | |
569 has_C = 1; | |
570 }else if((s->mb_x+1) == s->mb_width && (r->avail_cache[5-5] & type) & mask){ | |
571 C[0] = cur_pic->motion_val[dir][mv_pos - s->b8_stride - 1][0]; | |
572 C[1] = cur_pic->motion_val[dir][mv_pos - s->b8_stride - 1][1]; | |
573 has_C = 1; | |
574 } | |
575 | |
576 rv34_pred_b_vector(A, B, C, has_A, has_B, has_C, &mx, &my); | |
577 | |
578 mx += r->dmv[dir][0]; | |
579 my += r->dmv[dir][1]; | |
6096
89140b93ae09
Direct blocks should use motion vectors from the second reference frame
kostya
parents:
6036
diff
changeset
|
580 |
6026 | 581 for(j = 0; j < 2; j++){ |
582 for(i = 0; i < 2; i++){ | |
583 cur_pic->motion_val[dir][mv_pos + i + j*s->b8_stride][0] = mx; | |
584 cur_pic->motion_val[dir][mv_pos + i + j*s->b8_stride][1] = my; | |
585 } | |
586 } | |
587 if(block_type == RV34_MB_B_BACKWARD || block_type == RV34_MB_B_FORWARD) | |
588 fill_rectangle(cur_pic->motion_val[!dir][mv_pos], 2, 2, s->b8_stride, 0, 4); | |
589 } | |
590 | |
8099 | 591 /** |
592 * motion vector prediction - RV3 version | |
593 */ | |
594 static void rv34_pred_mv_rv3(RV34DecContext *r, int block_type, int dir) | |
595 { | |
596 MpegEncContext *s = &r->s; | |
597 int mv_pos = s->mb_x * 2 + s->mb_y * 2 * s->b8_stride; | |
598 int A[2] = {0}, B[2], C[2]; | |
8504
3bfb7a2ea222
It turned out that RV30 uses motion vectors for forward motion B-frame
kostya
parents:
8445
diff
changeset
|
599 int i, j, k; |
8099 | 600 int mx, my; |
601 int avail_index = avail_indexes[0]; | |
602 | |
603 if(r->avail_cache[avail_index - 1]){ | |
604 A[0] = s->current_picture_ptr->motion_val[0][mv_pos-1][0]; | |
605 A[1] = s->current_picture_ptr->motion_val[0][mv_pos-1][1]; | |
606 } | |
607 if(r->avail_cache[avail_index - 4]){ | |
608 B[0] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride][0]; | |
609 B[1] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride][1]; | |
610 }else{ | |
611 B[0] = A[0]; | |
612 B[1] = A[1]; | |
613 } | |
614 if(!r->avail_cache[avail_index - 4 + 2]){ | |
615 if(r->avail_cache[avail_index - 4] && (r->avail_cache[avail_index - 1])){ | |
616 C[0] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride-1][0]; | |
617 C[1] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride-1][1]; | |
618 }else{ | |
619 C[0] = A[0]; | |
620 C[1] = A[1]; | |
621 } | |
622 }else{ | |
623 C[0] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride+2][0]; | |
624 C[1] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride+2][1]; | |
625 } | |
626 mx = mid_pred(A[0], B[0], C[0]); | |
627 my = mid_pred(A[1], B[1], C[1]); | |
628 mx += r->dmv[0][0]; | |
629 my += r->dmv[0][1]; | |
630 for(j = 0; j < 2; j++){ | |
631 for(i = 0; i < 2; i++){ | |
8504
3bfb7a2ea222
It turned out that RV30 uses motion vectors for forward motion B-frame
kostya
parents:
8445
diff
changeset
|
632 for(k = 0; k < 2; k++){ |
3bfb7a2ea222
It turned out that RV30 uses motion vectors for forward motion B-frame
kostya
parents:
8445
diff
changeset
|
633 s->current_picture_ptr->motion_val[k][mv_pos + i + j*s->b8_stride][0] = mx; |
3bfb7a2ea222
It turned out that RV30 uses motion vectors for forward motion B-frame
kostya
parents:
8445
diff
changeset
|
634 s->current_picture_ptr->motion_val[k][mv_pos + i + j*s->b8_stride][1] = my; |
3bfb7a2ea222
It turned out that RV30 uses motion vectors for forward motion B-frame
kostya
parents:
8445
diff
changeset
|
635 } |
8099 | 636 } |
637 } | |
638 } | |
639 | |
8074 | 640 static const int chroma_coeffs[3] = { 0, 3, 5 }; |
6106 | 641 |
6026 | 642 /** |
643 * generic motion compensation function | |
644 * | |
645 * @param r decoder context | |
646 * @param block_type type of the current block | |
647 * @param xoff horizontal offset from the start of the current block | |
648 * @param yoff vertical offset from the start of the current block | |
649 * @param mv_off offset to the motion vector information | |
650 * @param width width of the current partition in 8x8 blocks | |
651 * @param height height of the current partition in 8x8 blocks | |
8684 | 652 * @param dir motion compensation direction (i.e. from the last or the next reference frame) |
653 * @param thirdpel motion vectors are specified in 1/3 of pixel | |
654 * @param qpel_mc a set of functions used to perform luma motion compensation | |
655 * @param chroma_mc a set of functions used to perform chroma motion compensation | |
6026 | 656 */ |
657 static inline void rv34_mc(RV34DecContext *r, const int block_type, | |
658 const int xoff, const int yoff, int mv_off, | |
659 const int width, const int height, int dir, | |
660 const int thirdpel, | |
661 qpel_mc_func (*qpel_mc)[16], | |
662 h264_chroma_mc_func (*chroma_mc)) | |
663 { | |
664 MpegEncContext *s = &r->s; | |
665 uint8_t *Y, *U, *V, *srcY, *srcU, *srcV; | |
8074 | 666 int dxy, mx, my, umx, umy, lx, ly, uvmx, uvmy, src_x, src_y, uvsrc_x, uvsrc_y; |
6026 | 667 int mv_pos = s->mb_x * 2 + s->mb_y * 2 * s->b8_stride + mv_off; |
668 int is16x16 = 1; | |
669 | |
670 if(thirdpel){ | |
8074 | 671 int chroma_mx, chroma_my; |
6106 | 672 mx = (s->current_picture_ptr->motion_val[dir][mv_pos][0] + (3 << 24)) / 3 - (1 << 24); |
673 my = (s->current_picture_ptr->motion_val[dir][mv_pos][1] + (3 << 24)) / 3 - (1 << 24); | |
674 lx = (s->current_picture_ptr->motion_val[dir][mv_pos][0] + (3 << 24)) % 3; | |
675 ly = (s->current_picture_ptr->motion_val[dir][mv_pos][1] + (3 << 24)) % 3; | |
8074 | 676 chroma_mx = (s->current_picture_ptr->motion_val[dir][mv_pos][0] + 1) >> 1; |
677 chroma_my = (s->current_picture_ptr->motion_val[dir][mv_pos][1] + 1) >> 1; | |
678 umx = (chroma_mx + (3 << 24)) / 3 - (1 << 24); | |
679 umy = (chroma_my + (3 << 24)) / 3 - (1 << 24); | |
680 uvmx = chroma_coeffs[(chroma_mx + (3 << 24)) % 3]; | |
681 uvmy = chroma_coeffs[(chroma_my + (3 << 24)) % 3]; | |
6026 | 682 }else{ |
8221 | 683 int cx, cy; |
6026 | 684 mx = s->current_picture_ptr->motion_val[dir][mv_pos][0] >> 2; |
685 my = s->current_picture_ptr->motion_val[dir][mv_pos][1] >> 2; | |
6121
bc59962f70b9
Fractional parts of motion vectors should be accounted separately too
kostya
parents:
6106
diff
changeset
|
686 lx = s->current_picture_ptr->motion_val[dir][mv_pos][0] & 3; |
bc59962f70b9
Fractional parts of motion vectors should be accounted separately too
kostya
parents:
6106
diff
changeset
|
687 ly = s->current_picture_ptr->motion_val[dir][mv_pos][1] & 3; |
8221 | 688 cx = s->current_picture_ptr->motion_val[dir][mv_pos][0] / 2; |
689 cy = s->current_picture_ptr->motion_val[dir][mv_pos][1] / 2; | |
690 umx = cx >> 2; | |
691 umy = cy >> 2; | |
692 uvmx = (cx & 3) << 1; | |
693 uvmy = (cy & 3) << 1; | |
694 //due to some flaw RV40 uses the same MC compensation routine for H2V2 and H3V3 | |
695 if(uvmx == 6 && uvmy == 6) | |
696 uvmx = uvmy = 4; | |
6026 | 697 } |
6121
bc59962f70b9
Fractional parts of motion vectors should be accounted separately too
kostya
parents:
6106
diff
changeset
|
698 dxy = ly*4 + lx; |
6026 | 699 srcY = dir ? s->next_picture_ptr->data[0] : s->last_picture_ptr->data[0]; |
700 srcU = dir ? s->next_picture_ptr->data[1] : s->last_picture_ptr->data[1]; | |
701 srcV = dir ? s->next_picture_ptr->data[2] : s->last_picture_ptr->data[2]; | |
702 src_x = s->mb_x * 16 + xoff + mx; | |
703 src_y = s->mb_y * 16 + yoff + my; | |
8074 | 704 uvsrc_x = s->mb_x * 8 + (xoff >> 1) + umx; |
705 uvsrc_y = s->mb_y * 8 + (yoff >> 1) + umy; | |
6026 | 706 srcY += src_y * s->linesize + src_x; |
707 srcU += uvsrc_y * s->uvlinesize + uvsrc_x; | |
708 srcV += uvsrc_y * s->uvlinesize + uvsrc_x; | |
8179 | 709 if( (unsigned)(src_x - !!lx*2) > s->h_edge_pos - !!lx*2 - (width <<3) - 4 |
710 || (unsigned)(src_y - !!ly*2) > s->v_edge_pos - !!ly*2 - (height<<3) - 4){ | |
711 uint8_t *uvbuf= s->edge_emu_buffer + 22 * s->linesize; | |
6026 | 712 |
713 srcY -= 2 + 2*s->linesize; | |
8179 | 714 ff_emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, (width<<3)+6, (height<<3)+6, |
6026 | 715 src_x - 2, src_y - 2, s->h_edge_pos, s->v_edge_pos); |
716 srcY = s->edge_emu_buffer + 2 + 2*s->linesize; | |
717 ff_emulated_edge_mc(uvbuf , srcU, s->uvlinesize, (width<<2)+1, (height<<2)+1, | |
718 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1); | |
719 ff_emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, (width<<2)+1, (height<<2)+1, | |
720 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1); | |
721 srcU = uvbuf; | |
722 srcV = uvbuf + 16; | |
723 } | |
724 Y = s->dest[0] + xoff + yoff *s->linesize; | |
725 U = s->dest[1] + (xoff>>1) + (yoff>>1)*s->uvlinesize; | |
726 V = s->dest[2] + (xoff>>1) + (yoff>>1)*s->uvlinesize; | |
727 | |
728 if(block_type == RV34_MB_P_16x8){ | |
729 qpel_mc[1][dxy](Y, srcY, s->linesize); | |
730 Y += 8; | |
731 srcY += 8; | |
732 }else if(block_type == RV34_MB_P_8x16){ | |
733 qpel_mc[1][dxy](Y, srcY, s->linesize); | |
734 Y += 8 * s->linesize; | |
735 srcY += 8 * s->linesize; | |
736 } | |
737 is16x16 = (block_type != RV34_MB_P_8x8) && (block_type != RV34_MB_P_16x8) && (block_type != RV34_MB_P_8x16); | |
738 qpel_mc[!is16x16][dxy](Y, srcY, s->linesize); | |
739 chroma_mc[2-width] (U, srcU, s->uvlinesize, height*4, uvmx, uvmy); | |
740 chroma_mc[2-width] (V, srcV, s->uvlinesize, height*4, uvmx, uvmy); | |
741 } | |
742 | |
743 static void rv34_mc_1mv(RV34DecContext *r, const int block_type, | |
744 const int xoff, const int yoff, int mv_off, | |
745 const int width, const int height, int dir) | |
746 { | |
747 rv34_mc(r, block_type, xoff, yoff, mv_off, width, height, dir, r->rv30, | |
6106 | 748 r->rv30 ? r->s.dsp.put_rv30_tpel_pixels_tab |
8221 | 749 : r->s.dsp.put_rv40_qpel_pixels_tab, |
750 r->rv30 ? r->s.dsp.put_h264_chroma_pixels_tab | |
751 : r->s.dsp.put_rv40_chroma_pixels_tab); | |
6026 | 752 } |
753 | |
754 static void rv34_mc_2mv(RV34DecContext *r, const int block_type) | |
755 { | |
756 rv34_mc(r, block_type, 0, 0, 0, 2, 2, 0, r->rv30, | |
6106 | 757 r->rv30 ? r->s.dsp.put_rv30_tpel_pixels_tab |
8221 | 758 : r->s.dsp.put_rv40_qpel_pixels_tab, |
8244
3f3d653fb46d
34l: forgot to change one case of chroma MC for RV40
kostya
parents:
8243
diff
changeset
|
759 r->rv30 ? r->s.dsp.put_h264_chroma_pixels_tab |
3f3d653fb46d
34l: forgot to change one case of chroma MC for RV40
kostya
parents:
8243
diff
changeset
|
760 : r->s.dsp.put_rv40_chroma_pixels_tab); |
6026 | 761 rv34_mc(r, block_type, 0, 0, 0, 2, 2, 1, r->rv30, |
6106 | 762 r->rv30 ? r->s.dsp.avg_rv30_tpel_pixels_tab |
8221 | 763 : r->s.dsp.avg_rv40_qpel_pixels_tab, |
764 r->rv30 ? r->s.dsp.avg_h264_chroma_pixels_tab | |
765 : r->s.dsp.avg_rv40_chroma_pixels_tab); | |
6026 | 766 } |
767 | |
6693
6f13852a9161
Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents:
6517
diff
changeset
|
768 static void rv34_mc_2mv_skip(RV34DecContext *r) |
6f13852a9161
Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents:
6517
diff
changeset
|
769 { |
8128 | 770 int i, j; |
6693
6f13852a9161
Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents:
6517
diff
changeset
|
771 for(j = 0; j < 2; j++) |
6f13852a9161
Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents:
6517
diff
changeset
|
772 for(i = 0; i < 2; i++){ |
6f13852a9161
Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents:
6517
diff
changeset
|
773 rv34_mc(r, RV34_MB_P_8x8, i*8, j*8, i+j*r->s.b8_stride, 1, 1, 0, r->rv30, |
6f13852a9161
Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents:
6517
diff
changeset
|
774 r->rv30 ? r->s.dsp.put_rv30_tpel_pixels_tab |
8221 | 775 : r->s.dsp.put_rv40_qpel_pixels_tab, |
776 r->rv30 ? r->s.dsp.put_h264_chroma_pixels_tab | |
777 : r->s.dsp.put_rv40_chroma_pixels_tab); | |
6693
6f13852a9161
Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents:
6517
diff
changeset
|
778 rv34_mc(r, RV34_MB_P_8x8, i*8, j*8, i+j*r->s.b8_stride, 1, 1, 1, r->rv30, |
6f13852a9161
Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents:
6517
diff
changeset
|
779 r->rv30 ? r->s.dsp.avg_rv30_tpel_pixels_tab |
8221 | 780 : r->s.dsp.avg_rv40_qpel_pixels_tab, |
781 r->rv30 ? r->s.dsp.avg_h264_chroma_pixels_tab | |
782 : r->s.dsp.avg_rv40_chroma_pixels_tab); | |
6693
6f13852a9161
Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents:
6517
diff
changeset
|
783 } |
6f13852a9161
Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents:
6517
diff
changeset
|
784 } |
6f13852a9161
Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents:
6517
diff
changeset
|
785 |
6026 | 786 /** number of motion vectors in each macroblock type */ |
787 static const int num_mvs[RV34_MB_TYPES] = { 0, 0, 1, 4, 1, 1, 0, 0, 2, 2, 2, 1 }; | |
788 | |
789 /** | |
790 * Decode motion vector differences | |
791 * and perform motion vector reconstruction and motion compensation. | |
792 */ | |
793 static int rv34_decode_mv(RV34DecContext *r, int block_type) | |
794 { | |
795 MpegEncContext *s = &r->s; | |
796 GetBitContext *gb = &s->gb; | |
6714
05c3a4b419e9
Calculate motion vector information based on PTS provided in slice header
kostya
parents:
6693
diff
changeset
|
797 int i, j, k, l; |
6693
6f13852a9161
Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents:
6517
diff
changeset
|
798 int mv_pos = s->mb_x * 2 + s->mb_y * 2 * s->b8_stride; |
6f13852a9161
Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents:
6517
diff
changeset
|
799 int next_bt; |
6026 | 800 |
801 memset(r->dmv, 0, sizeof(r->dmv)); | |
802 for(i = 0; i < num_mvs[block_type]; i++){ | |
803 r->dmv[i][0] = svq3_get_se_golomb(gb); | |
804 r->dmv[i][1] = svq3_get_se_golomb(gb); | |
805 } | |
806 switch(block_type){ | |
807 case RV34_MB_TYPE_INTRA: | |
808 case RV34_MB_TYPE_INTRA16x16: | |
809 fill_rectangle(s->current_picture_ptr->motion_val[0][s->mb_x * 2 + s->mb_y * 2 * s->b8_stride], 2, 2, s->b8_stride, 0, 4); | |
810 return 0; | |
811 case RV34_MB_SKIP: | |
6481 | 812 if(s->pict_type == FF_P_TYPE){ |
6026 | 813 fill_rectangle(s->current_picture_ptr->motion_val[0][s->mb_x * 2 + s->mb_y * 2 * s->b8_stride], 2, 2, s->b8_stride, 0, 4); |
814 rv34_mc_1mv (r, block_type, 0, 0, 0, 2, 2, 0); | |
815 break; | |
816 } | |
817 case RV34_MB_B_DIRECT: | |
6693
6f13852a9161
Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents:
6517
diff
changeset
|
818 //surprisingly, it uses motion scheme from next reference frame |
6f13852a9161
Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents:
6517
diff
changeset
|
819 next_bt = s->next_picture_ptr->mb_type[s->mb_x + s->mb_y * s->mb_stride]; |
9162 | 820 if(IS_INTRA(next_bt) || IS_SKIP(next_bt)){ |
9040
71620eeff338
Since motion vectors for intra blocks are always zero, do not try to retrieve them.
kostya
parents:
8827
diff
changeset
|
821 fill_rectangle(s->current_picture_ptr->motion_val[0][s->mb_x * 2 + s->mb_y * 2 * s->b8_stride], 2, 2, s->b8_stride, 0, 4); |
9162 | 822 fill_rectangle(s->current_picture_ptr->motion_val[1][s->mb_x * 2 + s->mb_y * 2 * s->b8_stride], 2, 2, s->b8_stride, 0, 4); |
823 }else | |
9041 | 824 for(j = 0; j < 2; j++) |
825 for(i = 0; i < 2; i++) | |
826 for(k = 0; k < 2; k++) | |
827 for(l = 0; l < 2; l++) | |
828 s->current_picture_ptr->motion_val[l][mv_pos + i + j*s->b8_stride][k] = calc_add_mv(r, l, s->next_picture_ptr->motion_val[0][mv_pos + i + j*s->b8_stride][k]); | |
9162 | 829 if(!(IS_16X8(next_bt) || IS_8X16(next_bt) || IS_8X8(next_bt))) //we can use whole macroblock MC |
6693
6f13852a9161
Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents:
6517
diff
changeset
|
830 rv34_mc_2mv(r, block_type); |
6f13852a9161
Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents:
6517
diff
changeset
|
831 else |
6f13852a9161
Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents:
6517
diff
changeset
|
832 rv34_mc_2mv_skip(r); |
6f13852a9161
Skip blocks in B-frames reuse motion vectors from next reference frame.
kostya
parents:
6517
diff
changeset
|
833 fill_rectangle(s->current_picture_ptr->motion_val[0][s->mb_x * 2 + s->mb_y * 2 * s->b8_stride], 2, 2, s->b8_stride, 0, 4); |
6026 | 834 break; |
835 case RV34_MB_P_16x16: | |
836 case RV34_MB_P_MIX16x16: | |
837 rv34_pred_mv(r, block_type, 0, 0); | |
838 rv34_mc_1mv (r, block_type, 0, 0, 0, 2, 2, 0); | |
839 break; | |
840 case RV34_MB_B_FORWARD: | |
841 case RV34_MB_B_BACKWARD: | |
842 r->dmv[1][0] = r->dmv[0][0]; | |
843 r->dmv[1][1] = r->dmv[0][1]; | |
8099 | 844 if(r->rv30) |
845 rv34_pred_mv_rv3(r, block_type, block_type == RV34_MB_B_BACKWARD); | |
846 else | |
847 rv34_pred_mv_b (r, block_type, block_type == RV34_MB_B_BACKWARD); | |
6026 | 848 rv34_mc_1mv (r, block_type, 0, 0, 0, 2, 2, block_type == RV34_MB_B_BACKWARD); |
849 break; | |
850 case RV34_MB_P_16x8: | |
851 case RV34_MB_P_8x16: | |
852 rv34_pred_mv(r, block_type, 0, 0); | |
853 rv34_pred_mv(r, block_type, 1 + (block_type == RV34_MB_P_16x8), 1); | |
854 if(block_type == RV34_MB_P_16x8){ | |
855 rv34_mc_1mv(r, block_type, 0, 0, 0, 2, 1, 0); | |
856 rv34_mc_1mv(r, block_type, 0, 8, s->b8_stride, 2, 1, 0); | |
857 } | |
858 if(block_type == RV34_MB_P_8x16){ | |
859 rv34_mc_1mv(r, block_type, 0, 0, 0, 1, 2, 0); | |
860 rv34_mc_1mv(r, block_type, 8, 0, 1, 1, 2, 0); | |
861 } | |
862 break; | |
863 case RV34_MB_B_BIDIR: | |
864 rv34_pred_mv_b (r, block_type, 0); | |
865 rv34_pred_mv_b (r, block_type, 1); | |
866 rv34_mc_2mv (r, block_type); | |
867 break; | |
868 case RV34_MB_P_8x8: | |
869 for(i=0;i< 4;i++){ | |
870 rv34_pred_mv(r, block_type, i, i); | |
871 rv34_mc_1mv (r, block_type, (i&1)<<3, (i&2)<<2, (i&1)+(i>>1)*s->b8_stride, 1, 1, 0); | |
872 } | |
873 break; | |
874 } | |
875 | |
876 return 0; | |
877 } | |
878 /** @} */ // mv group | |
879 | |
880 /** | |
881 * @defgroup recons Macroblock reconstruction functions | |
882 * @{ | |
883 */ | |
884 /** mapping of RV30/40 intra prediction types to standard H.264 types */ | |
885 static const int ittrans[9] = { | |
886 DC_PRED, VERT_PRED, HOR_PRED, DIAG_DOWN_RIGHT_PRED, DIAG_DOWN_LEFT_PRED, | |
887 VERT_RIGHT_PRED, VERT_LEFT_PRED, HOR_UP_PRED, HOR_DOWN_PRED, | |
888 }; | |
889 | |
890 /** mapping of RV30/40 intra 16x16 prediction types to standard H.264 types */ | |
891 static const int ittrans16[4] = { | |
892 DC_PRED8x8, VERT_PRED8x8, HOR_PRED8x8, PLANE_PRED8x8, | |
893 }; | |
894 | |
895 /** | |
896 * Perform 4x4 intra prediction. | |
897 */ | |
898 static void rv34_pred_4x4_block(RV34DecContext *r, uint8_t *dst, int stride, int itype, int up, int left, int down, int right) | |
899 { | |
900 uint8_t *prev = dst - stride + 4; | |
901 uint32_t topleft; | |
902 | |
903 if(!up && !left) | |
904 itype = DC_128_PRED; | |
905 else if(!up){ | |
906 if(itype == VERT_PRED) itype = HOR_PRED; | |
907 if(itype == DC_PRED) itype = LEFT_DC_PRED; | |
908 }else if(!left){ | |
909 if(itype == HOR_PRED) itype = VERT_PRED; | |
910 if(itype == DC_PRED) itype = TOP_DC_PRED; | |
911 if(itype == DIAG_DOWN_LEFT_PRED) itype = DIAG_DOWN_LEFT_PRED_RV40_NODOWN; | |
912 } | |
913 if(!down){ | |
914 if(itype == DIAG_DOWN_LEFT_PRED) itype = DIAG_DOWN_LEFT_PRED_RV40_NODOWN; | |
915 if(itype == HOR_UP_PRED) itype = HOR_UP_PRED_RV40_NODOWN; | |
6036
ce3b68242317
Correct spatial prediction mode in RV30/40 for vertical left direction
kostya
parents:
6026
diff
changeset
|
916 if(itype == VERT_LEFT_PRED) itype = VERT_LEFT_PRED_RV40_NODOWN; |
6026 | 917 } |
918 if(!right && up){ | |
919 topleft = dst[-stride + 3] * 0x01010101; | |
8721
42e258f2b931
Silence two pointer assignment compiler warnings in rv34.c
kostya
parents:
8718
diff
changeset
|
920 prev = (uint8_t*)&topleft; |
6026 | 921 } |
922 r->h.pred4x4[itype](dst, prev, stride); | |
923 } | |
924 | |
925 /** add_pixels_clamped for 4x4 block */ | |
926 static void rv34_add_4x4_block(uint8_t *dst, int stride, DCTELEM block[64], int off) | |
927 { | |
928 int x, y; | |
929 for(y = 0; y < 4; y++) | |
930 for(x = 0; x < 4; x++) | |
931 dst[x + y*stride] = av_clip_uint8(dst[x + y*stride] + block[off + x+y*8]); | |
932 } | |
933 | |
934 static inline int adjust_pred16(int itype, int up, int left) | |
935 { | |
936 if(!up && !left) | |
937 itype = DC_128_PRED8x8; | |
938 else if(!up){ | |
939 if(itype == PLANE_PRED8x8)itype = HOR_PRED8x8; | |
940 if(itype == VERT_PRED8x8) itype = HOR_PRED8x8; | |
941 if(itype == DC_PRED8x8) itype = LEFT_DC_PRED8x8; | |
942 }else if(!left){ | |
943 if(itype == PLANE_PRED8x8)itype = VERT_PRED8x8; | |
944 if(itype == HOR_PRED8x8) itype = VERT_PRED8x8; | |
945 if(itype == DC_PRED8x8) itype = TOP_DC_PRED8x8; | |
946 } | |
947 return itype; | |
948 } | |
949 | |
950 static void rv34_output_macroblock(RV34DecContext *r, int8_t *intra_types, int cbp, int is16) | |
951 { | |
952 MpegEncContext *s = &r->s; | |
953 DSPContext *dsp = &s->dsp; | |
954 int i, j; | |
955 uint8_t *Y, *U, *V; | |
956 int itype; | |
957 int avail[6*8] = {0}; | |
958 int idx; | |
959 | |
960 // Set neighbour information. | |
961 if(r->avail_cache[0]) | |
962 avail[0] = 1; | |
963 if(r->avail_cache[1]) | |
964 avail[1] = avail[2] = 1; | |
965 if(r->avail_cache[2]) | |
966 avail[3] = avail[4] = 1; | |
967 if(r->avail_cache[3]) | |
968 avail[5] = 1; | |
969 if(r->avail_cache[4]) | |
970 avail[8] = avail[16] = 1; | |
971 if(r->avail_cache[8]) | |
972 avail[24] = avail[32] = 1; | |
973 | |
974 Y = s->dest[0]; | |
975 U = s->dest[1]; | |
976 V = s->dest[2]; | |
977 if(!is16){ | |
978 for(j = 0; j < 4; j++){ | |
979 idx = 9 + j*8; | |
980 for(i = 0; i < 4; i++, cbp >>= 1, Y += 4, idx++){ | |
981 rv34_pred_4x4_block(r, Y, s->linesize, ittrans[intra_types[i]], avail[idx-8], avail[idx-1], avail[idx+7], avail[idx-7]); | |
982 avail[idx] = 1; | |
983 if(cbp & 1) | |
984 rv34_add_4x4_block(Y, s->linesize, s->block[(i>>1)+(j&2)], (i&1)*4+(j&1)*32); | |
985 } | |
986 Y += s->linesize * 4 - 4*4; | |
9903
305536ce781f
RV3/4 intra types array causes alignment issues (at least on ARM5), thus change
kostya
parents:
9568
diff
changeset
|
987 intra_types += r->intra_types_stride; |
6026 | 988 } |
9903
305536ce781f
RV3/4 intra types array causes alignment issues (at least on ARM5), thus change
kostya
parents:
9568
diff
changeset
|
989 intra_types -= r->intra_types_stride * 4; |
6026 | 990 fill_rectangle(r->avail_cache + 5, 2, 2, 4, 0, 4); |
991 for(j = 0; j < 2; j++){ | |
992 idx = 5 + j*4; | |
993 for(i = 0; i < 2; i++, cbp >>= 1, idx++){ | |
9903
305536ce781f
RV3/4 intra types array causes alignment issues (at least on ARM5), thus change
kostya
parents:
9568
diff
changeset
|
994 rv34_pred_4x4_block(r, U + i*4 + j*4*s->uvlinesize, s->uvlinesize, ittrans[intra_types[i*2+j*2*r->intra_types_stride]], r->avail_cache[idx-4], r->avail_cache[idx-1], !i && !j, r->avail_cache[idx-3]); |
305536ce781f
RV3/4 intra types array causes alignment issues (at least on ARM5), thus change
kostya
parents:
9568
diff
changeset
|
995 rv34_pred_4x4_block(r, V + i*4 + j*4*s->uvlinesize, s->uvlinesize, ittrans[intra_types[i*2+j*2*r->intra_types_stride]], r->avail_cache[idx-4], r->avail_cache[idx-1], !i && !j, r->avail_cache[idx-3]); |
6026 | 996 r->avail_cache[idx] = 1; |
997 if(cbp & 0x01) | |
998 rv34_add_4x4_block(U + i*4 + j*4*s->uvlinesize, s->uvlinesize, s->block[4], i*4+j*32); | |
999 if(cbp & 0x10) | |
1000 rv34_add_4x4_block(V + i*4 + j*4*s->uvlinesize, s->uvlinesize, s->block[5], i*4+j*32); | |
1001 } | |
1002 } | |
1003 }else{ | |
1004 itype = ittrans16[intra_types[0]]; | |
1005 itype = adjust_pred16(itype, r->avail_cache[5-4], r->avail_cache[5-1]); | |
1006 r->h.pred16x16[itype](Y, s->linesize); | |
8180
f4a291734ad7
Eliminate direct use of s->current_picture in RV30/40 decoder
kostya
parents:
8179
diff
changeset
|
1007 dsp->add_pixels_clamped(s->block[0], Y, s->linesize); |
f4a291734ad7
Eliminate direct use of s->current_picture in RV30/40 decoder
kostya
parents:
8179
diff
changeset
|
1008 dsp->add_pixels_clamped(s->block[1], Y + 8, s->linesize); |
f4a291734ad7
Eliminate direct use of s->current_picture in RV30/40 decoder
kostya
parents:
8179
diff
changeset
|
1009 Y += s->linesize * 8; |
f4a291734ad7
Eliminate direct use of s->current_picture in RV30/40 decoder
kostya
parents:
8179
diff
changeset
|
1010 dsp->add_pixels_clamped(s->block[2], Y, s->linesize); |
f4a291734ad7
Eliminate direct use of s->current_picture in RV30/40 decoder
kostya
parents:
8179
diff
changeset
|
1011 dsp->add_pixels_clamped(s->block[3], Y + 8, s->linesize); |
6026 | 1012 |
1013 itype = ittrans16[intra_types[0]]; | |
1014 if(itype == PLANE_PRED8x8) itype = DC_PRED8x8; | |
1015 itype = adjust_pred16(itype, r->avail_cache[5-4], r->avail_cache[5-1]); | |
1016 r->h.pred8x8[itype](U, s->uvlinesize); | |
1017 dsp->add_pixels_clamped(s->block[4], U, s->uvlinesize); | |
1018 r->h.pred8x8[itype](V, s->uvlinesize); | |
1019 dsp->add_pixels_clamped(s->block[5], V, s->uvlinesize); | |
1020 } | |
1021 } | |
1022 | |
1023 /** @} */ // recons group | |
1024 | |
1025 /** | |
1026 * @addtogroup bitstream | |
1027 * Decode macroblock header and return CBP in case of success, -1 otherwise. | |
1028 */ | |
1029 static int rv34_decode_mb_header(RV34DecContext *r, int8_t *intra_types) | |
1030 { | |
1031 MpegEncContext *s = &r->s; | |
1032 GetBitContext *gb = &s->gb; | |
1033 int mb_pos = s->mb_x + s->mb_y * s->mb_stride; | |
1034 int i, t; | |
1035 | |
1036 if(!r->si.type){ | |
1037 r->is16 = get_bits1(gb); | |
1038 if(!r->is16 && !r->rv30){ | |
1039 if(!get_bits1(gb)) | |
1040 av_log(s->avctx, AV_LOG_ERROR, "Need DQUANT\n"); | |
1041 } | |
1042 s->current_picture_ptr->mb_type[mb_pos] = r->is16 ? MB_TYPE_INTRA16x16 : MB_TYPE_INTRA; | |
1043 r->block_type = r->is16 ? RV34_MB_TYPE_INTRA16x16 : RV34_MB_TYPE_INTRA; | |
1044 }else{ | |
1045 r->block_type = r->decode_mb_info(r); | |
1046 if(r->block_type == -1) | |
1047 return -1; | |
1048 s->current_picture_ptr->mb_type[mb_pos] = rv34_mb_type_to_lavc[r->block_type]; | |
1049 r->mb_type[mb_pos] = r->block_type; | |
1050 if(r->block_type == RV34_MB_SKIP){ | |
6481 | 1051 if(s->pict_type == FF_P_TYPE) |
6026 | 1052 r->mb_type[mb_pos] = RV34_MB_P_16x16; |
6481 | 1053 if(s->pict_type == FF_B_TYPE) |
6026 | 1054 r->mb_type[mb_pos] = RV34_MB_B_DIRECT; |
1055 } | |
1056 r->is16 = !!IS_INTRA16x16(s->current_picture_ptr->mb_type[mb_pos]); | |
1057 rv34_decode_mv(r, r->block_type); | |
1058 if(r->block_type == RV34_MB_SKIP){ | |
9903
305536ce781f
RV3/4 intra types array causes alignment issues (at least on ARM5), thus change
kostya
parents:
9568
diff
changeset
|
1059 fill_rectangle(intra_types, 4, 4, r->intra_types_stride, 0, sizeof(intra_types[0])); |
6026 | 1060 return 0; |
1061 } | |
1062 r->chroma_vlc = 1; | |
1063 r->luma_vlc = 0; | |
1064 } | |
1065 if(IS_INTRA(s->current_picture_ptr->mb_type[mb_pos])){ | |
1066 if(r->is16){ | |
1067 t = get_bits(gb, 2); | |
9903
305536ce781f
RV3/4 intra types array causes alignment issues (at least on ARM5), thus change
kostya
parents:
9568
diff
changeset
|
1068 fill_rectangle(intra_types, 4, 4, r->intra_types_stride, t, sizeof(intra_types[0])); |
6026 | 1069 r->luma_vlc = 2; |
1070 }else{ | |
1071 if(r->decode_intra_types(r, gb, intra_types) < 0) | |
1072 return -1; | |
1073 r->luma_vlc = 1; | |
1074 } | |
1075 r->chroma_vlc = 0; | |
1076 r->cur_vlcs = choose_vlc_set(r->si.quant, r->si.vlc_set, 0); | |
1077 }else{ | |
1078 for(i = 0; i < 16; i++) | |
9903
305536ce781f
RV3/4 intra types array causes alignment issues (at least on ARM5), thus change
kostya
parents:
9568
diff
changeset
|
1079 intra_types[(i & 3) + (i>>2) * r->intra_types_stride] = 0; |
6026 | 1080 r->cur_vlcs = choose_vlc_set(r->si.quant, r->si.vlc_set, 1); |
1081 if(r->mb_type[mb_pos] == RV34_MB_P_MIX16x16){ | |
1082 r->is16 = 1; | |
1083 r->chroma_vlc = 1; | |
1084 r->luma_vlc = 2; | |
1085 r->cur_vlcs = choose_vlc_set(r->si.quant, r->si.vlc_set, 0); | |
1086 } | |
1087 } | |
1088 | |
1089 return rv34_decode_cbp(gb, r->cur_vlcs, r->is16); | |
1090 } | |
1091 | |
1092 /** | |
1093 * @addtogroup recons | |
1094 * @{ | |
1095 */ | |
1096 /** | |
1097 * mask for retrieving all bits in coded block pattern | |
1098 * corresponding to one 8x8 block | |
1099 */ | |
8181
d8f516ca0002
33l Fix applying residue condition in RV30/40 decoder
kostya
parents:
8180
diff
changeset
|
1100 #define LUMA_CBP_BLOCK_MASK 0x33 |
6026 | 1101 |
1102 #define U_CBP_MASK 0x0F0000 | |
1103 #define V_CBP_MASK 0xF00000 | |
1104 | |
1105 | |
1106 static void rv34_apply_differences(RV34DecContext *r, int cbp) | |
1107 { | |
1108 static const int shifts[4] = { 0, 2, 8, 10 }; | |
1109 MpegEncContext *s = &r->s; | |
1110 int i; | |
1111 | |
1112 for(i = 0; i < 4; i++) | |
8181
d8f516ca0002
33l Fix applying residue condition in RV30/40 decoder
kostya
parents:
8180
diff
changeset
|
1113 if((cbp & (LUMA_CBP_BLOCK_MASK << shifts[i])) || r->block_type == RV34_MB_P_MIX16x16) |
6026 | 1114 s->dsp.add_pixels_clamped(s->block[i], s->dest[0] + (i & 1)*8 + (i&2)*4*s->linesize, s->linesize); |
1115 if(cbp & U_CBP_MASK) | |
1116 s->dsp.add_pixels_clamped(s->block[4], s->dest[1], s->uvlinesize); | |
1117 if(cbp & V_CBP_MASK) | |
1118 s->dsp.add_pixels_clamped(s->block[5], s->dest[2], s->uvlinesize); | |
1119 } | |
1120 | |
8116
2d01559f824c
Calculating an additional MV-based deblocking pattern is the same
kostya
parents:
8099
diff
changeset
|
1121 static int is_mv_diff_gt_3(int16_t (*motion_val)[2], int step) |
2d01559f824c
Calculating an additional MV-based deblocking pattern is the same
kostya
parents:
8099
diff
changeset
|
1122 { |
2d01559f824c
Calculating an additional MV-based deblocking pattern is the same
kostya
parents:
8099
diff
changeset
|
1123 int d; |
2d01559f824c
Calculating an additional MV-based deblocking pattern is the same
kostya
parents:
8099
diff
changeset
|
1124 d = motion_val[0][0] - motion_val[-step][0]; |
2d01559f824c
Calculating an additional MV-based deblocking pattern is the same
kostya
parents:
8099
diff
changeset
|
1125 if(d < -3 || d > 3) |
2d01559f824c
Calculating an additional MV-based deblocking pattern is the same
kostya
parents:
8099
diff
changeset
|
1126 return 1; |
2d01559f824c
Calculating an additional MV-based deblocking pattern is the same
kostya
parents:
8099
diff
changeset
|
1127 d = motion_val[0][1] - motion_val[-step][1]; |
2d01559f824c
Calculating an additional MV-based deblocking pattern is the same
kostya
parents:
8099
diff
changeset
|
1128 if(d < -3 || d > 3) |
2d01559f824c
Calculating an additional MV-based deblocking pattern is the same
kostya
parents:
8099
diff
changeset
|
1129 return 1; |
2d01559f824c
Calculating an additional MV-based deblocking pattern is the same
kostya
parents:
8099
diff
changeset
|
1130 return 0; |
2d01559f824c
Calculating an additional MV-based deblocking pattern is the same
kostya
parents:
8099
diff
changeset
|
1131 } |
2d01559f824c
Calculating an additional MV-based deblocking pattern is the same
kostya
parents:
8099
diff
changeset
|
1132 |
2d01559f824c
Calculating an additional MV-based deblocking pattern is the same
kostya
parents:
8099
diff
changeset
|
1133 static int rv34_set_deblock_coef(RV34DecContext *r) |
2d01559f824c
Calculating an additional MV-based deblocking pattern is the same
kostya
parents:
8099
diff
changeset
|
1134 { |
2d01559f824c
Calculating an additional MV-based deblocking pattern is the same
kostya
parents:
8099
diff
changeset
|
1135 MpegEncContext *s = &r->s; |
8122
aec296246352
Split RV3/4 deblock pattern into horizontal and vertical parts
kostya
parents:
8121
diff
changeset
|
1136 int hmvmask = 0, vmvmask = 0, i, j; |
8116
2d01559f824c
Calculating an additional MV-based deblocking pattern is the same
kostya
parents:
8099
diff
changeset
|
1137 int midx = s->mb_x * 2 + s->mb_y * 2 * s->b8_stride; |
2d01559f824c
Calculating an additional MV-based deblocking pattern is the same
kostya
parents:
8099
diff
changeset
|
1138 int16_t (*motion_val)[2] = s->current_picture_ptr->motion_val[0][midx]; |
2d01559f824c
Calculating an additional MV-based deblocking pattern is the same
kostya
parents:
8099
diff
changeset
|
1139 for(j = 0; j < 16; j += 8){ |
2d01559f824c
Calculating an additional MV-based deblocking pattern is the same
kostya
parents:
8099
diff
changeset
|
1140 for(i = 0; i < 2; i++){ |
2d01559f824c
Calculating an additional MV-based deblocking pattern is the same
kostya
parents:
8099
diff
changeset
|
1141 if(is_mv_diff_gt_3(motion_val + i, 1)) |
8122
aec296246352
Split RV3/4 deblock pattern into horizontal and vertical parts
kostya
parents:
8121
diff
changeset
|
1142 vmvmask |= 0x11 << (j + i*2); |
8245
7e6ca1be9e40
Fix reading out of buffer during RV30/40 deblock mask calculation
kostya
parents:
8244
diff
changeset
|
1143 if((j || s->mb_y) && is_mv_diff_gt_3(motion_val + i, s->b8_stride)) |
8122
aec296246352
Split RV3/4 deblock pattern into horizontal and vertical parts
kostya
parents:
8121
diff
changeset
|
1144 hmvmask |= 0x03 << (j + i*2); |
8116
2d01559f824c
Calculating an additional MV-based deblocking pattern is the same
kostya
parents:
8099
diff
changeset
|
1145 } |
2d01559f824c
Calculating an additional MV-based deblocking pattern is the same
kostya
parents:
8099
diff
changeset
|
1146 motion_val += s->b8_stride; |
2d01559f824c
Calculating an additional MV-based deblocking pattern is the same
kostya
parents:
8099
diff
changeset
|
1147 } |
8122
aec296246352
Split RV3/4 deblock pattern into horizontal and vertical parts
kostya
parents:
8121
diff
changeset
|
1148 if(s->first_slice_line) |
aec296246352
Split RV3/4 deblock pattern into horizontal and vertical parts
kostya
parents:
8121
diff
changeset
|
1149 hmvmask &= ~0x000F; |
aec296246352
Split RV3/4 deblock pattern into horizontal and vertical parts
kostya
parents:
8121
diff
changeset
|
1150 if(!s->mb_x) |
aec296246352
Split RV3/4 deblock pattern into horizontal and vertical parts
kostya
parents:
8121
diff
changeset
|
1151 vmvmask &= ~0x1111; |
8368 | 1152 if(r->rv30){ //RV30 marks both subblocks on the edge for filtering |
1153 vmvmask |= (vmvmask & 0x4444) >> 1; | |
1154 hmvmask |= (hmvmask & 0x0F00) >> 4; | |
1155 if(s->mb_x) | |
1156 r->deblock_coefs[s->mb_x - 1 + s->mb_y*s->mb_stride] |= (vmvmask & 0x1111) << 3; | |
1157 if(!s->first_slice_line) | |
1158 r->deblock_coefs[s->mb_x + (s->mb_y - 1)*s->mb_stride] |= (hmvmask & 0xF) << 12; | |
1159 } | |
1160 return hmvmask | vmvmask; | |
8116
2d01559f824c
Calculating an additional MV-based deblocking pattern is the same
kostya
parents:
8099
diff
changeset
|
1161 } |
2d01559f824c
Calculating an additional MV-based deblocking pattern is the same
kostya
parents:
8099
diff
changeset
|
1162 |
6026 | 1163 static int rv34_decode_macroblock(RV34DecContext *r, int8_t *intra_types) |
1164 { | |
1165 MpegEncContext *s = &r->s; | |
1166 GetBitContext *gb = &s->gb; | |
1167 int cbp, cbp2; | |
1168 int i, blknum, blkoff; | |
1169 DCTELEM block16[64]; | |
1170 int luma_dc_quant; | |
1171 int dist; | |
1172 int mb_pos = s->mb_x + s->mb_y * s->mb_stride; | |
1173 | |
1174 // Calculate which neighbours are available. Maybe it's worth optimizing too. | |
1175 memset(r->avail_cache, 0, sizeof(r->avail_cache)); | |
1176 fill_rectangle(r->avail_cache + 5, 2, 2, 4, 1, 4); | |
1177 dist = (s->mb_x - s->resync_mb_x) + (s->mb_y - s->resync_mb_y) * s->mb_width; | |
1178 if(s->mb_x && dist) | |
1179 r->avail_cache[4] = | |
1180 r->avail_cache[8] = s->current_picture_ptr->mb_type[mb_pos - 1]; | |
1181 if(dist >= s->mb_width) | |
1182 r->avail_cache[1] = | |
1183 r->avail_cache[2] = s->current_picture_ptr->mb_type[mb_pos - s->mb_stride]; | |
1184 if(((s->mb_x+1) < s->mb_width) && dist >= s->mb_width - 1) | |
1185 r->avail_cache[3] = s->current_picture_ptr->mb_type[mb_pos - s->mb_stride + 1]; | |
1186 if(s->mb_x && dist > s->mb_width) | |
1187 r->avail_cache[0] = s->current_picture_ptr->mb_type[mb_pos - s->mb_stride - 1]; | |
1188 | |
1189 s->qscale = r->si.quant; | |
1190 cbp = cbp2 = rv34_decode_mb_header(r, intra_types); | |
8370 | 1191 r->cbp_luma [mb_pos] = cbp; |
1192 r->cbp_chroma[mb_pos] = cbp >> 16; | |
8116
2d01559f824c
Calculating an additional MV-based deblocking pattern is the same
kostya
parents:
8099
diff
changeset
|
1193 if(s->pict_type == FF_I_TYPE) |
8369
45c3780b1a96
Merge deblocking pattern with CBP for RV30/40 loop filtering
kostya
parents:
8368
diff
changeset
|
1194 r->deblock_coefs[mb_pos] = 0xFFFF; |
8116
2d01559f824c
Calculating an additional MV-based deblocking pattern is the same
kostya
parents:
8099
diff
changeset
|
1195 else |
8369
45c3780b1a96
Merge deblocking pattern with CBP for RV30/40 loop filtering
kostya
parents:
8368
diff
changeset
|
1196 r->deblock_coefs[mb_pos] = rv34_set_deblock_coef(r) | r->cbp_luma[mb_pos]; |
8370 | 1197 s->current_picture_ptr->qscale_table[mb_pos] = s->qscale; |
6026 | 1198 |
1199 if(cbp == -1) | |
1200 return -1; | |
1201 | |
8046 | 1202 luma_dc_quant = r->block_type == RV34_MB_P_MIX16x16 ? r->luma_dc_quant_p[s->qscale] : r->luma_dc_quant_i[s->qscale]; |
6026 | 1203 if(r->is16){ |
1204 memset(block16, 0, sizeof(block16)); | |
1205 rv34_decode_block(block16, gb, r->cur_vlcs, 3, 0); | |
1206 rv34_dequant4x4_16x16(block16, rv34_qscale_tab[luma_dc_quant],rv34_qscale_tab[s->qscale]); | |
1207 rv34_inv_transform_noround(block16); | |
1208 } | |
1209 | |
1210 for(i = 0; i < 16; i++, cbp >>= 1){ | |
1211 if(!r->is16 && !(cbp & 1)) continue; | |
1212 blknum = ((i & 2) >> 1) + ((i & 8) >> 2); | |
1213 blkoff = ((i & 1) << 2) + ((i & 4) << 3); | |
1214 if(cbp & 1) | |
1215 rv34_decode_block(s->block[blknum] + blkoff, gb, r->cur_vlcs, r->luma_vlc, 0); | |
8046 | 1216 rv34_dequant4x4(s->block[blknum] + blkoff, rv34_qscale_tab[s->qscale],rv34_qscale_tab[s->qscale]); |
6026 | 1217 if(r->is16) //FIXME: optimize |
1218 s->block[blknum][blkoff] = block16[(i & 3) | ((i & 0xC) << 1)]; | |
1219 rv34_inv_transform(s->block[blknum] + blkoff); | |
1220 } | |
1221 if(r->block_type == RV34_MB_P_MIX16x16) | |
1222 r->cur_vlcs = choose_vlc_set(r->si.quant, r->si.vlc_set, 1); | |
1223 for(; i < 24; i++, cbp >>= 1){ | |
1224 if(!(cbp & 1)) continue; | |
1225 blknum = ((i & 4) >> 2) + 4; | |
1226 blkoff = ((i & 1) << 2) + ((i & 2) << 4); | |
1227 rv34_decode_block(s->block[blknum] + blkoff, gb, r->cur_vlcs, r->chroma_vlc, 1); | |
1228 rv34_dequant4x4(s->block[blknum] + blkoff, rv34_qscale_tab[rv34_chroma_quant[1][s->qscale]],rv34_qscale_tab[rv34_chroma_quant[0][s->qscale]]); | |
1229 rv34_inv_transform(s->block[blknum] + blkoff); | |
1230 } | |
8370 | 1231 if(IS_INTRA(s->current_picture_ptr->mb_type[mb_pos])) |
6026 | 1232 rv34_output_macroblock(r, intra_types, cbp2, r->is16); |
1233 else | |
1234 rv34_apply_differences(r, cbp2); | |
1235 | |
1236 return 0; | |
1237 } | |
1238 | |
1239 static int check_slice_end(RV34DecContext *r, MpegEncContext *s) | |
1240 { | |
1241 int bits; | |
1242 if(s->mb_y >= s->mb_height) | |
1243 return 1; | |
1244 if(!s->mb_num_left) | |
1245 return 1; | |
1246 if(r->s.mb_skip_run > 1) | |
1247 return 0; | |
1248 bits = r->bits - get_bits_count(&s->gb); | |
1249 if(bits < 0 || (bits < 8 && !show_bits(&s->gb, bits))) | |
1250 return 1; | |
1251 return 0; | |
1252 } | |
1253 | |
1254 static inline int slice_compare(SliceInfo *si1, SliceInfo *si2) | |
1255 { | |
1256 return si1->type != si2->type || | |
1257 si1->start >= si2->start || | |
1258 si1->width != si2->width || | |
6714
05c3a4b419e9
Calculate motion vector information based on PTS provided in slice header
kostya
parents:
6693
diff
changeset
|
1259 si1->height != si2->height|| |
05c3a4b419e9
Calculate motion vector information based on PTS provided in slice header
kostya
parents:
6693
diff
changeset
|
1260 si1->pts != si2->pts; |
6026 | 1261 } |
1262 | |
8371
2ebc9b2c7459
add const qualifier to some pointers for input data
kostya
parents:
8370
diff
changeset
|
1263 static int rv34_decode_slice(RV34DecContext *r, int end, const uint8_t* buf, int buf_size) |
6026 | 1264 { |
1265 MpegEncContext *s = &r->s; | |
1266 GetBitContext *gb = &s->gb; | |
1267 int mb_pos; | |
1268 int res; | |
1269 | |
1270 init_get_bits(&r->s.gb, buf, buf_size*8); | |
1271 res = r->parse_slice_header(r, gb, &r->si); | |
1272 if(res < 0){ | |
1273 av_log(s->avctx, AV_LOG_ERROR, "Incorrect or unknown slice header\n"); | |
1274 return -1; | |
1275 } | |
1276 | |
1277 if ((s->mb_x == 0 && s->mb_y == 0) || s->current_picture_ptr==NULL) { | |
1278 if(s->width != r->si.width || s->height != r->si.height){ | |
1279 av_log(s->avctx, AV_LOG_DEBUG, "Changing dimensions to %dx%d\n", r->si.width,r->si.height); | |
1280 MPV_common_end(s); | |
1281 s->width = r->si.width; | |
1282 s->height = r->si.height; | |
1283 if(MPV_common_init(s) < 0) | |
1284 return -1; | |
9903
305536ce781f
RV3/4 intra types array causes alignment issues (at least on ARM5), thus change
kostya
parents:
9568
diff
changeset
|
1285 r->intra_types_stride = s->mb_width*4 + 4; |
305536ce781f
RV3/4 intra types array causes alignment issues (at least on ARM5), thus change
kostya
parents:
9568
diff
changeset
|
1286 r->intra_types_hist = av_realloc(r->intra_types_hist, r->intra_types_stride * 4 * 2 * sizeof(*r->intra_types_hist)); |
305536ce781f
RV3/4 intra types array causes alignment issues (at least on ARM5), thus change
kostya
parents:
9568
diff
changeset
|
1287 r->intra_types = r->intra_types_hist + r->intra_types_stride * 4; |
6026 | 1288 r->mb_type = av_realloc(r->mb_type, r->s.mb_stride * r->s.mb_height * sizeof(*r->mb_type)); |
6155
a425bdc70ac5
Save coded block patterns for future loop filtering.
kostya
parents:
6121
diff
changeset
|
1289 r->cbp_luma = av_realloc(r->cbp_luma, r->s.mb_stride * r->s.mb_height * sizeof(*r->cbp_luma)); |
a425bdc70ac5
Save coded block patterns for future loop filtering.
kostya
parents:
6121
diff
changeset
|
1290 r->cbp_chroma = av_realloc(r->cbp_chroma, r->s.mb_stride * r->s.mb_height * sizeof(*r->cbp_chroma)); |
8037
b6d93bef844a
RV3 and RV4 decoders set some deblocking coefs for each macroblock,
kostya
parents:
8036
diff
changeset
|
1291 r->deblock_coefs = av_realloc(r->deblock_coefs, r->s.mb_stride * r->s.mb_height * sizeof(*r->deblock_coefs)); |
6026 | 1292 } |
6481 | 1293 s->pict_type = r->si.type ? r->si.type : FF_I_TYPE; |
6026 | 1294 if(MPV_frame_start(s, s->avctx) < 0) |
1295 return -1; | |
1296 ff_er_frame_start(s); | |
6714
05c3a4b419e9
Calculate motion vector information based on PTS provided in slice header
kostya
parents:
6693
diff
changeset
|
1297 r->cur_pts = r->si.pts; |
05c3a4b419e9
Calculate motion vector information based on PTS provided in slice header
kostya
parents:
6693
diff
changeset
|
1298 if(s->pict_type != FF_B_TYPE){ |
05c3a4b419e9
Calculate motion vector information based on PTS provided in slice header
kostya
parents:
6693
diff
changeset
|
1299 r->last_pts = r->next_pts; |
05c3a4b419e9
Calculate motion vector information based on PTS provided in slice header
kostya
parents:
6693
diff
changeset
|
1300 r->next_pts = r->cur_pts; |
05c3a4b419e9
Calculate motion vector information based on PTS provided in slice header
kostya
parents:
6693
diff
changeset
|
1301 } |
6026 | 1302 s->mb_x = s->mb_y = 0; |
1303 } | |
1304 | |
1305 r->si.end = end; | |
1306 s->qscale = r->si.quant; | |
1307 r->bits = buf_size*8; | |
1308 s->mb_num_left = r->si.end - r->si.start; | |
1309 r->s.mb_skip_run = 0; | |
1310 | |
1311 mb_pos = s->mb_x + s->mb_y * s->mb_width; | |
1312 if(r->si.start != mb_pos){ | |
1313 av_log(s->avctx, AV_LOG_ERROR, "Slice indicates MB offset %d, got %d\n", r->si.start, mb_pos); | |
1314 s->mb_x = r->si.start % s->mb_width; | |
1315 s->mb_y = r->si.start / s->mb_width; | |
1316 } | |
9903
305536ce781f
RV3/4 intra types array causes alignment issues (at least on ARM5), thus change
kostya
parents:
9568
diff
changeset
|
1317 memset(r->intra_types_hist, -1, r->intra_types_stride * 4 * 2 * sizeof(*r->intra_types_hist)); |
6026 | 1318 s->first_slice_line = 1; |
1319 s->resync_mb_x= s->mb_x; | |
1320 s->resync_mb_y= s->mb_y; | |
1321 | |
1322 ff_init_block_index(s); | |
1323 while(!check_slice_end(r, s)) { | |
1324 ff_update_block_index(s); | |
1325 s->dsp.clear_blocks(s->block[0]); | |
1326 | |
9903
305536ce781f
RV3/4 intra types array causes alignment issues (at least on ARM5), thus change
kostya
parents:
9568
diff
changeset
|
1327 if(rv34_decode_macroblock(r, r->intra_types + s->mb_x * 4 + 4) < 0){ |
6026 | 1328 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, AC_ERROR|DC_ERROR|MV_ERROR); |
1329 return -1; | |
1330 } | |
1331 if (++s->mb_x == s->mb_width) { | |
1332 s->mb_x = 0; | |
1333 s->mb_y++; | |
1334 ff_init_block_index(s); | |
1335 | |
9903
305536ce781f
RV3/4 intra types array causes alignment issues (at least on ARM5), thus change
kostya
parents:
9568
diff
changeset
|
1336 memmove(r->intra_types_hist, r->intra_types, r->intra_types_stride * 4 * sizeof(*r->intra_types_hist)); |
305536ce781f
RV3/4 intra types array causes alignment issues (at least on ARM5), thus change
kostya
parents:
9568
diff
changeset
|
1337 memset(r->intra_types, -1, r->intra_types_stride * 4 * sizeof(*r->intra_types_hist)); |
8224
6771b3544991
Invoke future RV30/40 loop filter for already decoded rows instead of
kostya
parents:
8221
diff
changeset
|
1338 |
6771b3544991
Invoke future RV30/40 loop filter for already decoded rows instead of
kostya
parents:
8221
diff
changeset
|
1339 if(r->loop_filter && s->mb_y >= 2) |
6771b3544991
Invoke future RV30/40 loop filter for already decoded rows instead of
kostya
parents:
8221
diff
changeset
|
1340 r->loop_filter(r, s->mb_y - 2); |
6026 | 1341 } |
1342 if(s->mb_x == s->resync_mb_x) | |
1343 s->first_slice_line=0; | |
1344 s->mb_num_left--; | |
1345 } | |
1346 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, AC_END|DC_END|MV_END); | |
1347 | |
6750 | 1348 return s->mb_y == s->mb_height; |
6026 | 1349 } |
1350 | |
1351 /** @} */ // recons group end | |
1352 | |
1353 /** | |
1354 * Initialize decoder. | |
1355 */ | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6481
diff
changeset
|
1356 av_cold int ff_rv34_decode_init(AVCodecContext *avctx) |
6026 | 1357 { |
1358 RV34DecContext *r = avctx->priv_data; | |
1359 MpegEncContext *s = &r->s; | |
1360 | |
1361 MPV_decode_defaults(s); | |
1362 s->avctx= avctx; | |
1363 s->out_format = FMT_H263; | |
1364 s->codec_id= avctx->codec_id; | |
1365 | |
1366 s->width = avctx->width; | |
1367 s->height = avctx->height; | |
1368 | |
1369 r->s.avctx = avctx; | |
1370 avctx->flags |= CODEC_FLAG_EMU_EDGE; | |
1371 r->s.flags |= CODEC_FLAG_EMU_EDGE; | |
1372 avctx->pix_fmt = PIX_FMT_YUV420P; | |
1373 avctx->has_b_frames = 1; | |
1374 s->low_delay = 0; | |
1375 | |
1376 if (MPV_common_init(s) < 0) | |
1377 return -1; | |
1378 | |
1379 ff_h264_pred_init(&r->h, CODEC_ID_RV40); | |
1380 | |
9903
305536ce781f
RV3/4 intra types array causes alignment issues (at least on ARM5), thus change
kostya
parents:
9568
diff
changeset
|
1381 r->intra_types_stride = 4*s->mb_stride + 4; |
305536ce781f
RV3/4 intra types array causes alignment issues (at least on ARM5), thus change
kostya
parents:
9568
diff
changeset
|
1382 r->intra_types_hist = av_malloc(r->intra_types_stride * 4 * 2 * sizeof(*r->intra_types_hist)); |
305536ce781f
RV3/4 intra types array causes alignment issues (at least on ARM5), thus change
kostya
parents:
9568
diff
changeset
|
1383 r->intra_types = r->intra_types_hist + r->intra_types_stride * 4; |
6026 | 1384 |
1385 r->mb_type = av_mallocz(r->s.mb_stride * r->s.mb_height * sizeof(*r->mb_type)); | |
1386 | |
6155
a425bdc70ac5
Save coded block patterns for future loop filtering.
kostya
parents:
6121
diff
changeset
|
1387 r->cbp_luma = av_malloc(r->s.mb_stride * r->s.mb_height * sizeof(*r->cbp_luma)); |
a425bdc70ac5
Save coded block patterns for future loop filtering.
kostya
parents:
6121
diff
changeset
|
1388 r->cbp_chroma = av_malloc(r->s.mb_stride * r->s.mb_height * sizeof(*r->cbp_chroma)); |
8037
b6d93bef844a
RV3 and RV4 decoders set some deblocking coefs for each macroblock,
kostya
parents:
8036
diff
changeset
|
1389 r->deblock_coefs = av_malloc(r->s.mb_stride * r->s.mb_height * sizeof(*r->deblock_coefs)); |
6155
a425bdc70ac5
Save coded block patterns for future loop filtering.
kostya
parents:
6121
diff
changeset
|
1390 |
9568
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
1391 if(!intra_vlcs[0].cbppattern[0].bits) |
976a7ad342af
Revert changing VLC initialization type for RV3/4 decoder.
kostya
parents:
9554
diff
changeset
|
1392 rv34_init_tables(); |
6026 | 1393 |
1394 return 0; | |
1395 } | |
1396 | |
8371
2ebc9b2c7459
add const qualifier to some pointers for input data
kostya
parents:
8370
diff
changeset
|
1397 static int get_slice_offset(AVCodecContext *avctx, const uint8_t *buf, int n) |
6026 | 1398 { |
1399 if(avctx->slice_count) return avctx->slice_offset[n]; | |
1400 else return AV_RL32(buf + n*8 - 4) == 1 ? AV_RL32(buf + n*8) : AV_RB32(buf + n*8); | |
1401 } | |
1402 | |
1403 int ff_rv34_decode_frame(AVCodecContext *avctx, | |
1404 void *data, int *data_size, | |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9168
diff
changeset
|
1405 AVPacket *avpkt) |
6026 | 1406 { |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9168
diff
changeset
|
1407 const uint8_t *buf = avpkt->data; |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9168
diff
changeset
|
1408 int buf_size = avpkt->size; |
6026 | 1409 RV34DecContext *r = avctx->priv_data; |
1410 MpegEncContext *s = &r->s; | |
1411 AVFrame *pict = data; | |
1412 SliceInfo si; | |
1413 int i; | |
1414 int slice_count; | |
8371
2ebc9b2c7459
add const qualifier to some pointers for input data
kostya
parents:
8370
diff
changeset
|
1415 const uint8_t *slices_hdr = NULL; |
6026 | 1416 int last = 0; |
1417 | |
1418 /* no supplementary picture */ | |
1419 if (buf_size == 0) { | |
1420 /* special case for last picture */ | |
1421 if (s->low_delay==0 && s->next_picture_ptr) { | |
1422 *pict= *(AVFrame*)s->next_picture_ptr; | |
1423 s->next_picture_ptr= NULL; | |
1424 | |
1425 *data_size = sizeof(AVFrame); | |
1426 } | |
1427 return 0; | |
1428 } | |
1429 | |
1430 if(!avctx->slice_count){ | |
1431 slice_count = (*buf++) + 1; | |
1432 slices_hdr = buf + 4; | |
1433 buf += 8 * slice_count; | |
1434 }else | |
1435 slice_count = avctx->slice_count; | |
1436 | |
8754
f471abd09fef
Move RV3/4 frame type check up so 1-slice unanchored B-frames are checked, too.
kostya
parents:
8721
diff
changeset
|
1437 //parse first slice header to check whether this frame can be decoded |
f471abd09fef
Move RV3/4 frame type check up so 1-slice unanchored B-frames are checked, too.
kostya
parents:
8721
diff
changeset
|
1438 if(get_slice_offset(avctx, slices_hdr, 0) > buf_size){ |
f471abd09fef
Move RV3/4 frame type check up so 1-slice unanchored B-frames are checked, too.
kostya
parents:
8721
diff
changeset
|
1439 av_log(avctx, AV_LOG_ERROR, "Slice offset is greater than frame size\n"); |
f471abd09fef
Move RV3/4 frame type check up so 1-slice unanchored B-frames are checked, too.
kostya
parents:
8721
diff
changeset
|
1440 return -1; |
f471abd09fef
Move RV3/4 frame type check up so 1-slice unanchored B-frames are checked, too.
kostya
parents:
8721
diff
changeset
|
1441 } |
f471abd09fef
Move RV3/4 frame type check up so 1-slice unanchored B-frames are checked, too.
kostya
parents:
8721
diff
changeset
|
1442 init_get_bits(&s->gb, buf+get_slice_offset(avctx, slices_hdr, 0), buf_size-get_slice_offset(avctx, slices_hdr, 0)); |
8821
58706d84c938
In RV3/4 nonzero MB offset for the first slice also indicates error
kostya
parents:
8754
diff
changeset
|
1443 if(r->parse_slice_header(r, &r->s.gb, &si) < 0 || si.start){ |
8754
f471abd09fef
Move RV3/4 frame type check up so 1-slice unanchored B-frames are checked, too.
kostya
parents:
8721
diff
changeset
|
1444 av_log(avctx, AV_LOG_ERROR, "First slice header is incorrect\n"); |
f471abd09fef
Move RV3/4 frame type check up so 1-slice unanchored B-frames are checked, too.
kostya
parents:
8721
diff
changeset
|
1445 return -1; |
f471abd09fef
Move RV3/4 frame type check up so 1-slice unanchored B-frames are checked, too.
kostya
parents:
8721
diff
changeset
|
1446 } |
f471abd09fef
Move RV3/4 frame type check up so 1-slice unanchored B-frames are checked, too.
kostya
parents:
8721
diff
changeset
|
1447 if((!s->last_picture_ptr || !s->last_picture_ptr->data[0]) && si.type == FF_B_TYPE) |
f471abd09fef
Move RV3/4 frame type check up so 1-slice unanchored B-frames are checked, too.
kostya
parents:
8721
diff
changeset
|
1448 return -1; |
8827 | 1449 /* skip b frames if we are in a hurry */ |
1450 if(avctx->hurry_up && si.type==FF_B_TYPE) return buf_size; | |
1451 if( (avctx->skip_frame >= AVDISCARD_NONREF && si.type==FF_B_TYPE) | |
1452 || (avctx->skip_frame >= AVDISCARD_NONKEY && si.type!=FF_I_TYPE) | |
1453 || avctx->skip_frame >= AVDISCARD_ALL) | |
1454 return buf_size; | |
1455 /* skip everything if we are in a hurry>=5 */ | |
1456 if(avctx->hurry_up>=5) | |
1457 return buf_size; | |
8754
f471abd09fef
Move RV3/4 frame type check up so 1-slice unanchored B-frames are checked, too.
kostya
parents:
8721
diff
changeset
|
1458 |
6026 | 1459 for(i=0; i<slice_count; i++){ |
1460 int offset= get_slice_offset(avctx, slices_hdr, i); | |
1461 int size; | |
1462 if(i+1 == slice_count) | |
1463 size= buf_size - offset; | |
1464 else | |
1465 size= get_slice_offset(avctx, slices_hdr, i+1) - offset; | |
1466 | |
8243 | 1467 if(offset > buf_size){ |
1468 av_log(avctx, AV_LOG_ERROR, "Slice offset is greater than frame size\n"); | |
1469 break; | |
1470 } | |
1471 | |
6026 | 1472 r->si.end = s->mb_width * s->mb_height; |
1473 if(i+1 < slice_count){ | |
1474 init_get_bits(&s->gb, buf+get_slice_offset(avctx, slices_hdr, i+1), (buf_size-get_slice_offset(avctx, slices_hdr, i+1))*8); | |
1475 if(r->parse_slice_header(r, &r->s.gb, &si) < 0){ | |
1476 if(i+2 < slice_count) | |
1477 size = get_slice_offset(avctx, slices_hdr, i+2) - offset; | |
1478 else | |
1479 size = buf_size - offset; | |
1480 }else | |
1481 r->si.end = si.start; | |
1482 } | |
1483 last = rv34_decode_slice(r, r->si.end, buf + offset, size); | |
1484 s->mb_num_left = r->s.mb_x + r->s.mb_y*r->s.mb_width - r->si.start; | |
1485 if(last) | |
1486 break; | |
1487 } | |
1488 | |
1489 if(last){ | |
1490 if(r->loop_filter) | |
8224
6771b3544991
Invoke future RV30/40 loop filter for already decoded rows instead of
kostya
parents:
8221
diff
changeset
|
1491 r->loop_filter(r, s->mb_height - 1); |
6026 | 1492 ff_er_frame_end(s); |
1493 MPV_frame_end(s); | |
6481 | 1494 if (s->pict_type == FF_B_TYPE || s->low_delay) { |
6026 | 1495 *pict= *(AVFrame*)s->current_picture_ptr; |
1496 } else if (s->last_picture_ptr != NULL) { | |
1497 *pict= *(AVFrame*)s->last_picture_ptr; | |
1498 } | |
1499 | |
1500 if(s->last_picture_ptr || s->low_delay){ | |
1501 *data_size = sizeof(AVFrame); | |
1502 ff_print_debug_info(s, pict); | |
1503 } | |
1504 s->current_picture_ptr= NULL; //so we can detect if frame_end wasnt called (find some nicer solution...) | |
1505 } | |
1506 return buf_size; | |
1507 } | |
1508 | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6481
diff
changeset
|
1509 av_cold int ff_rv34_decode_end(AVCodecContext *avctx) |
6026 | 1510 { |
1511 RV34DecContext *r = avctx->priv_data; | |
1512 | |
1513 MPV_common_end(&r->s); | |
1514 | |
1515 av_freep(&r->intra_types_hist); | |
1516 r->intra_types = NULL; | |
1517 av_freep(&r->mb_type); | |
8038 | 1518 av_freep(&r->cbp_luma); |
1519 av_freep(&r->cbp_chroma); | |
1520 av_freep(&r->deblock_coefs); | |
6026 | 1521 |
1522 return 0; | |
1523 } |