FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/svq3.c
Date: 2024-10-04 17:46:48
Exec Total Coverage
Lines: 683 831 82.2%
Functions: 18 18 100.0%
Branches: 440 567 77.6%

Line Branch Exec Source
1 /*
2 * Copyright (c) 2003 The FFmpeg Project
3 *
4 * This file is part of FFmpeg.
5 *
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21 /*
22 * How to use this decoder:
23 * SVQ3 data is transported within Apple Quicktime files. Quicktime files
24 * have stsd atoms to describe media trak properties. A stsd atom for a
25 * video trak contains 1 or more ImageDescription atoms. These atoms begin
26 * with the 4-byte length of the atom followed by the codec fourcc. Some
27 * decoders need information in this atom to operate correctly. Such
28 * is the case with SVQ3. In order to get the best use out of this decoder,
29 * the calling app must make the SVQ3 ImageDescription atom available
30 * via the AVCodecContext's extradata[_size] field:
31 *
32 * AVCodecContext.extradata = pointer to ImageDescription, first characters
33 * are expected to be 'S', 'V', 'Q', and '3', NOT the 4-byte atom length
34 * AVCodecContext.extradata_size = size of ImageDescription atom memory
35 * buffer (which will be the same as the ImageDescription atom size field
36 * from the QT file, minus 4 bytes since the length is missing)
37 *
38 * You will know you have these parameters passed correctly when the decoder
39 * correctly decodes this file:
40 * http://samples.mplayerhq.hu/V-codecs/SVQ3/Vertical400kbit.sorenson3.mov
41 */
42
43 #include <inttypes.h>
44
45 #include "libavutil/attributes.h"
46 #include "libavutil/crc.h"
47 #include "libavutil/mem.h"
48 #include "libavutil/mem_internal.h"
49
50 #include "codec_internal.h"
51 #include "decode.h"
52 #include "avcodec.h"
53 #include "mpegutils.h"
54 #include "h264data.h"
55 #include "h264dsp.h"
56 #include "h264pred.h"
57 #include "h264_parse.h"
58 #include "golomb.h"
59 #include "hpeldsp.h"
60 #include "mathops.h"
61 #include "rectangle.h"
62 #include "tpeldsp.h"
63 #include "videodsp.h"
64
65 #if CONFIG_ZLIB
66 #include <zlib.h>
67 #endif
68
69 /**
70 * @file
71 * svq3 decoder.
72 */
73
74 typedef struct SVQ3Frame {
75 AVFrame *f;
76
77 int16_t (*motion_val_buf[2])[2];
78 int16_t (*motion_val[2])[2];
79
80 uint32_t *mb_type_buf, *mb_type;
81 } SVQ3Frame;
82
83 typedef struct SVQ3Context {
84 AVCodecContext *avctx;
85
86 H264DSPContext h264dsp;
87 H264PredContext hpc;
88 HpelDSPContext hdsp;
89 TpelDSPContext tdsp;
90 VideoDSPContext vdsp;
91
92 SVQ3Frame *cur_pic;
93 SVQ3Frame *next_pic;
94 SVQ3Frame *last_pic;
95 GetBitContext gb;
96 GetBitContext gb_slice;
97 uint8_t *slice_buf;
98 unsigned slice_buf_size;
99 int halfpel_flag;
100 int thirdpel_flag;
101 int has_watermark;
102 uint32_t watermark_key;
103 int adaptive_quant;
104 int h_edge_pos;
105 int v_edge_pos;
106 int last_frame_output;
107 int slice_num;
108 int qscale;
109 int cbp;
110 int frame_num;
111 int frame_num_offset;
112 int prev_frame_num_offset;
113 int prev_frame_num;
114
115 enum AVPictureType pict_type;
116 enum AVPictureType slice_type;
117 int low_delay;
118
119 int mb_x, mb_y;
120 int mb_xy;
121 int mb_width, mb_height;
122 int mb_stride, mb_num;
123 int b_stride;
124
125 uint32_t *mb2br_xy;
126
127 int chroma_pred_mode;
128 int intra16x16_pred_mode;
129
130 int8_t intra4x4_pred_mode_cache[5 * 8];
131 int8_t (*intra4x4_pred_mode);
132
133 unsigned int top_samples_available;
134 unsigned int left_samples_available;
135
136 uint8_t *edge_emu_buffer;
137
138 DECLARE_ALIGNED(16, int16_t, mv_cache)[2][5 * 8][2];
139 DECLARE_ALIGNED(8, int8_t, ref_cache)[2][5 * 8];
140 DECLARE_ALIGNED(16, int16_t, mb)[16 * 48 * 2];
141 DECLARE_ALIGNED(16, int16_t, mb_luma_dc)[3][16 * 2];
142 DECLARE_ALIGNED(8, uint8_t, non_zero_count_cache)[15 * 8];
143 uint32_t dequant4_coeff[QP_MAX_NUM + 1][16];
144 int block_offset[2 * (16 * 3)];
145 SVQ3Frame frames[3];
146 } SVQ3Context;
147
148 #define FULLPEL_MODE 1
149 #define HALFPEL_MODE 2
150 #define THIRDPEL_MODE 3
151 #define PREDICT_MODE 4
152
153 /* dual scan (from some older H.264 draft)
154 * o-->o-->o o
155 * | /|
156 * o o o / o
157 * | / | |/ |
158 * o o o o
159 * /
160 * o-->o-->o-->o
161 */
162 static const uint8_t svq3_scan[16] = {
163 0 + 0 * 4, 1 + 0 * 4, 2 + 0 * 4, 2 + 1 * 4,
164 2 + 2 * 4, 3 + 0 * 4, 3 + 1 * 4, 3 + 2 * 4,
165 0 + 1 * 4, 0 + 2 * 4, 1 + 1 * 4, 1 + 2 * 4,
166 0 + 3 * 4, 1 + 3 * 4, 2 + 3 * 4, 3 + 3 * 4,
167 };
168
169 static const uint8_t luma_dc_zigzag_scan[16] = {
170 0 * 16 + 0 * 64, 1 * 16 + 0 * 64, 2 * 16 + 0 * 64, 0 * 16 + 2 * 64,
171 3 * 16 + 0 * 64, 0 * 16 + 1 * 64, 1 * 16 + 1 * 64, 2 * 16 + 1 * 64,
172 1 * 16 + 2 * 64, 2 * 16 + 2 * 64, 3 * 16 + 2 * 64, 0 * 16 + 3 * 64,
173 3 * 16 + 1 * 64, 1 * 16 + 3 * 64, 2 * 16 + 3 * 64, 3 * 16 + 3 * 64,
174 };
175
176 static const uint8_t svq3_pred_0[25][2] = {
177 { 0, 0 },
178 { 1, 0 }, { 0, 1 },
179 { 0, 2 }, { 1, 1 }, { 2, 0 },
180 { 3, 0 }, { 2, 1 }, { 1, 2 }, { 0, 3 },
181 { 0, 4 }, { 1, 3 }, { 2, 2 }, { 3, 1 }, { 4, 0 },
182 { 4, 1 }, { 3, 2 }, { 2, 3 }, { 1, 4 },
183 { 2, 4 }, { 3, 3 }, { 4, 2 },
184 { 4, 3 }, { 3, 4 },
185 { 4, 4 }
186 };
187
188 static const int8_t svq3_pred_1[6][6][5] = {
189 { { 2, -1, -1, -1, -1 }, { 2, 1, -1, -1, -1 }, { 1, 2, -1, -1, -1 },
190 { 2, 1, -1, -1, -1 }, { 1, 2, -1, -1, -1 }, { 1, 2, -1, -1, -1 } },
191 { { 0, 2, -1, -1, -1 }, { 0, 2, 1, 4, 3 }, { 0, 1, 2, 4, 3 },
192 { 0, 2, 1, 4, 3 }, { 2, 0, 1, 3, 4 }, { 0, 4, 2, 1, 3 } },
193 { { 2, 0, -1, -1, -1 }, { 2, 1, 0, 4, 3 }, { 1, 2, 4, 0, 3 },
194 { 2, 1, 0, 4, 3 }, { 2, 1, 4, 3, 0 }, { 1, 2, 4, 0, 3 } },
195 { { 2, 0, -1, -1, -1 }, { 2, 0, 1, 4, 3 }, { 1, 2, 0, 4, 3 },
196 { 2, 1, 0, 4, 3 }, { 2, 1, 3, 4, 0 }, { 2, 4, 1, 0, 3 } },
197 { { 0, 2, -1, -1, -1 }, { 0, 2, 1, 3, 4 }, { 1, 2, 3, 0, 4 },
198 { 2, 0, 1, 3, 4 }, { 2, 1, 3, 0, 4 }, { 2, 0, 4, 3, 1 } },
199 { { 0, 2, -1, -1, -1 }, { 0, 2, 4, 1, 3 }, { 1, 4, 2, 0, 3 },
200 { 4, 2, 0, 1, 3 }, { 2, 0, 1, 4, 3 }, { 4, 2, 1, 0, 3 } },
201 };
202
203 static const struct {
204 uint8_t run;
205 uint8_t level;
206 } svq3_dct_tables[2][16] = {
207 { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 2, 1 }, { 0, 2 }, { 3, 1 }, { 4, 1 }, { 5, 1 },
208 { 0, 3 }, { 1, 2 }, { 2, 2 }, { 6, 1 }, { 7, 1 }, { 8, 1 }, { 9, 1 }, { 0, 4 } },
209 { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 0, 2 }, { 2, 1 }, { 0, 3 }, { 0, 4 }, { 0, 5 },
210 { 3, 1 }, { 4, 1 }, { 1, 2 }, { 1, 3 }, { 0, 6 }, { 0, 7 }, { 0, 8 }, { 0, 9 } }
211 };
212
213 static const uint32_t svq3_dequant_coeff[32] = {
214 3881, 4351, 4890, 5481, 6154, 6914, 7761, 8718,
215 9781, 10987, 12339, 13828, 15523, 17435, 19561, 21873,
216 24552, 27656, 30847, 34870, 38807, 43747, 49103, 54683,
217 61694, 68745, 77615, 89113, 100253, 109366, 126635, 141533
218 };
219
220 2537 static void svq3_luma_dc_dequant_idct_c(int16_t *output, int16_t *input, int qp)
221 {
222 2537 const unsigned qmul = svq3_dequant_coeff[qp];
223 #define stride 16
224 int i;
225 int temp[16];
226 static const uint8_t x_offset[4] = { 0, 1 * stride, 4 * stride, 5 * stride };
227
228
2/2
✓ Branch 0 taken 10148 times.
✓ Branch 1 taken 2537 times.
12685 for (i = 0; i < 4; i++) {
229 10148 const int z0 = 13 * (input[4 * i + 0] + input[4 * i + 2]);
230 10148 const int z1 = 13 * (input[4 * i + 0] - input[4 * i + 2]);
231 10148 const int z2 = 7 * input[4 * i + 1] - 17 * input[4 * i + 3];
232 10148 const int z3 = 17 * input[4 * i + 1] + 7 * input[4 * i + 3];
233
234 10148 temp[4 * i + 0] = z0 + z3;
235 10148 temp[4 * i + 1] = z1 + z2;
236 10148 temp[4 * i + 2] = z1 - z2;
237 10148 temp[4 * i + 3] = z0 - z3;
238 }
239
240
2/2
✓ Branch 0 taken 10148 times.
✓ Branch 1 taken 2537 times.
12685 for (i = 0; i < 4; i++) {
241 10148 const int offset = x_offset[i];
242 10148 const int z0 = 13 * (temp[4 * 0 + i] + temp[4 * 2 + i]);
243 10148 const int z1 = 13 * (temp[4 * 0 + i] - temp[4 * 2 + i]);
244 10148 const int z2 = 7 * temp[4 * 1 + i] - 17 * temp[4 * 3 + i];
245 10148 const int z3 = 17 * temp[4 * 1 + i] + 7 * temp[4 * 3 + i];
246
247 10148 output[stride * 0 + offset] = (int)((z0 + z3) * qmul + 0x80000) >> 20;
248 10148 output[stride * 2 + offset] = (int)((z1 + z2) * qmul + 0x80000) >> 20;
249 10148 output[stride * 8 + offset] = (int)((z1 - z2) * qmul + 0x80000) >> 20;
250 10148 output[stride * 10 + offset] = (int)((z0 - z3) * qmul + 0x80000) >> 20;
251 }
252 2537 }
253 #undef stride
254
255 4017149 static void svq3_add_idct_c(uint8_t *dst, int16_t *block,
256 int stride, int qp, int dc)
257 {
258 4017149 const int qmul = svq3_dequant_coeff[qp];
259 int i;
260
261
2/2
✓ Branch 0 taken 999789 times.
✓ Branch 1 taken 3017360 times.
4017149 if (dc) {
262
2/2
✓ Branch 0 taken 26094 times.
✓ Branch 1 taken 973695 times.
999789 dc = 13 * 13 * (dc == 1 ? 1538U* block[0]
263 973695 : qmul * (block[0] >> 3) / 2);
264 999789 block[0] = 0;
265 }
266
267
2/2
✓ Branch 0 taken 16068596 times.
✓ Branch 1 taken 4017149 times.
20085745 for (i = 0; i < 4; i++) {
268 16068596 const int z0 = 13 * (block[0 + 4 * i] + block[2 + 4 * i]);
269 16068596 const int z1 = 13 * (block[0 + 4 * i] - block[2 + 4 * i]);
270 16068596 const int z2 = 7 * block[1 + 4 * i] - 17 * block[3 + 4 * i];
271 16068596 const int z3 = 17 * block[1 + 4 * i] + 7 * block[3 + 4 * i];
272
273 16068596 block[0 + 4 * i] = z0 + z3;
274 16068596 block[1 + 4 * i] = z1 + z2;
275 16068596 block[2 + 4 * i] = z1 - z2;
276 16068596 block[3 + 4 * i] = z0 - z3;
277 }
278
279
2/2
✓ Branch 0 taken 16068596 times.
✓ Branch 1 taken 4017149 times.
20085745 for (i = 0; i < 4; i++) {
280 16068596 const unsigned z0 = 13 * (block[i + 4 * 0] + block[i + 4 * 2]);
281 16068596 const unsigned z1 = 13 * (block[i + 4 * 0] - block[i + 4 * 2]);
282 16068596 const unsigned z2 = 7 * block[i + 4 * 1] - 17 * block[i + 4 * 3];
283 16068596 const unsigned z3 = 17 * block[i + 4 * 1] + 7 * block[i + 4 * 3];
284 16068596 const int rr = (dc + 0x80000u);
285
286 16068596 dst[i + stride * 0] = av_clip_uint8(dst[i + stride * 0] + ((int)((z0 + z3) * qmul + rr) >> 20));
287 16068596 dst[i + stride * 1] = av_clip_uint8(dst[i + stride * 1] + ((int)((z1 + z2) * qmul + rr) >> 20));
288 16068596 dst[i + stride * 2] = av_clip_uint8(dst[i + stride * 2] + ((int)((z1 - z2) * qmul + rr) >> 20));
289 16068596 dst[i + stride * 3] = av_clip_uint8(dst[i + stride * 3] + ((int)((z0 - z3) * qmul + rr) >> 20));
290 }
291
292 4017149 memset(block, 0, 16 * sizeof(int16_t));
293 4017149 }
294
295 3885381 static inline int svq3_decode_block(GetBitContext *gb, int16_t *block,
296 int index, const int type)
297 {
298 static const uint8_t *const scan_patterns[4] = {
299 luma_dc_zigzag_scan, ff_zigzag_scan, svq3_scan, ff_h264_chroma_dc_scan
300 };
301
302 int run, level, sign, limit;
303 unsigned vlc;
304 3885381 const int intra = 3 * type >> 2;
305 3885381 const uint8_t *const scan = scan_patterns[type];
306
307
2/2
✓ Branch 0 taken 4445853 times.
✓ Branch 1 taken 560472 times.
5006325 for (limit = (16 >> intra); index < 16; index = limit, limit += 8) {
308
2/2
✓ Branch 1 taken 5383846 times.
✓ Branch 2 taken 4445853 times.
9829699 for (; (vlc = get_interleaved_ue_golomb(gb)) != 0; index++) {
309
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5383846 times.
5383846 if ((int32_t)vlc < 0)
310 return -1;
311
312
2/2
✓ Branch 0 taken 2639412 times.
✓ Branch 1 taken 2744434 times.
5383846 sign = (vlc & 1) ? 0 : -1;
313 5383846 vlc = vlc + 1 >> 1;
314
315
2/2
✓ Branch 0 taken 249899 times.
✓ Branch 1 taken 5133947 times.
5383846 if (type == 3) {
316
2/2
✓ Branch 0 taken 169166 times.
✓ Branch 1 taken 80733 times.
249899 if (vlc < 3) {
317 169166 run = 0;
318 169166 level = vlc;
319
2/2
✓ Branch 0 taken 34238 times.
✓ Branch 1 taken 46495 times.
80733 } else if (vlc < 4) {
320 34238 run = 1;
321 34238 level = 1;
322 } else {
323 46495 run = vlc & 0x3;
324 46495 level = (vlc + 9 >> 2) - run;
325 }
326 } else {
327
2/2
✓ Branch 0 taken 5041382 times.
✓ Branch 1 taken 92565 times.
5133947 if (vlc < 16U) {
328 5041382 run = svq3_dct_tables[intra][vlc].run;
329 5041382 level = svq3_dct_tables[intra][vlc].level;
330
2/2
✓ Branch 0 taken 8627 times.
✓ Branch 1 taken 83938 times.
92565 } else if (intra) {
331 8627 run = vlc & 0x7;
332
6/6
✓ Branch 0 taken 5366 times.
✓ Branch 1 taken 3261 times.
✓ Branch 2 taken 3386 times.
✓ Branch 3 taken 1980 times.
✓ Branch 4 taken 3278 times.
✓ Branch 5 taken 108 times.
8627 level = (vlc >> 3) + ((run == 0) ? 8 : ((run < 2) ? 2 : ((run < 5) ? 0 : -1)));
333 } else {
334 83938 run = vlc & 0xF;
335
6/6
✓ Branch 0 taken 51500 times.
✓ Branch 1 taken 32438 times.
✓ Branch 2 taken 21798 times.
✓ Branch 3 taken 29702 times.
✓ Branch 4 taken 18712 times.
✓ Branch 5 taken 3086 times.
83938 level = (vlc >> 4) + ((run == 0) ? 4 : ((run < 3) ? 2 : ((run < 10) ? 1 : 0)));
336 }
337 }
338
339
340
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5383846 times.
5383846 if ((index += run) >= limit)
341 return -1;
342
343 5383846 block[scan[index]] = (level ^ sign) - sign;
344 }
345
346
2/2
✓ Branch 0 taken 3324909 times.
✓ Branch 1 taken 1120944 times.
4445853 if (type != 2) {
347 3324909 break;
348 }
349 }
350
351 3885381 return 0;
352 }
353
354 static av_always_inline int
355 556808 svq3_fetch_diagonal_mv(const SVQ3Context *s, const int16_t **C,
356 int i, int list, int part_width)
357 {
358 556808 const int topright_ref = s->ref_cache[list][i - 8 + part_width];
359
360
2/2
✓ Branch 0 taken 475267 times.
✓ Branch 1 taken 81541 times.
556808 if (topright_ref != PART_NOT_AVAILABLE) {
361 475267 *C = s->mv_cache[list][i - 8 + part_width];
362 475267 return topright_ref;
363 } else {
364 81541 *C = s->mv_cache[list][i - 8 - 1];
365 81541 return s->ref_cache[list][i - 8 - 1];
366 }
367 }
368
369 /**
370 * Get the predicted MV.
371 * @param n the block index
372 * @param part_width the width of the partition (4, 8,16) -> (1, 2, 4)
373 * @param mx the x component of the predicted motion vector
374 * @param my the y component of the predicted motion vector
375 */
376 556808 static av_always_inline void svq3_pred_motion(const SVQ3Context *s, int n,
377 int part_width, int list,
378 int ref, int *const mx, int *const my)
379 {
380 556808 const int index8 = scan8[n];
381 556808 const int top_ref = s->ref_cache[list][index8 - 8];
382 556808 const int left_ref = s->ref_cache[list][index8 - 1];
383 556808 const int16_t *const A = s->mv_cache[list][index8 - 1];
384 556808 const int16_t *const B = s->mv_cache[list][index8 - 8];
385 const int16_t *C;
386 int diagonal_ref, match_count;
387
388 /* mv_cache
389 * B . . A T T T T
390 * U . . L . . , .
391 * U . . L . . . .
392 * U . . L . . , .
393 * . . . L . . . .
394 */
395
396 556808 diagonal_ref = svq3_fetch_diagonal_mv(s, &C, index8, list, part_width);
397 556808 match_count = (diagonal_ref == ref) + (top_ref == ref) + (left_ref == ref);
398
2/2
✓ Branch 0 taken 533003 times.
✓ Branch 1 taken 23805 times.
556808 if (match_count > 1) { //most common
399 533003 *mx = mid_pred(A[0], B[0], C[0]);
400 533003 *my = mid_pred(A[1], B[1], C[1]);
401
1/2
✓ Branch 0 taken 23805 times.
✗ Branch 1 not taken.
23805 } else if (match_count == 1) {
402
1/2
✓ Branch 0 taken 23805 times.
✗ Branch 1 not taken.
23805 if (left_ref == ref) {
403 23805 *mx = A[0];
404 23805 *my = A[1];
405 } else if (top_ref == ref) {
406 *mx = B[0];
407 *my = B[1];
408 } else {
409 *mx = C[0];
410 *my = C[1];
411 }
412 } else {
413 if (top_ref == PART_NOT_AVAILABLE &&
414 diagonal_ref == PART_NOT_AVAILABLE &&
415 left_ref != PART_NOT_AVAILABLE) {
416 *mx = A[0];
417 *my = A[1];
418 } else {
419 *mx = mid_pred(A[0], B[0], C[0]);
420 *my = mid_pred(A[1], B[1], C[1]);
421 }
422 }
423 556808 }
424
425 911840 static inline void svq3_mc_dir_part(SVQ3Context *s,
426 int x, int y, int width, int height,
427 int mx, int my, int dxy,
428 int thirdpel, int dir, int avg)
429 {
430
2/2
✓ Branch 0 taken 910709 times.
✓ Branch 1 taken 1131 times.
911840 const SVQ3Frame *pic = (dir == 0) ? s->last_pic : s->next_pic;
431 uint8_t *src, *dest;
432 911840 int i, emu = 0;
433 911840 int blocksize = 2 - (width >> 3); // 16->0, 8->1, 4->2
434 911840 int linesize = s->cur_pic->f->linesize[0];
435 911840 int uvlinesize = s->cur_pic->f->linesize[1];
436
437 911840 mx += x;
438 911840 my += y;
439
440
6/6
✓ Branch 0 taken 905629 times.
✓ Branch 1 taken 6211 times.
✓ Branch 2 taken 873824 times.
✓ Branch 3 taken 31805 times.
✓ Branch 4 taken 870724 times.
✓ Branch 5 taken 3100 times.
911840 if (mx < 0 || mx >= s->h_edge_pos - width - 1 ||
441
2/2
✓ Branch 0 taken 47592 times.
✓ Branch 1 taken 823132 times.
870724 my < 0 || my >= s->v_edge_pos - height - 1) {
442 88708 emu = 1;
443 88708 mx = av_clip(mx, -16, s->h_edge_pos - width + 15);
444 88708 my = av_clip(my, -16, s->v_edge_pos - height + 15);
445 }
446
447 /* form component predictions */
448 911840 dest = s->cur_pic->f->data[0] + x + y * linesize;
449 911840 src = pic->f->data[0] + mx + my * linesize;
450
451
2/2
✓ Branch 0 taken 88708 times.
✓ Branch 1 taken 823132 times.
911840 if (emu) {
452 88708 s->vdsp.emulated_edge_mc(s->edge_emu_buffer, src,
453 linesize, linesize,
454 width + 1, height + 1,
455 mx, my, s->h_edge_pos, s->v_edge_pos);
456 88708 src = s->edge_emu_buffer;
457 }
458
2/2
✓ Branch 0 taken 182 times.
✓ Branch 1 taken 911658 times.
911840 if (thirdpel)
459 (avg ? s->tdsp.avg_tpel_pixels_tab
460
2/2
✓ Branch 0 taken 13 times.
✓ Branch 1 taken 169 times.
182 : s->tdsp.put_tpel_pixels_tab)[dxy](dest, src, linesize,
461 width, height);
462 else
463 (avg ? s->hdsp.avg_pixels_tab
464
2/2
✓ Branch 0 taken 1068 times.
✓ Branch 1 taken 910590 times.
911658 : s->hdsp.put_pixels_tab)[blocksize][dxy](dest, src, linesize,
465 height);
466
467
1/2
✓ Branch 0 taken 911840 times.
✗ Branch 1 not taken.
911840 if (!(s->avctx->flags & AV_CODEC_FLAG_GRAY)) {
468 911840 mx = mx + (mx < (int) x) >> 1;
469 911840 my = my + (my < (int) y) >> 1;
470 911840 width = width >> 1;
471 911840 height = height >> 1;
472 911840 blocksize++;
473
474
2/2
✓ Branch 0 taken 1823680 times.
✓ Branch 1 taken 911840 times.
2735520 for (i = 1; i < 3; i++) {
475 1823680 dest = s->cur_pic->f->data[i] + (x >> 1) + (y >> 1) * uvlinesize;
476 1823680 src = pic->f->data[i] + mx + my * uvlinesize;
477
478
2/2
✓ Branch 0 taken 177416 times.
✓ Branch 1 taken 1646264 times.
1823680 if (emu) {
479 177416 s->vdsp.emulated_edge_mc(s->edge_emu_buffer, src,
480 uvlinesize, uvlinesize,
481 width + 1, height + 1,
482 177416 mx, my, (s->h_edge_pos >> 1),
483 177416 s->v_edge_pos >> 1);
484 177416 src = s->edge_emu_buffer;
485 }
486
2/2
✓ Branch 0 taken 364 times.
✓ Branch 1 taken 1823316 times.
1823680 if (thirdpel)
487 (avg ? s->tdsp.avg_tpel_pixels_tab
488
2/2
✓ Branch 0 taken 26 times.
✓ Branch 1 taken 338 times.
364 : s->tdsp.put_tpel_pixels_tab)[dxy](dest, src,
489 uvlinesize,
490 width, height);
491 else
492 (avg ? s->hdsp.avg_pixels_tab
493
2/2
✓ Branch 0 taken 2136 times.
✓ Branch 1 taken 1821180 times.
1823316 : s->hdsp.put_pixels_tab)[blocksize][dxy](dest, src,
494 uvlinesize,
495 height);
496 }
497 }
498 911840 }
499
500 439074 static inline int svq3_mc_dir(SVQ3Context *s, int size, int mode,
501 int dir, int avg)
502 {
503 int i, j, k, mx, my, dx, dy, x, y;
504
2/2
✓ Branch 0 taken 439052 times.
✓ Branch 1 taken 22 times.
439074 const int part_width = ((size & 5) == 4) ? 4 : 16 >> (size & 1);
505 439074 const int part_height = 16 >> ((unsigned)(size + 1) / 3);
506
2/2
✓ Branch 0 taken 786 times.
✓ Branch 1 taken 438288 times.
439074 const int extra_width = (mode == PREDICT_MODE) ? -16 * 6 : 0;
507 439074 const int h_edge_pos = 6 * (s->h_edge_pos - part_width) - extra_width;
508 439074 const int v_edge_pos = 6 * (s->v_edge_pos - part_height) - extra_width;
509
510
2/2
✓ Branch 0 taken 478620 times.
✓ Branch 1 taken 439074 times.
917694 for (i = 0; i < 16; i += part_height)
511
2/2
✓ Branch 0 taken 557846 times.
✓ Branch 1 taken 478620 times.
1036466 for (j = 0; j < 16; j += part_width) {
512 557846 const int b_xy = (4 * s->mb_x + (j >> 2)) +
513 557846 (4 * s->mb_y + (i >> 2)) * s->b_stride;
514 int dxy;
515 557846 x = 16 * s->mb_x + j;
516 557846 y = 16 * s->mb_y + i;
517 557846 k = (j >> 2 & 1) + (i >> 1 & 2) +
518 557846 (j >> 1 & 4) + (i & 8);
519
520
2/2
✓ Branch 0 taken 556808 times.
✓ Branch 1 taken 1038 times.
557846 if (mode != PREDICT_MODE) {
521 556808 svq3_pred_motion(s, k, part_width >> 2, dir, 1, &mx, &my);
522 } else {
523 1038 mx = s->next_pic->motion_val[0][b_xy][0] * 2;
524 1038 my = s->next_pic->motion_val[0][b_xy][1] * 2;
525
526
2/2
✓ Branch 0 taken 519 times.
✓ Branch 1 taken 519 times.
1038 if (dir == 0) {
527 519 mx = mx * s->frame_num_offset /
528 519 s->prev_frame_num_offset + 1 >> 1;
529 519 my = my * s->frame_num_offset /
530 519 s->prev_frame_num_offset + 1 >> 1;
531 } else {
532 519 mx = mx * (s->frame_num_offset - s->prev_frame_num_offset) /
533 519 s->prev_frame_num_offset + 1 >> 1;
534 519 my = my * (s->frame_num_offset - s->prev_frame_num_offset) /
535 519 s->prev_frame_num_offset + 1 >> 1;
536 }
537 }
538
539 /* clip motion vector prediction to frame border */
540 557846 mx = av_clip(mx, extra_width - 6 * x, h_edge_pos - 6 * x);
541 557846 my = av_clip(my, extra_width - 6 * y, v_edge_pos - 6 * y);
542
543 /* get (optional) motion vector differential */
544
2/2
✓ Branch 0 taken 1038 times.
✓ Branch 1 taken 556808 times.
557846 if (mode == PREDICT_MODE) {
545 1038 dx = dy = 0;
546 } else {
547 556808 dy = get_interleaved_se_golomb(&s->gb_slice);
548 556808 dx = get_interleaved_se_golomb(&s->gb_slice);
549
550
2/4
✓ Branch 0 taken 556808 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 556808 times.
556808 if (dx != (int16_t)dx || dy != (int16_t)dy) {
551 av_log(s->avctx, AV_LOG_ERROR, "invalid MV vlc\n");
552 return -1;
553 }
554 }
555
556 /* compute motion vector */
557
2/2
✓ Branch 0 taken 182 times.
✓ Branch 1 taken 557664 times.
557846 if (mode == THIRDPEL_MODE) {
558 int fx, fy;
559 182 mx = (mx + 1 >> 1) + dx;
560 182 my = (my + 1 >> 1) + dy;
561 182 fx = (unsigned)(mx + 0x30000) / 3 - 0x10000;
562 182 fy = (unsigned)(my + 0x30000) / 3 - 0x10000;
563 182 dxy = (mx - 3 * fx) + 4 * (my - 3 * fy);
564
565 182 svq3_mc_dir_part(s, x, y, part_width, part_height,
566 fx, fy, dxy, 1, dir, avg);
567 182 mx += mx;
568 182 my += my;
569
4/4
✓ Branch 0 taken 282368 times.
✓ Branch 1 taken 275296 times.
✓ Branch 2 taken 1038 times.
✓ Branch 3 taken 281330 times.
557664 } else if (mode == HALFPEL_MODE || mode == PREDICT_MODE) {
570 276334 mx = (unsigned)(mx + 1 + 0x30000) / 3 + dx - 0x10000;
571 276334 my = (unsigned)(my + 1 + 0x30000) / 3 + dy - 0x10000;
572 276334 dxy = (mx & 1) + 2 * (my & 1);
573
574 276334 svq3_mc_dir_part(s, x, y, part_width, part_height,
575 mx >> 1, my >> 1, dxy, 0, dir, avg);
576 276334 mx *= 3;
577 276334 my *= 3;
578 } else {
579 281330 mx = (unsigned)(mx + 3 + 0x60000) / 6 + dx - 0x10000;
580 281330 my = (unsigned)(my + 3 + 0x60000) / 6 + dy - 0x10000;
581
582 281330 svq3_mc_dir_part(s, x, y, part_width, part_height,
583 mx, my, 0, 0, dir, avg);
584 281330 mx *= 6;
585 281330 my *= 6;
586 }
587
588 /* update mv_cache */
589
2/2
✓ Branch 0 taken 556808 times.
✓ Branch 1 taken 1038 times.
557846 if (mode != PREDICT_MODE) {
590 556808 int32_t mv = pack16to32(mx, my);
591
592
4/4
✓ Branch 0 taken 157802 times.
✓ Branch 1 taken 399006 times.
✓ Branch 2 taken 78901 times.
✓ Branch 3 taken 78901 times.
556808 if (part_height == 8 && i < 8) {
593 78901 AV_WN32A(s->mv_cache[dir][scan8[k] + 1 * 8], mv);
594
595
4/4
✓ Branch 0 taken 78822 times.
✓ Branch 1 taken 79 times.
✓ Branch 2 taken 39411 times.
✓ Branch 3 taken 39411 times.
78901 if (part_width == 8 && j < 8)
596 39411 AV_WN32A(s->mv_cache[dir][scan8[k] + 1 + 1 * 8], mv);
597 }
598
4/4
✓ Branch 0 taken 157868 times.
✓ Branch 1 taken 398940 times.
✓ Branch 2 taken 78934 times.
✓ Branch 3 taken 78934 times.
556808 if (part_width == 8 && j < 8)
599 78934 AV_WN32A(s->mv_cache[dir][scan8[k] + 1], mv);
600
4/4
✓ Branch 0 taken 556672 times.
✓ Branch 1 taken 136 times.
✓ Branch 2 taken 48 times.
✓ Branch 3 taken 556624 times.
556808 if (part_width == 4 || part_height == 4)
601 184 AV_WN32A(s->mv_cache[dir][scan8[k]], mv);
602 }
603
604 /* write back motion vectors */
605 557846 fill_rectangle(s->cur_pic->motion_val[dir][b_xy],
606 part_width >> 2, part_height >> 2, s->b_stride,
607 pack16to32(mx, my), 4);
608 }
609
610 439074 return 0;
611 }
612
613 488854 static av_always_inline void hl_decode_mb_idct_luma(SVQ3Context *s,
614 int mb_type, const int *block_offset,
615 int linesize, uint8_t *dest_y)
616 {
617 int i;
618
2/2
✓ Branch 0 taken 440804 times.
✓ Branch 1 taken 48050 times.
488854 if (!IS_INTRA4x4(mb_type)) {
619
2/2
✓ Branch 0 taken 7052864 times.
✓ Branch 1 taken 440804 times.
7493668 for (i = 0; i < 16; i++)
620
4/4
✓ Branch 0 taken 4592260 times.
✓ Branch 1 taken 2460604 times.
✓ Branch 2 taken 22222 times.
✓ Branch 3 taken 4570038 times.
7052864 if (s->non_zero_count_cache[scan8[i]] || s->mb[i * 16]) {
621 2482826 uint8_t *const ptr = dest_y + block_offset[i];
622 2482826 svq3_add_idct_c(ptr, s->mb + i * 16, linesize,
623 2482826 s->qscale, IS_INTRA(mb_type) ? 1 : 0);
624 }
625 }
626 488854 }
627
628 50587 static av_always_inline void hl_decode_mb_predict_luma(SVQ3Context *s,
629 int mb_type,
630 const int *block_offset,
631 int linesize,
632 uint8_t *dest_y)
633 {
634 int i;
635 50587 int qscale = s->qscale;
636
637
2/2
✓ Branch 0 taken 48050 times.
✓ Branch 1 taken 2537 times.
50587 if (IS_INTRA4x4(mb_type)) {
638
2/2
✓ Branch 0 taken 768800 times.
✓ Branch 1 taken 48050 times.
816850 for (i = 0; i < 16; i++) {
639 768800 uint8_t *const ptr = dest_y + block_offset[i];
640 768800 const int dir = s->intra4x4_pred_mode_cache[scan8[i]];
641
642 uint8_t *topright;
643 int nnz;
644
3/4
✓ Branch 0 taken 715809 times.
✓ Branch 1 taken 52991 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 715809 times.
768800 if (dir == DIAG_DOWN_LEFT_PRED || dir == VERT_LEFT_PRED) {
645 av_assert2(s->mb_y || linesize <= block_offset[i]);
646 52991 topright = ptr + 4 - linesize;
647 } else
648 715809 topright = NULL;
649
650 768800 s->hpc.pred4x4[dir](ptr, topright, linesize);
651 768800 nnz = s->non_zero_count_cache[scan8[i]];
652
2/2
✓ Branch 0 taken 560628 times.
✓ Branch 1 taken 208172 times.
768800 if (nnz) {
653 560628 svq3_add_idct_c(ptr, s->mb + i * 16, linesize, qscale, 0);
654 }
655 }
656 } else {
657 2537 s->hpc.pred16x16[s->intra16x16_pred_mode](dest_y, linesize);
658 2537 svq3_luma_dc_dequant_idct_c(s->mb, s->mb_luma_dc[0], qscale);
659 }
660 50587 }
661
662 488854 static void hl_decode_mb(SVQ3Context *s)
663 {
664 488854 const int mb_x = s->mb_x;
665 488854 const int mb_y = s->mb_y;
666 488854 const int mb_xy = s->mb_xy;
667 488854 const int mb_type = s->cur_pic->mb_type[mb_xy];
668 uint8_t *dest_y, *dest_cb, *dest_cr;
669 int linesize, uvlinesize;
670 int i, j;
671 488854 const int *block_offset = &s->block_offset[0];
672 488854 const int block_h = 16 >> 1;
673
674 488854 linesize = s->cur_pic->f->linesize[0];
675 488854 uvlinesize = s->cur_pic->f->linesize[1];
676
677 488854 dest_y = s->cur_pic->f->data[0] + (mb_x + mb_y * linesize) * 16;
678 488854 dest_cb = s->cur_pic->f->data[1] + mb_x * 8 + mb_y * uvlinesize * block_h;
679 488854 dest_cr = s->cur_pic->f->data[2] + mb_x * 8 + mb_y * uvlinesize * block_h;
680
681 488854 s->vdsp.prefetch(dest_y + (s->mb_x & 3) * 4 * linesize + 64, linesize, 4);
682 488854 s->vdsp.prefetch(dest_cb + (s->mb_x & 7) * uvlinesize + 64, dest_cr - dest_cb, 2);
683
684
2/2
✓ Branch 0 taken 50587 times.
✓ Branch 1 taken 438267 times.
488854 if (IS_INTRA(mb_type)) {
685 50587 s->hpc.pred8x8[s->chroma_pred_mode](dest_cb, uvlinesize);
686 50587 s->hpc.pred8x8[s->chroma_pred_mode](dest_cr, uvlinesize);
687
688 50587 hl_decode_mb_predict_luma(s, mb_type, block_offset, linesize, dest_y);
689 }
690
691 488854 hl_decode_mb_idct_luma(s, mb_type, block_offset, linesize, dest_y);
692
693
2/2
✓ Branch 0 taken 159382 times.
✓ Branch 1 taken 329472 times.
488854 if (s->cbp & 0x30) {
694 159382 uint8_t *dest[2] = { dest_cb, dest_cr };
695 159382 s->h264dsp.h264_chroma_dc_dequant_idct(s->mb + 16 * 16 * 1,
696 159382 s->dequant4_coeff[4][0]);
697 159382 s->h264dsp.h264_chroma_dc_dequant_idct(s->mb + 16 * 16 * 2,
698 159382 s->dequant4_coeff[4][0]);
699
2/2
✓ Branch 0 taken 318764 times.
✓ Branch 1 taken 159382 times.
478146 for (j = 1; j < 3; j++) {
700
2/2
✓ Branch 0 taken 1275056 times.
✓ Branch 1 taken 318764 times.
1593820 for (i = j * 16; i < j * 16 + 4; i++)
701
4/4
✓ Branch 0 taken 732208 times.
✓ Branch 1 taken 542848 times.
✓ Branch 2 taken 430847 times.
✓ Branch 3 taken 301361 times.
1275056 if (s->non_zero_count_cache[scan8[i]] || s->mb[i * 16]) {
702 973695 uint8_t *const ptr = dest[j - 1] + block_offset[i];
703 973695 svq3_add_idct_c(ptr, s->mb + i * 16,
704 973695 uvlinesize, ff_h264_chroma_qp[0][s->qscale + 12] - 12, 2);
705 }
706 }
707 }
708 488854 }
709
710 842700 static int svq3_decode_mb(SVQ3Context *s, unsigned int mb_type)
711 {
712 int i, j, k, m, dir, mode;
713 842700 int cbp = 0;
714 uint32_t vlc;
715 int8_t *top, *left;
716 842700 const int mb_xy = s->mb_xy;
717 842700 const int b_xy = 4 * s->mb_x + 4 * s->mb_y * s->b_stride;
718
719
2/2
✓ Branch 0 taken 56180 times.
✓ Branch 1 taken 786520 times.
842700 s->top_samples_available = (s->mb_y == 0) ? 0x33FF : 0xFFFF;
720
2/2
✓ Branch 0 taken 42150 times.
✓ Branch 1 taken 800550 times.
842700 s->left_samples_available = (s->mb_x == 0) ? 0x5F5F : 0xFFFF;
721
722
2/2
✓ Branch 0 taken 353906 times.
✓ Branch 1 taken 488794 times.
842700 if (mb_type == 0) { /* SKIP */
723
2/2
✓ Branch 0 taken 874 times.
✓ Branch 1 taken 353032 times.
353906 if (s->pict_type == AV_PICTURE_TYPE_P ||
724
2/2
✓ Branch 0 taken 481 times.
✓ Branch 1 taken 393 times.
874 s->next_pic->mb_type[mb_xy] == -1) {
725 353513 svq3_mc_dir_part(s, 16 * s->mb_x, 16 * s->mb_y, 16, 16,
726 0, 0, 0, 0, 0, 0);
727
728
2/2
✓ Branch 0 taken 481 times.
✓ Branch 1 taken 353032 times.
353513 if (s->pict_type == AV_PICTURE_TYPE_B)
729 481 svq3_mc_dir_part(s, 16 * s->mb_x, 16 * s->mb_y, 16, 16,
730 0, 0, 0, 0, 1, 1);
731
732 353513 mb_type = MB_TYPE_SKIP;
733 } else {
734 393 mb_type = FFMIN(s->next_pic->mb_type[mb_xy], 6);
735
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 393 times.
393 if (svq3_mc_dir(s, mb_type, PREDICT_MODE, 0, 0) < 0)
736 return -1;
737
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 393 times.
393 if (svq3_mc_dir(s, mb_type, PREDICT_MODE, 1, 1) < 0)
738 return -1;
739
740 393 mb_type = MB_TYPE_16x16;
741 }
742
2/2
✓ Branch 0 taken 438207 times.
✓ Branch 1 taken 50587 times.
488794 } else if (mb_type < 8) { /* INTER */
743
4/4
✓ Branch 0 taken 833 times.
✓ Branch 1 taken 437374 times.
✓ Branch 3 taken 129 times.
✓ Branch 4 taken 704 times.
438207 if (s->thirdpel_flag && s->halfpel_flag == !get_bits1(&s->gb_slice))
744 129 mode = THIRDPEL_MODE;
745
1/2
✓ Branch 0 taken 438078 times.
✗ Branch 1 not taken.
438078 else if (s->halfpel_flag &&
746
2/2
✓ Branch 1 taken 197151 times.
✓ Branch 2 taken 240927 times.
438078 s->thirdpel_flag == !get_bits1(&s->gb_slice))
747 197151 mode = HALFPEL_MODE;
748 else
749 240927 mode = FULLPEL_MODE;
750
751 /* fill caches */
752 /* note ref_cache should contain here:
753 * ????????
754 * ???11111
755 * N??11111
756 * N??11111
757 * N??11111
758 */
759
760
2/2
✓ Branch 0 taken 438391 times.
✓ Branch 1 taken 184 times.
438575 for (m = 0; m < 2; m++) {
761
3/4
✓ Branch 0 taken 421631 times.
✓ Branch 1 taken 16760 times.
✓ Branch 2 taken 421631 times.
✗ Branch 3 not taken.
438391 if (s->mb_x > 0 && s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - 1] + 6] != -1) {
762
2/2
✓ Branch 0 taken 1686524 times.
✓ Branch 1 taken 421631 times.
2108155 for (i = 0; i < 4; i++)
763 1686524 AV_COPY32(s->mv_cache[m][scan8[0] - 1 + i * 8],
764 s->cur_pic->motion_val[m][b_xy - 1 + i * s->b_stride]);
765 } else {
766
2/2
✓ Branch 0 taken 67040 times.
✓ Branch 1 taken 16760 times.
83800 for (i = 0; i < 4; i++)
767 67040 AV_ZERO32(s->mv_cache[m][scan8[0] - 1 + i * 8]);
768 }
769
2/2
✓ Branch 0 taken 415485 times.
✓ Branch 1 taken 22906 times.
438391 if (s->mb_y > 0) {
770 415485 memcpy(s->mv_cache[m][scan8[0] - 1 * 8],
771 415485 s->cur_pic->motion_val[m][b_xy - s->b_stride],
772 4 * 2 * sizeof(int16_t));
773 415485 memset(&s->ref_cache[m][scan8[0] - 1 * 8],
774
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 415485 times.
415485 (s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride]] == -1) ? PART_NOT_AVAILABLE : 1, 4);
775
776
2/2
✓ Branch 0 taken 397233 times.
✓ Branch 1 taken 18252 times.
415485 if (s->mb_x < s->mb_width - 1) {
777 397233 AV_COPY32(s->mv_cache[m][scan8[0] + 4 - 1 * 8],
778 s->cur_pic->motion_val[m][b_xy - s->b_stride + 4]);
779 397233 s->ref_cache[m][scan8[0] + 4 - 1 * 8] =
780
1/2
✓ Branch 0 taken 397233 times.
✗ Branch 1 not taken.
397233 (s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride + 1] + 6] == -1 ||
781
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 397233 times.
397233 s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride]] == -1) ? PART_NOT_AVAILABLE : 1;
782 } else
783 18252 s->ref_cache[m][scan8[0] + 4 - 1 * 8] = PART_NOT_AVAILABLE;
784
2/2
✓ Branch 0 taken 399643 times.
✓ Branch 1 taken 15842 times.
415485 if (s->mb_x > 0) {
785 399643 AV_COPY32(s->mv_cache[m][scan8[0] - 1 - 1 * 8],
786 s->cur_pic->motion_val[m][b_xy - s->b_stride - 1]);
787 399643 s->ref_cache[m][scan8[0] - 1 - 1 * 8] =
788
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 399643 times.
399643 (s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride - 1] + 3] == -1) ? PART_NOT_AVAILABLE : 1;
789 } else
790 15842 s->ref_cache[m][scan8[0] - 1 - 1 * 8] = PART_NOT_AVAILABLE;
791 } else
792 22906 memset(&s->ref_cache[m][scan8[0] - 1 * 8 - 1],
793 PART_NOT_AVAILABLE, 8);
794
795
2/2
✓ Branch 0 taken 438023 times.
✓ Branch 1 taken 368 times.
438391 if (s->pict_type != AV_PICTURE_TYPE_B)
796 438023 break;
797 }
798
799 /* decode motion vector(s) and form prediction(s) */
800
2/2
✓ Branch 0 taken 438023 times.
✓ Branch 1 taken 184 times.
438207 if (s->pict_type == AV_PICTURE_TYPE_P) {
801
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 438023 times.
438023 if (svq3_mc_dir(s, mb_type - 1, mode, 0, 0) < 0)
802 return -1;
803 } else { /* AV_PICTURE_TYPE_B */
804
2/2
✓ Branch 0 taken 134 times.
✓ Branch 1 taken 50 times.
184 if (mb_type != 2) {
805
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 134 times.
134 if (svq3_mc_dir(s, 0, mode, 0, 0) < 0)
806 return -1;
807 } else {
808
2/2
✓ Branch 0 taken 200 times.
✓ Branch 1 taken 50 times.
250 for (i = 0; i < 4; i++)
809 200 memset(s->cur_pic->motion_val[0][b_xy + i * s->b_stride],
810 0, 4 * 2 * sizeof(int16_t));
811 }
812
2/2
✓ Branch 0 taken 131 times.
✓ Branch 1 taken 53 times.
184 if (mb_type != 1) {
813
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 131 times.
131 if (svq3_mc_dir(s, 0, mode, 1, mb_type == 3) < 0)
814 return -1;
815 } else {
816
2/2
✓ Branch 0 taken 212 times.
✓ Branch 1 taken 53 times.
265 for (i = 0; i < 4; i++)
817 212 memset(s->cur_pic->motion_val[1][b_xy + i * s->b_stride],
818 0, 4 * 2 * sizeof(int16_t));
819 }
820 }
821
822 438207 mb_type = MB_TYPE_16x16;
823
3/4
✓ Branch 0 taken 2537 times.
✓ Branch 1 taken 48050 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2537 times.
50587 } else if (mb_type == 8 || mb_type == 33) { /* INTRA4x4 */
824 48050 int8_t *i4x4 = s->intra4x4_pred_mode + s->mb2br_xy[s->mb_xy];
825 48050 int8_t *i4x4_cache = s->intra4x4_pred_mode_cache;
826
827 48050 memset(s->intra4x4_pred_mode_cache, -1, 8 * 5 * sizeof(int8_t));
828
829
1/2
✓ Branch 0 taken 48050 times.
✗ Branch 1 not taken.
48050 if (mb_type == 8) {
830
2/2
✓ Branch 0 taken 44048 times.
✓ Branch 1 taken 4002 times.
48050 if (s->mb_x > 0) {
831
2/2
✓ Branch 0 taken 176192 times.
✓ Branch 1 taken 44048 times.
220240 for (i = 0; i < 4; i++)
832 176192 s->intra4x4_pred_mode_cache[scan8[0] - 1 + i * 8] = s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - 1] + 6 - i];
833
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 44048 times.
44048 if (s->intra4x4_pred_mode_cache[scan8[0] - 1] == -1)
834 s->left_samples_available = 0x5F5F;
835 }
836
2/2
✓ Branch 0 taken 45141 times.
✓ Branch 1 taken 2909 times.
48050 if (s->mb_y > 0) {
837 45141 s->intra4x4_pred_mode_cache[4 + 8 * 0] = s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride] + 0];
838 45141 s->intra4x4_pred_mode_cache[5 + 8 * 0] = s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride] + 1];
839 45141 s->intra4x4_pred_mode_cache[6 + 8 * 0] = s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride] + 2];
840 45141 s->intra4x4_pred_mode_cache[7 + 8 * 0] = s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride] + 3];
841
842
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 45141 times.
45141 if (s->intra4x4_pred_mode_cache[4 + 8 * 0] == -1)
843 s->top_samples_available = 0x33FF;
844 }
845
846 /* decode prediction codes for luma blocks */
847
2/2
✓ Branch 0 taken 384400 times.
✓ Branch 1 taken 48050 times.
432450 for (i = 0; i < 16; i += 2) {
848 384400 vlc = get_interleaved_ue_golomb(&s->gb_slice);
849
850
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 384400 times.
384400 if (vlc >= 25U) {
851 av_log(s->avctx, AV_LOG_ERROR,
852 "luma prediction:%"PRIu32"\n", vlc);
853 return -1;
854 }
855
856 384400 left = &s->intra4x4_pred_mode_cache[scan8[i] - 1];
857 384400 top = &s->intra4x4_pred_mode_cache[scan8[i] - 8];
858
859 384400 left[1] = svq3_pred_1[top[0] + 1][left[0] + 1][svq3_pred_0[vlc][0]];
860 384400 left[2] = svq3_pred_1[top[1] + 1][left[1] + 1][svq3_pred_0[vlc][1]];
861
862
2/4
✓ Branch 0 taken 384400 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 384400 times.
384400 if (left[1] == -1 || left[2] == -1) {
863 av_log(s->avctx, AV_LOG_ERROR, "weird prediction\n");
864 return -1;
865 }
866 }
867 } else { /* mb_type == 33, DC_128_PRED block type */
868 for (i = 0; i < 4; i++)
869 memset(&s->intra4x4_pred_mode_cache[scan8[0] + 8 * i], DC_PRED, 4);
870 }
871
872 48050 AV_COPY32(i4x4, i4x4_cache + 4 + 8 * 4);
873 48050 i4x4[4] = i4x4_cache[7 + 8 * 3];
874 48050 i4x4[5] = i4x4_cache[7 + 8 * 2];
875 48050 i4x4[6] = i4x4_cache[7 + 8 * 1];
876
877
1/2
✓ Branch 0 taken 48050 times.
✗ Branch 1 not taken.
48050 if (mb_type == 8) {
878 48050 ff_h264_check_intra4x4_pred_mode(s->intra4x4_pred_mode_cache,
879 48050 s->avctx, s->top_samples_available,
880 48050 s->left_samples_available);
881
882
2/2
✓ Branch 0 taken 2909 times.
✓ Branch 1 taken 45141 times.
48050 s->top_samples_available = (s->mb_y == 0) ? 0x33FF : 0xFFFF;
883
2/2
✓ Branch 0 taken 4002 times.
✓ Branch 1 taken 44048 times.
48050 s->left_samples_available = (s->mb_x == 0) ? 0x5F5F : 0xFFFF;
884 } else {
885 for (i = 0; i < 4; i++)
886 memset(&s->intra4x4_pred_mode_cache[scan8[0] + 8 * i], DC_128_PRED, 4);
887
888 s->top_samples_available = 0x33FF;
889 s->left_samples_available = 0x5F5F;
890 }
891
892 48050 mb_type = MB_TYPE_INTRA4x4;
893 } else { /* INTRA16x16 */
894 2537 dir = ff_h264_i_mb_type_info[mb_type - 8].pred_mode;
895 2537 dir = (dir >> 1) ^ 3 * (dir & 1) ^ 1;
896
897
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2537 times.
2537 if ((s->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(s->avctx, s->top_samples_available,
898 2537 s->left_samples_available, dir, 0)) < 0) {
899 av_log(s->avctx, AV_LOG_ERROR, "ff_h264_check_intra_pred_mode < 0\n");
900 return s->intra16x16_pred_mode;
901 }
902
903 2537 cbp = ff_h264_i_mb_type_info[mb_type - 8].cbp;
904 2537 mb_type = MB_TYPE_INTRA16x16;
905 }
906
907
4/4
✓ Branch 0 taken 404100 times.
✓ Branch 1 taken 438600 times.
✓ Branch 2 taken 384930 times.
✓ Branch 3 taken 19170 times.
842700 if (!IS_INTER(mb_type) && s->pict_type != AV_PICTURE_TYPE_I) {
908
2/2
✓ Branch 0 taken 1539720 times.
✓ Branch 1 taken 384930 times.
1924650 for (i = 0; i < 4; i++)
909 1539720 memset(s->cur_pic->motion_val[0][b_xy + i * s->b_stride],
910 0, 4 * 2 * sizeof(int16_t));
911
2/2
✓ Branch 0 taken 503 times.
✓ Branch 1 taken 384427 times.
384930 if (s->pict_type == AV_PICTURE_TYPE_B) {
912
2/2
✓ Branch 0 taken 2012 times.
✓ Branch 1 taken 503 times.
2515 for (i = 0; i < 4; i++)
913 2012 memset(s->cur_pic->motion_val[1][b_xy + i * s->b_stride],
914 0, 4 * 2 * sizeof(int16_t));
915 }
916 }
917
2/2
✓ Branch 0 taken 794650 times.
✓ Branch 1 taken 48050 times.
842700 if (!IS_INTRA4x4(mb_type)) {
918 794650 memset(s->intra4x4_pred_mode + s->mb2br_xy[mb_xy], DC_PRED, 8);
919 }
920
4/4
✓ Branch 0 taken 353513 times.
✓ Branch 1 taken 489187 times.
✓ Branch 2 taken 481 times.
✓ Branch 3 taken 353032 times.
842700 if (!IS_SKIP(mb_type) || s->pict_type == AV_PICTURE_TYPE_B) {
921 489668 memset(s->non_zero_count_cache + 8, 0, 14 * 8 * sizeof(uint8_t));
922 }
923
924
2/2
✓ Branch 0 taken 840163 times.
✓ Branch 1 taken 2537 times.
842700 if (!IS_INTRA16x16(mb_type) &&
925
4/4
✓ Branch 0 taken 353513 times.
✓ Branch 1 taken 486650 times.
✓ Branch 2 taken 481 times.
✓ Branch 3 taken 353032 times.
840163 (!IS_SKIP(mb_type) || s->pict_type == AV_PICTURE_TYPE_B)) {
926
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 487131 times.
487131 if ((vlc = get_interleaved_ue_golomb(&s->gb_slice)) >= 48U){
927 av_log(s->avctx, AV_LOG_ERROR, "cbp_vlc=%"PRIu32"\n", vlc);
928 return -1;
929 }
930
931 487131 cbp = IS_INTRA(mb_type) ? ff_h264_golomb_to_intra4x4_cbp[vlc]
932
2/2
✓ Branch 0 taken 48050 times.
✓ Branch 1 taken 439081 times.
487131 : ff_h264_golomb_to_inter_cbp[vlc];
933 }
934
2/2
✓ Branch 0 taken 840163 times.
✓ Branch 1 taken 2537 times.
842700 if (IS_INTRA16x16(mb_type) ||
935
6/6
✓ Branch 0 taken 823203 times.
✓ Branch 1 taken 16960 times.
✓ Branch 2 taken 2424 times.
✓ Branch 3 taken 820779 times.
✓ Branch 4 taken 696 times.
✓ Branch 5 taken 1728 times.
840163 (s->pict_type != AV_PICTURE_TYPE_I && s->adaptive_quant && cbp)) {
936 3233 s->qscale += get_interleaved_se_golomb(&s->gb_slice);
937
938
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3233 times.
3233 if (s->qscale > 31u) {
939 av_log(s->avctx, AV_LOG_ERROR, "qscale:%d\n", s->qscale);
940 return -1;
941 }
942 }
943
2/2
✓ Branch 0 taken 2537 times.
✓ Branch 1 taken 840163 times.
842700 if (IS_INTRA16x16(mb_type)) {
944 2537 AV_ZERO128(s->mb_luma_dc[0] + 0);
945 2537 AV_ZERO128(s->mb_luma_dc[0] + 8);
946
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2537 times.
2537 if (svq3_decode_block(&s->gb_slice, s->mb_luma_dc[0], 0, 1)) {
947 av_log(s->avctx, AV_LOG_ERROR,
948 "error while decoding intra luma dc\n");
949 return -1;
950 }
951 }
952
953
2/2
✓ Branch 0 taken 333795 times.
✓ Branch 1 taken 508905 times.
842700 if (cbp) {
954 333795 const int index = IS_INTRA16x16(mb_type) ? 1 : 0;
955
4/4
✓ Branch 0 taken 333729 times.
✓ Branch 1 taken 66 times.
✓ Branch 2 taken 40577 times.
✓ Branch 3 taken 293152 times.
333795 const int type = ((s->qscale < 24 && IS_INTRA4x4(mb_type)) ? 2 : 1);
956
957
2/2
✓ Branch 0 taken 1335180 times.
✓ Branch 1 taken 333795 times.
1668975 for (i = 0; i < 4; i++)
958
2/2
✓ Branch 0 taken 755308 times.
✓ Branch 1 taken 579872 times.
1335180 if ((cbp & (1 << i))) {
959
2/2
✓ Branch 0 taken 3021232 times.
✓ Branch 1 taken 755308 times.
3776540 for (j = 0; j < 4; j++) {
960 3025104 k = index ? (1 * (j & 1) + 2 * (i & 1) +
961 3872 2 * (j & 2) + 4 * (i & 2))
962
2/2
✓ Branch 0 taken 3872 times.
✓ Branch 1 taken 3017360 times.
3021232 : (4 * i + j);
963 3021232 s->non_zero_count_cache[scan8[k]] = 1;
964
965
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3021232 times.
3021232 if (svq3_decode_block(&s->gb_slice, &s->mb[16 * k], index, type)) {
966 av_log(s->avctx, AV_LOG_ERROR,
967 "error while decoding block\n");
968 return -1;
969 }
970 }
971 }
972
973
2/2
✓ Branch 0 taken 159382 times.
✓ Branch 1 taken 174413 times.
333795 if ((cbp & 0x30)) {
974
2/2
✓ Branch 0 taken 318764 times.
✓ Branch 1 taken 159382 times.
478146 for (i = 1; i < 3; ++i)
975
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 318764 times.
318764 if (svq3_decode_block(&s->gb_slice, &s->mb[16 * 16 * i], 0, 3)) {
976 av_log(s->avctx, AV_LOG_ERROR,
977 "error while decoding chroma dc block\n");
978 return -1;
979 }
980
981
2/2
✓ Branch 0 taken 67856 times.
✓ Branch 1 taken 91526 times.
159382 if ((cbp & 0x20)) {
982
2/2
✓ Branch 0 taken 135712 times.
✓ Branch 1 taken 67856 times.
203568 for (i = 1; i < 3; i++) {
983
2/2
✓ Branch 0 taken 542848 times.
✓ Branch 1 taken 135712 times.
678560 for (j = 0; j < 4; j++) {
984 542848 k = 16 * i + j;
985 542848 s->non_zero_count_cache[scan8[k]] = 1;
986
987
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 542848 times.
542848 if (svq3_decode_block(&s->gb_slice, &s->mb[16 * k], 1, 1)) {
988 av_log(s->avctx, AV_LOG_ERROR,
989 "error while decoding chroma ac block\n");
990 return -1;
991 }
992 }
993 }
994 }
995 }
996 }
997
998 842700 s->cbp = cbp;
999 842700 s->cur_pic->mb_type[mb_xy] = mb_type;
1000
1001
2/2
✓ Branch 0 taken 50587 times.
✓ Branch 1 taken 792113 times.
842700 if (IS_INTRA(mb_type))
1002 50587 s->chroma_pred_mode = ff_h264_check_intra_pred_mode(s->avctx, s->top_samples_available,
1003 50587 s->left_samples_available, DC_PRED8x8, 1);
1004
1005 842700 return 0;
1006 }
1007
1008 2810 static int svq3_decode_slice_header(AVCodecContext *avctx)
1009 {
1010 2810 SVQ3Context *s = avctx->priv_data;
1011 2810 const int mb_xy = s->mb_xy;
1012 int i, header;
1013 unsigned slice_id;
1014
1015 2810 header = get_bits(&s->gb, 8);
1016
1017
2/6
✗ Branch 0 not taken.
✓ Branch 1 taken 2810 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2810 times.
2810 if (((header & 0x9F) != 1 && (header & 0x9F) != 2) || (header & 0x60) == 0) {
1018 /* TODO: what? */
1019 av_log(avctx, AV_LOG_ERROR, "unsupported slice header (%02X)\n", header);
1020 return -1;
1021 } else {
1022 int slice_bits, slice_bytes, slice_length;
1023 2810 int length = header >> 5 & 3;
1024
1025 2810 slice_length = show_bits(&s->gb, 8 * length);
1026 2810 slice_bits = slice_length * 8;
1027 2810 slice_bytes = slice_length + length - 1;
1028
1029 2810 skip_bits(&s->gb, 8);
1030
1031 2810 av_fast_padded_malloc(&s->slice_buf, &s->slice_buf_size, slice_bytes);
1032
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2810 times.
2810 if (!s->slice_buf)
1033 return AVERROR(ENOMEM);
1034
1035
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2810 times.
2810 if (slice_bytes * 8LL > get_bits_left(&s->gb)) {
1036 av_log(avctx, AV_LOG_ERROR, "slice after bitstream end\n");
1037 return AVERROR_INVALIDDATA;
1038 }
1039 2810 memcpy(s->slice_buf, s->gb.buffer + s->gb.index / 8, slice_bytes);
1040
1041
1/2
✓ Branch 0 taken 2810 times.
✗ Branch 1 not taken.
2810 if (length > 0) {
1042 2810 memmove(s->slice_buf, &s->slice_buf[slice_length], length - 1);
1043 }
1044
1045
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 2800 times.
2810 if (s->watermark_key) {
1046 10 uint32_t header = AV_RL32(&s->slice_buf[1]);
1047 10 AV_WL32(&s->slice_buf[1], header ^ s->watermark_key);
1048 }
1049 2810 init_get_bits(&s->gb_slice, s->slice_buf, slice_bits);
1050
1051 2810 skip_bits_long(&s->gb, slice_bytes * 8);
1052 }
1053
1054
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2810 times.
2810 if ((slice_id = get_interleaved_ue_golomb(&s->gb_slice)) >= 3) {
1055 av_log(s->avctx, AV_LOG_ERROR, "illegal slice type %u \n", slice_id);
1056 return -1;
1057 }
1058
1059 2810 s->slice_type = ff_h264_golomb_to_pict_type[slice_id];
1060
1061
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2810 times.
2810 if ((header & 0x9F) == 2) {
1062 i = (s->mb_num < 64) ? 6 : (1 + av_log2(s->mb_num - 1));
1063 get_bits(&s->gb_slice, i);
1064
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2810 times.
2810 } else if (get_bits1(&s->gb_slice)) {
1065 avpriv_report_missing_feature(s->avctx, "Media key encryption");
1066 return AVERROR_PATCHWELCOME;
1067 }
1068
1069 2810 s->slice_num = get_bits(&s->gb_slice, 8);
1070 2810 s->qscale = get_bits(&s->gb_slice, 5);
1071 2810 s->adaptive_quant = get_bits1(&s->gb_slice);
1072
1073 /* unknown fields */
1074 2810 skip_bits1(&s->gb_slice);
1075
1076
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 2800 times.
2810 if (s->has_watermark)
1077 10 skip_bits1(&s->gb_slice);
1078
1079 2810 skip_bits1(&s->gb_slice);
1080 2810 skip_bits(&s->gb_slice, 2);
1081
1082
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2810 times.
2810 if (skip_1stop_8data_bits(&s->gb_slice) < 0)
1083 return AVERROR_INVALIDDATA;
1084
1085 /* reset intra predictors and invalidate motion vector references */
1086
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2810 times.
2810 if (s->mb_x > 0) {
1087 memset(s->intra4x4_pred_mode + s->mb2br_xy[mb_xy - 1] + 3,
1088 -1, 4 * sizeof(int8_t));
1089 memset(s->intra4x4_pred_mode + s->mb2br_xy[mb_xy - s->mb_x],
1090 -1, 8 * sizeof(int8_t) * s->mb_x);
1091 }
1092
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2810 times.
2810 if (s->mb_y > 0) {
1093 memset(s->intra4x4_pred_mode + s->mb2br_xy[mb_xy - s->mb_stride],
1094 -1, 8 * sizeof(int8_t) * (s->mb_width - s->mb_x));
1095
1096 if (s->mb_x > 0)
1097 s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride - 1] + 3] = -1;
1098 }
1099
1100 2810 return 0;
1101 }
1102
1103 8 static void init_dequant4_coeff_table(SVQ3Context *s)
1104 {
1105 int q, x;
1106 8 const int max_qp = 51;
1107
1108
2/2
✓ Branch 0 taken 416 times.
✓ Branch 1 taken 8 times.
424 for (q = 0; q < max_qp + 1; q++) {
1109 416 int shift = ff_h264_quant_div6[q] + 2;
1110 416 int idx = ff_h264_quant_rem6[q];
1111
2/2
✓ Branch 0 taken 6656 times.
✓ Branch 1 taken 416 times.
7072 for (x = 0; x < 16; x++)
1112 6656 s->dequant4_coeff[q][(x >> 2) | ((x << 2) & 0xF)] =
1113 6656 ((uint32_t)ff_h264_dequant4_coeff_init[idx][(x & 1) + ((x >> 2) & 1)] * 16) << shift;
1114 }
1115 8 }
1116
1117 8 static av_cold int svq3_decode_init(AVCodecContext *avctx)
1118 {
1119 8 SVQ3Context *s = avctx->priv_data;
1120 int m, x, y;
1121 unsigned char *extradata;
1122 unsigned char *extradata_end;
1123 unsigned int size;
1124 8 int marker_found = 0;
1125 int ret;
1126
1127 8 s->cur_pic = &s->frames[0];
1128 8 s->last_pic = &s->frames[1];
1129 8 s->next_pic = &s->frames[2];
1130
1131 8 s->cur_pic->f = av_frame_alloc();
1132 8 s->last_pic->f = av_frame_alloc();
1133 8 s->next_pic->f = av_frame_alloc();
1134
3/6
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 8 times.
8 if (!s->cur_pic->f || !s->last_pic->f || !s->next_pic->f)
1135 return AVERROR(ENOMEM);
1136
1137 8 ff_h264dsp_init(&s->h264dsp, 8, 1);
1138 8 ff_h264_pred_init(&s->hpc, AV_CODEC_ID_SVQ3, 8, 1);
1139 8 ff_videodsp_init(&s->vdsp, 8);
1140
1141
1142 8 avctx->bits_per_raw_sample = 8;
1143
1144 8 ff_hpeldsp_init(&s->hdsp, avctx->flags);
1145 8 ff_tpeldsp_init(&s->tdsp);
1146
1147 8 avctx->pix_fmt = AV_PIX_FMT_YUVJ420P;
1148 8 avctx->color_range = AVCOL_RANGE_JPEG;
1149
1150 8 s->avctx = avctx;
1151 8 s->halfpel_flag = 1;
1152 8 s->thirdpel_flag = 1;
1153 8 s->has_watermark = 0;
1154
1155 /* prowl for the "SEQH" marker in the extradata */
1156 8 extradata = (unsigned char *)avctx->extradata;
1157 8 extradata_end = avctx->extradata + avctx->extradata_size;
1158
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
8 if (extradata) {
1159
1/2
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
72 for (m = 0; m + 8 < avctx->extradata_size; m++) {
1160
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 64 times.
72 if (!memcmp(extradata, "SEQH", 4)) {
1161 8 marker_found = 1;
1162 8 break;
1163 }
1164 64 extradata++;
1165 }
1166 }
1167
1168 /* if a match was found, parse the extra data */
1169
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
8 if (marker_found) {
1170 GetBitContext gb;
1171 int frame_size_code;
1172 int unk0, unk1, unk2, unk3, unk4;
1173 int w,h;
1174
1175 8 size = AV_RB32(&extradata[4]);
1176
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 if (size > extradata_end - extradata - 8)
1177 return AVERROR_INVALIDDATA;
1178 8 init_get_bits(&gb, extradata + 8, size * 8);
1179
1180 /* 'frame size code' and optional 'width, height' */
1181 8 frame_size_code = get_bits(&gb, 3);
1182
2/9
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 6 times.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
8 switch (frame_size_code) {
1183 case 0:
1184 w = 160;
1185 h = 120;
1186 break;
1187 case 1:
1188 w = 128;
1189 h = 96;
1190 break;
1191 case 2:
1192 w = 176;
1193 h = 144;
1194 break;
1195 case 3:
1196 w = 352;
1197 h = 288;
1198 break;
1199 case 4:
1200 w = 704;
1201 h = 576;
1202 break;
1203 case 5:
1204 w = 240;
1205 h = 180;
1206 break;
1207 6 case 6:
1208 6 w = 320;
1209 6 h = 240;
1210 6 break;
1211 2 case 7:
1212 2 w = get_bits(&gb, 12);
1213 2 h = get_bits(&gb, 12);
1214 2 break;
1215 }
1216 8 ret = ff_set_dimensions(avctx, w, h);
1217
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 if (ret < 0)
1218 return ret;
1219
1220 8 s->halfpel_flag = get_bits1(&gb);
1221 8 s->thirdpel_flag = get_bits1(&gb);
1222
1223 /* unknown fields */
1224 8 unk0 = get_bits1(&gb);
1225 8 unk1 = get_bits1(&gb);
1226 8 unk2 = get_bits1(&gb);
1227 8 unk3 = get_bits1(&gb);
1228
1229 8 s->low_delay = get_bits1(&gb);
1230
1231 /* unknown field */
1232 8 unk4 = get_bits1(&gb);
1233
1234 8 av_log(avctx, AV_LOG_DEBUG, "Unknown fields %d %d %d %d %d\n",
1235 unk0, unk1, unk2, unk3, unk4);
1236
1237
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
8 if (skip_1stop_8data_bits(&gb) < 0)
1238 return AVERROR_INVALIDDATA;
1239
1240 8 s->has_watermark = get_bits1(&gb);
1241 8 avctx->has_b_frames = !s->low_delay;
1242
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
8 if (s->has_watermark) {
1243 #if CONFIG_ZLIB
1244 2 unsigned watermark_width = get_interleaved_ue_golomb(&gb);
1245 2 unsigned watermark_height = get_interleaved_ue_golomb(&gb);
1246 2 int u1 = get_interleaved_ue_golomb(&gb);
1247 2 int u2 = get_bits(&gb, 8);
1248 2 int u3 = get_bits(&gb, 2);
1249 2 int u4 = get_interleaved_ue_golomb(&gb);
1250 2 unsigned long buf_len = watermark_width *
1251 2 watermark_height * 4;
1252 2 int offset = get_bits_count(&gb) + 7 >> 3;
1253 uint8_t *buf;
1254
1255
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 if (watermark_height <= 0 ||
1256
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 (uint64_t)watermark_width * 4 > UINT_MAX / watermark_height)
1257 return AVERROR_INVALIDDATA;
1258
1259 2 buf = av_malloc(buf_len);
1260
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (!buf)
1261 return AVERROR(ENOMEM);
1262
1263 2 av_log(avctx, AV_LOG_DEBUG, "watermark size: %ux%u\n",
1264 watermark_width, watermark_height);
1265 2 av_log(avctx, AV_LOG_DEBUG,
1266 "u1: %x u2: %x u3: %x compressed data size: %d offset: %d\n",
1267 u1, u2, u3, u4, offset);
1268
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (uncompress(buf, &buf_len, extradata + 8 + offset,
1269 2 size - offset) != Z_OK) {
1270 av_log(avctx, AV_LOG_ERROR,
1271 "could not uncompress watermark logo\n");
1272 av_free(buf);
1273 return -1;
1274 }
1275 2 s->watermark_key = av_bswap16(av_crc(av_crc_get_table(AV_CRC_16_CCITT), 0, buf, buf_len));
1276
1277 2 s->watermark_key = s->watermark_key << 16 | s->watermark_key;
1278 2 av_log(avctx, AV_LOG_DEBUG,
1279 "watermark key %#"PRIx32"\n", s->watermark_key);
1280 2 av_free(buf);
1281 #else
1282 av_log(avctx, AV_LOG_ERROR,
1283 "this svq3 file contains watermark which need zlib support compiled in\n");
1284 return AVERROR(ENOSYS);
1285 #endif
1286 }
1287 }
1288
1289 8 s->mb_width = (avctx->width + 15) / 16;
1290 8 s->mb_height = (avctx->height + 15) / 16;
1291 8 s->mb_stride = s->mb_width + 1;
1292 8 s->mb_num = s->mb_width * s->mb_height;
1293 8 s->b_stride = 4 * s->mb_width;
1294 8 s->h_edge_pos = s->mb_width * 16;
1295 8 s->v_edge_pos = s->mb_height * 16;
1296
1297 8 s->intra4x4_pred_mode = av_mallocz(s->mb_stride * 2 * 8);
1298
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 if (!s->intra4x4_pred_mode)
1299 return AVERROR(ENOMEM);
1300
1301 8 s->mb2br_xy = av_mallocz(s->mb_stride * (s->mb_height + 1) *
1302 sizeof(*s->mb2br_xy));
1303
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 if (!s->mb2br_xy)
1304 return AVERROR(ENOMEM);
1305
1306
2/2
✓ Branch 0 taken 120 times.
✓ Branch 1 taken 8 times.
128 for (y = 0; y < s->mb_height; y++)
1307
2/2
✓ Branch 0 taken 2340 times.
✓ Branch 1 taken 120 times.
2460 for (x = 0; x < s->mb_width; x++) {
1308 2340 const int mb_xy = x + y * s->mb_stride;
1309
1310 2340 s->mb2br_xy[mb_xy] = 8 * (mb_xy % (2 * s->mb_stride));
1311 }
1312
1313 8 init_dequant4_coeff_table(s);
1314
1315 8 return 0;
1316 }
1317
1318 24 static void free_picture(SVQ3Frame *pic)
1319 {
1320 int i;
1321
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 24 times.
72 for (i = 0; i < 2; i++) {
1322 48 av_freep(&pic->motion_val_buf[i]);
1323 }
1324 24 av_freep(&pic->mb_type_buf);
1325
1326 24 av_frame_unref(pic->f);
1327 24 }
1328
1329 2810 static int get_buffer(AVCodecContext *avctx, SVQ3Frame *pic)
1330 {
1331 2810 SVQ3Context *s = avctx->priv_data;
1332 2810 const int big_mb_num = s->mb_stride * (s->mb_height + 1) + 1;
1333 2810 const int b4_stride = s->mb_width * 4 + 1;
1334 2810 const int b4_array_size = b4_stride * s->mb_height * 4;
1335 int ret;
1336
1337
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 2798 times.
2810 if (!pic->motion_val_buf[0]) {
1338 int i;
1339
1340 12 pic->mb_type_buf = av_calloc(big_mb_num + s->mb_stride, sizeof(uint32_t));
1341
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
12 if (!pic->mb_type_buf)
1342 return AVERROR(ENOMEM);
1343 12 pic->mb_type = pic->mb_type_buf + 2 * s->mb_stride + 1;
1344
1345
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 12 times.
36 for (i = 0; i < 2; i++) {
1346 24 pic->motion_val_buf[i] = av_calloc(b4_array_size + 4, 2 * sizeof(int16_t));
1347
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 24 times.
24 if (!pic->motion_val_buf[i]) {
1348 ret = AVERROR(ENOMEM);
1349 goto fail;
1350 }
1351
1352 24 pic->motion_val[i] = pic->motion_val_buf[i] + 4;
1353 }
1354 }
1355
1356 2810 ret = ff_get_buffer(avctx, pic->f,
1357 2810 (s->pict_type != AV_PICTURE_TYPE_B) ?
1358 AV_GET_BUFFER_FLAG_REF : 0);
1359
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2810 times.
2810 if (ret < 0)
1360 goto fail;
1361
1362
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2806 times.
2810 if (!s->edge_emu_buffer) {
1363 4 s->edge_emu_buffer = av_calloc(pic->f->linesize[0], 17);
1364
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 if (!s->edge_emu_buffer)
1365 return AVERROR(ENOMEM);
1366 }
1367
1368 2810 return 0;
1369 fail:
1370 free_picture(pic);
1371 return ret;
1372 }
1373
1374 2816 static int svq3_decode_frame(AVCodecContext *avctx, AVFrame *rframe,
1375 int *got_frame, AVPacket *avpkt)
1376 {
1377 2816 SVQ3Context *s = avctx->priv_data;
1378 2816 int buf_size = avpkt->size;
1379 int left;
1380 int ret, m, i;
1381
1382 /* special case for last picture */
1383
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 2810 times.
2816 if (buf_size == 0) {
1384
4/6
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✓ Branch 5 taken 3 times.
6 if (s->next_pic->f->data[0] && !s->low_delay && !s->last_frame_output) {
1385 3 ret = av_frame_ref(rframe, s->next_pic->f);
1386
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if (ret < 0)
1387 return ret;
1388 3 s->last_frame_output = 1;
1389 3 *got_frame = 1;
1390 }
1391 6 return 0;
1392 }
1393
1394 2810 s->mb_x = s->mb_y = s->mb_xy = 0;
1395
1396 2810 ret = init_get_bits8(&s->gb, avpkt->data, avpkt->size);
1397
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2810 times.
2810 if (ret < 0)
1398 return ret;
1399
1400
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2810 times.
2810 if (svq3_decode_slice_header(avctx))
1401 return -1;
1402
1403
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2810 times.
2810 if (avpkt->size < s->mb_width * s->mb_height / 8)
1404 return AVERROR_INVALIDDATA;
1405
1406 2810 s->pict_type = s->slice_type;
1407
1408
2/2
✓ Branch 0 taken 2806 times.
✓ Branch 1 taken 4 times.
2810 if (s->pict_type != AV_PICTURE_TYPE_B)
1409 2806 FFSWAP(SVQ3Frame*, s->next_pic, s->last_pic);
1410
1411 2810 av_frame_unref(s->cur_pic->f);
1412
1413 /* for skipping the frame */
1414 2810 s->cur_pic->f->pict_type = s->pict_type;
1415
2/2
✓ Branch 0 taken 64 times.
✓ Branch 1 taken 2746 times.
2810 if (s->pict_type == AV_PICTURE_TYPE_I)
1416 64 s->cur_pic->f->flags |= AV_FRAME_FLAG_KEY;
1417 else
1418 2746 s->cur_pic->f->flags &= ~AV_FRAME_FLAG_KEY;
1419
1420 2810 ret = get_buffer(avctx, s->cur_pic);
1421
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2810 times.
2810 if (ret < 0)
1422 return ret;
1423
1424
2/2
✓ Branch 0 taken 44960 times.
✓ Branch 1 taken 2810 times.
47770 for (i = 0; i < 16; i++) {
1425 44960 s->block_offset[i] = (4 * ((scan8[i] - scan8[0]) & 7)) + 4 * s->cur_pic->f->linesize[0] * ((scan8[i] - scan8[0]) >> 3);
1426 44960 s->block_offset[48 + i] = (4 * ((scan8[i] - scan8[0]) & 7)) + 8 * s->cur_pic->f->linesize[0] * ((scan8[i] - scan8[0]) >> 3);
1427 }
1428
2/2
✓ Branch 0 taken 44960 times.
✓ Branch 1 taken 2810 times.
47770 for (i = 0; i < 16; i++) {
1429 44960 s->block_offset[16 + i] =
1430 44960 s->block_offset[32 + i] = (4 * ((scan8[i] - scan8[0]) & 7)) + 4 * s->cur_pic->f->linesize[1] * ((scan8[i] - scan8[0]) >> 3);
1431 44960 s->block_offset[48 + 16 + i] =
1432 44960 s->block_offset[48 + 32 + i] = (4 * ((scan8[i] - scan8[0]) & 7)) + 8 * s->cur_pic->f->linesize[1] * ((scan8[i] - scan8[0]) >> 3);
1433 }
1434
1435
2/2
✓ Branch 0 taken 2746 times.
✓ Branch 1 taken 64 times.
2810 if (s->pict_type != AV_PICTURE_TYPE_I) {
1436
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2746 times.
2746 if (!s->last_pic->f->data[0]) {
1437 av_log(avctx, AV_LOG_ERROR, "Missing reference frame.\n");
1438 av_frame_unref(s->last_pic->f);
1439 ret = get_buffer(avctx, s->last_pic);
1440 if (ret < 0)
1441 return ret;
1442 memset(s->last_pic->f->data[0], 0, avctx->height * s->last_pic->f->linesize[0]);
1443 memset(s->last_pic->f->data[1], 0x80, (avctx->height / 2) *
1444 s->last_pic->f->linesize[1]);
1445 memset(s->last_pic->f->data[2], 0x80, (avctx->height / 2) *
1446 s->last_pic->f->linesize[2]);
1447 }
1448
1449
3/4
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2742 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
2746 if (s->pict_type == AV_PICTURE_TYPE_B && !s->next_pic->f->data[0]) {
1450 av_log(avctx, AV_LOG_ERROR, "Missing reference frame.\n");
1451 av_frame_unref(s->next_pic->f);
1452 ret = get_buffer(avctx, s->next_pic);
1453 if (ret < 0)
1454 return ret;
1455 memset(s->next_pic->f->data[0], 0, avctx->height * s->next_pic->f->linesize[0]);
1456 memset(s->next_pic->f->data[1], 0x80, (avctx->height / 2) *
1457 s->next_pic->f->linesize[1]);
1458 memset(s->next_pic->f->data[2], 0x80, (avctx->height / 2) *
1459 s->next_pic->f->linesize[2]);
1460 }
1461 }
1462
1463
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2810 times.
2810 if (avctx->debug & FF_DEBUG_PICT_INFO)
1464 av_log(s->avctx, AV_LOG_DEBUG,
1465 "%c hpel:%d, tpel:%d aqp:%d qp:%d, slice_num:%02X\n",
1466 av_get_picture_type_char(s->pict_type),
1467 s->halfpel_flag, s->thirdpel_flag,
1468 s->adaptive_quant, s->qscale, s->slice_num);
1469
1470
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2810 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2810 if (avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type == AV_PICTURE_TYPE_B ||
1471
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2810 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2810 avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type != AV_PICTURE_TYPE_I ||
1472
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2810 times.
2810 avctx->skip_frame >= AVDISCARD_ALL)
1473 return 0;
1474
1475
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2806 times.
2810 if (s->pict_type == AV_PICTURE_TYPE_B) {
1476 4 s->frame_num_offset = s->slice_num - s->prev_frame_num;
1477
1478
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 if (s->frame_num_offset < 0)
1479 s->frame_num_offset += 256;
1480
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 if (s->frame_num_offset == 0 ||
1481
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 s->frame_num_offset >= s->prev_frame_num_offset) {
1482 av_log(s->avctx, AV_LOG_ERROR, "error in B-frame picture id\n");
1483 return -1;
1484 }
1485 } else {
1486 2806 s->prev_frame_num = s->frame_num;
1487 2806 s->frame_num = s->slice_num;
1488 2806 s->prev_frame_num_offset = s->frame_num - s->prev_frame_num;
1489
1490
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 2796 times.
2806 if (s->prev_frame_num_offset < 0)
1491 10 s->prev_frame_num_offset += 256;
1492 }
1493
1494
2/2
✓ Branch 0 taken 5620 times.
✓ Branch 1 taken 2810 times.
8430 for (m = 0; m < 2; m++) {
1495 int i;
1496
2/2
✓ Branch 0 taken 22480 times.
✓ Branch 1 taken 5620 times.
28100 for (i = 0; i < 4; i++) {
1497 int j;
1498
2/2
✓ Branch 0 taken 112400 times.
✓ Branch 1 taken 22480 times.
134880 for (j = -1; j < 4; j++)
1499 112400 s->ref_cache[m][scan8[0] + 8 * i + j] = 1;
1500
2/2
✓ Branch 0 taken 16860 times.
✓ Branch 1 taken 5620 times.
22480 if (i < 3)
1501 16860 s->ref_cache[m][scan8[0] + 8 * i + j] = PART_NOT_AVAILABLE;
1502 }
1503 }
1504
1505
2/2
✓ Branch 0 taken 42150 times.
✓ Branch 1 taken 2810 times.
44960 for (s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) {
1506
2/2
✓ Branch 0 taken 842700 times.
✓ Branch 1 taken 42150 times.
884850 for (s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) {
1507 unsigned mb_type;
1508 842700 s->mb_xy = s->mb_x + s->mb_y * s->mb_stride;
1509
1510
2/2
✓ Branch 1 taken 3847 times.
✓ Branch 2 taken 838853 times.
842700 if ((get_bits_left(&s->gb_slice)) <= 7) {
1511
2/4
✓ Branch 1 taken 3847 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 3847 times.
7694 if (((get_bits_count(&s->gb_slice) & 7) == 0 ||
1512 3847 show_bits(&s->gb_slice, get_bits_left(&s->gb_slice) & 7) == 0)) {
1513
1514 if (svq3_decode_slice_header(avctx))
1515 return -1;
1516 }
1517
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3847 times.
3847 if (s->slice_type != s->pict_type) {
1518 avpriv_request_sample(avctx, "non constant slice type");
1519 }
1520 /* TODO: support s->mb_skip_run */
1521 }
1522
1523 842700 mb_type = get_interleaved_ue_golomb(&s->gb_slice);
1524
1525
2/2
✓ Branch 0 taken 19170 times.
✓ Branch 1 taken 823530 times.
842700 if (s->pict_type == AV_PICTURE_TYPE_I)
1526 19170 mb_type += 8;
1527
4/4
✓ Branch 0 taken 1080 times.
✓ Branch 1 taken 822450 times.
✓ Branch 2 taken 22 times.
✓ Branch 3 taken 1058 times.
823530 else if (s->pict_type == AV_PICTURE_TYPE_B && mb_type >= 4)
1528 22 mb_type += 4;
1529
2/4
✓ Branch 0 taken 842700 times.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 842700 times.
842700 if (mb_type > 33 || svq3_decode_mb(s, mb_type)) {
1530 av_log(s->avctx, AV_LOG_ERROR,
1531 "error while decoding MB %d %d\n", s->mb_x, s->mb_y);
1532 return -1;
1533 }
1534
1535
4/4
✓ Branch 0 taken 353906 times.
✓ Branch 1 taken 488794 times.
✓ Branch 2 taken 60 times.
✓ Branch 3 taken 353846 times.
842700 if (mb_type != 0 || s->cbp)
1536 488854 hl_decode_mb(s);
1537
1538
3/4
✓ Branch 0 taken 841620 times.
✓ Branch 1 taken 1080 times.
✓ Branch 2 taken 841620 times.
✗ Branch 3 not taken.
842700 if (s->pict_type != AV_PICTURE_TYPE_B && !s->low_delay)
1539 841620 s->cur_pic->mb_type[s->mb_x + s->mb_y * s->mb_stride] =
1540
4/4
✓ Branch 0 taken 822450 times.
✓ Branch 1 taken 19170 times.
✓ Branch 2 taken 791055 times.
✓ Branch 3 taken 31395 times.
841620 (s->pict_type == AV_PICTURE_TYPE_P && mb_type < 8) ? (mb_type - 1) : -1;
1541 }
1542
1543 42150 ff_draw_horiz_band(avctx, s->cur_pic->f,
1544 42090 s->last_pic->f->data[0] ? s->last_pic->f : NULL,
1545
2/2
✓ Branch 0 taken 42090 times.
✓ Branch 1 taken 60 times.
42150 16 * s->mb_y, 16, PICT_FRAME, 0,
1546 s->low_delay);
1547 }
1548
1549 2810 left = buf_size*8 - get_bits_count(&s->gb_slice);
1550
1551
2/4
✓ Branch 0 taken 2810 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2810 times.
2810 if (s->mb_y != s->mb_height || s->mb_x != s->mb_width) {
1552 av_log(avctx, AV_LOG_INFO, "frame num %"PRId64" incomplete pic x %d y %d left %d\n", avctx->frame_num, s->mb_y, s->mb_x, left);
1553 //av_hex_dump(stderr, buf+buf_size-8, 8);
1554 }
1555
1556
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2810 times.
2810 if (left < 0) {
1557 av_log(avctx, AV_LOG_ERROR, "frame num %"PRId64" left %d\n", avctx->frame_num, left);
1558 return -1;
1559 }
1560
1561
3/4
✓ Branch 0 taken 2806 times.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2806 times.
2810 if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay)
1562 4 ret = av_frame_ref(rframe, s->cur_pic->f);
1563
2/2
✓ Branch 0 taken 2802 times.
✓ Branch 1 taken 4 times.
2806 else if (s->last_pic->f->data[0])
1564 2802 ret = av_frame_ref(rframe, s->last_pic->f);
1565
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2810 times.
2810 if (ret < 0)
1566 return ret;
1567
1568 /* Do not output the last pic after seeking. */
1569
3/4
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2806 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
2810 if (s->last_pic->f->data[0] || s->low_delay)
1570 2806 *got_frame = 1;
1571
1572
2/2
✓ Branch 0 taken 2806 times.
✓ Branch 1 taken 4 times.
2810 if (s->pict_type != AV_PICTURE_TYPE_B) {
1573 2806 FFSWAP(SVQ3Frame*, s->cur_pic, s->next_pic);
1574 } else {
1575 4 av_frame_unref(s->cur_pic->f);
1576 }
1577
1578 2810 return buf_size;
1579 }
1580
1581 8 static av_cold int svq3_decode_end(AVCodecContext *avctx)
1582 {
1583 8 SVQ3Context *s = avctx->priv_data;
1584
1585
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 8 times.
32 for (int i = 0; i < FF_ARRAY_ELEMS(s->frames); i++) {
1586 24 free_picture(&s->frames[i]);
1587 24 av_frame_free(&s->frames[i].f);
1588 }
1589 8 av_freep(&s->slice_buf);
1590 8 av_freep(&s->intra4x4_pred_mode);
1591 8 av_freep(&s->edge_emu_buffer);
1592 8 av_freep(&s->mb2br_xy);
1593
1594 8 return 0;
1595 }
1596
1597 const FFCodec ff_svq3_decoder = {
1598 .p.name = "svq3",
1599 CODEC_LONG_NAME("Sorenson Vector Quantizer 3 / Sorenson Video 3 / SVQ3"),
1600 .p.type = AVMEDIA_TYPE_VIDEO,
1601 .p.id = AV_CODEC_ID_SVQ3,
1602 .priv_data_size = sizeof(SVQ3Context),
1603 .init = svq3_decode_init,
1604 .close = svq3_decode_end,
1605 FF_CODEC_DECODE_CB(svq3_decode_frame),
1606 .p.capabilities = AV_CODEC_CAP_DRAW_HORIZ_BAND |
1607 AV_CODEC_CAP_DR1 |
1608 AV_CODEC_CAP_DELAY,
1609 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
1610 };
1611