yading@10
|
1 /*
|
yading@10
|
2 * RV30/40 decoder common data
|
yading@10
|
3 * Copyright (c) 2007 Mike Melanson, Konstantin Shishkov
|
yading@10
|
4 *
|
yading@10
|
5 * This file is part of FFmpeg.
|
yading@10
|
6 *
|
yading@10
|
7 * FFmpeg is free software; you can redistribute it and/or
|
yading@10
|
8 * modify it under the terms of the GNU Lesser General Public
|
yading@10
|
9 * License as published by the Free Software Foundation; either
|
yading@10
|
10 * version 2.1 of the License, or (at your option) any later version.
|
yading@10
|
11 *
|
yading@10
|
12 * FFmpeg is distributed in the hope that it will be useful,
|
yading@10
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
yading@10
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
yading@10
|
15 * Lesser General Public License for more details.
|
yading@10
|
16 *
|
yading@10
|
17 * You should have received a copy of the GNU Lesser General Public
|
yading@10
|
18 * License along with FFmpeg; if not, write to the Free Software
|
yading@10
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
yading@10
|
20 */
|
yading@10
|
21
|
yading@10
|
22 /**
|
yading@10
|
23 * @file
|
yading@10
|
24 * RV30/40 decoder common data
|
yading@10
|
25 */
|
yading@10
|
26
|
yading@10
|
27 #include "libavutil/imgutils.h"
|
yading@10
|
28 #include "libavutil/internal.h"
|
yading@10
|
29
|
yading@10
|
30 #include "avcodec.h"
|
yading@10
|
31 #include "error_resilience.h"
|
yading@10
|
32 #include "mpegvideo.h"
|
yading@10
|
33 #include "golomb.h"
|
yading@10
|
34 #include "internal.h"
|
yading@10
|
35 #include "mathops.h"
|
yading@10
|
36 #include "rectangle.h"
|
yading@10
|
37 #include "thread.h"
|
yading@10
|
38
|
yading@10
|
39 #include "rv34vlc.h"
|
yading@10
|
40 #include "rv34data.h"
|
yading@10
|
41 #include "rv34.h"
|
yading@10
|
42
|
yading@10
|
43 //#define DEBUG
|
yading@10
|
44
|
yading@10
|
45 static inline void ZERO8x2(void* dst, int stride)
|
yading@10
|
46 {
|
yading@10
|
47 fill_rectangle(dst, 1, 2, stride, 0, 4);
|
yading@10
|
48 fill_rectangle(((uint8_t*)(dst))+4, 1, 2, stride, 0, 4);
|
yading@10
|
49 }
|
yading@10
|
50
|
yading@10
|
51 /** translation of RV30/40 macroblock types to lavc ones */
|
yading@10
|
52 static const int rv34_mb_type_to_lavc[12] = {
|
yading@10
|
53 MB_TYPE_INTRA,
|
yading@10
|
54 MB_TYPE_INTRA16x16 | MB_TYPE_SEPARATE_DC,
|
yading@10
|
55 MB_TYPE_16x16 | MB_TYPE_L0,
|
yading@10
|
56 MB_TYPE_8x8 | MB_TYPE_L0,
|
yading@10
|
57 MB_TYPE_16x16 | MB_TYPE_L0,
|
yading@10
|
58 MB_TYPE_16x16 | MB_TYPE_L1,
|
yading@10
|
59 MB_TYPE_SKIP,
|
yading@10
|
60 MB_TYPE_DIRECT2 | MB_TYPE_16x16,
|
yading@10
|
61 MB_TYPE_16x8 | MB_TYPE_L0,
|
yading@10
|
62 MB_TYPE_8x16 | MB_TYPE_L0,
|
yading@10
|
63 MB_TYPE_16x16 | MB_TYPE_L0L1,
|
yading@10
|
64 MB_TYPE_16x16 | MB_TYPE_L0 | MB_TYPE_SEPARATE_DC
|
yading@10
|
65 };
|
yading@10
|
66
|
yading@10
|
67
|
yading@10
|
68 static RV34VLC intra_vlcs[NUM_INTRA_TABLES], inter_vlcs[NUM_INTER_TABLES];
|
yading@10
|
69
|
yading@10
|
70 static int rv34_decode_mv(RV34DecContext *r, int block_type);
|
yading@10
|
71
|
yading@10
|
72 /**
|
yading@10
|
73 * @name RV30/40 VLC generating functions
|
yading@10
|
74 * @{
|
yading@10
|
75 */
|
yading@10
|
76
|
yading@10
|
77 static const int table_offs[] = {
|
yading@10
|
78 0, 1818, 3622, 4144, 4698, 5234, 5804, 5868, 5900, 5932,
|
yading@10
|
79 5996, 6252, 6316, 6348, 6380, 7674, 8944, 10274, 11668, 12250,
|
yading@10
|
80 14060, 15846, 16372, 16962, 17512, 18148, 18180, 18212, 18244, 18308,
|
yading@10
|
81 18564, 18628, 18660, 18692, 20036, 21314, 22648, 23968, 24614, 26384,
|
yading@10
|
82 28190, 28736, 29366, 29938, 30608, 30640, 30672, 30704, 30768, 31024,
|
yading@10
|
83 31088, 31120, 31184, 32570, 33898, 35236, 36644, 37286, 39020, 40802,
|
yading@10
|
84 41368, 42052, 42692, 43348, 43380, 43412, 43444, 43476, 43604, 43668,
|
yading@10
|
85 43700, 43732, 45100, 46430, 47778, 49160, 49802, 51550, 53340, 53972,
|
yading@10
|
86 54648, 55348, 55994, 56122, 56154, 56186, 56218, 56346, 56410, 56442,
|
yading@10
|
87 56474, 57878, 59290, 60636, 62036, 62682, 64460, 64524, 64588, 64716,
|
yading@10
|
88 64844, 66076, 67466, 67978, 68542, 69064, 69648, 70296, 72010, 72074,
|
yading@10
|
89 72138, 72202, 72330, 73572, 74936, 75454, 76030, 76566, 77176, 77822,
|
yading@10
|
90 79582, 79646, 79678, 79742, 79870, 81180, 82536, 83064, 83672, 84242,
|
yading@10
|
91 84934, 85576, 87384, 87448, 87480, 87544, 87672, 88982, 90340, 90902,
|
yading@10
|
92 91598, 92182, 92846, 93488, 95246, 95278, 95310, 95374, 95502, 96878,
|
yading@10
|
93 98266, 98848, 99542, 100234, 100884, 101524, 103320, 103352, 103384, 103416,
|
yading@10
|
94 103480, 104874, 106222, 106910, 107584, 108258, 108902, 109544, 111366, 111398,
|
yading@10
|
95 111430, 111462, 111494, 112878, 114320, 114988, 115660, 116310, 116950, 117592
|
yading@10
|
96 };
|
yading@10
|
97
|
yading@10
|
98 static VLC_TYPE table_data[117592][2];
|
yading@10
|
99
|
yading@10
|
100 /**
|
yading@10
|
101 * Generate VLC from codeword lengths.
|
yading@10
|
102 * @param bits codeword lengths (zeroes are accepted)
|
yading@10
|
103 * @param size length of input data
|
yading@10
|
104 * @param vlc output VLC
|
yading@10
|
105 * @param insyms symbols for input codes (NULL for default ones)
|
yading@10
|
106 * @param num VLC table number (for static initialization)
|
yading@10
|
107 */
|
yading@10
|
108 static void rv34_gen_vlc(const uint8_t *bits, int size, VLC *vlc, const uint8_t *insyms,
|
yading@10
|
109 const int num)
|
yading@10
|
110 {
|
yading@10
|
111 int i;
|
yading@10
|
112 int counts[17] = {0}, codes[17];
|
yading@10
|
113 uint16_t cw[MAX_VLC_SIZE], syms[MAX_VLC_SIZE];
|
yading@10
|
114 uint8_t bits2[MAX_VLC_SIZE];
|
yading@10
|
115 int maxbits = 0, realsize = 0;
|
yading@10
|
116
|
yading@10
|
117 for(i = 0; i < size; i++){
|
yading@10
|
118 if(bits[i]){
|
yading@10
|
119 bits2[realsize] = bits[i];
|
yading@10
|
120 syms[realsize] = insyms ? insyms[i] : i;
|
yading@10
|
121 realsize++;
|
yading@10
|
122 maxbits = FFMAX(maxbits, bits[i]);
|
yading@10
|
123 counts[bits[i]]++;
|
yading@10
|
124 }
|
yading@10
|
125 }
|
yading@10
|
126
|
yading@10
|
127 codes[0] = 0;
|
yading@10
|
128 for(i = 0; i < 16; i++)
|
yading@10
|
129 codes[i+1] = (codes[i] + counts[i]) << 1;
|
yading@10
|
130 for(i = 0; i < realsize; i++)
|
yading@10
|
131 cw[i] = codes[bits2[i]]++;
|
yading@10
|
132
|
yading@10
|
133 vlc->table = &table_data[table_offs[num]];
|
yading@10
|
134 vlc->table_allocated = table_offs[num + 1] - table_offs[num];
|
yading@10
|
135 ff_init_vlc_sparse(vlc, FFMIN(maxbits, 9), realsize,
|
yading@10
|
136 bits2, 1, 1,
|
yading@10
|
137 cw, 2, 2,
|
yading@10
|
138 syms, 2, 2, INIT_VLC_USE_NEW_STATIC);
|
yading@10
|
139 }
|
yading@10
|
140
|
yading@10
|
141 /**
|
yading@10
|
142 * Initialize all tables.
|
yading@10
|
143 */
|
yading@10
|
144 static av_cold void rv34_init_tables(void)
|
yading@10
|
145 {
|
yading@10
|
146 int i, j, k;
|
yading@10
|
147
|
yading@10
|
148 for(i = 0; i < NUM_INTRA_TABLES; i++){
|
yading@10
|
149 for(j = 0; j < 2; j++){
|
yading@10
|
150 rv34_gen_vlc(rv34_table_intra_cbppat [i][j], CBPPAT_VLC_SIZE, &intra_vlcs[i].cbppattern[j], NULL, 19*i + 0 + j);
|
yading@10
|
151 rv34_gen_vlc(rv34_table_intra_secondpat[i][j], OTHERBLK_VLC_SIZE, &intra_vlcs[i].second_pattern[j], NULL, 19*i + 2 + j);
|
yading@10
|
152 rv34_gen_vlc(rv34_table_intra_thirdpat [i][j], OTHERBLK_VLC_SIZE, &intra_vlcs[i].third_pattern[j], NULL, 19*i + 4 + j);
|
yading@10
|
153 for(k = 0; k < 4; k++){
|
yading@10
|
154 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);
|
yading@10
|
155 }
|
yading@10
|
156 }
|
yading@10
|
157 for(j = 0; j < 4; j++){
|
yading@10
|
158 rv34_gen_vlc(rv34_table_intra_firstpat[i][j], FIRSTBLK_VLC_SIZE, &intra_vlcs[i].first_pattern[j], NULL, 19*i + 14 + j);
|
yading@10
|
159 }
|
yading@10
|
160 rv34_gen_vlc(rv34_intra_coeff[i], COEFF_VLC_SIZE, &intra_vlcs[i].coefficient, NULL, 19*i + 18);
|
yading@10
|
161 }
|
yading@10
|
162
|
yading@10
|
163 for(i = 0; i < NUM_INTER_TABLES; i++){
|
yading@10
|
164 rv34_gen_vlc(rv34_inter_cbppat[i], CBPPAT_VLC_SIZE, &inter_vlcs[i].cbppattern[0], NULL, i*12 + 95);
|
yading@10
|
165 for(j = 0; j < 4; j++){
|
yading@10
|
166 rv34_gen_vlc(rv34_inter_cbp[i][j], CBP_VLC_SIZE, &inter_vlcs[i].cbp[0][j], rv34_cbp_code, i*12 + 96 + j);
|
yading@10
|
167 }
|
yading@10
|
168 for(j = 0; j < 2; j++){
|
yading@10
|
169 rv34_gen_vlc(rv34_table_inter_firstpat [i][j], FIRSTBLK_VLC_SIZE, &inter_vlcs[i].first_pattern[j], NULL, i*12 + 100 + j);
|
yading@10
|
170 rv34_gen_vlc(rv34_table_inter_secondpat[i][j], OTHERBLK_VLC_SIZE, &inter_vlcs[i].second_pattern[j], NULL, i*12 + 102 + j);
|
yading@10
|
171 rv34_gen_vlc(rv34_table_inter_thirdpat [i][j], OTHERBLK_VLC_SIZE, &inter_vlcs[i].third_pattern[j], NULL, i*12 + 104 + j);
|
yading@10
|
172 }
|
yading@10
|
173 rv34_gen_vlc(rv34_inter_coeff[i], COEFF_VLC_SIZE, &inter_vlcs[i].coefficient, NULL, i*12 + 106);
|
yading@10
|
174 }
|
yading@10
|
175 }
|
yading@10
|
176
|
yading@10
|
177 /** @} */ // vlc group
|
yading@10
|
178
|
yading@10
|
179 /**
|
yading@10
|
180 * @name RV30/40 4x4 block decoding functions
|
yading@10
|
181 * @{
|
yading@10
|
182 */
|
yading@10
|
183
|
yading@10
|
184 /**
|
yading@10
|
185 * Decode coded block pattern.
|
yading@10
|
186 */
|
yading@10
|
187 static int rv34_decode_cbp(GetBitContext *gb, RV34VLC *vlc, int table)
|
yading@10
|
188 {
|
yading@10
|
189 int pattern, code, cbp=0;
|
yading@10
|
190 int ones;
|
yading@10
|
191 static const int cbp_masks[3] = {0x100000, 0x010000, 0x110000};
|
yading@10
|
192 static const int shifts[4] = { 0, 2, 8, 10 };
|
yading@10
|
193 const int *curshift = shifts;
|
yading@10
|
194 int i, t, mask;
|
yading@10
|
195
|
yading@10
|
196 code = get_vlc2(gb, vlc->cbppattern[table].table, 9, 2);
|
yading@10
|
197 pattern = code & 0xF;
|
yading@10
|
198 code >>= 4;
|
yading@10
|
199
|
yading@10
|
200 ones = rv34_count_ones[pattern];
|
yading@10
|
201
|
yading@10
|
202 for(mask = 8; mask; mask >>= 1, curshift++){
|
yading@10
|
203 if(pattern & mask)
|
yading@10
|
204 cbp |= get_vlc2(gb, vlc->cbp[table][ones].table, vlc->cbp[table][ones].bits, 1) << curshift[0];
|
yading@10
|
205 }
|
yading@10
|
206
|
yading@10
|
207 for(i = 0; i < 4; i++){
|
yading@10
|
208 t = (modulo_three_table[code] >> (6 - 2*i)) & 3;
|
yading@10
|
209 if(t == 1)
|
yading@10
|
210 cbp |= cbp_masks[get_bits1(gb)] << i;
|
yading@10
|
211 if(t == 2)
|
yading@10
|
212 cbp |= cbp_masks[2] << i;
|
yading@10
|
213 }
|
yading@10
|
214 return cbp;
|
yading@10
|
215 }
|
yading@10
|
216
|
yading@10
|
217 /**
|
yading@10
|
218 * Get one coefficient value from the bitstream and store it.
|
yading@10
|
219 */
|
yading@10
|
220 static inline void decode_coeff(int16_t *dst, int coef, int esc, GetBitContext *gb, VLC* vlc, int q)
|
yading@10
|
221 {
|
yading@10
|
222 if(coef){
|
yading@10
|
223 if(coef == esc){
|
yading@10
|
224 coef = get_vlc2(gb, vlc->table, 9, 2);
|
yading@10
|
225 if(coef > 23){
|
yading@10
|
226 coef -= 23;
|
yading@10
|
227 coef = 22 + ((1 << coef) | get_bits(gb, coef));
|
yading@10
|
228 }
|
yading@10
|
229 coef += esc;
|
yading@10
|
230 }
|
yading@10
|
231 if(get_bits1(gb))
|
yading@10
|
232 coef = -coef;
|
yading@10
|
233 *dst = (coef*q + 8) >> 4;
|
yading@10
|
234 }
|
yading@10
|
235 }
|
yading@10
|
236
|
yading@10
|
237 /**
|
yading@10
|
238 * Decode 2x2 subblock of coefficients.
|
yading@10
|
239 */
|
yading@10
|
240 static inline void decode_subblock(int16_t *dst, int code, const int is_block2, GetBitContext *gb, VLC *vlc, int q)
|
yading@10
|
241 {
|
yading@10
|
242 int flags = modulo_three_table[code];
|
yading@10
|
243
|
yading@10
|
244 decode_coeff( dst+0*4+0, (flags >> 6) , 3, gb, vlc, q);
|
yading@10
|
245 if(is_block2){
|
yading@10
|
246 decode_coeff(dst+1*4+0, (flags >> 4) & 3, 2, gb, vlc, q);
|
yading@10
|
247 decode_coeff(dst+0*4+1, (flags >> 2) & 3, 2, gb, vlc, q);
|
yading@10
|
248 }else{
|
yading@10
|
249 decode_coeff(dst+0*4+1, (flags >> 4) & 3, 2, gb, vlc, q);
|
yading@10
|
250 decode_coeff(dst+1*4+0, (flags >> 2) & 3, 2, gb, vlc, q);
|
yading@10
|
251 }
|
yading@10
|
252 decode_coeff( dst+1*4+1, (flags >> 0) & 3, 2, gb, vlc, q);
|
yading@10
|
253 }
|
yading@10
|
254
|
yading@10
|
255 /**
|
yading@10
|
256 * Decode a single coefficient.
|
yading@10
|
257 */
|
yading@10
|
258 static inline void decode_subblock1(int16_t *dst, int code, GetBitContext *gb, VLC *vlc, int q)
|
yading@10
|
259 {
|
yading@10
|
260 int coeff = modulo_three_table[code] >> 6;
|
yading@10
|
261 decode_coeff(dst, coeff, 3, gb, vlc, q);
|
yading@10
|
262 }
|
yading@10
|
263
|
yading@10
|
264 static inline void decode_subblock3(int16_t *dst, int code, GetBitContext *gb, VLC *vlc,
|
yading@10
|
265 int q_dc, int q_ac1, int q_ac2)
|
yading@10
|
266 {
|
yading@10
|
267 int flags = modulo_three_table[code];
|
yading@10
|
268
|
yading@10
|
269 decode_coeff(dst+0*4+0, (flags >> 6) , 3, gb, vlc, q_dc);
|
yading@10
|
270 decode_coeff(dst+0*4+1, (flags >> 4) & 3, 2, gb, vlc, q_ac1);
|
yading@10
|
271 decode_coeff(dst+1*4+0, (flags >> 2) & 3, 2, gb, vlc, q_ac1);
|
yading@10
|
272 decode_coeff(dst+1*4+1, (flags >> 0) & 3, 2, gb, vlc, q_ac2);
|
yading@10
|
273 }
|
yading@10
|
274
|
yading@10
|
275 /**
|
yading@10
|
276 * Decode coefficients for 4x4 block.
|
yading@10
|
277 *
|
yading@10
|
278 * This is done by filling 2x2 subblocks with decoded coefficients
|
yading@10
|
279 * in this order (the same for subblocks and subblock coefficients):
|
yading@10
|
280 * o--o
|
yading@10
|
281 * /
|
yading@10
|
282 * /
|
yading@10
|
283 * o--o
|
yading@10
|
284 */
|
yading@10
|
285
|
yading@10
|
286 static int rv34_decode_block(int16_t *dst, GetBitContext *gb, RV34VLC *rvlc, int fc, int sc, int q_dc, int q_ac1, int q_ac2)
|
yading@10
|
287 {
|
yading@10
|
288 int code, pattern, has_ac = 1;
|
yading@10
|
289
|
yading@10
|
290 code = get_vlc2(gb, rvlc->first_pattern[fc].table, 9, 2);
|
yading@10
|
291
|
yading@10
|
292 pattern = code & 0x7;
|
yading@10
|
293
|
yading@10
|
294 code >>= 3;
|
yading@10
|
295
|
yading@10
|
296 if (modulo_three_table[code] & 0x3F) {
|
yading@10
|
297 decode_subblock3(dst, code, gb, &rvlc->coefficient, q_dc, q_ac1, q_ac2);
|
yading@10
|
298 } else {
|
yading@10
|
299 decode_subblock1(dst, code, gb, &rvlc->coefficient, q_dc);
|
yading@10
|
300 if (!pattern)
|
yading@10
|
301 return 0;
|
yading@10
|
302 has_ac = 0;
|
yading@10
|
303 }
|
yading@10
|
304
|
yading@10
|
305 if(pattern & 4){
|
yading@10
|
306 code = get_vlc2(gb, rvlc->second_pattern[sc].table, 9, 2);
|
yading@10
|
307 decode_subblock(dst + 4*0+2, code, 0, gb, &rvlc->coefficient, q_ac2);
|
yading@10
|
308 }
|
yading@10
|
309 if(pattern & 2){ // Looks like coefficients 1 and 2 are swapped for this block
|
yading@10
|
310 code = get_vlc2(gb, rvlc->second_pattern[sc].table, 9, 2);
|
yading@10
|
311 decode_subblock(dst + 4*2+0, code, 1, gb, &rvlc->coefficient, q_ac2);
|
yading@10
|
312 }
|
yading@10
|
313 if(pattern & 1){
|
yading@10
|
314 code = get_vlc2(gb, rvlc->third_pattern[sc].table, 9, 2);
|
yading@10
|
315 decode_subblock(dst + 4*2+2, code, 0, gb, &rvlc->coefficient, q_ac2);
|
yading@10
|
316 }
|
yading@10
|
317 return has_ac | pattern;
|
yading@10
|
318 }
|
yading@10
|
319
|
yading@10
|
320 /**
|
yading@10
|
321 * @name RV30/40 bitstream parsing
|
yading@10
|
322 * @{
|
yading@10
|
323 */
|
yading@10
|
324
|
yading@10
|
325 /**
|
yading@10
|
326 * Decode starting slice position.
|
yading@10
|
327 * @todo Maybe replace with ff_h263_decode_mba() ?
|
yading@10
|
328 */
|
yading@10
|
329 int ff_rv34_get_start_offset(GetBitContext *gb, int mb_size)
|
yading@10
|
330 {
|
yading@10
|
331 int i;
|
yading@10
|
332 for(i = 0; i < 5; i++)
|
yading@10
|
333 if(rv34_mb_max_sizes[i] >= mb_size - 1)
|
yading@10
|
334 break;
|
yading@10
|
335 return rv34_mb_bits_sizes[i];
|
yading@10
|
336 }
|
yading@10
|
337
|
yading@10
|
338 /**
|
yading@10
|
339 * Select VLC set for decoding from current quantizer, modifier and frame type.
|
yading@10
|
340 */
|
yading@10
|
341 static inline RV34VLC* choose_vlc_set(int quant, int mod, int type)
|
yading@10
|
342 {
|
yading@10
|
343 if(mod == 2 && quant < 19) quant += 10;
|
yading@10
|
344 else if(mod && quant < 26) quant += 5;
|
yading@10
|
345 return type ? &inter_vlcs[rv34_quant_to_vlc_set[1][av_clip(quant, 0, 30)]]
|
yading@10
|
346 : &intra_vlcs[rv34_quant_to_vlc_set[0][av_clip(quant, 0, 30)]];
|
yading@10
|
347 }
|
yading@10
|
348
|
yading@10
|
349 /**
|
yading@10
|
350 * Decode intra macroblock header and return CBP in case of success, -1 otherwise.
|
yading@10
|
351 */
|
yading@10
|
352 static int rv34_decode_intra_mb_header(RV34DecContext *r, int8_t *intra_types)
|
yading@10
|
353 {
|
yading@10
|
354 MpegEncContext *s = &r->s;
|
yading@10
|
355 GetBitContext *gb = &s->gb;
|
yading@10
|
356 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
|
yading@10
|
357 int t;
|
yading@10
|
358
|
yading@10
|
359 r->is16 = get_bits1(gb);
|
yading@10
|
360 if(r->is16){
|
yading@10
|
361 s->current_picture_ptr->mb_type[mb_pos] = MB_TYPE_INTRA16x16;
|
yading@10
|
362 r->block_type = RV34_MB_TYPE_INTRA16x16;
|
yading@10
|
363 t = get_bits(gb, 2);
|
yading@10
|
364 fill_rectangle(intra_types, 4, 4, r->intra_types_stride, t, sizeof(intra_types[0]));
|
yading@10
|
365 r->luma_vlc = 2;
|
yading@10
|
366 }else{
|
yading@10
|
367 if(!r->rv30){
|
yading@10
|
368 if(!get_bits1(gb))
|
yading@10
|
369 av_log(s->avctx, AV_LOG_ERROR, "Need DQUANT\n");
|
yading@10
|
370 }
|
yading@10
|
371 s->current_picture_ptr->mb_type[mb_pos] = MB_TYPE_INTRA;
|
yading@10
|
372 r->block_type = RV34_MB_TYPE_INTRA;
|
yading@10
|
373 if(r->decode_intra_types(r, gb, intra_types) < 0)
|
yading@10
|
374 return -1;
|
yading@10
|
375 r->luma_vlc = 1;
|
yading@10
|
376 }
|
yading@10
|
377
|
yading@10
|
378 r->chroma_vlc = 0;
|
yading@10
|
379 r->cur_vlcs = choose_vlc_set(r->si.quant, r->si.vlc_set, 0);
|
yading@10
|
380
|
yading@10
|
381 return rv34_decode_cbp(gb, r->cur_vlcs, r->is16);
|
yading@10
|
382 }
|
yading@10
|
383
|
yading@10
|
384 /**
|
yading@10
|
385 * Decode inter macroblock header and return CBP in case of success, -1 otherwise.
|
yading@10
|
386 */
|
yading@10
|
387 static int rv34_decode_inter_mb_header(RV34DecContext *r, int8_t *intra_types)
|
yading@10
|
388 {
|
yading@10
|
389 MpegEncContext *s = &r->s;
|
yading@10
|
390 GetBitContext *gb = &s->gb;
|
yading@10
|
391 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
|
yading@10
|
392 int i, t;
|
yading@10
|
393
|
yading@10
|
394 r->block_type = r->decode_mb_info(r);
|
yading@10
|
395 if(r->block_type == -1)
|
yading@10
|
396 return -1;
|
yading@10
|
397 s->current_picture_ptr->mb_type[mb_pos] = rv34_mb_type_to_lavc[r->block_type];
|
yading@10
|
398 r->mb_type[mb_pos] = r->block_type;
|
yading@10
|
399 if(r->block_type == RV34_MB_SKIP){
|
yading@10
|
400 if(s->pict_type == AV_PICTURE_TYPE_P)
|
yading@10
|
401 r->mb_type[mb_pos] = RV34_MB_P_16x16;
|
yading@10
|
402 if(s->pict_type == AV_PICTURE_TYPE_B)
|
yading@10
|
403 r->mb_type[mb_pos] = RV34_MB_B_DIRECT;
|
yading@10
|
404 }
|
yading@10
|
405 r->is16 = !!IS_INTRA16x16(s->current_picture_ptr->mb_type[mb_pos]);
|
yading@10
|
406 rv34_decode_mv(r, r->block_type);
|
yading@10
|
407 if(r->block_type == RV34_MB_SKIP){
|
yading@10
|
408 fill_rectangle(intra_types, 4, 4, r->intra_types_stride, 0, sizeof(intra_types[0]));
|
yading@10
|
409 return 0;
|
yading@10
|
410 }
|
yading@10
|
411 r->chroma_vlc = 1;
|
yading@10
|
412 r->luma_vlc = 0;
|
yading@10
|
413
|
yading@10
|
414 if(IS_INTRA(s->current_picture_ptr->mb_type[mb_pos])){
|
yading@10
|
415 if(r->is16){
|
yading@10
|
416 t = get_bits(gb, 2);
|
yading@10
|
417 fill_rectangle(intra_types, 4, 4, r->intra_types_stride, t, sizeof(intra_types[0]));
|
yading@10
|
418 r->luma_vlc = 2;
|
yading@10
|
419 }else{
|
yading@10
|
420 if(r->decode_intra_types(r, gb, intra_types) < 0)
|
yading@10
|
421 return -1;
|
yading@10
|
422 r->luma_vlc = 1;
|
yading@10
|
423 }
|
yading@10
|
424 r->chroma_vlc = 0;
|
yading@10
|
425 r->cur_vlcs = choose_vlc_set(r->si.quant, r->si.vlc_set, 0);
|
yading@10
|
426 }else{
|
yading@10
|
427 for(i = 0; i < 16; i++)
|
yading@10
|
428 intra_types[(i & 3) + (i>>2) * r->intra_types_stride] = 0;
|
yading@10
|
429 r->cur_vlcs = choose_vlc_set(r->si.quant, r->si.vlc_set, 1);
|
yading@10
|
430 if(r->mb_type[mb_pos] == RV34_MB_P_MIX16x16){
|
yading@10
|
431 r->is16 = 1;
|
yading@10
|
432 r->chroma_vlc = 1;
|
yading@10
|
433 r->luma_vlc = 2;
|
yading@10
|
434 r->cur_vlcs = choose_vlc_set(r->si.quant, r->si.vlc_set, 0);
|
yading@10
|
435 }
|
yading@10
|
436 }
|
yading@10
|
437
|
yading@10
|
438 return rv34_decode_cbp(gb, r->cur_vlcs, r->is16);
|
yading@10
|
439 }
|
yading@10
|
440
|
yading@10
|
441 /** @} */ //bitstream functions
|
yading@10
|
442
|
yading@10
|
443 /**
|
yading@10
|
444 * @name motion vector related code (prediction, reconstruction, motion compensation)
|
yading@10
|
445 * @{
|
yading@10
|
446 */
|
yading@10
|
447
|
yading@10
|
448 /** macroblock partition width in 8x8 blocks */
|
yading@10
|
449 static const uint8_t part_sizes_w[RV34_MB_TYPES] = { 2, 2, 2, 1, 2, 2, 2, 2, 2, 1, 2, 2 };
|
yading@10
|
450
|
yading@10
|
451 /** macroblock partition height in 8x8 blocks */
|
yading@10
|
452 static const uint8_t part_sizes_h[RV34_MB_TYPES] = { 2, 2, 2, 1, 2, 2, 2, 2, 1, 2, 2, 2 };
|
yading@10
|
453
|
yading@10
|
454 /** availability index for subblocks */
|
yading@10
|
455 static const uint8_t avail_indexes[4] = { 6, 7, 10, 11 };
|
yading@10
|
456
|
yading@10
|
457 /**
|
yading@10
|
458 * motion vector prediction
|
yading@10
|
459 *
|
yading@10
|
460 * Motion prediction performed for the block by using median prediction of
|
yading@10
|
461 * motion vectors from the left, top and right top blocks but in corner cases
|
yading@10
|
462 * some other vectors may be used instead.
|
yading@10
|
463 */
|
yading@10
|
464 static void rv34_pred_mv(RV34DecContext *r, int block_type, int subblock_no, int dmv_no)
|
yading@10
|
465 {
|
yading@10
|
466 MpegEncContext *s = &r->s;
|
yading@10
|
467 int mv_pos = s->mb_x * 2 + s->mb_y * 2 * s->b8_stride;
|
yading@10
|
468 int A[2] = {0}, B[2], C[2];
|
yading@10
|
469 int i, j;
|
yading@10
|
470 int mx, my;
|
yading@10
|
471 int* avail = r->avail_cache + avail_indexes[subblock_no];
|
yading@10
|
472 int c_off = part_sizes_w[block_type];
|
yading@10
|
473
|
yading@10
|
474 mv_pos += (subblock_no & 1) + (subblock_no >> 1)*s->b8_stride;
|
yading@10
|
475 if(subblock_no == 3)
|
yading@10
|
476 c_off = -1;
|
yading@10
|
477
|
yading@10
|
478 if(avail[-1]){
|
yading@10
|
479 A[0] = s->current_picture_ptr->motion_val[0][mv_pos-1][0];
|
yading@10
|
480 A[1] = s->current_picture_ptr->motion_val[0][mv_pos-1][1];
|
yading@10
|
481 }
|
yading@10
|
482 if(avail[-4]){
|
yading@10
|
483 B[0] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride][0];
|
yading@10
|
484 B[1] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride][1];
|
yading@10
|
485 }else{
|
yading@10
|
486 B[0] = A[0];
|
yading@10
|
487 B[1] = A[1];
|
yading@10
|
488 }
|
yading@10
|
489 if(!avail[c_off-4]){
|
yading@10
|
490 if(avail[-4] && (avail[-1] || r->rv30)){
|
yading@10
|
491 C[0] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride-1][0];
|
yading@10
|
492 C[1] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride-1][1];
|
yading@10
|
493 }else{
|
yading@10
|
494 C[0] = A[0];
|
yading@10
|
495 C[1] = A[1];
|
yading@10
|
496 }
|
yading@10
|
497 }else{
|
yading@10
|
498 C[0] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride+c_off][0];
|
yading@10
|
499 C[1] = s->current_picture_ptr->motion_val[0][mv_pos-s->b8_stride+c_off][1];
|
yading@10
|
500 }
|
yading@10
|
501 mx = mid_pred(A[0], B[0], C[0]);
|
yading@10
|
502 my = mid_pred(A[1], B[1], C[1]);
|
yading@10
|
503 mx += r->dmv[dmv_no][0];
|
yading@10
|
504 my += r->dmv[dmv_no][1];
|
yading@10
|
505 for(j = 0; j < part_sizes_h[block_type]; j++){
|
yading@10
|
506 for(i = 0; i < part_sizes_w[block_type]; i++){
|
yading@10
|
507 s->current_picture_ptr->motion_val[0][mv_pos + i + j*s->b8_stride][0] = mx;
|
yading@10
|
508 s->current_picture_ptr->motion_val[0][mv_pos + i + j*s->b8_stride][1] = my;
|
yading@10
|
509 }
|
yading@10
|
510 }
|
yading@10
|
511 }
|
yading@10
|
512
|
yading@10
|
513 #define GET_PTS_DIFF(a, b) ((a - b + 8192) & 0x1FFF)
|
yading@10
|
514
|
yading@10
|
515 /**
|
yading@10
|
516 * Calculate motion vector component that should be added for direct blocks.
|
yading@10
|
517 */
|
yading@10
|
518 static int calc_add_mv(RV34DecContext *r, int dir, int val)
|
yading@10
|
519 {
|
yading@10
|
520 int mul = dir ? -r->mv_weight2 : r->mv_weight1;
|
yading@10
|
521
|
yading@10
|
522 return (val * mul + 0x2000) >> 14;
|
yading@10
|
523 }
|
yading@10
|
524
|
yading@10
|
525 /**
|
yading@10
|
526 * Predict motion vector for B-frame macroblock.
|
yading@10
|
527 */
|
yading@10
|
528 static inline void rv34_pred_b_vector(int A[2], int B[2], int C[2],
|
yading@10
|
529 int A_avail, int B_avail, int C_avail,
|
yading@10
|
530 int *mx, int *my)
|
yading@10
|
531 {
|
yading@10
|
532 if(A_avail + B_avail + C_avail != 3){
|
yading@10
|
533 *mx = A[0] + B[0] + C[0];
|
yading@10
|
534 *my = A[1] + B[1] + C[1];
|
yading@10
|
535 if(A_avail + B_avail + C_avail == 2){
|
yading@10
|
536 *mx /= 2;
|
yading@10
|
537 *my /= 2;
|
yading@10
|
538 }
|
yading@10
|
539 }else{
|
yading@10
|
540 *mx = mid_pred(A[0], B[0], C[0]);
|
yading@10
|
541 *my = mid_pred(A[1], B[1], C[1]);
|
yading@10
|
542 }
|
yading@10
|
543 }
|
yading@10
|
544
|
yading@10
|
545 /**
|
yading@10
|
546 * motion vector prediction for B-frames
|
yading@10
|
547 */
|
yading@10
|
548 static void rv34_pred_mv_b(RV34DecContext *r, int block_type, int dir)
|
yading@10
|
549 {
|
yading@10
|
550 MpegEncContext *s = &r->s;
|
yading@10
|
551 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
|
yading@10
|
552 int mv_pos = s->mb_x * 2 + s->mb_y * 2 * s->b8_stride;
|
yading@10
|
553 int A[2] = { 0 }, B[2] = { 0 }, C[2] = { 0 };
|
yading@10
|
554 int has_A = 0, has_B = 0, has_C = 0;
|
yading@10
|
555 int mx, my;
|
yading@10
|
556 int i, j;
|
yading@10
|
557 Picture *cur_pic = s->current_picture_ptr;
|
yading@10
|
558 const int mask = dir ? MB_TYPE_L1 : MB_TYPE_L0;
|
yading@10
|
559 int type = cur_pic->mb_type[mb_pos];
|
yading@10
|
560
|
yading@10
|
561 if((r->avail_cache[6-1] & type) & mask){
|
yading@10
|
562 A[0] = cur_pic->motion_val[dir][mv_pos - 1][0];
|
yading@10
|
563 A[1] = cur_pic->motion_val[dir][mv_pos - 1][1];
|
yading@10
|
564 has_A = 1;
|
yading@10
|
565 }
|
yading@10
|
566 if((r->avail_cache[6-4] & type) & mask){
|
yading@10
|
567 B[0] = cur_pic->motion_val[dir][mv_pos - s->b8_stride][0];
|
yading@10
|
568 B[1] = cur_pic->motion_val[dir][mv_pos - s->b8_stride][1];
|
yading@10
|
569 has_B = 1;
|
yading@10
|
570 }
|
yading@10
|
571 if(r->avail_cache[6-4] && (r->avail_cache[6-2] & type) & mask){
|
yading@10
|
572 C[0] = cur_pic->motion_val[dir][mv_pos - s->b8_stride + 2][0];
|
yading@10
|
573 C[1] = cur_pic->motion_val[dir][mv_pos - s->b8_stride + 2][1];
|
yading@10
|
574 has_C = 1;
|
yading@10
|
575 }else if((s->mb_x+1) == s->mb_width && (r->avail_cache[6-5] & type) & mask){
|
yading@10
|
576 C[0] = cur_pic->motion_val[dir][mv_pos - s->b8_stride - 1][0];
|
yading@10
|
577 C[1] = cur_pic->motion_val[dir][mv_pos - s->b8_stride - 1][1];
|
yading@10
|
578 has_C = 1;
|
yading@10
|
579 }
|
yading@10
|
580
|
yading@10
|
581 rv34_pred_b_vector(A, B, C, has_A, has_B, has_C, &mx, &my);
|
yading@10
|
582
|
yading@10
|
583 mx += r->dmv[dir][0];
|
yading@10
|
584 my += r->dmv[dir][1];
|
yading@10
|
585
|
yading@10
|
586 for(j = 0; j < 2; j++){
|
yading@10
|
587 for(i = 0; i < 2; i++){
|
yading@10
|
588 cur_pic->motion_val[dir][mv_pos + i + j*s->b8_stride][0] = mx;
|
yading@10
|
589 cur_pic->motion_val[dir][mv_pos + i + j*s->b8_stride][1] = my;
|
yading@10
|
590 }
|
yading@10
|
591 }
|
yading@10
|
592 if(block_type == RV34_MB_B_BACKWARD || block_type == RV34_MB_B_FORWARD){
|
yading@10
|
593 ZERO8x2(cur_pic->motion_val[!dir][mv_pos], s->b8_stride);
|
yading@10
|
594 }
|
yading@10
|
595 }
|
yading@10
|
596
|
yading@10
|
597 /**
|
yading@10
|
598 * motion vector prediction - RV3 version
|
yading@10
|
599 */
|
yading@10
|
600 static void rv34_pred_mv_rv3(RV34DecContext *r, int block_type, int dir)
|
yading@10
|
601 {
|
yading@10
|
602 MpegEncContext *s = &r->s;
|
yading@10
|
603 int mv_pos = s->mb_x * 2 + s->mb_y * 2 * s->b8_stride;
|
yading@10
|
604 int A[2] = {0}, B[2], C[2];
|
yading@10
|
605 int i, j, k;
|
yading@10
|
606 int mx, my;
|
yading@10
|
607 int* avail = r->avail_cache + avail_indexes[0];
|
yading@10
|
608
|
yading@10
|
609 if(avail[-1]){
|
yading@10
|
610 A[0] = s->current_picture_ptr->motion_val[0][mv_pos - 1][0];
|
yading@10
|
611 A[1] = s->current_picture_ptr->motion_val[0][mv_pos - 1][1];
|
yading@10
|
612 }
|
yading@10
|
613 if(avail[-4]){
|
yading@10
|
614 B[0] = s->current_picture_ptr->motion_val[0][mv_pos - s->b8_stride][0];
|
yading@10
|
615 B[1] = s->current_picture_ptr->motion_val[0][mv_pos - s->b8_stride][1];
|
yading@10
|
616 }else{
|
yading@10
|
617 B[0] = A[0];
|
yading@10
|
618 B[1] = A[1];
|
yading@10
|
619 }
|
yading@10
|
620 if(!avail[-4 + 2]){
|
yading@10
|
621 if(avail[-4] && (avail[-1])){
|
yading@10
|
622 C[0] = s->current_picture_ptr->motion_val[0][mv_pos - s->b8_stride - 1][0];
|
yading@10
|
623 C[1] = s->current_picture_ptr->motion_val[0][mv_pos - s->b8_stride - 1][1];
|
yading@10
|
624 }else{
|
yading@10
|
625 C[0] = A[0];
|
yading@10
|
626 C[1] = A[1];
|
yading@10
|
627 }
|
yading@10
|
628 }else{
|
yading@10
|
629 C[0] = s->current_picture_ptr->motion_val[0][mv_pos - s->b8_stride + 2][0];
|
yading@10
|
630 C[1] = s->current_picture_ptr->motion_val[0][mv_pos - s->b8_stride + 2][1];
|
yading@10
|
631 }
|
yading@10
|
632 mx = mid_pred(A[0], B[0], C[0]);
|
yading@10
|
633 my = mid_pred(A[1], B[1], C[1]);
|
yading@10
|
634 mx += r->dmv[0][0];
|
yading@10
|
635 my += r->dmv[0][1];
|
yading@10
|
636 for(j = 0; j < 2; j++){
|
yading@10
|
637 for(i = 0; i < 2; i++){
|
yading@10
|
638 for(k = 0; k < 2; k++){
|
yading@10
|
639 s->current_picture_ptr->motion_val[k][mv_pos + i + j*s->b8_stride][0] = mx;
|
yading@10
|
640 s->current_picture_ptr->motion_val[k][mv_pos + i + j*s->b8_stride][1] = my;
|
yading@10
|
641 }
|
yading@10
|
642 }
|
yading@10
|
643 }
|
yading@10
|
644 }
|
yading@10
|
645
|
yading@10
|
646 static const int chroma_coeffs[3] = { 0, 3, 5 };
|
yading@10
|
647
|
yading@10
|
648 /**
|
yading@10
|
649 * generic motion compensation function
|
yading@10
|
650 *
|
yading@10
|
651 * @param r decoder context
|
yading@10
|
652 * @param block_type type of the current block
|
yading@10
|
653 * @param xoff horizontal offset from the start of the current block
|
yading@10
|
654 * @param yoff vertical offset from the start of the current block
|
yading@10
|
655 * @param mv_off offset to the motion vector information
|
yading@10
|
656 * @param width width of the current partition in 8x8 blocks
|
yading@10
|
657 * @param height height of the current partition in 8x8 blocks
|
yading@10
|
658 * @param dir motion compensation direction (i.e. from the last or the next reference frame)
|
yading@10
|
659 * @param thirdpel motion vectors are specified in 1/3 of pixel
|
yading@10
|
660 * @param qpel_mc a set of functions used to perform luma motion compensation
|
yading@10
|
661 * @param chroma_mc a set of functions used to perform chroma motion compensation
|
yading@10
|
662 */
|
yading@10
|
663 static inline void rv34_mc(RV34DecContext *r, const int block_type,
|
yading@10
|
664 const int xoff, const int yoff, int mv_off,
|
yading@10
|
665 const int width, const int height, int dir,
|
yading@10
|
666 const int thirdpel, int weighted,
|
yading@10
|
667 qpel_mc_func (*qpel_mc)[16],
|
yading@10
|
668 h264_chroma_mc_func (*chroma_mc))
|
yading@10
|
669 {
|
yading@10
|
670 MpegEncContext *s = &r->s;
|
yading@10
|
671 uint8_t *Y, *U, *V, *srcY, *srcU, *srcV;
|
yading@10
|
672 int dxy, mx, my, umx, umy, lx, ly, uvmx, uvmy, src_x, src_y, uvsrc_x, uvsrc_y;
|
yading@10
|
673 int mv_pos = s->mb_x * 2 + s->mb_y * 2 * s->b8_stride + mv_off;
|
yading@10
|
674 int is16x16 = 1;
|
yading@10
|
675
|
yading@10
|
676 if(thirdpel){
|
yading@10
|
677 int chroma_mx, chroma_my;
|
yading@10
|
678 mx = (s->current_picture_ptr->motion_val[dir][mv_pos][0] + (3 << 24)) / 3 - (1 << 24);
|
yading@10
|
679 my = (s->current_picture_ptr->motion_val[dir][mv_pos][1] + (3 << 24)) / 3 - (1 << 24);
|
yading@10
|
680 lx = (s->current_picture_ptr->motion_val[dir][mv_pos][0] + (3 << 24)) % 3;
|
yading@10
|
681 ly = (s->current_picture_ptr->motion_val[dir][mv_pos][1] + (3 << 24)) % 3;
|
yading@10
|
682 chroma_mx = s->current_picture_ptr->motion_val[dir][mv_pos][0] / 2;
|
yading@10
|
683 chroma_my = s->current_picture_ptr->motion_val[dir][mv_pos][1] / 2;
|
yading@10
|
684 umx = (chroma_mx + (3 << 24)) / 3 - (1 << 24);
|
yading@10
|
685 umy = (chroma_my + (3 << 24)) / 3 - (1 << 24);
|
yading@10
|
686 uvmx = chroma_coeffs[(chroma_mx + (3 << 24)) % 3];
|
yading@10
|
687 uvmy = chroma_coeffs[(chroma_my + (3 << 24)) % 3];
|
yading@10
|
688 }else{
|
yading@10
|
689 int cx, cy;
|
yading@10
|
690 mx = s->current_picture_ptr->motion_val[dir][mv_pos][0] >> 2;
|
yading@10
|
691 my = s->current_picture_ptr->motion_val[dir][mv_pos][1] >> 2;
|
yading@10
|
692 lx = s->current_picture_ptr->motion_val[dir][mv_pos][0] & 3;
|
yading@10
|
693 ly = s->current_picture_ptr->motion_val[dir][mv_pos][1] & 3;
|
yading@10
|
694 cx = s->current_picture_ptr->motion_val[dir][mv_pos][0] / 2;
|
yading@10
|
695 cy = s->current_picture_ptr->motion_val[dir][mv_pos][1] / 2;
|
yading@10
|
696 umx = cx >> 2;
|
yading@10
|
697 umy = cy >> 2;
|
yading@10
|
698 uvmx = (cx & 3) << 1;
|
yading@10
|
699 uvmy = (cy & 3) << 1;
|
yading@10
|
700 //due to some flaw RV40 uses the same MC compensation routine for H2V2 and H3V3
|
yading@10
|
701 if(uvmx == 6 && uvmy == 6)
|
yading@10
|
702 uvmx = uvmy = 4;
|
yading@10
|
703 }
|
yading@10
|
704
|
yading@10
|
705 if (HAVE_THREADS && (s->avctx->active_thread_type & FF_THREAD_FRAME)) {
|
yading@10
|
706 /* wait for the referenced mb row to be finished */
|
yading@10
|
707 int mb_row = s->mb_y + ((yoff + my + 5 + 8 * height) >> 4);
|
yading@10
|
708 ThreadFrame *f = dir ? &s->next_picture_ptr->tf : &s->last_picture_ptr->tf;
|
yading@10
|
709 ff_thread_await_progress(f, mb_row, 0);
|
yading@10
|
710 }
|
yading@10
|
711
|
yading@10
|
712 dxy = ly*4 + lx;
|
yading@10
|
713 srcY = dir ? s->next_picture_ptr->f.data[0] : s->last_picture_ptr->f.data[0];
|
yading@10
|
714 srcU = dir ? s->next_picture_ptr->f.data[1] : s->last_picture_ptr->f.data[1];
|
yading@10
|
715 srcV = dir ? s->next_picture_ptr->f.data[2] : s->last_picture_ptr->f.data[2];
|
yading@10
|
716 src_x = s->mb_x * 16 + xoff + mx;
|
yading@10
|
717 src_y = s->mb_y * 16 + yoff + my;
|
yading@10
|
718 uvsrc_x = s->mb_x * 8 + (xoff >> 1) + umx;
|
yading@10
|
719 uvsrc_y = s->mb_y * 8 + (yoff >> 1) + umy;
|
yading@10
|
720 srcY += src_y * s->linesize + src_x;
|
yading@10
|
721 srcU += uvsrc_y * s->uvlinesize + uvsrc_x;
|
yading@10
|
722 srcV += uvsrc_y * s->uvlinesize + uvsrc_x;
|
yading@10
|
723 if(s->h_edge_pos - (width << 3) < 6 || s->v_edge_pos - (height << 3) < 6 ||
|
yading@10
|
724 (unsigned)(src_x - !!lx*2) > s->h_edge_pos - !!lx*2 - (width <<3) - 4 ||
|
yading@10
|
725 (unsigned)(src_y - !!ly*2) > s->v_edge_pos - !!ly*2 - (height<<3) - 4) {
|
yading@10
|
726 uint8_t *uvbuf = s->edge_emu_buffer + 22 * s->linesize;
|
yading@10
|
727
|
yading@10
|
728 srcY -= 2 + 2*s->linesize;
|
yading@10
|
729 s->vdsp.emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, (width<<3)+6, (height<<3)+6,
|
yading@10
|
730 src_x - 2, src_y - 2, s->h_edge_pos, s->v_edge_pos);
|
yading@10
|
731 srcY = s->edge_emu_buffer + 2 + 2*s->linesize;
|
yading@10
|
732 s->vdsp.emulated_edge_mc(uvbuf , srcU, s->uvlinesize, (width<<2)+1, (height<<2)+1,
|
yading@10
|
733 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
|
yading@10
|
734 s->vdsp.emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, (width<<2)+1, (height<<2)+1,
|
yading@10
|
735 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
|
yading@10
|
736 srcU = uvbuf;
|
yading@10
|
737 srcV = uvbuf + 16;
|
yading@10
|
738 }
|
yading@10
|
739 if(!weighted){
|
yading@10
|
740 Y = s->dest[0] + xoff + yoff *s->linesize;
|
yading@10
|
741 U = s->dest[1] + (xoff>>1) + (yoff>>1)*s->uvlinesize;
|
yading@10
|
742 V = s->dest[2] + (xoff>>1) + (yoff>>1)*s->uvlinesize;
|
yading@10
|
743 }else{
|
yading@10
|
744 Y = r->tmp_b_block_y [dir] + xoff + yoff *s->linesize;
|
yading@10
|
745 U = r->tmp_b_block_uv[dir*2] + (xoff>>1) + (yoff>>1)*s->uvlinesize;
|
yading@10
|
746 V = r->tmp_b_block_uv[dir*2+1] + (xoff>>1) + (yoff>>1)*s->uvlinesize;
|
yading@10
|
747 }
|
yading@10
|
748
|
yading@10
|
749 if(block_type == RV34_MB_P_16x8){
|
yading@10
|
750 qpel_mc[1][dxy](Y, srcY, s->linesize);
|
yading@10
|
751 Y += 8;
|
yading@10
|
752 srcY += 8;
|
yading@10
|
753 }else if(block_type == RV34_MB_P_8x16){
|
yading@10
|
754 qpel_mc[1][dxy](Y, srcY, s->linesize);
|
yading@10
|
755 Y += 8 * s->linesize;
|
yading@10
|
756 srcY += 8 * s->linesize;
|
yading@10
|
757 }
|
yading@10
|
758 is16x16 = (block_type != RV34_MB_P_8x8) && (block_type != RV34_MB_P_16x8) && (block_type != RV34_MB_P_8x16);
|
yading@10
|
759 qpel_mc[!is16x16][dxy](Y, srcY, s->linesize);
|
yading@10
|
760 chroma_mc[2-width] (U, srcU, s->uvlinesize, height*4, uvmx, uvmy);
|
yading@10
|
761 chroma_mc[2-width] (V, srcV, s->uvlinesize, height*4, uvmx, uvmy);
|
yading@10
|
762 }
|
yading@10
|
763
|
yading@10
|
764 static void rv34_mc_1mv(RV34DecContext *r, const int block_type,
|
yading@10
|
765 const int xoff, const int yoff, int mv_off,
|
yading@10
|
766 const int width, const int height, int dir)
|
yading@10
|
767 {
|
yading@10
|
768 rv34_mc(r, block_type, xoff, yoff, mv_off, width, height, dir, r->rv30, 0,
|
yading@10
|
769 r->rdsp.put_pixels_tab,
|
yading@10
|
770 r->rdsp.put_chroma_pixels_tab);
|
yading@10
|
771 }
|
yading@10
|
772
|
yading@10
|
773 static void rv4_weight(RV34DecContext *r)
|
yading@10
|
774 {
|
yading@10
|
775 r->rdsp.rv40_weight_pixels_tab[r->scaled_weight][0](r->s.dest[0],
|
yading@10
|
776 r->tmp_b_block_y[0],
|
yading@10
|
777 r->tmp_b_block_y[1],
|
yading@10
|
778 r->weight1,
|
yading@10
|
779 r->weight2,
|
yading@10
|
780 r->s.linesize);
|
yading@10
|
781 r->rdsp.rv40_weight_pixels_tab[r->scaled_weight][1](r->s.dest[1],
|
yading@10
|
782 r->tmp_b_block_uv[0],
|
yading@10
|
783 r->tmp_b_block_uv[2],
|
yading@10
|
784 r->weight1,
|
yading@10
|
785 r->weight2,
|
yading@10
|
786 r->s.uvlinesize);
|
yading@10
|
787 r->rdsp.rv40_weight_pixels_tab[r->scaled_weight][1](r->s.dest[2],
|
yading@10
|
788 r->tmp_b_block_uv[1],
|
yading@10
|
789 r->tmp_b_block_uv[3],
|
yading@10
|
790 r->weight1,
|
yading@10
|
791 r->weight2,
|
yading@10
|
792 r->s.uvlinesize);
|
yading@10
|
793 }
|
yading@10
|
794
|
yading@10
|
795 static void rv34_mc_2mv(RV34DecContext *r, const int block_type)
|
yading@10
|
796 {
|
yading@10
|
797 int weighted = !r->rv30 && block_type != RV34_MB_B_BIDIR && r->weight1 != 8192;
|
yading@10
|
798
|
yading@10
|
799 rv34_mc(r, block_type, 0, 0, 0, 2, 2, 0, r->rv30, weighted,
|
yading@10
|
800 r->rdsp.put_pixels_tab,
|
yading@10
|
801 r->rdsp.put_chroma_pixels_tab);
|
yading@10
|
802 if(!weighted){
|
yading@10
|
803 rv34_mc(r, block_type, 0, 0, 0, 2, 2, 1, r->rv30, 0,
|
yading@10
|
804 r->rdsp.avg_pixels_tab,
|
yading@10
|
805 r->rdsp.avg_chroma_pixels_tab);
|
yading@10
|
806 }else{
|
yading@10
|
807 rv34_mc(r, block_type, 0, 0, 0, 2, 2, 1, r->rv30, 1,
|
yading@10
|
808 r->rdsp.put_pixels_tab,
|
yading@10
|
809 r->rdsp.put_chroma_pixels_tab);
|
yading@10
|
810 rv4_weight(r);
|
yading@10
|
811 }
|
yading@10
|
812 }
|
yading@10
|
813
|
yading@10
|
814 static void rv34_mc_2mv_skip(RV34DecContext *r)
|
yading@10
|
815 {
|
yading@10
|
816 int i, j;
|
yading@10
|
817 int weighted = !r->rv30 && r->weight1 != 8192;
|
yading@10
|
818
|
yading@10
|
819 for(j = 0; j < 2; j++)
|
yading@10
|
820 for(i = 0; i < 2; i++){
|
yading@10
|
821 rv34_mc(r, RV34_MB_P_8x8, i*8, j*8, i+j*r->s.b8_stride, 1, 1, 0, r->rv30,
|
yading@10
|
822 weighted,
|
yading@10
|
823 r->rdsp.put_pixels_tab,
|
yading@10
|
824 r->rdsp.put_chroma_pixels_tab);
|
yading@10
|
825 rv34_mc(r, RV34_MB_P_8x8, i*8, j*8, i+j*r->s.b8_stride, 1, 1, 1, r->rv30,
|
yading@10
|
826 weighted,
|
yading@10
|
827 weighted ? r->rdsp.put_pixels_tab : r->rdsp.avg_pixels_tab,
|
yading@10
|
828 weighted ? r->rdsp.put_chroma_pixels_tab : r->rdsp.avg_chroma_pixels_tab);
|
yading@10
|
829 }
|
yading@10
|
830 if(weighted)
|
yading@10
|
831 rv4_weight(r);
|
yading@10
|
832 }
|
yading@10
|
833
|
yading@10
|
834 /** number of motion vectors in each macroblock type */
|
yading@10
|
835 static const int num_mvs[RV34_MB_TYPES] = { 0, 0, 1, 4, 1, 1, 0, 0, 2, 2, 2, 1 };
|
yading@10
|
836
|
yading@10
|
837 /**
|
yading@10
|
838 * Decode motion vector differences
|
yading@10
|
839 * and perform motion vector reconstruction and motion compensation.
|
yading@10
|
840 */
|
yading@10
|
841 static int rv34_decode_mv(RV34DecContext *r, int block_type)
|
yading@10
|
842 {
|
yading@10
|
843 MpegEncContext *s = &r->s;
|
yading@10
|
844 GetBitContext *gb = &s->gb;
|
yading@10
|
845 int i, j, k, l;
|
yading@10
|
846 int mv_pos = s->mb_x * 2 + s->mb_y * 2 * s->b8_stride;
|
yading@10
|
847 int next_bt;
|
yading@10
|
848
|
yading@10
|
849 memset(r->dmv, 0, sizeof(r->dmv));
|
yading@10
|
850 for(i = 0; i < num_mvs[block_type]; i++){
|
yading@10
|
851 r->dmv[i][0] = svq3_get_se_golomb(gb);
|
yading@10
|
852 r->dmv[i][1] = svq3_get_se_golomb(gb);
|
yading@10
|
853 }
|
yading@10
|
854 switch(block_type){
|
yading@10
|
855 case RV34_MB_TYPE_INTRA:
|
yading@10
|
856 case RV34_MB_TYPE_INTRA16x16:
|
yading@10
|
857 ZERO8x2(s->current_picture_ptr->motion_val[0][s->mb_x * 2 + s->mb_y * 2 * s->b8_stride], s->b8_stride);
|
yading@10
|
858 return 0;
|
yading@10
|
859 case RV34_MB_SKIP:
|
yading@10
|
860 if(s->pict_type == AV_PICTURE_TYPE_P){
|
yading@10
|
861 ZERO8x2(s->current_picture_ptr->motion_val[0][s->mb_x * 2 + s->mb_y * 2 * s->b8_stride], s->b8_stride);
|
yading@10
|
862 rv34_mc_1mv (r, block_type, 0, 0, 0, 2, 2, 0);
|
yading@10
|
863 break;
|
yading@10
|
864 }
|
yading@10
|
865 case RV34_MB_B_DIRECT:
|
yading@10
|
866 //surprisingly, it uses motion scheme from next reference frame
|
yading@10
|
867 /* wait for the current mb row to be finished */
|
yading@10
|
868 if (HAVE_THREADS && (s->avctx->active_thread_type & FF_THREAD_FRAME))
|
yading@10
|
869 ff_thread_await_progress(&s->next_picture_ptr->tf, FFMAX(0, s->mb_y-1), 0);
|
yading@10
|
870
|
yading@10
|
871 next_bt = s->next_picture_ptr->mb_type[s->mb_x + s->mb_y * s->mb_stride];
|
yading@10
|
872 if(IS_INTRA(next_bt) || IS_SKIP(next_bt)){
|
yading@10
|
873 ZERO8x2(s->current_picture_ptr->motion_val[0][s->mb_x * 2 + s->mb_y * 2 * s->b8_stride], s->b8_stride);
|
yading@10
|
874 ZERO8x2(s->current_picture_ptr->motion_val[1][s->mb_x * 2 + s->mb_y * 2 * s->b8_stride], s->b8_stride);
|
yading@10
|
875 }else
|
yading@10
|
876 for(j = 0; j < 2; j++)
|
yading@10
|
877 for(i = 0; i < 2; i++)
|
yading@10
|
878 for(k = 0; k < 2; k++)
|
yading@10
|
879 for(l = 0; l < 2; l++)
|
yading@10
|
880 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]);
|
yading@10
|
881 if(!(IS_16X8(next_bt) || IS_8X16(next_bt) || IS_8X8(next_bt))) //we can use whole macroblock MC
|
yading@10
|
882 rv34_mc_2mv(r, block_type);
|
yading@10
|
883 else
|
yading@10
|
884 rv34_mc_2mv_skip(r);
|
yading@10
|
885 ZERO8x2(s->current_picture_ptr->motion_val[0][s->mb_x * 2 + s->mb_y * 2 * s->b8_stride], s->b8_stride);
|
yading@10
|
886 break;
|
yading@10
|
887 case RV34_MB_P_16x16:
|
yading@10
|
888 case RV34_MB_P_MIX16x16:
|
yading@10
|
889 rv34_pred_mv(r, block_type, 0, 0);
|
yading@10
|
890 rv34_mc_1mv (r, block_type, 0, 0, 0, 2, 2, 0);
|
yading@10
|
891 break;
|
yading@10
|
892 case RV34_MB_B_FORWARD:
|
yading@10
|
893 case RV34_MB_B_BACKWARD:
|
yading@10
|
894 r->dmv[1][0] = r->dmv[0][0];
|
yading@10
|
895 r->dmv[1][1] = r->dmv[0][1];
|
yading@10
|
896 if(r->rv30)
|
yading@10
|
897 rv34_pred_mv_rv3(r, block_type, block_type == RV34_MB_B_BACKWARD);
|
yading@10
|
898 else
|
yading@10
|
899 rv34_pred_mv_b (r, block_type, block_type == RV34_MB_B_BACKWARD);
|
yading@10
|
900 rv34_mc_1mv (r, block_type, 0, 0, 0, 2, 2, block_type == RV34_MB_B_BACKWARD);
|
yading@10
|
901 break;
|
yading@10
|
902 case RV34_MB_P_16x8:
|
yading@10
|
903 case RV34_MB_P_8x16:
|
yading@10
|
904 rv34_pred_mv(r, block_type, 0, 0);
|
yading@10
|
905 rv34_pred_mv(r, block_type, 1 + (block_type == RV34_MB_P_16x8), 1);
|
yading@10
|
906 if(block_type == RV34_MB_P_16x8){
|
yading@10
|
907 rv34_mc_1mv(r, block_type, 0, 0, 0, 2, 1, 0);
|
yading@10
|
908 rv34_mc_1mv(r, block_type, 0, 8, s->b8_stride, 2, 1, 0);
|
yading@10
|
909 }
|
yading@10
|
910 if(block_type == RV34_MB_P_8x16){
|
yading@10
|
911 rv34_mc_1mv(r, block_type, 0, 0, 0, 1, 2, 0);
|
yading@10
|
912 rv34_mc_1mv(r, block_type, 8, 0, 1, 1, 2, 0);
|
yading@10
|
913 }
|
yading@10
|
914 break;
|
yading@10
|
915 case RV34_MB_B_BIDIR:
|
yading@10
|
916 rv34_pred_mv_b (r, block_type, 0);
|
yading@10
|
917 rv34_pred_mv_b (r, block_type, 1);
|
yading@10
|
918 rv34_mc_2mv (r, block_type);
|
yading@10
|
919 break;
|
yading@10
|
920 case RV34_MB_P_8x8:
|
yading@10
|
921 for(i=0;i< 4;i++){
|
yading@10
|
922 rv34_pred_mv(r, block_type, i, i);
|
yading@10
|
923 rv34_mc_1mv (r, block_type, (i&1)<<3, (i&2)<<2, (i&1)+(i>>1)*s->b8_stride, 1, 1, 0);
|
yading@10
|
924 }
|
yading@10
|
925 break;
|
yading@10
|
926 }
|
yading@10
|
927
|
yading@10
|
928 return 0;
|
yading@10
|
929 }
|
yading@10
|
930 /** @} */ // mv group
|
yading@10
|
931
|
yading@10
|
932 /**
|
yading@10
|
933 * @name Macroblock reconstruction functions
|
yading@10
|
934 * @{
|
yading@10
|
935 */
|
yading@10
|
936 /** mapping of RV30/40 intra prediction types to standard H.264 types */
|
yading@10
|
937 static const int ittrans[9] = {
|
yading@10
|
938 DC_PRED, VERT_PRED, HOR_PRED, DIAG_DOWN_RIGHT_PRED, DIAG_DOWN_LEFT_PRED,
|
yading@10
|
939 VERT_RIGHT_PRED, VERT_LEFT_PRED, HOR_UP_PRED, HOR_DOWN_PRED,
|
yading@10
|
940 };
|
yading@10
|
941
|
yading@10
|
942 /** mapping of RV30/40 intra 16x16 prediction types to standard H.264 types */
|
yading@10
|
943 static const int ittrans16[4] = {
|
yading@10
|
944 DC_PRED8x8, VERT_PRED8x8, HOR_PRED8x8, PLANE_PRED8x8,
|
yading@10
|
945 };
|
yading@10
|
946
|
yading@10
|
947 /**
|
yading@10
|
948 * Perform 4x4 intra prediction.
|
yading@10
|
949 */
|
yading@10
|
950 static void rv34_pred_4x4_block(RV34DecContext *r, uint8_t *dst, int stride, int itype, int up, int left, int down, int right)
|
yading@10
|
951 {
|
yading@10
|
952 uint8_t *prev = dst - stride + 4;
|
yading@10
|
953 uint32_t topleft;
|
yading@10
|
954
|
yading@10
|
955 if(!up && !left)
|
yading@10
|
956 itype = DC_128_PRED;
|
yading@10
|
957 else if(!up){
|
yading@10
|
958 if(itype == VERT_PRED) itype = HOR_PRED;
|
yading@10
|
959 if(itype == DC_PRED) itype = LEFT_DC_PRED;
|
yading@10
|
960 }else if(!left){
|
yading@10
|
961 if(itype == HOR_PRED) itype = VERT_PRED;
|
yading@10
|
962 if(itype == DC_PRED) itype = TOP_DC_PRED;
|
yading@10
|
963 if(itype == DIAG_DOWN_LEFT_PRED) itype = DIAG_DOWN_LEFT_PRED_RV40_NODOWN;
|
yading@10
|
964 }
|
yading@10
|
965 if(!down){
|
yading@10
|
966 if(itype == DIAG_DOWN_LEFT_PRED) itype = DIAG_DOWN_LEFT_PRED_RV40_NODOWN;
|
yading@10
|
967 if(itype == HOR_UP_PRED) itype = HOR_UP_PRED_RV40_NODOWN;
|
yading@10
|
968 if(itype == VERT_LEFT_PRED) itype = VERT_LEFT_PRED_RV40_NODOWN;
|
yading@10
|
969 }
|
yading@10
|
970 if(!right && up){
|
yading@10
|
971 topleft = dst[-stride + 3] * 0x01010101u;
|
yading@10
|
972 prev = (uint8_t*)&topleft;
|
yading@10
|
973 }
|
yading@10
|
974 r->h.pred4x4[itype](dst, prev, stride);
|
yading@10
|
975 }
|
yading@10
|
976
|
yading@10
|
977 static inline int adjust_pred16(int itype, int up, int left)
|
yading@10
|
978 {
|
yading@10
|
979 if(!up && !left)
|
yading@10
|
980 itype = DC_128_PRED8x8;
|
yading@10
|
981 else if(!up){
|
yading@10
|
982 if(itype == PLANE_PRED8x8)itype = HOR_PRED8x8;
|
yading@10
|
983 if(itype == VERT_PRED8x8) itype = HOR_PRED8x8;
|
yading@10
|
984 if(itype == DC_PRED8x8) itype = LEFT_DC_PRED8x8;
|
yading@10
|
985 }else if(!left){
|
yading@10
|
986 if(itype == PLANE_PRED8x8)itype = VERT_PRED8x8;
|
yading@10
|
987 if(itype == HOR_PRED8x8) itype = VERT_PRED8x8;
|
yading@10
|
988 if(itype == DC_PRED8x8) itype = TOP_DC_PRED8x8;
|
yading@10
|
989 }
|
yading@10
|
990 return itype;
|
yading@10
|
991 }
|
yading@10
|
992
|
yading@10
|
993 static inline void rv34_process_block(RV34DecContext *r,
|
yading@10
|
994 uint8_t *pdst, int stride,
|
yading@10
|
995 int fc, int sc, int q_dc, int q_ac)
|
yading@10
|
996 {
|
yading@10
|
997 MpegEncContext *s = &r->s;
|
yading@10
|
998 int16_t *ptr = s->block[0];
|
yading@10
|
999 int has_ac = rv34_decode_block(ptr, &s->gb, r->cur_vlcs,
|
yading@10
|
1000 fc, sc, q_dc, q_ac, q_ac);
|
yading@10
|
1001 if(has_ac){
|
yading@10
|
1002 r->rdsp.rv34_idct_add(pdst, stride, ptr);
|
yading@10
|
1003 }else{
|
yading@10
|
1004 r->rdsp.rv34_idct_dc_add(pdst, stride, ptr[0]);
|
yading@10
|
1005 ptr[0] = 0;
|
yading@10
|
1006 }
|
yading@10
|
1007 }
|
yading@10
|
1008
|
yading@10
|
1009 static void rv34_output_i16x16(RV34DecContext *r, int8_t *intra_types, int cbp)
|
yading@10
|
1010 {
|
yading@10
|
1011 LOCAL_ALIGNED_16(int16_t, block16, [16]);
|
yading@10
|
1012 MpegEncContext *s = &r->s;
|
yading@10
|
1013 GetBitContext *gb = &s->gb;
|
yading@10
|
1014 int q_dc = rv34_qscale_tab[ r->luma_dc_quant_i[s->qscale] ],
|
yading@10
|
1015 q_ac = rv34_qscale_tab[s->qscale];
|
yading@10
|
1016 uint8_t *dst = s->dest[0];
|
yading@10
|
1017 int16_t *ptr = s->block[0];
|
yading@10
|
1018 int i, j, itype, has_ac;
|
yading@10
|
1019
|
yading@10
|
1020 memset(block16, 0, 16 * sizeof(*block16));
|
yading@10
|
1021
|
yading@10
|
1022 has_ac = rv34_decode_block(block16, gb, r->cur_vlcs, 3, 0, q_dc, q_dc, q_ac);
|
yading@10
|
1023 if(has_ac)
|
yading@10
|
1024 r->rdsp.rv34_inv_transform(block16);
|
yading@10
|
1025 else
|
yading@10
|
1026 r->rdsp.rv34_inv_transform_dc(block16);
|
yading@10
|
1027
|
yading@10
|
1028 itype = ittrans16[intra_types[0]];
|
yading@10
|
1029 itype = adjust_pred16(itype, r->avail_cache[6-4], r->avail_cache[6-1]);
|
yading@10
|
1030 r->h.pred16x16[itype](dst, s->linesize);
|
yading@10
|
1031
|
yading@10
|
1032 for(j = 0; j < 4; j++){
|
yading@10
|
1033 for(i = 0; i < 4; i++, cbp >>= 1){
|
yading@10
|
1034 int dc = block16[i + j*4];
|
yading@10
|
1035
|
yading@10
|
1036 if(cbp & 1){
|
yading@10
|
1037 has_ac = rv34_decode_block(ptr, gb, r->cur_vlcs, r->luma_vlc, 0, q_ac, q_ac, q_ac);
|
yading@10
|
1038 }else
|
yading@10
|
1039 has_ac = 0;
|
yading@10
|
1040
|
yading@10
|
1041 if(has_ac){
|
yading@10
|
1042 ptr[0] = dc;
|
yading@10
|
1043 r->rdsp.rv34_idct_add(dst+4*i, s->linesize, ptr);
|
yading@10
|
1044 }else
|
yading@10
|
1045 r->rdsp.rv34_idct_dc_add(dst+4*i, s->linesize, dc);
|
yading@10
|
1046 }
|
yading@10
|
1047
|
yading@10
|
1048 dst += 4*s->linesize;
|
yading@10
|
1049 }
|
yading@10
|
1050
|
yading@10
|
1051 itype = ittrans16[intra_types[0]];
|
yading@10
|
1052 if(itype == PLANE_PRED8x8) itype = DC_PRED8x8;
|
yading@10
|
1053 itype = adjust_pred16(itype, r->avail_cache[6-4], r->avail_cache[6-1]);
|
yading@10
|
1054
|
yading@10
|
1055 q_dc = rv34_qscale_tab[rv34_chroma_quant[1][s->qscale]];
|
yading@10
|
1056 q_ac = rv34_qscale_tab[rv34_chroma_quant[0][s->qscale]];
|
yading@10
|
1057
|
yading@10
|
1058 for(j = 1; j < 3; j++){
|
yading@10
|
1059 dst = s->dest[j];
|
yading@10
|
1060 r->h.pred8x8[itype](dst, s->uvlinesize);
|
yading@10
|
1061 for(i = 0; i < 4; i++, cbp >>= 1){
|
yading@10
|
1062 uint8_t *pdst;
|
yading@10
|
1063 if(!(cbp & 1)) continue;
|
yading@10
|
1064 pdst = dst + (i&1)*4 + (i&2)*2*s->uvlinesize;
|
yading@10
|
1065
|
yading@10
|
1066 rv34_process_block(r, pdst, s->uvlinesize,
|
yading@10
|
1067 r->chroma_vlc, 1, q_dc, q_ac);
|
yading@10
|
1068 }
|
yading@10
|
1069 }
|
yading@10
|
1070 }
|
yading@10
|
1071
|
yading@10
|
1072 static void rv34_output_intra(RV34DecContext *r, int8_t *intra_types, int cbp)
|
yading@10
|
1073 {
|
yading@10
|
1074 MpegEncContext *s = &r->s;
|
yading@10
|
1075 uint8_t *dst = s->dest[0];
|
yading@10
|
1076 int avail[6*8] = {0};
|
yading@10
|
1077 int i, j, k;
|
yading@10
|
1078 int idx, q_ac, q_dc;
|
yading@10
|
1079
|
yading@10
|
1080 // Set neighbour information.
|
yading@10
|
1081 if(r->avail_cache[1])
|
yading@10
|
1082 avail[0] = 1;
|
yading@10
|
1083 if(r->avail_cache[2])
|
yading@10
|
1084 avail[1] = avail[2] = 1;
|
yading@10
|
1085 if(r->avail_cache[3])
|
yading@10
|
1086 avail[3] = avail[4] = 1;
|
yading@10
|
1087 if(r->avail_cache[4])
|
yading@10
|
1088 avail[5] = 1;
|
yading@10
|
1089 if(r->avail_cache[5])
|
yading@10
|
1090 avail[8] = avail[16] = 1;
|
yading@10
|
1091 if(r->avail_cache[9])
|
yading@10
|
1092 avail[24] = avail[32] = 1;
|
yading@10
|
1093
|
yading@10
|
1094 q_ac = rv34_qscale_tab[s->qscale];
|
yading@10
|
1095 for(j = 0; j < 4; j++){
|
yading@10
|
1096 idx = 9 + j*8;
|
yading@10
|
1097 for(i = 0; i < 4; i++, cbp >>= 1, dst += 4, idx++){
|
yading@10
|
1098 rv34_pred_4x4_block(r, dst, s->linesize, ittrans[intra_types[i]], avail[idx-8], avail[idx-1], avail[idx+7], avail[idx-7]);
|
yading@10
|
1099 avail[idx] = 1;
|
yading@10
|
1100 if(!(cbp & 1)) continue;
|
yading@10
|
1101
|
yading@10
|
1102 rv34_process_block(r, dst, s->linesize,
|
yading@10
|
1103 r->luma_vlc, 0, q_ac, q_ac);
|
yading@10
|
1104 }
|
yading@10
|
1105 dst += s->linesize * 4 - 4*4;
|
yading@10
|
1106 intra_types += r->intra_types_stride;
|
yading@10
|
1107 }
|
yading@10
|
1108
|
yading@10
|
1109 intra_types -= r->intra_types_stride * 4;
|
yading@10
|
1110
|
yading@10
|
1111 q_dc = rv34_qscale_tab[rv34_chroma_quant[1][s->qscale]];
|
yading@10
|
1112 q_ac = rv34_qscale_tab[rv34_chroma_quant[0][s->qscale]];
|
yading@10
|
1113
|
yading@10
|
1114 for(k = 0; k < 2; k++){
|
yading@10
|
1115 dst = s->dest[1+k];
|
yading@10
|
1116 fill_rectangle(r->avail_cache + 6, 2, 2, 4, 0, 4);
|
yading@10
|
1117
|
yading@10
|
1118 for(j = 0; j < 2; j++){
|
yading@10
|
1119 int* acache = r->avail_cache + 6 + j*4;
|
yading@10
|
1120 for(i = 0; i < 2; i++, cbp >>= 1, acache++){
|
yading@10
|
1121 int itype = ittrans[intra_types[i*2+j*2*r->intra_types_stride]];
|
yading@10
|
1122 rv34_pred_4x4_block(r, dst+4*i, s->uvlinesize, itype, acache[-4], acache[-1], !i && !j, acache[-3]);
|
yading@10
|
1123 acache[0] = 1;
|
yading@10
|
1124
|
yading@10
|
1125 if(!(cbp&1)) continue;
|
yading@10
|
1126
|
yading@10
|
1127 rv34_process_block(r, dst + 4*i, s->uvlinesize,
|
yading@10
|
1128 r->chroma_vlc, 1, q_dc, q_ac);
|
yading@10
|
1129 }
|
yading@10
|
1130
|
yading@10
|
1131 dst += 4*s->uvlinesize;
|
yading@10
|
1132 }
|
yading@10
|
1133 }
|
yading@10
|
1134 }
|
yading@10
|
1135
|
yading@10
|
1136 static int is_mv_diff_gt_3(int16_t (*motion_val)[2], int step)
|
yading@10
|
1137 {
|
yading@10
|
1138 int d;
|
yading@10
|
1139 d = motion_val[0][0] - motion_val[-step][0];
|
yading@10
|
1140 if(d < -3 || d > 3)
|
yading@10
|
1141 return 1;
|
yading@10
|
1142 d = motion_val[0][1] - motion_val[-step][1];
|
yading@10
|
1143 if(d < -3 || d > 3)
|
yading@10
|
1144 return 1;
|
yading@10
|
1145 return 0;
|
yading@10
|
1146 }
|
yading@10
|
1147
|
yading@10
|
1148 static int rv34_set_deblock_coef(RV34DecContext *r)
|
yading@10
|
1149 {
|
yading@10
|
1150 MpegEncContext *s = &r->s;
|
yading@10
|
1151 int hmvmask = 0, vmvmask = 0, i, j;
|
yading@10
|
1152 int midx = s->mb_x * 2 + s->mb_y * 2 * s->b8_stride;
|
yading@10
|
1153 int16_t (*motion_val)[2] = &s->current_picture_ptr->motion_val[0][midx];
|
yading@10
|
1154 for(j = 0; j < 16; j += 8){
|
yading@10
|
1155 for(i = 0; i < 2; i++){
|
yading@10
|
1156 if(is_mv_diff_gt_3(motion_val + i, 1))
|
yading@10
|
1157 vmvmask |= 0x11 << (j + i*2);
|
yading@10
|
1158 if((j || s->mb_y) && is_mv_diff_gt_3(motion_val + i, s->b8_stride))
|
yading@10
|
1159 hmvmask |= 0x03 << (j + i*2);
|
yading@10
|
1160 }
|
yading@10
|
1161 motion_val += s->b8_stride;
|
yading@10
|
1162 }
|
yading@10
|
1163 if(s->first_slice_line)
|
yading@10
|
1164 hmvmask &= ~0x000F;
|
yading@10
|
1165 if(!s->mb_x)
|
yading@10
|
1166 vmvmask &= ~0x1111;
|
yading@10
|
1167 if(r->rv30){ //RV30 marks both subblocks on the edge for filtering
|
yading@10
|
1168 vmvmask |= (vmvmask & 0x4444) >> 1;
|
yading@10
|
1169 hmvmask |= (hmvmask & 0x0F00) >> 4;
|
yading@10
|
1170 if(s->mb_x)
|
yading@10
|
1171 r->deblock_coefs[s->mb_x - 1 + s->mb_y*s->mb_stride] |= (vmvmask & 0x1111) << 3;
|
yading@10
|
1172 if(!s->first_slice_line)
|
yading@10
|
1173 r->deblock_coefs[s->mb_x + (s->mb_y - 1)*s->mb_stride] |= (hmvmask & 0xF) << 12;
|
yading@10
|
1174 }
|
yading@10
|
1175 return hmvmask | vmvmask;
|
yading@10
|
1176 }
|
yading@10
|
1177
|
yading@10
|
1178 static int rv34_decode_inter_macroblock(RV34DecContext *r, int8_t *intra_types)
|
yading@10
|
1179 {
|
yading@10
|
1180 MpegEncContext *s = &r->s;
|
yading@10
|
1181 GetBitContext *gb = &s->gb;
|
yading@10
|
1182 uint8_t *dst = s->dest[0];
|
yading@10
|
1183 int16_t *ptr = s->block[0];
|
yading@10
|
1184 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
|
yading@10
|
1185 int cbp, cbp2;
|
yading@10
|
1186 int q_dc, q_ac, has_ac;
|
yading@10
|
1187 int i, j;
|
yading@10
|
1188 int dist;
|
yading@10
|
1189
|
yading@10
|
1190 // Calculate which neighbours are available. Maybe it's worth optimizing too.
|
yading@10
|
1191 memset(r->avail_cache, 0, sizeof(r->avail_cache));
|
yading@10
|
1192 fill_rectangle(r->avail_cache + 6, 2, 2, 4, 1, 4);
|
yading@10
|
1193 dist = (s->mb_x - s->resync_mb_x) + (s->mb_y - s->resync_mb_y) * s->mb_width;
|
yading@10
|
1194 if(s->mb_x && dist)
|
yading@10
|
1195 r->avail_cache[5] =
|
yading@10
|
1196 r->avail_cache[9] = s->current_picture_ptr->mb_type[mb_pos - 1];
|
yading@10
|
1197 if(dist >= s->mb_width)
|
yading@10
|
1198 r->avail_cache[2] =
|
yading@10
|
1199 r->avail_cache[3] = s->current_picture_ptr->mb_type[mb_pos - s->mb_stride];
|
yading@10
|
1200 if(((s->mb_x+1) < s->mb_width) && dist >= s->mb_width - 1)
|
yading@10
|
1201 r->avail_cache[4] = s->current_picture_ptr->mb_type[mb_pos - s->mb_stride + 1];
|
yading@10
|
1202 if(s->mb_x && dist > s->mb_width)
|
yading@10
|
1203 r->avail_cache[1] = s->current_picture_ptr->mb_type[mb_pos - s->mb_stride - 1];
|
yading@10
|
1204
|
yading@10
|
1205 s->qscale = r->si.quant;
|
yading@10
|
1206 cbp = cbp2 = rv34_decode_inter_mb_header(r, intra_types);
|
yading@10
|
1207 r->cbp_luma [mb_pos] = cbp;
|
yading@10
|
1208 r->cbp_chroma[mb_pos] = cbp >> 16;
|
yading@10
|
1209 r->deblock_coefs[mb_pos] = rv34_set_deblock_coef(r) | r->cbp_luma[mb_pos];
|
yading@10
|
1210 s->current_picture_ptr->qscale_table[mb_pos] = s->qscale;
|
yading@10
|
1211
|
yading@10
|
1212 if(cbp == -1)
|
yading@10
|
1213 return -1;
|
yading@10
|
1214
|
yading@10
|
1215 if (IS_INTRA(s->current_picture_ptr->mb_type[mb_pos])){
|
yading@10
|
1216 if(r->is16) rv34_output_i16x16(r, intra_types, cbp);
|
yading@10
|
1217 else rv34_output_intra(r, intra_types, cbp);
|
yading@10
|
1218 return 0;
|
yading@10
|
1219 }
|
yading@10
|
1220
|
yading@10
|
1221 if(r->is16){
|
yading@10
|
1222 // Only for RV34_MB_P_MIX16x16
|
yading@10
|
1223 LOCAL_ALIGNED_16(int16_t, block16, [16]);
|
yading@10
|
1224 memset(block16, 0, 16 * sizeof(*block16));
|
yading@10
|
1225 q_dc = rv34_qscale_tab[ r->luma_dc_quant_p[s->qscale] ];
|
yading@10
|
1226 q_ac = rv34_qscale_tab[s->qscale];
|
yading@10
|
1227 if (rv34_decode_block(block16, gb, r->cur_vlcs, 3, 0, q_dc, q_dc, q_ac))
|
yading@10
|
1228 r->rdsp.rv34_inv_transform(block16);
|
yading@10
|
1229 else
|
yading@10
|
1230 r->rdsp.rv34_inv_transform_dc(block16);
|
yading@10
|
1231
|
yading@10
|
1232 q_ac = rv34_qscale_tab[s->qscale];
|
yading@10
|
1233
|
yading@10
|
1234 for(j = 0; j < 4; j++){
|
yading@10
|
1235 for(i = 0; i < 4; i++, cbp >>= 1){
|
yading@10
|
1236 int dc = block16[i + j*4];
|
yading@10
|
1237
|
yading@10
|
1238 if(cbp & 1){
|
yading@10
|
1239 has_ac = rv34_decode_block(ptr, gb, r->cur_vlcs, r->luma_vlc, 0, q_ac, q_ac, q_ac);
|
yading@10
|
1240 }else
|
yading@10
|
1241 has_ac = 0;
|
yading@10
|
1242
|
yading@10
|
1243 if(has_ac){
|
yading@10
|
1244 ptr[0] = dc;
|
yading@10
|
1245 r->rdsp.rv34_idct_add(dst+4*i, s->linesize, ptr);
|
yading@10
|
1246 }else
|
yading@10
|
1247 r->rdsp.rv34_idct_dc_add(dst+4*i, s->linesize, dc);
|
yading@10
|
1248 }
|
yading@10
|
1249
|
yading@10
|
1250 dst += 4*s->linesize;
|
yading@10
|
1251 }
|
yading@10
|
1252
|
yading@10
|
1253 r->cur_vlcs = choose_vlc_set(r->si.quant, r->si.vlc_set, 1);
|
yading@10
|
1254 }else{
|
yading@10
|
1255 q_ac = rv34_qscale_tab[s->qscale];
|
yading@10
|
1256
|
yading@10
|
1257 for(j = 0; j < 4; j++){
|
yading@10
|
1258 for(i = 0; i < 4; i++, cbp >>= 1){
|
yading@10
|
1259 if(!(cbp & 1)) continue;
|
yading@10
|
1260
|
yading@10
|
1261 rv34_process_block(r, dst + 4*i, s->linesize,
|
yading@10
|
1262 r->luma_vlc, 0, q_ac, q_ac);
|
yading@10
|
1263 }
|
yading@10
|
1264 dst += 4*s->linesize;
|
yading@10
|
1265 }
|
yading@10
|
1266 }
|
yading@10
|
1267
|
yading@10
|
1268 q_dc = rv34_qscale_tab[rv34_chroma_quant[1][s->qscale]];
|
yading@10
|
1269 q_ac = rv34_qscale_tab[rv34_chroma_quant[0][s->qscale]];
|
yading@10
|
1270
|
yading@10
|
1271 for(j = 1; j < 3; j++){
|
yading@10
|
1272 dst = s->dest[j];
|
yading@10
|
1273 for(i = 0; i < 4; i++, cbp >>= 1){
|
yading@10
|
1274 uint8_t *pdst;
|
yading@10
|
1275 if(!(cbp & 1)) continue;
|
yading@10
|
1276 pdst = dst + (i&1)*4 + (i&2)*2*s->uvlinesize;
|
yading@10
|
1277
|
yading@10
|
1278 rv34_process_block(r, pdst, s->uvlinesize,
|
yading@10
|
1279 r->chroma_vlc, 1, q_dc, q_ac);
|
yading@10
|
1280 }
|
yading@10
|
1281 }
|
yading@10
|
1282
|
yading@10
|
1283 return 0;
|
yading@10
|
1284 }
|
yading@10
|
1285
|
yading@10
|
1286 static int rv34_decode_intra_macroblock(RV34DecContext *r, int8_t *intra_types)
|
yading@10
|
1287 {
|
yading@10
|
1288 MpegEncContext *s = &r->s;
|
yading@10
|
1289 int cbp, dist;
|
yading@10
|
1290 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
|
yading@10
|
1291
|
yading@10
|
1292 // Calculate which neighbours are available. Maybe it's worth optimizing too.
|
yading@10
|
1293 memset(r->avail_cache, 0, sizeof(r->avail_cache));
|
yading@10
|
1294 fill_rectangle(r->avail_cache + 6, 2, 2, 4, 1, 4);
|
yading@10
|
1295 dist = (s->mb_x - s->resync_mb_x) + (s->mb_y - s->resync_mb_y) * s->mb_width;
|
yading@10
|
1296 if(s->mb_x && dist)
|
yading@10
|
1297 r->avail_cache[5] =
|
yading@10
|
1298 r->avail_cache[9] = s->current_picture_ptr->mb_type[mb_pos - 1];
|
yading@10
|
1299 if(dist >= s->mb_width)
|
yading@10
|
1300 r->avail_cache[2] =
|
yading@10
|
1301 r->avail_cache[3] = s->current_picture_ptr->mb_type[mb_pos - s->mb_stride];
|
yading@10
|
1302 if(((s->mb_x+1) < s->mb_width) && dist >= s->mb_width - 1)
|
yading@10
|
1303 r->avail_cache[4] = s->current_picture_ptr->mb_type[mb_pos - s->mb_stride + 1];
|
yading@10
|
1304 if(s->mb_x && dist > s->mb_width)
|
yading@10
|
1305 r->avail_cache[1] = s->current_picture_ptr->mb_type[mb_pos - s->mb_stride - 1];
|
yading@10
|
1306
|
yading@10
|
1307 s->qscale = r->si.quant;
|
yading@10
|
1308 cbp = rv34_decode_intra_mb_header(r, intra_types);
|
yading@10
|
1309 r->cbp_luma [mb_pos] = cbp;
|
yading@10
|
1310 r->cbp_chroma[mb_pos] = cbp >> 16;
|
yading@10
|
1311 r->deblock_coefs[mb_pos] = 0xFFFF;
|
yading@10
|
1312 s->current_picture_ptr->qscale_table[mb_pos] = s->qscale;
|
yading@10
|
1313
|
yading@10
|
1314 if(cbp == -1)
|
yading@10
|
1315 return -1;
|
yading@10
|
1316
|
yading@10
|
1317 if(r->is16){
|
yading@10
|
1318 rv34_output_i16x16(r, intra_types, cbp);
|
yading@10
|
1319 return 0;
|
yading@10
|
1320 }
|
yading@10
|
1321
|
yading@10
|
1322 rv34_output_intra(r, intra_types, cbp);
|
yading@10
|
1323 return 0;
|
yading@10
|
1324 }
|
yading@10
|
1325
|
yading@10
|
1326 static int check_slice_end(RV34DecContext *r, MpegEncContext *s)
|
yading@10
|
1327 {
|
yading@10
|
1328 int bits;
|
yading@10
|
1329 if(s->mb_y >= s->mb_height)
|
yading@10
|
1330 return 1;
|
yading@10
|
1331 if(!s->mb_num_left)
|
yading@10
|
1332 return 1;
|
yading@10
|
1333 if(r->s.mb_skip_run > 1)
|
yading@10
|
1334 return 0;
|
yading@10
|
1335 bits = get_bits_left(&s->gb);
|
yading@10
|
1336 if(bits <= 0 || (bits < 8 && !show_bits(&s->gb, bits)))
|
yading@10
|
1337 return 1;
|
yading@10
|
1338 return 0;
|
yading@10
|
1339 }
|
yading@10
|
1340
|
yading@10
|
1341
|
yading@10
|
1342 static void rv34_decoder_free(RV34DecContext *r)
|
yading@10
|
1343 {
|
yading@10
|
1344 av_freep(&r->intra_types_hist);
|
yading@10
|
1345 r->intra_types = NULL;
|
yading@10
|
1346 av_freep(&r->tmp_b_block_base);
|
yading@10
|
1347 av_freep(&r->mb_type);
|
yading@10
|
1348 av_freep(&r->cbp_luma);
|
yading@10
|
1349 av_freep(&r->cbp_chroma);
|
yading@10
|
1350 av_freep(&r->deblock_coefs);
|
yading@10
|
1351 }
|
yading@10
|
1352
|
yading@10
|
1353
|
yading@10
|
1354 static int rv34_decoder_alloc(RV34DecContext *r)
|
yading@10
|
1355 {
|
yading@10
|
1356 r->intra_types_stride = r->s.mb_width * 4 + 4;
|
yading@10
|
1357
|
yading@10
|
1358 r->cbp_chroma = av_malloc(r->s.mb_stride * r->s.mb_height *
|
yading@10
|
1359 sizeof(*r->cbp_chroma));
|
yading@10
|
1360 r->cbp_luma = av_malloc(r->s.mb_stride * r->s.mb_height *
|
yading@10
|
1361 sizeof(*r->cbp_luma));
|
yading@10
|
1362 r->deblock_coefs = av_malloc(r->s.mb_stride * r->s.mb_height *
|
yading@10
|
1363 sizeof(*r->deblock_coefs));
|
yading@10
|
1364 r->intra_types_hist = av_malloc(r->intra_types_stride * 4 * 2 *
|
yading@10
|
1365 sizeof(*r->intra_types_hist));
|
yading@10
|
1366 r->mb_type = av_mallocz(r->s.mb_stride * r->s.mb_height *
|
yading@10
|
1367 sizeof(*r->mb_type));
|
yading@10
|
1368
|
yading@10
|
1369 if (!(r->cbp_chroma && r->cbp_luma && r->deblock_coefs &&
|
yading@10
|
1370 r->intra_types_hist && r->mb_type)) {
|
yading@10
|
1371 rv34_decoder_free(r);
|
yading@10
|
1372 return AVERROR(ENOMEM);
|
yading@10
|
1373 }
|
yading@10
|
1374
|
yading@10
|
1375 r->intra_types = r->intra_types_hist + r->intra_types_stride * 4;
|
yading@10
|
1376
|
yading@10
|
1377 return 0;
|
yading@10
|
1378 }
|
yading@10
|
1379
|
yading@10
|
1380
|
yading@10
|
1381 static int rv34_decoder_realloc(RV34DecContext *r)
|
yading@10
|
1382 {
|
yading@10
|
1383 rv34_decoder_free(r);
|
yading@10
|
1384 return rv34_decoder_alloc(r);
|
yading@10
|
1385 }
|
yading@10
|
1386
|
yading@10
|
1387
|
yading@10
|
1388 static int rv34_decode_slice(RV34DecContext *r, int end, const uint8_t* buf, int buf_size)
|
yading@10
|
1389 {
|
yading@10
|
1390 MpegEncContext *s = &r->s;
|
yading@10
|
1391 GetBitContext *gb = &s->gb;
|
yading@10
|
1392 int mb_pos, slice_type;
|
yading@10
|
1393 int res;
|
yading@10
|
1394
|
yading@10
|
1395 init_get_bits(&r->s.gb, buf, buf_size*8);
|
yading@10
|
1396 res = r->parse_slice_header(r, gb, &r->si);
|
yading@10
|
1397 if(res < 0){
|
yading@10
|
1398 av_log(s->avctx, AV_LOG_ERROR, "Incorrect or unknown slice header\n");
|
yading@10
|
1399 return -1;
|
yading@10
|
1400 }
|
yading@10
|
1401
|
yading@10
|
1402 slice_type = r->si.type ? r->si.type : AV_PICTURE_TYPE_I;
|
yading@10
|
1403 if (slice_type != s->pict_type) {
|
yading@10
|
1404 av_log(s->avctx, AV_LOG_ERROR, "Slice type mismatch\n");
|
yading@10
|
1405 return AVERROR_INVALIDDATA;
|
yading@10
|
1406 }
|
yading@10
|
1407 if (s->width != r->si.width || s->height != r->si.height) {
|
yading@10
|
1408 av_log(s->avctx, AV_LOG_ERROR, "Size mismatch\n");
|
yading@10
|
1409 return AVERROR_INVALIDDATA;
|
yading@10
|
1410 }
|
yading@10
|
1411
|
yading@10
|
1412 r->si.end = end;
|
yading@10
|
1413 s->qscale = r->si.quant;
|
yading@10
|
1414 s->mb_num_left = r->si.end - r->si.start;
|
yading@10
|
1415 r->s.mb_skip_run = 0;
|
yading@10
|
1416
|
yading@10
|
1417 mb_pos = s->mb_x + s->mb_y * s->mb_width;
|
yading@10
|
1418 if(r->si.start != mb_pos){
|
yading@10
|
1419 av_log(s->avctx, AV_LOG_ERROR, "Slice indicates MB offset %d, got %d\n", r->si.start, mb_pos);
|
yading@10
|
1420 s->mb_x = r->si.start % s->mb_width;
|
yading@10
|
1421 s->mb_y = r->si.start / s->mb_width;
|
yading@10
|
1422 }
|
yading@10
|
1423 memset(r->intra_types_hist, -1, r->intra_types_stride * 4 * 2 * sizeof(*r->intra_types_hist));
|
yading@10
|
1424 s->first_slice_line = 1;
|
yading@10
|
1425 s->resync_mb_x = s->mb_x;
|
yading@10
|
1426 s->resync_mb_y = s->mb_y;
|
yading@10
|
1427
|
yading@10
|
1428 ff_init_block_index(s);
|
yading@10
|
1429 while(!check_slice_end(r, s)) {
|
yading@10
|
1430 ff_update_block_index(s);
|
yading@10
|
1431
|
yading@10
|
1432 if(r->si.type)
|
yading@10
|
1433 res = rv34_decode_inter_macroblock(r, r->intra_types + s->mb_x * 4 + 4);
|
yading@10
|
1434 else
|
yading@10
|
1435 res = rv34_decode_intra_macroblock(r, r->intra_types + s->mb_x * 4 + 4);
|
yading@10
|
1436 if(res < 0){
|
yading@10
|
1437 ff_er_add_slice(&s->er, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, ER_MB_ERROR);
|
yading@10
|
1438 return -1;
|
yading@10
|
1439 }
|
yading@10
|
1440 if (++s->mb_x == s->mb_width) {
|
yading@10
|
1441 s->mb_x = 0;
|
yading@10
|
1442 s->mb_y++;
|
yading@10
|
1443 ff_init_block_index(s);
|
yading@10
|
1444
|
yading@10
|
1445 memmove(r->intra_types_hist, r->intra_types, r->intra_types_stride * 4 * sizeof(*r->intra_types_hist));
|
yading@10
|
1446 memset(r->intra_types, -1, r->intra_types_stride * 4 * sizeof(*r->intra_types_hist));
|
yading@10
|
1447
|
yading@10
|
1448 if(r->loop_filter && s->mb_y >= 2)
|
yading@10
|
1449 r->loop_filter(r, s->mb_y - 2);
|
yading@10
|
1450
|
yading@10
|
1451 if (HAVE_THREADS && (s->avctx->active_thread_type & FF_THREAD_FRAME))
|
yading@10
|
1452 ff_thread_report_progress(&s->current_picture_ptr->tf,
|
yading@10
|
1453 s->mb_y - 2, 0);
|
yading@10
|
1454
|
yading@10
|
1455 }
|
yading@10
|
1456 if(s->mb_x == s->resync_mb_x)
|
yading@10
|
1457 s->first_slice_line=0;
|
yading@10
|
1458 s->mb_num_left--;
|
yading@10
|
1459 }
|
yading@10
|
1460 ff_er_add_slice(&s->er, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, ER_MB_END);
|
yading@10
|
1461
|
yading@10
|
1462 return s->mb_y == s->mb_height;
|
yading@10
|
1463 }
|
yading@10
|
1464
|
yading@10
|
1465 /** @} */ // recons group end
|
yading@10
|
1466
|
yading@10
|
1467 /**
|
yading@10
|
1468 * Initialize decoder.
|
yading@10
|
1469 */
|
yading@10
|
1470 av_cold int ff_rv34_decode_init(AVCodecContext *avctx)
|
yading@10
|
1471 {
|
yading@10
|
1472 RV34DecContext *r = avctx->priv_data;
|
yading@10
|
1473 MpegEncContext *s = &r->s;
|
yading@10
|
1474 int ret;
|
yading@10
|
1475
|
yading@10
|
1476 ff_MPV_decode_defaults(s);
|
yading@10
|
1477 s->avctx = avctx;
|
yading@10
|
1478 s->out_format = FMT_H263;
|
yading@10
|
1479 s->codec_id = avctx->codec_id;
|
yading@10
|
1480
|
yading@10
|
1481 s->width = avctx->width;
|
yading@10
|
1482 s->height = avctx->height;
|
yading@10
|
1483
|
yading@10
|
1484 r->s.avctx = avctx;
|
yading@10
|
1485 avctx->flags |= CODEC_FLAG_EMU_EDGE;
|
yading@10
|
1486 r->s.flags |= CODEC_FLAG_EMU_EDGE;
|
yading@10
|
1487 avctx->pix_fmt = AV_PIX_FMT_YUV420P;
|
yading@10
|
1488 avctx->has_b_frames = 1;
|
yading@10
|
1489 s->low_delay = 0;
|
yading@10
|
1490
|
yading@10
|
1491 if ((ret = ff_MPV_common_init(s)) < 0)
|
yading@10
|
1492 return ret;
|
yading@10
|
1493
|
yading@10
|
1494 ff_h264_pred_init(&r->h, AV_CODEC_ID_RV40, 8, 1);
|
yading@10
|
1495
|
yading@10
|
1496 #if CONFIG_RV30_DECODER
|
yading@10
|
1497 if (avctx->codec_id == AV_CODEC_ID_RV30)
|
yading@10
|
1498 ff_rv30dsp_init(&r->rdsp);
|
yading@10
|
1499 #endif
|
yading@10
|
1500 #if CONFIG_RV40_DECODER
|
yading@10
|
1501 if (avctx->codec_id == AV_CODEC_ID_RV40)
|
yading@10
|
1502 ff_rv40dsp_init(&r->rdsp);
|
yading@10
|
1503 #endif
|
yading@10
|
1504
|
yading@10
|
1505 if ((ret = rv34_decoder_alloc(r)) < 0)
|
yading@10
|
1506 return ret;
|
yading@10
|
1507
|
yading@10
|
1508 if(!intra_vlcs[0].cbppattern[0].bits)
|
yading@10
|
1509 rv34_init_tables();
|
yading@10
|
1510
|
yading@10
|
1511 avctx->internal->allocate_progress = 1;
|
yading@10
|
1512
|
yading@10
|
1513 return 0;
|
yading@10
|
1514 }
|
yading@10
|
1515
|
yading@10
|
1516 int ff_rv34_decode_init_thread_copy(AVCodecContext *avctx)
|
yading@10
|
1517 {
|
yading@10
|
1518 int err;
|
yading@10
|
1519 RV34DecContext *r = avctx->priv_data;
|
yading@10
|
1520
|
yading@10
|
1521 r->s.avctx = avctx;
|
yading@10
|
1522
|
yading@10
|
1523 if (avctx->internal->is_copy) {
|
yading@10
|
1524 r->tmp_b_block_base = NULL;
|
yading@10
|
1525 if ((err = ff_MPV_common_init(&r->s)) < 0)
|
yading@10
|
1526 return err;
|
yading@10
|
1527 if ((err = rv34_decoder_alloc(r)) < 0)
|
yading@10
|
1528 return err;
|
yading@10
|
1529 }
|
yading@10
|
1530
|
yading@10
|
1531 return 0;
|
yading@10
|
1532 }
|
yading@10
|
1533
|
yading@10
|
1534 int ff_rv34_decode_update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
|
yading@10
|
1535 {
|
yading@10
|
1536 RV34DecContext *r = dst->priv_data, *r1 = src->priv_data;
|
yading@10
|
1537 MpegEncContext * const s = &r->s, * const s1 = &r1->s;
|
yading@10
|
1538 int err;
|
yading@10
|
1539
|
yading@10
|
1540 if (dst == src || !s1->context_initialized)
|
yading@10
|
1541 return 0;
|
yading@10
|
1542
|
yading@10
|
1543 if (s->height != s1->height || s->width != s1->width) {
|
yading@10
|
1544 s->height = s1->height;
|
yading@10
|
1545 s->width = s1->width;
|
yading@10
|
1546 if ((err = ff_MPV_common_frame_size_change(s)) < 0)
|
yading@10
|
1547 return err;
|
yading@10
|
1548 if ((err = rv34_decoder_realloc(r)) < 0)
|
yading@10
|
1549 return err;
|
yading@10
|
1550 }
|
yading@10
|
1551
|
yading@10
|
1552 if ((err = ff_mpeg_update_thread_context(dst, src)))
|
yading@10
|
1553 return err;
|
yading@10
|
1554
|
yading@10
|
1555 r->cur_pts = r1->cur_pts;
|
yading@10
|
1556 r->last_pts = r1->last_pts;
|
yading@10
|
1557 r->next_pts = r1->next_pts;
|
yading@10
|
1558
|
yading@10
|
1559 memset(&r->si, 0, sizeof(r->si));
|
yading@10
|
1560
|
yading@10
|
1561 return 0;
|
yading@10
|
1562 }
|
yading@10
|
1563
|
yading@10
|
1564 static int get_slice_offset(AVCodecContext *avctx, const uint8_t *buf, int n)
|
yading@10
|
1565 {
|
yading@10
|
1566 if(avctx->slice_count) return avctx->slice_offset[n];
|
yading@10
|
1567 else return AV_RL32(buf + n*8 - 4) == 1 ? AV_RL32(buf + n*8) : AV_RB32(buf + n*8);
|
yading@10
|
1568 }
|
yading@10
|
1569
|
yading@10
|
1570 static int finish_frame(AVCodecContext *avctx, AVFrame *pict)
|
yading@10
|
1571 {
|
yading@10
|
1572 RV34DecContext *r = avctx->priv_data;
|
yading@10
|
1573 MpegEncContext *s = &r->s;
|
yading@10
|
1574 int got_picture = 0, ret;
|
yading@10
|
1575
|
yading@10
|
1576 ff_er_frame_end(&s->er);
|
yading@10
|
1577 ff_MPV_frame_end(s);
|
yading@10
|
1578 s->mb_num_left = 0;
|
yading@10
|
1579
|
yading@10
|
1580 if (HAVE_THREADS && (s->avctx->active_thread_type & FF_THREAD_FRAME))
|
yading@10
|
1581 ff_thread_report_progress(&s->current_picture_ptr->tf, INT_MAX, 0);
|
yading@10
|
1582
|
yading@10
|
1583 if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) {
|
yading@10
|
1584 if ((ret = av_frame_ref(pict, &s->current_picture_ptr->f)) < 0)
|
yading@10
|
1585 return ret;
|
yading@10
|
1586 ff_print_debug_info(s, s->current_picture_ptr, pict);
|
yading@10
|
1587 ff_mpv_export_qp_table(s, pict, s->current_picture_ptr, FF_QSCALE_TYPE_MPEG1);
|
yading@10
|
1588 got_picture = 1;
|
yading@10
|
1589 } else if (s->last_picture_ptr != NULL) {
|
yading@10
|
1590 if ((ret = av_frame_ref(pict, &s->last_picture_ptr->f)) < 0)
|
yading@10
|
1591 return ret;
|
yading@10
|
1592 ff_print_debug_info(s, s->last_picture_ptr, pict);
|
yading@10
|
1593 ff_mpv_export_qp_table(s, pict, s->last_picture_ptr, FF_QSCALE_TYPE_MPEG1);
|
yading@10
|
1594 got_picture = 1;
|
yading@10
|
1595 }
|
yading@10
|
1596
|
yading@10
|
1597 return got_picture;
|
yading@10
|
1598 }
|
yading@10
|
1599
|
yading@10
|
1600 static AVRational update_sar(int old_w, int old_h, AVRational sar, int new_w, int new_h)
|
yading@10
|
1601 {
|
yading@10
|
1602 // attempt to keep aspect during typical resolution switches
|
yading@10
|
1603 if (!sar.num)
|
yading@10
|
1604 sar = (AVRational){1, 1};
|
yading@10
|
1605
|
yading@10
|
1606 sar = av_mul_q(sar, (AVRational){new_h * old_w, new_w * old_h});
|
yading@10
|
1607 return sar;
|
yading@10
|
1608 }
|
yading@10
|
1609
|
yading@10
|
1610 int ff_rv34_decode_frame(AVCodecContext *avctx,
|
yading@10
|
1611 void *data, int *got_picture_ptr,
|
yading@10
|
1612 AVPacket *avpkt)
|
yading@10
|
1613 {
|
yading@10
|
1614 const uint8_t *buf = avpkt->data;
|
yading@10
|
1615 int buf_size = avpkt->size;
|
yading@10
|
1616 RV34DecContext *r = avctx->priv_data;
|
yading@10
|
1617 MpegEncContext *s = &r->s;
|
yading@10
|
1618 AVFrame *pict = data;
|
yading@10
|
1619 SliceInfo si;
|
yading@10
|
1620 int i, ret;
|
yading@10
|
1621 int slice_count;
|
yading@10
|
1622 const uint8_t *slices_hdr = NULL;
|
yading@10
|
1623 int last = 0;
|
yading@10
|
1624
|
yading@10
|
1625 /* no supplementary picture */
|
yading@10
|
1626 if (buf_size == 0) {
|
yading@10
|
1627 /* special case for last picture */
|
yading@10
|
1628 if (s->low_delay==0 && s->next_picture_ptr) {
|
yading@10
|
1629 if ((ret = av_frame_ref(pict, &s->next_picture_ptr->f)) < 0)
|
yading@10
|
1630 return ret;
|
yading@10
|
1631 s->next_picture_ptr = NULL;
|
yading@10
|
1632
|
yading@10
|
1633 *got_picture_ptr = 1;
|
yading@10
|
1634 }
|
yading@10
|
1635 return 0;
|
yading@10
|
1636 }
|
yading@10
|
1637
|
yading@10
|
1638 if(!avctx->slice_count){
|
yading@10
|
1639 slice_count = (*buf++) + 1;
|
yading@10
|
1640 slices_hdr = buf + 4;
|
yading@10
|
1641 buf += 8 * slice_count;
|
yading@10
|
1642 buf_size -= 1 + 8 * slice_count;
|
yading@10
|
1643 }else
|
yading@10
|
1644 slice_count = avctx->slice_count;
|
yading@10
|
1645
|
yading@10
|
1646 //parse first slice header to check whether this frame can be decoded
|
yading@10
|
1647 if(get_slice_offset(avctx, slices_hdr, 0) < 0 ||
|
yading@10
|
1648 get_slice_offset(avctx, slices_hdr, 0) > buf_size){
|
yading@10
|
1649 av_log(avctx, AV_LOG_ERROR, "Slice offset is invalid\n");
|
yading@10
|
1650 return AVERROR_INVALIDDATA;
|
yading@10
|
1651 }
|
yading@10
|
1652 init_get_bits(&s->gb, buf+get_slice_offset(avctx, slices_hdr, 0), (buf_size-get_slice_offset(avctx, slices_hdr, 0))*8);
|
yading@10
|
1653 if(r->parse_slice_header(r, &r->s.gb, &si) < 0 || si.start){
|
yading@10
|
1654 av_log(avctx, AV_LOG_ERROR, "First slice header is incorrect\n");
|
yading@10
|
1655 return AVERROR_INVALIDDATA;
|
yading@10
|
1656 }
|
yading@10
|
1657 if ((!s->last_picture_ptr || !s->last_picture_ptr->f.data[0]) &&
|
yading@10
|
1658 si.type == AV_PICTURE_TYPE_B) {
|
yading@10
|
1659 av_log(avctx, AV_LOG_ERROR, "Invalid decoder state: B-frame without "
|
yading@10
|
1660 "reference data.\n");
|
yading@10
|
1661 return AVERROR_INVALIDDATA;
|
yading@10
|
1662 }
|
yading@10
|
1663 if( (avctx->skip_frame >= AVDISCARD_NONREF && si.type==AV_PICTURE_TYPE_B)
|
yading@10
|
1664 || (avctx->skip_frame >= AVDISCARD_NONKEY && si.type!=AV_PICTURE_TYPE_I)
|
yading@10
|
1665 || avctx->skip_frame >= AVDISCARD_ALL)
|
yading@10
|
1666 return avpkt->size;
|
yading@10
|
1667
|
yading@10
|
1668 /* first slice */
|
yading@10
|
1669 if (si.start == 0) {
|
yading@10
|
1670 if (s->mb_num_left > 0) {
|
yading@10
|
1671 av_log(avctx, AV_LOG_ERROR, "New frame but still %d MB left.\n",
|
yading@10
|
1672 s->mb_num_left);
|
yading@10
|
1673 ff_er_frame_end(&s->er);
|
yading@10
|
1674 ff_MPV_frame_end(s);
|
yading@10
|
1675 }
|
yading@10
|
1676
|
yading@10
|
1677 if (s->width != si.width || s->height != si.height) {
|
yading@10
|
1678 int err;
|
yading@10
|
1679
|
yading@10
|
1680 av_log(s->avctx, AV_LOG_WARNING, "Changing dimensions to %dx%d\n",
|
yading@10
|
1681 si.width, si.height);
|
yading@10
|
1682
|
yading@10
|
1683 if (av_image_check_size(si.width, si.height, 0, s->avctx))
|
yading@10
|
1684 return AVERROR_INVALIDDATA;
|
yading@10
|
1685
|
yading@10
|
1686 s->avctx->sample_aspect_ratio = update_sar(
|
yading@10
|
1687 s->width, s->height, s->avctx->sample_aspect_ratio,
|
yading@10
|
1688 si.width, si.height);
|
yading@10
|
1689 s->width = si.width;
|
yading@10
|
1690 s->height = si.height;
|
yading@10
|
1691 avcodec_set_dimensions(s->avctx, s->width, s->height);
|
yading@10
|
1692 if ((err = ff_MPV_common_frame_size_change(s)) < 0)
|
yading@10
|
1693 return err;
|
yading@10
|
1694 if ((err = rv34_decoder_realloc(r)) < 0)
|
yading@10
|
1695 return err;
|
yading@10
|
1696 }
|
yading@10
|
1697 s->pict_type = si.type ? si.type : AV_PICTURE_TYPE_I;
|
yading@10
|
1698 if (ff_MPV_frame_start(s, s->avctx) < 0)
|
yading@10
|
1699 return -1;
|
yading@10
|
1700 ff_mpeg_er_frame_start(s);
|
yading@10
|
1701 if (!r->tmp_b_block_base) {
|
yading@10
|
1702 int i;
|
yading@10
|
1703
|
yading@10
|
1704 r->tmp_b_block_base = av_malloc(s->linesize * 48);
|
yading@10
|
1705 for (i = 0; i < 2; i++)
|
yading@10
|
1706 r->tmp_b_block_y[i] = r->tmp_b_block_base
|
yading@10
|
1707 + i * 16 * s->linesize;
|
yading@10
|
1708 for (i = 0; i < 4; i++)
|
yading@10
|
1709 r->tmp_b_block_uv[i] = r->tmp_b_block_base + 32 * s->linesize
|
yading@10
|
1710 + (i >> 1) * 8 * s->uvlinesize
|
yading@10
|
1711 + (i & 1) * 16;
|
yading@10
|
1712 }
|
yading@10
|
1713 r->cur_pts = si.pts;
|
yading@10
|
1714 if (s->pict_type != AV_PICTURE_TYPE_B) {
|
yading@10
|
1715 r->last_pts = r->next_pts;
|
yading@10
|
1716 r->next_pts = r->cur_pts;
|
yading@10
|
1717 } else {
|
yading@10
|
1718 int refdist = GET_PTS_DIFF(r->next_pts, r->last_pts);
|
yading@10
|
1719 int dist0 = GET_PTS_DIFF(r->cur_pts, r->last_pts);
|
yading@10
|
1720 int dist1 = GET_PTS_DIFF(r->next_pts, r->cur_pts);
|
yading@10
|
1721
|
yading@10
|
1722 if(!refdist){
|
yading@10
|
1723 r->mv_weight1 = r->mv_weight2 = r->weight1 = r->weight2 = 8192;
|
yading@10
|
1724 r->scaled_weight = 0;
|
yading@10
|
1725 }else{
|
yading@10
|
1726 r->mv_weight1 = (dist0 << 14) / refdist;
|
yading@10
|
1727 r->mv_weight2 = (dist1 << 14) / refdist;
|
yading@10
|
1728 if((r->mv_weight1|r->mv_weight2) & 511){
|
yading@10
|
1729 r->weight1 = r->mv_weight1;
|
yading@10
|
1730 r->weight2 = r->mv_weight2;
|
yading@10
|
1731 r->scaled_weight = 0;
|
yading@10
|
1732 }else{
|
yading@10
|
1733 r->weight1 = r->mv_weight1 >> 9;
|
yading@10
|
1734 r->weight2 = r->mv_weight2 >> 9;
|
yading@10
|
1735 r->scaled_weight = 1;
|
yading@10
|
1736 }
|
yading@10
|
1737 }
|
yading@10
|
1738 }
|
yading@10
|
1739 s->mb_x = s->mb_y = 0;
|
yading@10
|
1740 ff_thread_finish_setup(s->avctx);
|
yading@10
|
1741 } else if (HAVE_THREADS &&
|
yading@10
|
1742 (s->avctx->active_thread_type & FF_THREAD_FRAME)) {
|
yading@10
|
1743 av_log(s->avctx, AV_LOG_ERROR, "Decoder needs full frames in frame "
|
yading@10
|
1744 "multithreading mode (start MB is %d).\n", si.start);
|
yading@10
|
1745 return AVERROR_INVALIDDATA;
|
yading@10
|
1746 }
|
yading@10
|
1747
|
yading@10
|
1748 for(i = 0; i < slice_count; i++){
|
yading@10
|
1749 int offset = get_slice_offset(avctx, slices_hdr, i);
|
yading@10
|
1750 int size;
|
yading@10
|
1751 if(i+1 == slice_count)
|
yading@10
|
1752 size = buf_size - offset;
|
yading@10
|
1753 else
|
yading@10
|
1754 size = get_slice_offset(avctx, slices_hdr, i+1) - offset;
|
yading@10
|
1755
|
yading@10
|
1756 if(offset < 0 || offset > buf_size){
|
yading@10
|
1757 av_log(avctx, AV_LOG_ERROR, "Slice offset is invalid\n");
|
yading@10
|
1758 break;
|
yading@10
|
1759 }
|
yading@10
|
1760
|
yading@10
|
1761 r->si.end = s->mb_width * s->mb_height;
|
yading@10
|
1762 s->mb_num_left = r->s.mb_x + r->s.mb_y*r->s.mb_width - r->si.start;
|
yading@10
|
1763
|
yading@10
|
1764 if(i+1 < slice_count){
|
yading@10
|
1765 if (get_slice_offset(avctx, slices_hdr, i+1) < 0 ||
|
yading@10
|
1766 get_slice_offset(avctx, slices_hdr, i+1) > buf_size) {
|
yading@10
|
1767 av_log(avctx, AV_LOG_ERROR, "Slice offset is invalid\n");
|
yading@10
|
1768 break;
|
yading@10
|
1769 }
|
yading@10
|
1770 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);
|
yading@10
|
1771 if(r->parse_slice_header(r, &r->s.gb, &si) < 0){
|
yading@10
|
1772 if(i+2 < slice_count)
|
yading@10
|
1773 size = get_slice_offset(avctx, slices_hdr, i+2) - offset;
|
yading@10
|
1774 else
|
yading@10
|
1775 size = buf_size - offset;
|
yading@10
|
1776 }else
|
yading@10
|
1777 r->si.end = si.start;
|
yading@10
|
1778 }
|
yading@10
|
1779 if (size < 0 || size > buf_size - offset) {
|
yading@10
|
1780 av_log(avctx, AV_LOG_ERROR, "Slice size is invalid\n");
|
yading@10
|
1781 break;
|
yading@10
|
1782 }
|
yading@10
|
1783 last = rv34_decode_slice(r, r->si.end, buf + offset, size);
|
yading@10
|
1784 if(last)
|
yading@10
|
1785 break;
|
yading@10
|
1786 }
|
yading@10
|
1787
|
yading@10
|
1788 if (s->current_picture_ptr) {
|
yading@10
|
1789 if (last) {
|
yading@10
|
1790 if(r->loop_filter)
|
yading@10
|
1791 r->loop_filter(r, s->mb_height - 1);
|
yading@10
|
1792
|
yading@10
|
1793 ret = finish_frame(avctx, pict);
|
yading@10
|
1794 if (ret < 0)
|
yading@10
|
1795 return ret;
|
yading@10
|
1796 *got_picture_ptr = ret;
|
yading@10
|
1797 } else if (HAVE_THREADS &&
|
yading@10
|
1798 (s->avctx->active_thread_type & FF_THREAD_FRAME)) {
|
yading@10
|
1799 av_log(avctx, AV_LOG_INFO, "marking unfished frame as finished\n");
|
yading@10
|
1800 /* always mark the current frame as finished, frame-mt supports
|
yading@10
|
1801 * only complete frames */
|
yading@10
|
1802 ff_er_frame_end(&s->er);
|
yading@10
|
1803 ff_MPV_frame_end(s);
|
yading@10
|
1804 s->mb_num_left = 0;
|
yading@10
|
1805 ff_thread_report_progress(&s->current_picture_ptr->tf, INT_MAX, 0);
|
yading@10
|
1806 return AVERROR_INVALIDDATA;
|
yading@10
|
1807 }
|
yading@10
|
1808 }
|
yading@10
|
1809
|
yading@10
|
1810 return avpkt->size;
|
yading@10
|
1811 }
|
yading@10
|
1812
|
yading@10
|
1813 av_cold int ff_rv34_decode_end(AVCodecContext *avctx)
|
yading@10
|
1814 {
|
yading@10
|
1815 RV34DecContext *r = avctx->priv_data;
|
yading@10
|
1816
|
yading@10
|
1817 ff_MPV_common_end(&r->s);
|
yading@10
|
1818 rv34_decoder_free(r);
|
yading@10
|
1819
|
yading@10
|
1820 return 0;
|
yading@10
|
1821 }
|