FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/svq3.c
Date: 2025-10-17 04:29:00
Exec Total Coverage
Lines: 687 830 82.8%
Functions: 18 19 94.7%
Branches: 437 565 77.3%

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 #define NUM_PICS 3
75
76 typedef struct SVQ3Frame {
77 AVFrame *f;
78
79 int16_t (*motion_val[2])[2];
80
81 uint32_t *mb_type;
82 } SVQ3Frame;
83
84 typedef struct SVQ3Context {
85 AVCodecContext *avctx;
86
87 H264DSPContext h264dsp;
88 H264PredContext hpc;
89 HpelDSPContext hdsp;
90 TpelDSPContext tdsp;
91 VideoDSPContext vdsp;
92
93 SVQ3Frame *cur_pic;
94 SVQ3Frame *next_pic;
95 SVQ3Frame *last_pic;
96 GetBitContext gb;
97 GetBitContext gb_slice;
98 uint8_t *slice_buf;
99 unsigned slice_buf_size;
100 int halfpel_flag;
101 int thirdpel_flag;
102 int has_watermark;
103 uint32_t watermark_key;
104 int adaptive_quant;
105 int h_edge_pos;
106 int v_edge_pos;
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[NUM_PICS];
146
147 uint32_t *mb_type_buf;
148 int16_t (*motion_val_buf)[2];
149 } SVQ3Context;
150
151 #define FULLPEL_MODE 1
152 #define HALFPEL_MODE 2
153 #define THIRDPEL_MODE 3
154 #define PREDICT_MODE 4
155
156 /* dual scan (from some older H.264 draft)
157 * o-->o-->o o
158 * | /|
159 * o o o / o
160 * | / | |/ |
161 * o o o o
162 * /
163 * o-->o-->o-->o
164 */
165 static const uint8_t svq3_scan[16] = {
166 0 + 0 * 4, 1 + 0 * 4, 2 + 0 * 4, 2 + 1 * 4,
167 2 + 2 * 4, 3 + 0 * 4, 3 + 1 * 4, 3 + 2 * 4,
168 0 + 1 * 4, 0 + 2 * 4, 1 + 1 * 4, 1 + 2 * 4,
169 0 + 3 * 4, 1 + 3 * 4, 2 + 3 * 4, 3 + 3 * 4,
170 };
171
172 static const uint8_t luma_dc_zigzag_scan[16] = {
173 0 * 16 + 0 * 64, 1 * 16 + 0 * 64, 2 * 16 + 0 * 64, 0 * 16 + 2 * 64,
174 3 * 16 + 0 * 64, 0 * 16 + 1 * 64, 1 * 16 + 1 * 64, 2 * 16 + 1 * 64,
175 1 * 16 + 2 * 64, 2 * 16 + 2 * 64, 3 * 16 + 2 * 64, 0 * 16 + 3 * 64,
176 3 * 16 + 1 * 64, 1 * 16 + 3 * 64, 2 * 16 + 3 * 64, 3 * 16 + 3 * 64,
177 };
178
179 static const uint8_t svq3_pred_0[25][2] = {
180 { 0, 0 },
181 { 1, 0 }, { 0, 1 },
182 { 0, 2 }, { 1, 1 }, { 2, 0 },
183 { 3, 0 }, { 2, 1 }, { 1, 2 }, { 0, 3 },
184 { 0, 4 }, { 1, 3 }, { 2, 2 }, { 3, 1 }, { 4, 0 },
185 { 4, 1 }, { 3, 2 }, { 2, 3 }, { 1, 4 },
186 { 2, 4 }, { 3, 3 }, { 4, 2 },
187 { 4, 3 }, { 3, 4 },
188 { 4, 4 }
189 };
190
191 static const int8_t svq3_pred_1[6][6][5] = {
192 { { 2, -1, -1, -1, -1 }, { 2, 1, -1, -1, -1 }, { 1, 2, -1, -1, -1 },
193 { 2, 1, -1, -1, -1 }, { 1, 2, -1, -1, -1 }, { 1, 2, -1, -1, -1 } },
194 { { 0, 2, -1, -1, -1 }, { 0, 2, 1, 4, 3 }, { 0, 1, 2, 4, 3 },
195 { 0, 2, 1, 4, 3 }, { 2, 0, 1, 3, 4 }, { 0, 4, 2, 1, 3 } },
196 { { 2, 0, -1, -1, -1 }, { 2, 1, 0, 4, 3 }, { 1, 2, 4, 0, 3 },
197 { 2, 1, 0, 4, 3 }, { 2, 1, 4, 3, 0 }, { 1, 2, 4, 0, 3 } },
198 { { 2, 0, -1, -1, -1 }, { 2, 0, 1, 4, 3 }, { 1, 2, 0, 4, 3 },
199 { 2, 1, 0, 4, 3 }, { 2, 1, 3, 4, 0 }, { 2, 4, 1, 0, 3 } },
200 { { 0, 2, -1, -1, -1 }, { 0, 2, 1, 3, 4 }, { 1, 2, 3, 0, 4 },
201 { 2, 0, 1, 3, 4 }, { 2, 1, 3, 0, 4 }, { 2, 0, 4, 3, 1 } },
202 { { 0, 2, -1, -1, -1 }, { 0, 2, 4, 1, 3 }, { 1, 4, 2, 0, 3 },
203 { 4, 2, 0, 1, 3 }, { 2, 0, 1, 4, 3 }, { 4, 2, 1, 0, 3 } },
204 };
205
206 static const struct {
207 uint8_t run;
208 uint8_t level;
209 } svq3_dct_tables[2][16] = {
210 { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 2, 1 }, { 0, 2 }, { 3, 1 }, { 4, 1 }, { 5, 1 },
211 { 0, 3 }, { 1, 2 }, { 2, 2 }, { 6, 1 }, { 7, 1 }, { 8, 1 }, { 9, 1 }, { 0, 4 } },
212 { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 0, 2 }, { 2, 1 }, { 0, 3 }, { 0, 4 }, { 0, 5 },
213 { 3, 1 }, { 4, 1 }, { 1, 2 }, { 1, 3 }, { 0, 6 }, { 0, 7 }, { 0, 8 }, { 0, 9 } }
214 };
215
216 static const uint32_t svq3_dequant_coeff[32] = {
217 3881, 4351, 4890, 5481, 6154, 6914, 7761, 8718,
218 9781, 10987, 12339, 13828, 15523, 17435, 19561, 21873,
219 24552, 27656, 30847, 34870, 38807, 43747, 49103, 54683,
220 61694, 68745, 77615, 89113, 100253, 109366, 126635, 141533
221 };
222
223 2537 static void svq3_luma_dc_dequant_idct_c(int16_t *output, int16_t *input, int qp)
224 {
225 2537 const unsigned qmul = svq3_dequant_coeff[qp];
226 #define stride 16
227 int i;
228 int temp[16];
229 static const uint8_t x_offset[4] = { 0, 1 * stride, 4 * stride, 5 * stride };
230
231
2/2
✓ Branch 0 taken 10148 times.
✓ Branch 1 taken 2537 times.
12685 for (i = 0; i < 4; i++) {
232 10148 const int z0 = 13 * (input[4 * i + 0] + input[4 * i + 2]);
233 10148 const int z1 = 13 * (input[4 * i + 0] - input[4 * i + 2]);
234 10148 const int z2 = 7 * input[4 * i + 1] - 17 * input[4 * i + 3];
235 10148 const int z3 = 17 * input[4 * i + 1] + 7 * input[4 * i + 3];
236
237 10148 temp[4 * i + 0] = z0 + z3;
238 10148 temp[4 * i + 1] = z1 + z2;
239 10148 temp[4 * i + 2] = z1 - z2;
240 10148 temp[4 * i + 3] = z0 - z3;
241 }
242
243
2/2
✓ Branch 0 taken 10148 times.
✓ Branch 1 taken 2537 times.
12685 for (i = 0; i < 4; i++) {
244 10148 const int offset = x_offset[i];
245 10148 const int z0 = 13 * (temp[4 * 0 + i] + temp[4 * 2 + i]);
246 10148 const int z1 = 13 * (temp[4 * 0 + i] - temp[4 * 2 + i]);
247 10148 const int z2 = 7 * temp[4 * 1 + i] - 17 * temp[4 * 3 + i];
248 10148 const int z3 = 17 * temp[4 * 1 + i] + 7 * temp[4 * 3 + i];
249
250 10148 output[stride * 0 + offset] = (int)((z0 + z3) * qmul + 0x80000) >> 20;
251 10148 output[stride * 2 + offset] = (int)((z1 + z2) * qmul + 0x80000) >> 20;
252 10148 output[stride * 8 + offset] = (int)((z1 - z2) * qmul + 0x80000) >> 20;
253 10148 output[stride * 10 + offset] = (int)((z0 - z3) * qmul + 0x80000) >> 20;
254 }
255 2537 }
256 #undef stride
257
258 4013303 static void svq3_add_idct_c(uint8_t *dst, int16_t *block,
259 int stride, int qp, int dc)
260 {
261 4013303 const int qmul = svq3_dequant_coeff[qp];
262 int i;
263
264
2/2
✓ Branch 0 taken 998979 times.
✓ Branch 1 taken 3014324 times.
4013303 if (dc) {
265
2/2
✓ Branch 0 taken 26094 times.
✓ Branch 1 taken 972885 times.
998979 dc = 13 * 13 * (dc == 1 ? 1538U* block[0]
266 972885 : qmul * (block[0] >> 3) / 2);
267 998979 block[0] = 0;
268 }
269
270
2/2
✓ Branch 0 taken 16053212 times.
✓ Branch 1 taken 4013303 times.
20066515 for (i = 0; i < 4; i++) {
271 16053212 const int z0 = 13 * (block[0 + 4 * i] + block[2 + 4 * i]);
272 16053212 const int z1 = 13 * (block[0 + 4 * i] - block[2 + 4 * i]);
273 16053212 const int z2 = 7 * block[1 + 4 * i] - 17 * block[3 + 4 * i];
274 16053212 const int z3 = 17 * block[1 + 4 * i] + 7 * block[3 + 4 * i];
275
276 16053212 block[0 + 4 * i] = z0 + z3;
277 16053212 block[1 + 4 * i] = z1 + z2;
278 16053212 block[2 + 4 * i] = z1 - z2;
279 16053212 block[3 + 4 * i] = z0 - z3;
280 }
281
282
2/2
✓ Branch 0 taken 16053212 times.
✓ Branch 1 taken 4013303 times.
20066515 for (i = 0; i < 4; i++) {
283 16053212 const unsigned z0 = 13 * (block[i + 4 * 0] + block[i + 4 * 2]);
284 16053212 const unsigned z1 = 13 * (block[i + 4 * 0] - block[i + 4 * 2]);
285 16053212 const unsigned z2 = 7 * block[i + 4 * 1] - 17 * block[i + 4 * 3];
286 16053212 const unsigned z3 = 17 * block[i + 4 * 1] + 7 * block[i + 4 * 3];
287 16053212 const int rr = (dc + 0x80000u);
288
289 16053212 dst[i + stride * 0] = av_clip_uint8(dst[i + stride * 0] + ((int)((z0 + z3) * qmul + rr) >> 20));
290 16053212 dst[i + stride * 1] = av_clip_uint8(dst[i + stride * 1] + ((int)((z1 + z2) * qmul + rr) >> 20));
291 16053212 dst[i + stride * 2] = av_clip_uint8(dst[i + stride * 2] + ((int)((z1 - z2) * qmul + rr) >> 20));
292 16053212 dst[i + stride * 3] = av_clip_uint8(dst[i + stride * 3] + ((int)((z0 - z3) * qmul + rr) >> 20));
293 }
294
295 4013303 memset(block, 0, 16 * sizeof(int16_t));
296 4013303 }
297
298 3881601 static inline int svq3_decode_block(GetBitContext *gb, int16_t *block,
299 int index, const int type)
300 {
301 static const uint8_t *const scan_patterns[4] = {
302 luma_dc_zigzag_scan, ff_zigzag_scan, svq3_scan, ff_h264_chroma_dc_scan
303 };
304
305 int run, level, sign, limit;
306 unsigned vlc;
307 3881601 const int intra = 3 * type >> 2;
308 3881601 const uint8_t *const scan = scan_patterns[type];
309
310
2/2
✓ Branch 0 taken 4441509 times.
✓ Branch 1 taken 559908 times.
5001417 for (limit = (16 >> intra); index < 16; index = limit, limit += 8) {
311
2/2
✓ Branch 1 taken 5377025 times.
✓ Branch 2 taken 4441509 times.
9818534 for (; (vlc = get_interleaved_ue_golomb(gb)) != 0; index++) {
312
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5377025 times.
5377025 if ((int32_t)vlc < 0)
313 return -1;
314
315
2/2
✓ Branch 0 taken 2636336 times.
✓ Branch 1 taken 2740689 times.
5377025 sign = (vlc & 1) ? 0 : -1;
316 5377025 vlc = vlc + 1 >> 1;
317
318
2/2
✓ Branch 0 taken 249633 times.
✓ Branch 1 taken 5127392 times.
5377025 if (type == 3) {
319
2/2
✓ Branch 0 taken 169007 times.
✓ Branch 1 taken 80626 times.
249633 if (vlc < 3) {
320 169007 run = 0;
321 169007 level = vlc;
322
2/2
✓ Branch 0 taken 34201 times.
✓ Branch 1 taken 46425 times.
80626 } else if (vlc < 4) {
323 34201 run = 1;
324 34201 level = 1;
325 } else {
326 46425 run = vlc & 0x3;
327 46425 level = (vlc + 9 >> 2) - run;
328 }
329 } else {
330
2/2
✓ Branch 0 taken 5034991 times.
✓ Branch 1 taken 92401 times.
5127392 if (vlc < 16U) {
331 5034991 run = svq3_dct_tables[intra][vlc].run;
332 5034991 level = svq3_dct_tables[intra][vlc].level;
333
2/2
✓ Branch 0 taken 8622 times.
✓ Branch 1 taken 83779 times.
92401 } else if (intra) {
334 8622 run = vlc & 0x7;
335
6/6
✓ Branch 0 taken 5363 times.
✓ Branch 1 taken 3259 times.
✓ Branch 2 taken 3384 times.
✓ Branch 3 taken 1979 times.
✓ Branch 4 taken 3276 times.
✓ Branch 5 taken 108 times.
8622 level = (vlc >> 3) + ((run == 0) ? 8 : ((run < 2) ? 2 : ((run < 5) ? 0 : -1)));
336 } else {
337 83779 run = vlc & 0xF;
338
6/6
✓ Branch 0 taken 51410 times.
✓ Branch 1 taken 32369 times.
✓ Branch 2 taken 21766 times.
✓ Branch 3 taken 29644 times.
✓ Branch 4 taken 18682 times.
✓ Branch 5 taken 3084 times.
83779 level = (vlc >> 4) + ((run == 0) ? 4 : ((run < 3) ? 2 : ((run < 10) ? 1 : 0)));
339 }
340 }
341
342
343
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5377025 times.
5377025 if ((index += run) >= limit)
344 return -1;
345
346 5377025 block[scan[index]] = (level ^ sign) - sign;
347 }
348
349
2/2
✓ Branch 0 taken 3321693 times.
✓ Branch 1 taken 1119816 times.
4441509 if (type != 2) {
350 3321693 break;
351 }
352 }
353
354 3881601 return 0;
355 }
356
357 static av_always_inline int
358 556385 svq3_fetch_diagonal_mv(const SVQ3Context *s, const int16_t **C,
359 int i, int list, int part_width)
360 {
361 556385 const int topright_ref = s->ref_cache[list][i - 8 + part_width];
362
363
2/2
✓ Branch 0 taken 474936 times.
✓ Branch 1 taken 81449 times.
556385 if (topright_ref != PART_NOT_AVAILABLE) {
364 474936 *C = s->mv_cache[list][i - 8 + part_width];
365 474936 return topright_ref;
366 } else {
367 81449 *C = s->mv_cache[list][i - 8 - 1];
368 81449 return s->ref_cache[list][i - 8 - 1];
369 }
370 }
371
372 /**
373 * Get the predicted MV.
374 * @param n the block index
375 * @param part_width the width of the partition (4, 8,16) -> (1, 2, 4)
376 * @param mx the x component of the predicted motion vector
377 * @param my the y component of the predicted motion vector
378 */
379 556385 static av_always_inline void svq3_pred_motion(const SVQ3Context *s, int n,
380 int part_width, int list,
381 int ref, int *const mx, int *const my)
382 {
383 556385 const int index8 = scan8[n];
384 556385 const int top_ref = s->ref_cache[list][index8 - 8];
385 556385 const int left_ref = s->ref_cache[list][index8 - 1];
386 556385 const int16_t *const A = s->mv_cache[list][index8 - 1];
387 556385 const int16_t *const B = s->mv_cache[list][index8 - 8];
388 const int16_t *C;
389 int diagonal_ref, match_count;
390
391 /* mv_cache
392 * B . . A T T T T
393 * U . . L . . , .
394 * U . . L . . . .
395 * U . . L . . , .
396 * . . . L . . . .
397 */
398
399 556385 diagonal_ref = svq3_fetch_diagonal_mv(s, &C, index8, list, part_width);
400 556385 match_count = (diagonal_ref == ref) + (top_ref == ref) + (left_ref == ref);
401
2/2
✓ Branch 0 taken 532596 times.
✓ Branch 1 taken 23789 times.
556385 if (match_count > 1) { //most common
402 532596 *mx = mid_pred(A[0], B[0], C[0]);
403 532596 *my = mid_pred(A[1], B[1], C[1]);
404
1/2
✓ Branch 0 taken 23789 times.
✗ Branch 1 not taken.
23789 } else if (match_count == 1) {
405
1/2
✓ Branch 0 taken 23789 times.
✗ Branch 1 not taken.
23789 if (left_ref == ref) {
406 23789 *mx = A[0];
407 23789 *my = A[1];
408 } else if (top_ref == ref) {
409 *mx = B[0];
410 *my = B[1];
411 } else {
412 *mx = C[0];
413 *my = C[1];
414 }
415 } else {
416 if (top_ref == PART_NOT_AVAILABLE &&
417 diagonal_ref == PART_NOT_AVAILABLE &&
418 left_ref != PART_NOT_AVAILABLE) {
419 *mx = A[0];
420 *my = A[1];
421 } else {
422 *mx = mid_pred(A[0], B[0], C[0]);
423 *my = mid_pred(A[1], B[1], C[1]);
424 }
425 }
426 556385 }
427
428 911391 static inline void svq3_mc_dir_part(SVQ3Context *s,
429 int x, int y, int width, int height,
430 int mx, int my, int dxy,
431 int thirdpel, int dir, int avg)
432 {
433
2/2
✓ Branch 0 taken 910260 times.
✓ Branch 1 taken 1131 times.
911391 const SVQ3Frame *pic = (dir == 0) ? s->last_pic : s->next_pic;
434 uint8_t *src, *dest;
435 911391 int i, emu = 0;
436 911391 int blocksize = 2 - (width >> 3); // 16->0, 8->1, 4->2
437 911391 int linesize = s->cur_pic->f->linesize[0];
438 911391 int uvlinesize = s->cur_pic->f->linesize[1];
439
440 911391 mx += x;
441 911391 my += y;
442
443
6/6
✓ Branch 0 taken 905181 times.
✓ Branch 1 taken 6210 times.
✓ Branch 2 taken 873382 times.
✓ Branch 3 taken 31799 times.
✓ Branch 4 taken 870282 times.
✓ Branch 5 taken 3100 times.
911391 if (mx < 0 || mx >= s->h_edge_pos - width - 1 ||
444
2/2
✓ Branch 0 taken 47573 times.
✓ Branch 1 taken 822709 times.
870282 my < 0 || my >= s->v_edge_pos - height - 1) {
445 88682 emu = 1;
446 88682 mx = av_clip(mx, -16, s->h_edge_pos - width + 15);
447 88682 my = av_clip(my, -16, s->v_edge_pos - height + 15);
448 }
449
450 /* form component predictions */
451 911391 dest = s->cur_pic->f->data[0] + x + y * linesize;
452 911391 src = pic->f->data[0] + mx + my * linesize;
453
454
2/2
✓ Branch 0 taken 88682 times.
✓ Branch 1 taken 822709 times.
911391 if (emu) {
455 88682 s->vdsp.emulated_edge_mc(s->edge_emu_buffer, src,
456 linesize, linesize,
457 width + 1, height + 1,
458 mx, my, s->h_edge_pos, s->v_edge_pos);
459 88682 src = s->edge_emu_buffer;
460 }
461
2/2
✓ Branch 0 taken 182 times.
✓ Branch 1 taken 911209 times.
911391 if (thirdpel)
462 (avg ? s->tdsp.avg_tpel_pixels_tab
463
2/2
✓ Branch 0 taken 13 times.
✓ Branch 1 taken 169 times.
182 : s->tdsp.put_tpel_pixels_tab)[dxy](dest, src, linesize,
464 width, height);
465 else
466 (avg ? s->hdsp.avg_pixels_tab
467
2/2
✓ Branch 0 taken 1068 times.
✓ Branch 1 taken 910141 times.
911209 : s->hdsp.put_pixels_tab)[blocksize][dxy](dest, src, linesize,
468 height);
469
470
1/2
✓ Branch 0 taken 911391 times.
✗ Branch 1 not taken.
911391 if (!(s->avctx->flags & AV_CODEC_FLAG_GRAY)) {
471 911391 mx = mx + (mx < (int) x) >> 1;
472 911391 my = my + (my < (int) y) >> 1;
473 911391 width = width >> 1;
474 911391 height = height >> 1;
475 911391 blocksize++;
476
477
2/2
✓ Branch 0 taken 1822782 times.
✓ Branch 1 taken 911391 times.
2734173 for (i = 1; i < 3; i++) {
478 1822782 dest = s->cur_pic->f->data[i] + (x >> 1) + (y >> 1) * uvlinesize;
479 1822782 src = pic->f->data[i] + mx + my * uvlinesize;
480
481
2/2
✓ Branch 0 taken 177364 times.
✓ Branch 1 taken 1645418 times.
1822782 if (emu) {
482 177364 s->vdsp.emulated_edge_mc(s->edge_emu_buffer, src,
483 uvlinesize, uvlinesize,
484 width + 1, height + 1,
485 177364 mx, my, (s->h_edge_pos >> 1),
486 177364 s->v_edge_pos >> 1);
487 177364 src = s->edge_emu_buffer;
488 }
489
2/2
✓ Branch 0 taken 364 times.
✓ Branch 1 taken 1822418 times.
1822782 if (thirdpel)
490 (avg ? s->tdsp.avg_tpel_pixels_tab
491
2/2
✓ Branch 0 taken 26 times.
✓ Branch 1 taken 338 times.
364 : s->tdsp.put_tpel_pixels_tab)[dxy](dest, src,
492 uvlinesize,
493 width, height);
494 else
495 (avg ? s->hdsp.avg_pixels_tab
496
2/2
✓ Branch 0 taken 2136 times.
✓ Branch 1 taken 1820282 times.
1822418 : s->hdsp.put_pixels_tab)[blocksize][dxy](dest, src,
497 uvlinesize,
498 height);
499 }
500 }
501 911391 }
502
503 438837 static inline int svq3_mc_dir(SVQ3Context *s, int size, int mode,
504 int dir, int avg)
505 {
506 int i, j, k, mx, my, dx, dy, x, y;
507 // 0->16x16,1->8x16,2->16x8,3->8x8,4->4x8,5->8x4,6->4x4
508
2/2
✓ Branch 0 taken 438815 times.
✓ Branch 1 taken 22 times.
438837 const int part_width = ((size & 5) == 4) ? 4 : 16 >> (size & 1);
509 438837 const int part_height = 16 >> ((unsigned)(size + 1) / 3);
510
2/2
✓ Branch 0 taken 786 times.
✓ Branch 1 taken 438051 times.
438837 const int extra_width = (mode == PREDICT_MODE) ? -16 * 6 : 0;
511 438837 const int h_edge_pos = 6 * (s->h_edge_pos - part_width) - extra_width;
512 438837 const int v_edge_pos = 6 * (s->v_edge_pos - part_height) - extra_width;
513
514
2/2
✓ Branch 0 taken 478321 times.
✓ Branch 1 taken 438837 times.
917158 for (i = 0; i < 16; i += part_height)
515
2/2
✓ Branch 0 taken 557423 times.
✓ Branch 1 taken 478321 times.
1035744 for (j = 0; j < 16; j += part_width) {
516 557423 const int b_xy = (4 * s->mb_x + (j >> 2)) +
517 557423 (4 * s->mb_y + (i >> 2)) * s->b_stride;
518 int dxy;
519 557423 x = 16 * s->mb_x + j;
520 557423 y = 16 * s->mb_y + i;
521 557423 k = (j >> 2 & 1) + (i >> 1 & 2) +
522 557423 (j >> 1 & 4) + (i & 8);
523
524
2/2
✓ Branch 0 taken 556385 times.
✓ Branch 1 taken 1038 times.
557423 if (mode != PREDICT_MODE) {
525 556385 svq3_pred_motion(s, k, part_width >> 2, dir, 1, &mx, &my);
526 } else {
527 1038 mx = s->next_pic->motion_val[0][b_xy][0] * 2;
528 1038 my = s->next_pic->motion_val[0][b_xy][1] * 2;
529
530
2/2
✓ Branch 0 taken 519 times.
✓ Branch 1 taken 519 times.
1038 if (dir == 0) {
531 519 mx = mx * s->frame_num_offset /
532 519 s->prev_frame_num_offset + 1 >> 1;
533 519 my = my * s->frame_num_offset /
534 519 s->prev_frame_num_offset + 1 >> 1;
535 } else {
536 519 mx = mx * (s->frame_num_offset - s->prev_frame_num_offset) /
537 519 s->prev_frame_num_offset + 1 >> 1;
538 519 my = my * (s->frame_num_offset - s->prev_frame_num_offset) /
539 519 s->prev_frame_num_offset + 1 >> 1;
540 }
541 }
542
543 /* clip motion vector prediction to frame border */
544 557423 mx = av_clip(mx, extra_width - 6 * x, h_edge_pos - 6 * x);
545 557423 my = av_clip(my, extra_width - 6 * y, v_edge_pos - 6 * y);
546
547 /* get (optional) motion vector differential */
548
2/2
✓ Branch 0 taken 1038 times.
✓ Branch 1 taken 556385 times.
557423 if (mode == PREDICT_MODE) {
549 1038 dx = dy = 0;
550 } else {
551 556385 dy = get_interleaved_se_golomb(&s->gb_slice);
552 556385 dx = get_interleaved_se_golomb(&s->gb_slice);
553
554
2/4
✓ Branch 0 taken 556385 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 556385 times.
556385 if (dx != (int16_t)dx || dy != (int16_t)dy) {
555 av_log(s->avctx, AV_LOG_ERROR, "invalid MV vlc\n");
556 return -1;
557 }
558 }
559
560 /* compute motion vector */
561
2/2
✓ Branch 0 taken 182 times.
✓ Branch 1 taken 557241 times.
557423 if (mode == THIRDPEL_MODE) {
562 int fx, fy;
563 182 mx = (mx + 1 >> 1) + dx;
564 182 my = (my + 1 >> 1) + dy;
565 182 fx = (unsigned)(mx + 0x30000) / 3 - 0x10000;
566 182 fy = (unsigned)(my + 0x30000) / 3 - 0x10000;
567 182 dxy = (mx - 3 * fx) + 4 * (my - 3 * fy);
568
569 182 svq3_mc_dir_part(s, x, y, part_width, part_height,
570 fx, fy, dxy, 1, dir, avg);
571 182 mx += mx;
572 182 my += my;
573
4/4
✓ Branch 0 taken 282127 times.
✓ Branch 1 taken 275114 times.
✓ Branch 2 taken 1038 times.
✓ Branch 3 taken 281089 times.
557241 } else if (mode == HALFPEL_MODE || mode == PREDICT_MODE) {
574 276152 mx = (unsigned)(mx + 1 + 0x30000) / 3 + dx - 0x10000;
575 276152 my = (unsigned)(my + 1 + 0x30000) / 3 + dy - 0x10000;
576 276152 dxy = (mx & 1) + 2 * (my & 1);
577
578 276152 svq3_mc_dir_part(s, x, y, part_width, part_height,
579 mx >> 1, my >> 1, dxy, 0, dir, avg);
580 276152 mx *= 3;
581 276152 my *= 3;
582 } else {
583 281089 mx = (unsigned)(mx + 3 + 0x60000) / 6 + dx - 0x10000;
584 281089 my = (unsigned)(my + 3 + 0x60000) / 6 + dy - 0x10000;
585
586 281089 svq3_mc_dir_part(s, x, y, part_width, part_height,
587 mx, my, 0, 0, dir, avg);
588 281089 mx *= 6;
589 281089 my *= 6;
590 }
591
592 /* update mv_cache */
593
2/2
✓ Branch 0 taken 556385 times.
✓ Branch 1 taken 1038 times.
557423 if (mode != PREDICT_MODE) {
594 556385 int32_t mv = pack16to32(mx, my);
595
596
4/4
✓ Branch 0 taken 157554 times.
✓ Branch 1 taken 398831 times.
✓ Branch 2 taken 78777 times.
✓ Branch 3 taken 78777 times.
556385 if (part_height == 8 && i < 8) {
597 78777 AV_WN32A(s->mv_cache[dir][scan8[k] + 1 * 8], mv);
598
599
4/4
✓ Branch 0 taken 78698 times.
✓ Branch 1 taken 79 times.
✓ Branch 2 taken 39349 times.
✓ Branch 3 taken 39349 times.
78777 if (part_width == 8 && j < 8)
600 39349 AV_WN32A(s->mv_cache[dir][scan8[k] + 1 + 1 * 8], mv);
601 }
602
4/4
✓ Branch 0 taken 157620 times.
✓ Branch 1 taken 398765 times.
✓ Branch 2 taken 78810 times.
✓ Branch 3 taken 78810 times.
556385 if (part_width == 8 && j < 8)
603 78810 AV_WN32A(s->mv_cache[dir][scan8[k] + 1], mv);
604
4/4
✓ Branch 0 taken 556249 times.
✓ Branch 1 taken 136 times.
✓ Branch 2 taken 48 times.
✓ Branch 3 taken 556201 times.
556385 if (part_width == 4 || part_height == 4)
605 184 AV_WN32A(s->mv_cache[dir][scan8[k]], mv);
606 }
607
608 /* write back motion vectors */
609 557423 fill_rectangle(s->cur_pic->motion_val[dir][b_xy],
610 part_width >> 2, part_height >> 2, s->b_stride,
611 pack16to32(mx, my), 4);
612 }
613
614 438837 return 0;
615 }
616
617 488580 static av_always_inline void hl_decode_mb_idct_luma(SVQ3Context *s,
618 int mb_type, const int *block_offset,
619 int linesize, uint8_t *dest_y)
620 {
621 int i;
622
2/2
✓ Branch 0 taken 440567 times.
✓ Branch 1 taken 48013 times.
488580 if (!IS_INTRA4x4(mb_type)) {
623
2/2
✓ Branch 0 taken 7049072 times.
✓ Branch 1 taken 440567 times.
7489639 for (i = 0; i < 16; i++)
624
4/4
✓ Branch 0 taken 4590940 times.
✓ Branch 1 taken 2458132 times.
✓ Branch 2 taken 22222 times.
✓ Branch 3 taken 4568718 times.
7049072 if (s->non_zero_count_cache[scan8[i]] || s->mb[i * 16]) {
625 2480354 uint8_t *const ptr = dest_y + block_offset[i];
626 2480354 svq3_add_idct_c(ptr, s->mb + i * 16, linesize,
627 2480354 s->qscale, IS_INTRA(mb_type) ? 1 : 0);
628 }
629 }
630 488580 }
631
632 50550 static av_always_inline void hl_decode_mb_predict_luma(SVQ3Context *s,
633 int mb_type,
634 const int *block_offset,
635 int linesize,
636 uint8_t *dest_y)
637 {
638 int i;
639 50550 int qscale = s->qscale;
640
641
2/2
✓ Branch 0 taken 48013 times.
✓ Branch 1 taken 2537 times.
50550 if (IS_INTRA4x4(mb_type)) {
642
2/2
✓ Branch 0 taken 768208 times.
✓ Branch 1 taken 48013 times.
816221 for (i = 0; i < 16; i++) {
643 768208 uint8_t *const ptr = dest_y + block_offset[i];
644 768208 const int dir = s->intra4x4_pred_mode_cache[scan8[i]];
645
646 uint8_t *topright;
647 int nnz;
648
3/4
✓ Branch 0 taken 715259 times.
✓ Branch 1 taken 52949 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 715259 times.
768208 if (dir == DIAG_DOWN_LEFT_PRED || dir == VERT_LEFT_PRED) {
649 av_assert2(s->mb_y || linesize <= block_offset[i]);
650 52949 topright = ptr + 4 - linesize;
651 } else
652 715259 topright = NULL;
653
654 768208 s->hpc.pred4x4[dir](ptr, topright, linesize);
655 768208 nnz = s->non_zero_count_cache[scan8[i]];
656
2/2
✓ Branch 0 taken 560064 times.
✓ Branch 1 taken 208144 times.
768208 if (nnz) {
657 560064 svq3_add_idct_c(ptr, s->mb + i * 16, linesize, qscale, 0);
658 }
659 }
660 } else {
661 2537 s->hpc.pred16x16[s->intra16x16_pred_mode](dest_y, linesize);
662 2537 svq3_luma_dc_dequant_idct_c(s->mb, s->mb_luma_dc[0], qscale);
663 }
664 50550 }
665
666 488580 static void hl_decode_mb(SVQ3Context *s)
667 {
668 488580 const int mb_x = s->mb_x;
669 488580 const int mb_y = s->mb_y;
670 488580 const int mb_xy = s->mb_xy;
671 488580 const int mb_type = s->cur_pic->mb_type[mb_xy];
672 uint8_t *dest_y, *dest_cb, *dest_cr;
673 int linesize, uvlinesize;
674 int i, j;
675 488580 const int *block_offset = &s->block_offset[0];
676 488580 const int block_h = 16 >> 1;
677
678 488580 linesize = s->cur_pic->f->linesize[0];
679 488580 uvlinesize = s->cur_pic->f->linesize[1];
680
681 488580 dest_y = s->cur_pic->f->data[0] + (mb_x + mb_y * linesize) * 16;
682 488580 dest_cb = s->cur_pic->f->data[1] + mb_x * 8 + mb_y * uvlinesize * block_h;
683 488580 dest_cr = s->cur_pic->f->data[2] + mb_x * 8 + mb_y * uvlinesize * block_h;
684
685 488580 s->vdsp.prefetch(dest_y + (s->mb_x & 3) * 4 * linesize + 64, linesize, 4);
686 488580 s->vdsp.prefetch(dest_cb + (s->mb_x & 7) * uvlinesize + 64, dest_cr - dest_cb, 2);
687
688
2/2
✓ Branch 0 taken 50550 times.
✓ Branch 1 taken 438030 times.
488580 if (IS_INTRA(mb_type)) {
689 50550 s->hpc.pred8x8[s->chroma_pred_mode](dest_cb, uvlinesize);
690 50550 s->hpc.pred8x8[s->chroma_pred_mode](dest_cr, uvlinesize);
691
692 50550 hl_decode_mb_predict_luma(s, mb_type, block_offset, linesize, dest_y);
693 }
694
695 488580 hl_decode_mb_idct_luma(s, mb_type, block_offset, linesize, dest_y);
696
697
2/2
✓ Branch 0 taken 159250 times.
✓ Branch 1 taken 329330 times.
488580 if (s->cbp & 0x30) {
698 159250 uint8_t *dest[2] = { dest_cb, dest_cr };
699 159250 s->h264dsp.h264_chroma_dc_dequant_idct(s->mb + 16 * 16 * 1,
700 159250 s->dequant4_coeff[4][0]);
701 159250 s->h264dsp.h264_chroma_dc_dequant_idct(s->mb + 16 * 16 * 2,
702 159250 s->dequant4_coeff[4][0]);
703
2/2
✓ Branch 0 taken 318500 times.
✓ Branch 1 taken 159250 times.
477750 for (j = 1; j < 3; j++) {
704
2/2
✓ Branch 0 taken 1274000 times.
✓ Branch 1 taken 318500 times.
1592500 for (i = j * 16; i < j * 16 + 4; i++)
705
4/4
✓ Branch 0 taken 731632 times.
✓ Branch 1 taken 542368 times.
✓ Branch 2 taken 430517 times.
✓ Branch 3 taken 301115 times.
1274000 if (s->non_zero_count_cache[scan8[i]] || s->mb[i * 16]) {
706 972885 uint8_t *const ptr = dest[j - 1] + block_offset[i];
707 972885 svq3_add_idct_c(ptr, s->mb + i * 16,
708 972885 uvlinesize, ff_h264_chroma_qp[0][s->qscale + 12] - 12, 2);
709 }
710 }
711 }
712 488580 }
713
714 842400 static int svq3_decode_mb(SVQ3Context *s, unsigned int mb_type)
715 {
716 int i, j, k, m, dir, mode;
717 842400 int cbp = 0;
718 uint32_t vlc;
719 int8_t *top, *left;
720 842400 const int mb_xy = s->mb_xy;
721 842400 const int b_xy = 4 * s->mb_x + 4 * s->mb_y * s->b_stride;
722
723
2/2
✓ Branch 0 taken 56160 times.
✓ Branch 1 taken 786240 times.
842400 s->top_samples_available = (s->mb_y == 0) ? 0x33FF : 0xFFFF;
724
2/2
✓ Branch 0 taken 42135 times.
✓ Branch 1 taken 800265 times.
842400 s->left_samples_available = (s->mb_x == 0) ? 0x5F5F : 0xFFFF;
725
726
2/2
✓ Branch 0 taken 353880 times.
✓ Branch 1 taken 488520 times.
842400 if (mb_type == 0) { /* SKIP */
727
2/2
✓ Branch 0 taken 874 times.
✓ Branch 1 taken 353006 times.
353880 if (s->pict_type == AV_PICTURE_TYPE_P ||
728
2/2
✓ Branch 0 taken 481 times.
✓ Branch 1 taken 393 times.
874 s->next_pic->mb_type[mb_xy] == -1) {
729 353487 svq3_mc_dir_part(s, 16 * s->mb_x, 16 * s->mb_y, 16, 16,
730 0, 0, 0, 0, 0, 0);
731
732
2/2
✓ Branch 0 taken 481 times.
✓ Branch 1 taken 353006 times.
353487 if (s->pict_type == AV_PICTURE_TYPE_B)
733 481 svq3_mc_dir_part(s, 16 * s->mb_x, 16 * s->mb_y, 16, 16,
734 0, 0, 0, 0, 1, 1);
735
736 353487 mb_type = MB_TYPE_SKIP;
737 } else {
738 393 mb_type = FFMIN(s->next_pic->mb_type[mb_xy], 6);
739
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 393 times.
393 if (svq3_mc_dir(s, mb_type, PREDICT_MODE, 0, 0) < 0)
740 return -1;
741
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 393 times.
393 if (svq3_mc_dir(s, mb_type, PREDICT_MODE, 1, 1) < 0)
742 return -1;
743
744 393 mb_type = MB_TYPE_16x16;
745 }
746
2/2
✓ Branch 0 taken 437970 times.
✓ Branch 1 taken 50550 times.
488520 } else if (mb_type < 8) { /* INTER */
747
4/4
✓ Branch 0 taken 833 times.
✓ Branch 1 taken 437137 times.
✓ Branch 3 taken 129 times.
✓ Branch 4 taken 704 times.
437970 if (s->thirdpel_flag && s->halfpel_flag == !get_bits1(&s->gb_slice))
748 129 mode = THIRDPEL_MODE;
749
1/2
✓ Branch 0 taken 437841 times.
✗ Branch 1 not taken.
437841 else if (s->halfpel_flag &&
750
2/2
✓ Branch 1 taken 197056 times.
✓ Branch 2 taken 240785 times.
437841 s->thirdpel_flag == !get_bits1(&s->gb_slice))
751 197056 mode = HALFPEL_MODE;
752 else
753 240785 mode = FULLPEL_MODE;
754
755 /* fill caches */
756 /* note ref_cache should contain here:
757 * ????????
758 * ???11111
759 * N??11111
760 * N??11111
761 * N??11111
762 */
763
764
2/2
✓ Branch 0 taken 438154 times.
✓ Branch 1 taken 184 times.
438338 for (m = 0; m < 2; m++) {
765
3/4
✓ Branch 0 taken 421404 times.
✓ Branch 1 taken 16750 times.
✓ Branch 2 taken 421404 times.
✗ Branch 3 not taken.
438154 if (s->mb_x > 0 && s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - 1] + 6] != -1) {
766
2/2
✓ Branch 0 taken 1685616 times.
✓ Branch 1 taken 421404 times.
2107020 for (i = 0; i < 4; i++)
767 1685616 AV_COPY32(s->mv_cache[m][scan8[0] - 1 + i * 8],
768 s->cur_pic->motion_val[m][b_xy - 1 + i * s->b_stride]);
769 } else {
770
2/2
✓ Branch 0 taken 67000 times.
✓ Branch 1 taken 16750 times.
83750 for (i = 0; i < 4; i++)
771 67000 AV_ZERO32(s->mv_cache[m][scan8[0] - 1 + i * 8]);
772 }
773
2/2
✓ Branch 0 taken 415264 times.
✓ Branch 1 taken 22890 times.
438154 if (s->mb_y > 0) {
774 415264 memcpy(s->mv_cache[m][scan8[0] - 1 * 8],
775 415264 s->cur_pic->motion_val[m][b_xy - s->b_stride],
776 4 * 2 * sizeof(int16_t));
777 415264 memset(&s->ref_cache[m][scan8[0] - 1 * 8],
778
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 415264 times.
415264 (s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride]] == -1) ? PART_NOT_AVAILABLE : 1, 4);
779
780
2/2
✓ Branch 0 taken 397026 times.
✓ Branch 1 taken 18238 times.
415264 if (s->mb_x < s->mb_width - 1) {
781 397026 AV_COPY32(s->mv_cache[m][scan8[0] + 4 - 1 * 8],
782 s->cur_pic->motion_val[m][b_xy - s->b_stride + 4]);
783 397026 s->ref_cache[m][scan8[0] + 4 - 1 * 8] =
784
1/2
✓ Branch 0 taken 397026 times.
✗ Branch 1 not taken.
397026 (s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride + 1] + 6] == -1 ||
785
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 397026 times.
397026 s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride]] == -1) ? PART_NOT_AVAILABLE : 1;
786 } else
787 18238 s->ref_cache[m][scan8[0] + 4 - 1 * 8] = PART_NOT_AVAILABLE;
788
2/2
✓ Branch 0 taken 399431 times.
✓ Branch 1 taken 15833 times.
415264 if (s->mb_x > 0) {
789 399431 AV_COPY32(s->mv_cache[m][scan8[0] - 1 - 1 * 8],
790 s->cur_pic->motion_val[m][b_xy - s->b_stride - 1]);
791 399431 s->ref_cache[m][scan8[0] - 1 - 1 * 8] =
792
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 399431 times.
399431 (s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride - 1] + 3] == -1) ? PART_NOT_AVAILABLE : 1;
793 } else
794 15833 s->ref_cache[m][scan8[0] - 1 - 1 * 8] = PART_NOT_AVAILABLE;
795 } else
796 22890 memset(&s->ref_cache[m][scan8[0] - 1 * 8 - 1],
797 PART_NOT_AVAILABLE, 8);
798
799
2/2
✓ Branch 0 taken 437786 times.
✓ Branch 1 taken 368 times.
438154 if (s->pict_type != AV_PICTURE_TYPE_B)
800 437786 break;
801 }
802
803 /* decode motion vector(s) and form prediction(s) */
804
2/2
✓ Branch 0 taken 437786 times.
✓ Branch 1 taken 184 times.
437970 if (s->pict_type == AV_PICTURE_TYPE_P) {
805
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 437786 times.
437786 if (svq3_mc_dir(s, mb_type - 1, mode, 0, 0) < 0)
806 return -1;
807 } else { /* AV_PICTURE_TYPE_B */
808
2/2
✓ Branch 0 taken 134 times.
✓ Branch 1 taken 50 times.
184 if (mb_type != 2) {
809
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 134 times.
134 if (svq3_mc_dir(s, 0, mode, 0, 0) < 0)
810 return -1;
811 } else {
812
2/2
✓ Branch 0 taken 200 times.
✓ Branch 1 taken 50 times.
250 for (i = 0; i < 4; i++)
813 200 memset(s->cur_pic->motion_val[0][b_xy + i * s->b_stride],
814 0, 4 * 2 * sizeof(int16_t));
815 }
816
2/2
✓ Branch 0 taken 131 times.
✓ Branch 1 taken 53 times.
184 if (mb_type != 1) {
817
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 131 times.
131 if (svq3_mc_dir(s, 0, mode, 1, mb_type == 3) < 0)
818 return -1;
819 } else {
820
2/2
✓ Branch 0 taken 212 times.
✓ Branch 1 taken 53 times.
265 for (i = 0; i < 4; i++)
821 212 memset(s->cur_pic->motion_val[1][b_xy + i * s->b_stride],
822 0, 4 * 2 * sizeof(int16_t));
823 }
824 }
825
826 437970 mb_type = MB_TYPE_16x16;
827
3/4
✓ Branch 0 taken 2537 times.
✓ Branch 1 taken 48013 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2537 times.
50550 } else if (mb_type == 8 || mb_type == 33) { /* INTRA4x4 */
828 48013 int8_t *i4x4 = s->intra4x4_pred_mode + s->mb2br_xy[s->mb_xy];
829 48013 int8_t *i4x4_cache = s->intra4x4_pred_mode_cache;
830
831 48013 memset(s->intra4x4_pred_mode_cache, -1, 8 * 5 * sizeof(int8_t));
832
833
1/2
✓ Branch 0 taken 48013 times.
✗ Branch 1 not taken.
48013 if (mb_type == 8) {
834
2/2
✓ Branch 0 taken 44014 times.
✓ Branch 1 taken 3999 times.
48013 if (s->mb_x > 0) {
835
2/2
✓ Branch 0 taken 176056 times.
✓ Branch 1 taken 44014 times.
220070 for (i = 0; i < 4; i++)
836 176056 s->intra4x4_pred_mode_cache[scan8[0] - 1 + i * 8] = s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - 1] + 6 - i];
837
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 44014 times.
44014 if (s->intra4x4_pred_mode_cache[scan8[0] - 1] == -1)
838 s->left_samples_available = 0x5F5F;
839 }
840
2/2
✓ Branch 0 taken 45104 times.
✓ Branch 1 taken 2909 times.
48013 if (s->mb_y > 0) {
841 45104 s->intra4x4_pred_mode_cache[4 + 8 * 0] = s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride] + 0];
842 45104 s->intra4x4_pred_mode_cache[5 + 8 * 0] = s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride] + 1];
843 45104 s->intra4x4_pred_mode_cache[6 + 8 * 0] = s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride] + 2];
844 45104 s->intra4x4_pred_mode_cache[7 + 8 * 0] = s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride] + 3];
845
846
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 45104 times.
45104 if (s->intra4x4_pred_mode_cache[4 + 8 * 0] == -1)
847 s->top_samples_available = 0x33FF;
848 }
849
850 /* decode prediction codes for luma blocks */
851
2/2
✓ Branch 0 taken 384104 times.
✓ Branch 1 taken 48013 times.
432117 for (i = 0; i < 16; i += 2) {
852 384104 vlc = get_interleaved_ue_golomb(&s->gb_slice);
853
854
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 384104 times.
384104 if (vlc >= 25U) {
855 av_log(s->avctx, AV_LOG_ERROR,
856 "luma prediction:%"PRIu32"\n", vlc);
857 return -1;
858 }
859
860 384104 left = &s->intra4x4_pred_mode_cache[scan8[i] - 1];
861 384104 top = &s->intra4x4_pred_mode_cache[scan8[i] - 8];
862
863 384104 left[1] = svq3_pred_1[top[0] + 1][left[0] + 1][svq3_pred_0[vlc][0]];
864 384104 left[2] = svq3_pred_1[top[1] + 1][left[1] + 1][svq3_pred_0[vlc][1]];
865
866
2/4
✓ Branch 0 taken 384104 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 384104 times.
384104 if (left[1] == -1 || left[2] == -1) {
867 av_log(s->avctx, AV_LOG_ERROR, "weird prediction\n");
868 return -1;
869 }
870 }
871 } else { /* mb_type == 33, DC_128_PRED block type */
872 for (i = 0; i < 4; i++)
873 memset(&s->intra4x4_pred_mode_cache[scan8[0] + 8 * i], DC_PRED, 4);
874 }
875
876 48013 AV_COPY32(i4x4, i4x4_cache + 4 + 8 * 4);
877 48013 i4x4[4] = i4x4_cache[7 + 8 * 3];
878 48013 i4x4[5] = i4x4_cache[7 + 8 * 2];
879 48013 i4x4[6] = i4x4_cache[7 + 8 * 1];
880
881
1/2
✓ Branch 0 taken 48013 times.
✗ Branch 1 not taken.
48013 if (mb_type == 8) {
882 48013 ff_h264_check_intra4x4_pred_mode(s->intra4x4_pred_mode_cache,
883 48013 s->avctx, s->top_samples_available,
884 48013 s->left_samples_available);
885
886
2/2
✓ Branch 0 taken 2909 times.
✓ Branch 1 taken 45104 times.
48013 s->top_samples_available = (s->mb_y == 0) ? 0x33FF : 0xFFFF;
887
2/2
✓ Branch 0 taken 3999 times.
✓ Branch 1 taken 44014 times.
48013 s->left_samples_available = (s->mb_x == 0) ? 0x5F5F : 0xFFFF;
888 } else {
889 for (i = 0; i < 4; i++)
890 memset(&s->intra4x4_pred_mode_cache[scan8[0] + 8 * i], DC_128_PRED, 4);
891
892 s->top_samples_available = 0x33FF;
893 s->left_samples_available = 0x5F5F;
894 }
895
896 48013 mb_type = MB_TYPE_INTRA4x4;
897 } else { /* INTRA16x16 */
898 2537 dir = ff_h264_i_mb_type_info[mb_type - 8].pred_mode;
899 2537 dir = (dir >> 1) ^ 3 * (dir & 1) ^ 1;
900
901
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,
902 2537 s->left_samples_available, dir, 0)) < 0) {
903 av_log(s->avctx, AV_LOG_ERROR, "ff_h264_check_intra_pred_mode < 0\n");
904 return s->intra16x16_pred_mode;
905 }
906
907 2537 cbp = ff_h264_i_mb_type_info[mb_type - 8].cbp;
908 2537 mb_type = MB_TYPE_INTRA16x16;
909 }
910
911
4/4
✓ Branch 0 taken 404037 times.
✓ Branch 1 taken 438363 times.
✓ Branch 2 taken 384867 times.
✓ Branch 3 taken 19170 times.
842400 if (!IS_INTER(mb_type) && s->pict_type != AV_PICTURE_TYPE_I) {
912
2/2
✓ Branch 0 taken 1539468 times.
✓ Branch 1 taken 384867 times.
1924335 for (i = 0; i < 4; i++)
913 1539468 memset(s->cur_pic->motion_val[0][b_xy + i * s->b_stride],
914 0, 4 * 2 * sizeof(int16_t));
915
2/2
✓ Branch 0 taken 503 times.
✓ Branch 1 taken 384364 times.
384867 if (s->pict_type == AV_PICTURE_TYPE_B) {
916
2/2
✓ Branch 0 taken 2012 times.
✓ Branch 1 taken 503 times.
2515 for (i = 0; i < 4; i++)
917 2012 memset(s->cur_pic->motion_val[1][b_xy + i * s->b_stride],
918 0, 4 * 2 * sizeof(int16_t));
919 }
920 }
921
2/2
✓ Branch 0 taken 794387 times.
✓ Branch 1 taken 48013 times.
842400 if (!IS_INTRA4x4(mb_type)) {
922 794387 memset(s->intra4x4_pred_mode + s->mb2br_xy[mb_xy], DC_PRED, 8);
923 }
924
4/4
✓ Branch 0 taken 353487 times.
✓ Branch 1 taken 488913 times.
✓ Branch 2 taken 481 times.
✓ Branch 3 taken 353006 times.
842400 if (!IS_SKIP(mb_type) || s->pict_type == AV_PICTURE_TYPE_B) {
925 489394 memset(s->non_zero_count_cache + 8, 0, 14 * 8 * sizeof(uint8_t));
926 }
927
928
2/2
✓ Branch 0 taken 839863 times.
✓ Branch 1 taken 2537 times.
842400 if (!IS_INTRA16x16(mb_type) &&
929
4/4
✓ Branch 0 taken 353487 times.
✓ Branch 1 taken 486376 times.
✓ Branch 2 taken 481 times.
✓ Branch 3 taken 353006 times.
839863 (!IS_SKIP(mb_type) || s->pict_type == AV_PICTURE_TYPE_B)) {
930
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 486857 times.
486857 if ((vlc = get_interleaved_ue_golomb(&s->gb_slice)) >= 48U){
931 av_log(s->avctx, AV_LOG_ERROR, "cbp_vlc=%"PRIu32"\n", vlc);
932 return -1;
933 }
934
935 486857 cbp = IS_INTRA(mb_type) ? ff_h264_golomb_to_intra4x4_cbp[vlc]
936
2/2
✓ Branch 0 taken 48013 times.
✓ Branch 1 taken 438844 times.
486857 : ff_h264_golomb_to_inter_cbp[vlc];
937 }
938
2/2
✓ Branch 0 taken 839863 times.
✓ Branch 1 taken 2537 times.
842400 if (IS_INTRA16x16(mb_type) ||
939
6/6
✓ Branch 0 taken 822903 times.
✓ Branch 1 taken 16960 times.
✓ Branch 2 taken 2424 times.
✓ Branch 3 taken 820479 times.
✓ Branch 4 taken 696 times.
✓ Branch 5 taken 1728 times.
839863 (s->pict_type != AV_PICTURE_TYPE_I && s->adaptive_quant && cbp)) {
940 3233 s->qscale += get_interleaved_se_golomb(&s->gb_slice);
941
942
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3233 times.
3233 if (s->qscale > 31u) {
943 av_log(s->avctx, AV_LOG_ERROR, "qscale:%d\n", s->qscale);
944 return -1;
945 }
946 }
947
2/2
✓ Branch 0 taken 2537 times.
✓ Branch 1 taken 839863 times.
842400 if (IS_INTRA16x16(mb_type)) {
948 2537 AV_ZERO128(s->mb_luma_dc[0] + 0);
949 2537 AV_ZERO128(s->mb_luma_dc[0] + 8);
950
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)) {
951 av_log(s->avctx, AV_LOG_ERROR,
952 "error while decoding intra luma dc\n");
953 return -1;
954 }
955 }
956
957
2/2
✓ Branch 0 taken 333556 times.
✓ Branch 1 taken 508844 times.
842400 if (cbp) {
958 333556 const int index = IS_INTRA16x16(mb_type) ? 1 : 0;
959
4/4
✓ Branch 0 taken 333490 times.
✓ Branch 1 taken 66 times.
✓ Branch 2 taken 40540 times.
✓ Branch 3 taken 292950 times.
333556 const int type = ((s->qscale < 24 && IS_INTRA4x4(mb_type)) ? 2 : 1);
960
961
2/2
✓ Branch 0 taken 1334224 times.
✓ Branch 1 taken 333556 times.
1667780 for (i = 0; i < 4; i++)
962
2/2
✓ Branch 0 taken 754549 times.
✓ Branch 1 taken 579675 times.
1334224 if ((cbp & (1 << i))) {
963
2/2
✓ Branch 0 taken 3018196 times.
✓ Branch 1 taken 754549 times.
3772745 for (j = 0; j < 4; j++) {
964 3022068 k = index ? (1 * (j & 1) + 2 * (i & 1) +
965 3872 2 * (j & 2) + 4 * (i & 2))
966
2/2
✓ Branch 0 taken 3872 times.
✓ Branch 1 taken 3014324 times.
3018196 : (4 * i + j);
967 3018196 s->non_zero_count_cache[scan8[k]] = 1;
968
969
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3018196 times.
3018196 if (svq3_decode_block(&s->gb_slice, &s->mb[16 * k], index, type)) {
970 av_log(s->avctx, AV_LOG_ERROR,
971 "error while decoding block\n");
972 return -1;
973 }
974 }
975 }
976
977
2/2
✓ Branch 0 taken 159250 times.
✓ Branch 1 taken 174306 times.
333556 if ((cbp & 0x30)) {
978
2/2
✓ Branch 0 taken 318500 times.
✓ Branch 1 taken 159250 times.
477750 for (i = 1; i < 3; ++i)
979
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 318500 times.
318500 if (svq3_decode_block(&s->gb_slice, &s->mb[16 * 16 * i], 0, 3)) {
980 av_log(s->avctx, AV_LOG_ERROR,
981 "error while decoding chroma dc block\n");
982 return -1;
983 }
984
985
2/2
✓ Branch 0 taken 67796 times.
✓ Branch 1 taken 91454 times.
159250 if ((cbp & 0x20)) {
986
2/2
✓ Branch 0 taken 135592 times.
✓ Branch 1 taken 67796 times.
203388 for (i = 1; i < 3; i++) {
987
2/2
✓ Branch 0 taken 542368 times.
✓ Branch 1 taken 135592 times.
677960 for (j = 0; j < 4; j++) {
988 542368 k = 16 * i + j;
989 542368 s->non_zero_count_cache[scan8[k]] = 1;
990
991
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 542368 times.
542368 if (svq3_decode_block(&s->gb_slice, &s->mb[16 * k], 1, 1)) {
992 av_log(s->avctx, AV_LOG_ERROR,
993 "error while decoding chroma ac block\n");
994 return -1;
995 }
996 }
997 }
998 }
999 }
1000 }
1001
1002 842400 s->cbp = cbp;
1003 842400 s->cur_pic->mb_type[mb_xy] = mb_type;
1004
1005
2/2
✓ Branch 0 taken 50550 times.
✓ Branch 1 taken 791850 times.
842400 if (IS_INTRA(mb_type))
1006 50550 s->chroma_pred_mode = ff_h264_check_intra_pred_mode(s->avctx, s->top_samples_available,
1007 50550 s->left_samples_available, DC_PRED8x8, 1);
1008
1009 842400 return 0;
1010 }
1011
1012 2809 static int svq3_decode_slice_header(AVCodecContext *avctx)
1013 {
1014 2809 SVQ3Context *s = avctx->priv_data;
1015 2809 const int mb_xy = s->mb_xy;
1016 int i, header;
1017 unsigned slice_id;
1018
1019 2809 header = get_bits(&s->gb, 8);
1020
1021
2/6
✗ Branch 0 not taken.
✓ Branch 1 taken 2809 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2809 times.
2809 if (((header & 0x9F) != 1 && (header & 0x9F) != 2) || (header & 0x60) == 0) {
1022 /* TODO: what? */
1023 av_log(avctx, AV_LOG_ERROR, "unsupported slice header (%02X)\n", header);
1024 return -1;
1025 } else {
1026 int slice_bits, slice_bytes, slice_length;
1027 2809 int length = header >> 5 & 3;
1028
1029 2809 slice_length = show_bits(&s->gb, 8 * length);
1030 2809 slice_bits = slice_length * 8;
1031 2809 slice_bytes = slice_length + length - 1;
1032
1033 2809 skip_bits(&s->gb, 8);
1034
1035 2809 av_fast_padded_malloc(&s->slice_buf, &s->slice_buf_size, slice_bytes);
1036
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2809 times.
2809 if (!s->slice_buf)
1037 return AVERROR(ENOMEM);
1038
1039
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2809 times.
2809 if (slice_bytes * 8LL > get_bits_left(&s->gb)) {
1040 av_log(avctx, AV_LOG_ERROR, "slice after bitstream end\n");
1041 return AVERROR_INVALIDDATA;
1042 }
1043 2809 memcpy(s->slice_buf, s->gb.buffer + s->gb.index / 8, slice_bytes);
1044
1045
1/2
✓ Branch 0 taken 2809 times.
✗ Branch 1 not taken.
2809 if (length > 0) {
1046 2809 memmove(s->slice_buf, &s->slice_buf[slice_length], length - 1);
1047 }
1048
1049
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 2799 times.
2809 if (s->watermark_key) {
1050 10 uint32_t header = AV_RL32(&s->slice_buf[1]);
1051 10 AV_WL32(&s->slice_buf[1], header ^ s->watermark_key);
1052 }
1053 2809 init_get_bits(&s->gb_slice, s->slice_buf, slice_bits);
1054
1055 2809 skip_bits_long(&s->gb, slice_bytes * 8);
1056 }
1057
1058
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2809 times.
2809 if ((slice_id = get_interleaved_ue_golomb(&s->gb_slice)) >= 3) {
1059 av_log(s->avctx, AV_LOG_ERROR, "illegal slice type %u \n", slice_id);
1060 return -1;
1061 }
1062
1063 2809 s->slice_type = ff_h264_golomb_to_pict_type[slice_id];
1064
1065
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2809 times.
2809 if ((header & 0x9F) == 2) {
1066 i = (s->mb_num < 64) ? 6 : (1 + av_log2(s->mb_num - 1));
1067 get_bits(&s->gb_slice, i);
1068
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2809 times.
2809 } else if (get_bits1(&s->gb_slice)) {
1069 avpriv_report_missing_feature(s->avctx, "Media key encryption");
1070 return AVERROR_PATCHWELCOME;
1071 }
1072
1073 2809 s->slice_num = get_bits(&s->gb_slice, 8);
1074 2809 s->qscale = get_bits(&s->gb_slice, 5);
1075 2809 s->adaptive_quant = get_bits1(&s->gb_slice);
1076
1077 /* unknown fields */
1078 2809 skip_bits1(&s->gb_slice);
1079
1080
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 2799 times.
2809 if (s->has_watermark)
1081 10 skip_bits1(&s->gb_slice);
1082
1083 2809 skip_bits1(&s->gb_slice);
1084 2809 skip_bits(&s->gb_slice, 2);
1085
1086
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2809 times.
2809 if (skip_1stop_8data_bits(&s->gb_slice) < 0)
1087 return AVERROR_INVALIDDATA;
1088
1089 /* reset intra predictors and invalidate motion vector references */
1090
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2809 times.
2809 if (s->mb_x > 0) {
1091 memset(s->intra4x4_pred_mode + s->mb2br_xy[mb_xy - 1] + 3,
1092 -1, 4 * sizeof(int8_t));
1093 memset(s->intra4x4_pred_mode + s->mb2br_xy[mb_xy - s->mb_x],
1094 -1, 8 * sizeof(int8_t) * s->mb_x);
1095 }
1096
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2809 times.
2809 if (s->mb_y > 0) {
1097 memset(s->intra4x4_pred_mode + s->mb2br_xy[mb_xy - s->mb_stride],
1098 -1, 8 * sizeof(int8_t) * (s->mb_width - s->mb_x));
1099
1100 if (s->mb_x > 0)
1101 s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride - 1] + 3] = -1;
1102 }
1103
1104 2809 return 0;
1105 }
1106
1107 8 static void init_dequant4_coeff_table(SVQ3Context *s)
1108 {
1109 int q, x;
1110 8 const int max_qp = 51;
1111
1112
2/2
✓ Branch 0 taken 416 times.
✓ Branch 1 taken 8 times.
424 for (q = 0; q < max_qp + 1; q++) {
1113 416 int shift = ff_h264_quant_div6[q] + 2;
1114 416 int idx = ff_h264_quant_rem6[q];
1115
2/2
✓ Branch 0 taken 6656 times.
✓ Branch 1 taken 416 times.
7072 for (x = 0; x < 16; x++)
1116 6656 s->dequant4_coeff[q][(x >> 2) | ((x << 2) & 0xF)] =
1117 6656 ((uint32_t)ff_h264_dequant4_coeff_init[idx][(x & 1) + ((x >> 2) & 1)] * 16) << shift;
1118 }
1119 8 }
1120
1121 8 static av_cold int svq3_decode_extradata(AVCodecContext *avctx, SVQ3Context *s,
1122 int seqh_offset)
1123 {
1124 8 const uint8_t *extradata = avctx->extradata + seqh_offset;
1125 8 unsigned int size = AV_RB32(extradata + 4);
1126 GetBitContext gb;
1127 int ret;
1128
1129
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 if (size > avctx->extradata_size - seqh_offset - 8)
1130 return AVERROR_INVALIDDATA;
1131 8 extradata += 8;
1132 8 init_get_bits(&gb, extradata, size * 8);
1133
1134 /* 'frame size code' and optional 'width, height' */
1135 8 int frame_size_code = get_bits(&gb, 3);
1136 int w, h;
1137
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) {
1138 case 0:
1139 w = 160;
1140 h = 120;
1141 break;
1142 case 1:
1143 w = 128;
1144 h = 96;
1145 break;
1146 case 2:
1147 w = 176;
1148 h = 144;
1149 break;
1150 case 3:
1151 w = 352;
1152 h = 288;
1153 break;
1154 case 4:
1155 w = 704;
1156 h = 576;
1157 break;
1158 case 5:
1159 w = 240;
1160 h = 180;
1161 break;
1162 6 case 6:
1163 6 w = 320;
1164 6 h = 240;
1165 6 break;
1166 2 case 7:
1167 2 w = get_bits(&gb, 12);
1168 2 h = get_bits(&gb, 12);
1169 2 break;
1170 }
1171 8 ret = ff_set_dimensions(avctx, w, h);
1172
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 if (ret < 0)
1173 return ret;
1174
1175 8 s->halfpel_flag = get_bits1(&gb);
1176 8 s->thirdpel_flag = get_bits1(&gb);
1177
1178 /* unknown fields */
1179 8 int unk0 = get_bits1(&gb);
1180 8 int unk1 = get_bits1(&gb);
1181 8 int unk2 = get_bits1(&gb);
1182 8 int unk3 = get_bits1(&gb);
1183
1184 8 s->low_delay = get_bits1(&gb);
1185 8 avctx->has_b_frames = !s->low_delay;
1186
1187 /* unknown field */
1188 8 int unk4 = get_bits1(&gb);
1189
1190 8 av_log(avctx, AV_LOG_DEBUG, "Unknown fields %d %d %d %d %d\n",
1191 unk0, unk1, unk2, unk3, unk4);
1192
1193
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
8 if (skip_1stop_8data_bits(&gb) < 0)
1194 return AVERROR_INVALIDDATA;
1195
1196 8 s->has_watermark = get_bits1(&gb);
1197
1198
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 2 times.
8 if (!s->has_watermark)
1199 6 return 0;
1200
1201 #if CONFIG_ZLIB
1202 2 unsigned watermark_width = get_interleaved_ue_golomb(&gb);
1203 2 unsigned watermark_height = get_interleaved_ue_golomb(&gb);
1204 2 int u1 = get_interleaved_ue_golomb(&gb);
1205 2 int u2 = get_bits(&gb, 8);
1206 2 int u3 = get_bits(&gb, 2);
1207 2 int u4 = get_interleaved_ue_golomb(&gb);
1208 2 unsigned long buf_len = watermark_width *
1209 2 watermark_height * 4;
1210 2 int offset = get_bits_count(&gb) + 7 >> 3;
1211
1212
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
4 if (watermark_height <= 0 ||
1213 2 get_bits_left(&gb) <= 0 ||
1214
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 (uint64_t)watermark_width * 4 > UINT_MAX / watermark_height)
1215 return AVERROR_INVALIDDATA;
1216
1217 2 av_log(avctx, AV_LOG_DEBUG, "watermark size: %ux%u\n",
1218 watermark_width, watermark_height);
1219 2 av_log(avctx, AV_LOG_DEBUG,
1220 "u1: %x u2: %x u3: %x compressed data size: %d offset: %d\n",
1221 u1, u2, u3, u4, offset);
1222
1223 2 uint8_t *buf = av_malloc(buf_len);
1224
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (!buf)
1225 return AVERROR(ENOMEM);
1226
1227
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (uncompress(buf, &buf_len, extradata + offset,
1228 2 size - offset) != Z_OK) {
1229 av_log(avctx, AV_LOG_ERROR,
1230 "could not uncompress watermark logo\n");
1231 av_free(buf);
1232 return AVERROR_EXTERNAL;
1233 }
1234 2 s->watermark_key = av_bswap16(av_crc(av_crc_get_table(AV_CRC_16_CCITT), 0, buf, buf_len));
1235
1236 2 s->watermark_key = s->watermark_key << 16 | s->watermark_key;
1237 2 av_log(avctx, AV_LOG_DEBUG,
1238 "watermark key %#"PRIx32"\n", s->watermark_key);
1239 2 av_free(buf);
1240
1241 2 return 0;
1242 #else
1243 av_log(avctx, AV_LOG_ERROR,
1244 "this svq3 file contains watermark which need zlib support compiled in\n");
1245 return AVERROR(ENOSYS);
1246 #endif
1247 }
1248
1249 8 static av_cold int svq3_decode_init(AVCodecContext *avctx)
1250 {
1251 8 SVQ3Context *s = avctx->priv_data;
1252 int m, x, y;
1253 unsigned char *extradata;
1254 int ret;
1255
1256 8 s->cur_pic = &s->frames[0];
1257 8 s->last_pic = &s->frames[1];
1258 8 s->next_pic = &s->frames[2];
1259
1260 8 s->cur_pic->f = av_frame_alloc();
1261 8 s->last_pic->f = av_frame_alloc();
1262 8 s->next_pic->f = av_frame_alloc();
1263
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)
1264 return AVERROR(ENOMEM);
1265
1266 8 ff_h264dsp_init(&s->h264dsp, 8, 1);
1267 8 ff_h264_pred_init(&s->hpc, AV_CODEC_ID_SVQ3, 8, 1);
1268 8 ff_videodsp_init(&s->vdsp, 8);
1269
1270
1271 8 avctx->bits_per_raw_sample = 8;
1272
1273 8 ff_hpeldsp_init(&s->hdsp, avctx->flags);
1274 8 ff_tpeldsp_init(&s->tdsp);
1275
1276 8 avctx->pix_fmt = AV_PIX_FMT_YUVJ420P;
1277 8 avctx->color_range = AVCOL_RANGE_JPEG;
1278
1279 8 s->avctx = avctx;
1280 8 s->halfpel_flag = 1;
1281 8 s->thirdpel_flag = 1;
1282 8 s->has_watermark = 0;
1283
1284 /* prowl for the "SEQH" marker in the extradata */
1285 8 extradata = (unsigned char *)avctx->extradata;
1286
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
8 if (extradata) {
1287
1/2
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
72 for (m = 0; m + 8 < avctx->extradata_size; m++) {
1288
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 64 times.
72 if (!memcmp(extradata, "SEQH", 4)) {
1289 /* if a match was found, parse the extra data */
1290 8 ret = svq3_decode_extradata(avctx, s, m);
1291
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 if (ret < 0)
1292 return ret;
1293 8 break;
1294 }
1295 64 extradata++;
1296 }
1297 }
1298
1299 8 s->mb_width = (avctx->width + 15) / 16;
1300 8 s->mb_height = (avctx->height + 15) / 16;
1301 8 s->mb_stride = s->mb_width + 1;
1302 8 s->mb_num = s->mb_width * s->mb_height;
1303 8 s->b_stride = 4 * s->mb_width;
1304 8 s->h_edge_pos = s->mb_width * 16;
1305 8 s->v_edge_pos = s->mb_height * 16;
1306
1307 8 const unsigned big_mb_num = s->mb_stride * (s->mb_height + 2) + 1;
1308
1309 8 s->mb_type_buf = av_calloc(big_mb_num, NUM_PICS * sizeof(*s->mb_type_buf));
1310
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 if (!s->mb_type_buf)
1311 return AVERROR(ENOMEM);
1312 8 uint32_t *mb_type_buf = s->mb_type_buf + 2 * s->mb_stride + 1;
1313
1314 8 const unsigned b4_stride = s->mb_width * 4 + 1;
1315 8 const unsigned b4_array_size = b4_stride * s->mb_height * 4;
1316 8 const unsigned motion_val_buf_size = b4_array_size + 4;
1317
1318 8 s->motion_val_buf = av_calloc(motion_val_buf_size,
1319 NUM_PICS * 2 * sizeof(*s->motion_val_buf));
1320
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 if (!s->motion_val_buf)
1321 return AVERROR(ENOMEM);
1322 8 int16_t (*motion_val_buf)[2] = s->motion_val_buf + 4;
1323
1324
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 8 times.
32 for (size_t i = 0; i < NUM_PICS; ++i) {
1325 24 SVQ3Frame *const pic = &s->frames[i];
1326
1327 24 pic->mb_type = mb_type_buf;
1328 24 mb_type_buf += big_mb_num;
1329
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 24 times.
72 for (size_t j = 0; j < FF_ARRAY_ELEMS(pic->motion_val); ++j) {
1330 48 pic->motion_val[j] = motion_val_buf;
1331 48 motion_val_buf += motion_val_buf_size;
1332 }
1333 }
1334
1335 8 s->intra4x4_pred_mode = av_mallocz(s->mb_stride * 2 * 8);
1336
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 if (!s->intra4x4_pred_mode)
1337 return AVERROR(ENOMEM);
1338
1339 8 s->mb2br_xy = av_mallocz(s->mb_stride * (s->mb_height + 1) *
1340 sizeof(*s->mb2br_xy));
1341
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 if (!s->mb2br_xy)
1342 return AVERROR(ENOMEM);
1343
1344
2/2
✓ Branch 0 taken 120 times.
✓ Branch 1 taken 8 times.
128 for (y = 0; y < s->mb_height; y++)
1345
2/2
✓ Branch 0 taken 2340 times.
✓ Branch 1 taken 120 times.
2460 for (x = 0; x < s->mb_width; x++) {
1346 2340 const int mb_xy = x + y * s->mb_stride;
1347
1348 2340 s->mb2br_xy[mb_xy] = 8 * (mb_xy % (2 * s->mb_stride));
1349 }
1350
1351 8 init_dequant4_coeff_table(s);
1352
1353 8 return 0;
1354 }
1355
1356 2809 static int get_buffer(AVCodecContext *avctx, SVQ3Frame *pic)
1357 {
1358 2809 SVQ3Context *s = avctx->priv_data;
1359 2809 int ret = ff_get_buffer(avctx, pic->f,
1360 2809 (s->pict_type != AV_PICTURE_TYPE_B) ?
1361 AV_GET_BUFFER_FLAG_REF : 0);
1362
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2809 times.
2809 if (ret < 0)
1363 return ret;
1364
1365
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2805 times.
2809 if (!s->edge_emu_buffer) {
1366 4 s->edge_emu_buffer = av_calloc(pic->f->linesize[0], 17);
1367
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 if (!s->edge_emu_buffer)
1368 return AVERROR(ENOMEM);
1369 }
1370
1371 2809 return 0;
1372 }
1373
1374 static av_cold int alloc_dummy_frame(AVCodecContext *avctx, SVQ3Frame *pic)
1375 {
1376 av_log(avctx, AV_LOG_ERROR, "Missing reference frame.\n");
1377 av_frame_unref(pic->f);
1378 int ret = get_buffer(avctx, pic);
1379 if (ret < 0)
1380 return ret;
1381
1382 memset(pic->f->data[0], 0, avctx->height * pic->f->linesize[0]);
1383 memset(pic->f->data[1], 0x80, (avctx->height / 2) *
1384 pic->f->linesize[1]);
1385 memset(pic->f->data[2], 0x80, (avctx->height / 2) *
1386 pic->f->linesize[2]);
1387
1388 return 0;
1389 }
1390
1391 2815 static int svq3_decode_frame(AVCodecContext *avctx, AVFrame *rframe,
1392 int *got_frame, AVPacket *avpkt)
1393 {
1394 2815 SVQ3Context *s = avctx->priv_data;
1395 2815 int buf_size = avpkt->size;
1396 int left;
1397 int ret, m, i;
1398
1399 /* special case for last picture */
1400
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 2809 times.
2815 if (buf_size == 0) {
1401
3/4
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
6 if (s->next_pic->f->data[0] && !s->low_delay) {
1402 3 av_frame_move_ref(rframe, s->next_pic->f);
1403 3 *got_frame = 1;
1404 }
1405 6 return 0;
1406 }
1407
1408 2809 s->mb_x = s->mb_y = s->mb_xy = 0;
1409
1410 2809 ret = init_get_bits8(&s->gb, avpkt->data, avpkt->size);
1411
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2809 times.
2809 if (ret < 0)
1412 return ret;
1413
1414 2809 ret = svq3_decode_slice_header(avctx);
1415
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2809 times.
2809 if (ret < 0)
1416 return ret;
1417
1418
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2809 times.
2809 if (avpkt->size < s->mb_width * s->mb_height / 8)
1419 return AVERROR_INVALIDDATA;
1420
1421 2809 s->pict_type = s->slice_type;
1422
1423
2/2
✓ Branch 0 taken 2805 times.
✓ Branch 1 taken 4 times.
2809 if (s->pict_type != AV_PICTURE_TYPE_B)
1424 2805 FFSWAP(SVQ3Frame*, s->next_pic, s->last_pic);
1425
1426 2809 av_frame_unref(s->cur_pic->f);
1427
1428 /* for skipping the frame */
1429 2809 s->cur_pic->f->pict_type = s->pict_type;
1430
2/2
✓ Branch 0 taken 64 times.
✓ Branch 1 taken 2745 times.
2809 if (s->pict_type == AV_PICTURE_TYPE_I)
1431 64 s->cur_pic->f->flags |= AV_FRAME_FLAG_KEY;
1432 else
1433 2745 s->cur_pic->f->flags &= ~AV_FRAME_FLAG_KEY;
1434
1435 2809 ret = get_buffer(avctx, s->cur_pic);
1436
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2809 times.
2809 if (ret < 0)
1437 return ret;
1438
1439
2/2
✓ Branch 0 taken 44944 times.
✓ Branch 1 taken 2809 times.
47753 for (i = 0; i < 16; i++) {
1440 44944 s->block_offset[i] = (4 * ((scan8[i] - scan8[0]) & 7)) + 4 * s->cur_pic->f->linesize[0] * ((scan8[i] - scan8[0]) >> 3);
1441 44944 s->block_offset[48 + i] = (4 * ((scan8[i] - scan8[0]) & 7)) + 8 * s->cur_pic->f->linesize[0] * ((scan8[i] - scan8[0]) >> 3);
1442 }
1443
2/2
✓ Branch 0 taken 44944 times.
✓ Branch 1 taken 2809 times.
47753 for (i = 0; i < 16; i++) {
1444 44944 s->block_offset[16 + i] =
1445 44944 s->block_offset[32 + i] = (4 * ((scan8[i] - scan8[0]) & 7)) + 4 * s->cur_pic->f->linesize[1] * ((scan8[i] - scan8[0]) >> 3);
1446 44944 s->block_offset[48 + 16 + i] =
1447 44944 s->block_offset[48 + 32 + i] = (4 * ((scan8[i] - scan8[0]) & 7)) + 8 * s->cur_pic->f->linesize[1] * ((scan8[i] - scan8[0]) >> 3);
1448 }
1449
1450
2/2
✓ Branch 0 taken 2745 times.
✓ Branch 1 taken 64 times.
2809 if (s->pict_type != AV_PICTURE_TYPE_I) {
1451
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2745 times.
2745 if (!s->last_pic->f->data[0]) {
1452 ret = alloc_dummy_frame(avctx, s->last_pic);
1453 if (ret < 0)
1454 return ret;
1455 }
1456
1457
3/4
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2741 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
2745 if (s->pict_type == AV_PICTURE_TYPE_B && !s->next_pic->f->data[0]) {
1458 ret = alloc_dummy_frame(avctx, s->next_pic);
1459 if (ret < 0)
1460 return ret;
1461 }
1462 }
1463
1464
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2809 times.
2809 if (avctx->debug & FF_DEBUG_PICT_INFO)
1465 av_log(s->avctx, AV_LOG_DEBUG,
1466 "%c hpel:%d, tpel:%d aqp:%d qp:%d, slice_num:%02X\n",
1467 av_get_picture_type_char(s->pict_type),
1468 s->halfpel_flag, s->thirdpel_flag,
1469 s->adaptive_quant, s->qscale, s->slice_num);
1470
1471
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2809 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2809 if (avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type == AV_PICTURE_TYPE_B ||
1472
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2809 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2809 avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type != AV_PICTURE_TYPE_I ||
1473
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2809 times.
2809 avctx->skip_frame >= AVDISCARD_ALL)
1474 return 0;
1475
1476
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2805 times.
2809 if (s->pict_type == AV_PICTURE_TYPE_B) {
1477 4 s->frame_num_offset = s->slice_num - s->prev_frame_num;
1478
1479
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 if (s->frame_num_offset < 0)
1480 s->frame_num_offset += 256;
1481
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 if (s->frame_num_offset == 0 ||
1482
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 s->frame_num_offset >= s->prev_frame_num_offset) {
1483 av_log(s->avctx, AV_LOG_ERROR, "error in B-frame picture id\n");
1484 return -1;
1485 }
1486 } else {
1487 2805 s->prev_frame_num = s->frame_num;
1488 2805 s->frame_num = s->slice_num;
1489 2805 s->prev_frame_num_offset = s->frame_num - s->prev_frame_num;
1490
1491
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 2795 times.
2805 if (s->prev_frame_num_offset < 0)
1492 10 s->prev_frame_num_offset += 256;
1493 }
1494
1495
2/2
✓ Branch 0 taken 5618 times.
✓ Branch 1 taken 2809 times.
8427 for (m = 0; m < 2; m++) {
1496 int i;
1497
2/2
✓ Branch 0 taken 22472 times.
✓ Branch 1 taken 5618 times.
28090 for (i = 0; i < 4; i++) {
1498 int j;
1499
2/2
✓ Branch 0 taken 112360 times.
✓ Branch 1 taken 22472 times.
134832 for (j = -1; j < 4; j++)
1500 112360 s->ref_cache[m][scan8[0] + 8 * i + j] = 1;
1501
2/2
✓ Branch 0 taken 16854 times.
✓ Branch 1 taken 5618 times.
22472 if (i < 3)
1502 16854 s->ref_cache[m][scan8[0] + 8 * i + j] = PART_NOT_AVAILABLE;
1503 }
1504 }
1505
1506
2/2
✓ Branch 0 taken 42135 times.
✓ Branch 1 taken 2809 times.
44944 for (s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) {
1507
2/2
✓ Branch 0 taken 842400 times.
✓ Branch 1 taken 42135 times.
884535 for (s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) {
1508 unsigned mb_type;
1509 842400 s->mb_xy = s->mb_x + s->mb_y * s->mb_stride;
1510
1511
2/2
✓ Branch 1 taken 3847 times.
✓ Branch 2 taken 838553 times.
842400 if ((get_bits_left(&s->gb_slice)) <= 7) {
1512
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 ||
1513 3847 show_bits(&s->gb_slice, get_bits_left(&s->gb_slice) & 7) == 0)) {
1514
1515 ret = svq3_decode_slice_header(avctx);
1516 if (ret < 0)
1517 return ret;
1518 }
1519
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3847 times.
3847 if (s->slice_type != s->pict_type) {
1520 avpriv_request_sample(avctx, "non constant slice type");
1521 }
1522 /* TODO: support s->mb_skip_run */
1523 }
1524
1525 842400 mb_type = get_interleaved_ue_golomb(&s->gb_slice);
1526
1527
2/2
✓ Branch 0 taken 19170 times.
✓ Branch 1 taken 823230 times.
842400 if (s->pict_type == AV_PICTURE_TYPE_I)
1528 19170 mb_type += 8;
1529
4/4
✓ Branch 0 taken 1080 times.
✓ Branch 1 taken 822150 times.
✓ Branch 2 taken 22 times.
✓ Branch 3 taken 1058 times.
823230 else if (s->pict_type == AV_PICTURE_TYPE_B && mb_type >= 4)
1530 22 mb_type += 4;
1531
2/4
✓ Branch 0 taken 842400 times.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 842400 times.
842400 if (mb_type > 33 || svq3_decode_mb(s, mb_type)) {
1532 av_log(s->avctx, AV_LOG_ERROR,
1533 "error while decoding MB %d %d\n", s->mb_x, s->mb_y);
1534 return -1;
1535 }
1536
1537
4/4
✓ Branch 0 taken 353880 times.
✓ Branch 1 taken 488520 times.
✓ Branch 2 taken 60 times.
✓ Branch 3 taken 353820 times.
842400 if (mb_type != 0 || s->cbp)
1538 488580 hl_decode_mb(s);
1539
1540
3/4
✓ Branch 0 taken 841320 times.
✓ Branch 1 taken 1080 times.
✓ Branch 2 taken 841320 times.
✗ Branch 3 not taken.
842400 if (s->pict_type != AV_PICTURE_TYPE_B && !s->low_delay)
1541 841320 s->cur_pic->mb_type[s->mb_x + s->mb_y * s->mb_stride] =
1542
4/4
✓ Branch 0 taken 822150 times.
✓ Branch 1 taken 19170 times.
✓ Branch 2 taken 790792 times.
✓ Branch 3 taken 31358 times.
841320 (s->pict_type == AV_PICTURE_TYPE_P && mb_type < 8) ? (mb_type - 1) : -1;
1543 }
1544
1545 42135 ff_draw_horiz_band(avctx, s->cur_pic->f,
1546 42075 s->last_pic->f->data[0] ? s->last_pic->f : NULL,
1547
2/2
✓ Branch 0 taken 42075 times.
✓ Branch 1 taken 60 times.
42135 16 * s->mb_y, 16, PICT_FRAME, 0,
1548 s->low_delay);
1549 }
1550
1551 2809 left = buf_size*8 - get_bits_count(&s->gb_slice);
1552
1553
2/4
✓ Branch 0 taken 2809 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2809 times.
2809 if (s->mb_y != s->mb_height || s->mb_x != s->mb_width) {
1554 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);
1555 //av_hex_dump(stderr, buf+buf_size-8, 8);
1556 }
1557
1558
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2809 times.
2809 if (left < 0) {
1559 av_log(avctx, AV_LOG_ERROR, "frame num %"PRId64" left %d\n", avctx->frame_num, left);
1560 return -1;
1561 }
1562
1563
3/4
✓ Branch 0 taken 2805 times.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2805 times.
2809 if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay)
1564 4 ret = av_frame_ref(rframe, s->cur_pic->f);
1565
2/2
✓ Branch 0 taken 2801 times.
✓ Branch 1 taken 4 times.
2805 else if (s->last_pic->f->data[0])
1566 2801 ret = av_frame_ref(rframe, s->last_pic->f);
1567
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2809 times.
2809 if (ret < 0)
1568 return ret;
1569
1570 /* Do not output the last pic after seeking. */
1571
3/4
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2805 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
2809 if (s->last_pic->f->data[0] || s->low_delay)
1572 2805 *got_frame = 1;
1573
1574
2/2
✓ Branch 0 taken 2805 times.
✓ Branch 1 taken 4 times.
2809 if (s->pict_type != AV_PICTURE_TYPE_B) {
1575 2805 FFSWAP(SVQ3Frame*, s->cur_pic, s->next_pic);
1576 } else {
1577 4 av_frame_unref(s->cur_pic->f);
1578 }
1579
1580 2809 return buf_size;
1581 }
1582
1583 8 static av_cold int svq3_decode_end(AVCodecContext *avctx)
1584 {
1585 8 SVQ3Context *s = avctx->priv_data;
1586
1587
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 8 times.
32 for (int i = 0; i < NUM_PICS; i++)
1588 24 av_frame_free(&s->frames[i].f);
1589 8 av_freep(&s->motion_val_buf);
1590 8 av_freep(&s->mb_type_buf);
1591 8 av_freep(&s->slice_buf);
1592 8 av_freep(&s->intra4x4_pred_mode);
1593 8 av_freep(&s->edge_emu_buffer);
1594 8 av_freep(&s->mb2br_xy);
1595
1596 8 return 0;
1597 }
1598
1599 const FFCodec ff_svq3_decoder = {
1600 .p.name = "svq3",
1601 CODEC_LONG_NAME("Sorenson Vector Quantizer 3 / Sorenson Video 3 / SVQ3"),
1602 .p.type = AVMEDIA_TYPE_VIDEO,
1603 .p.id = AV_CODEC_ID_SVQ3,
1604 .priv_data_size = sizeof(SVQ3Context),
1605 .init = svq3_decode_init,
1606 .close = svq3_decode_end,
1607 FF_CODEC_DECODE_CB(svq3_decode_frame),
1608 .p.capabilities = AV_CODEC_CAP_DRAW_HORIZ_BAND |
1609 AV_CODEC_CAP_DR1 |
1610 AV_CODEC_CAP_DELAY,
1611 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
1612 };
1613