FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/rv34.c
Date: 2026-05-02 17:52:23
Exec Total Coverage
Lines: 938 1049 89.4%
Functions: 43 46 93.5%
Branches: 546 661 82.6%

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