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