FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/svq3.c
Date: 2025-08-19 23:55:23
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 4021067 static void svq3_add_idct_c(uint8_t *dst, int16_t *block,
259 int stride, int qp, int dc)
260 {
261 4021067 const int qmul = svq3_dequant_coeff[qp];
262 int i;
263
264
2/2
✓ Branch 0 taken 1000611 times.
✓ Branch 1 taken 3020456 times.
4021067 if (dc) {
265
2/2
✓ Branch 0 taken 26094 times.
✓ Branch 1 taken 974517 times.
1000611 dc = 13 * 13 * (dc == 1 ? 1538U* block[0]
266 974517 : qmul * (block[0] >> 3) / 2);
267 1000611 block[0] = 0;
268 }
269
270
2/2
✓ Branch 0 taken 16084268 times.
✓ Branch 1 taken 4021067 times.
20105335 for (i = 0; i < 4; i++) {
271 16084268 const int z0 = 13 * (block[0 + 4 * i] + block[2 + 4 * i]);
272 16084268 const int z1 = 13 * (block[0 + 4 * i] - block[2 + 4 * i]);
273 16084268 const int z2 = 7 * block[1 + 4 * i] - 17 * block[3 + 4 * i];
274 16084268 const int z3 = 17 * block[1 + 4 * i] + 7 * block[3 + 4 * i];
275
276 16084268 block[0 + 4 * i] = z0 + z3;
277 16084268 block[1 + 4 * i] = z1 + z2;
278 16084268 block[2 + 4 * i] = z1 - z2;
279 16084268 block[3 + 4 * i] = z0 - z3;
280 }
281
282
2/2
✓ Branch 0 taken 16084268 times.
✓ Branch 1 taken 4021067 times.
20105335 for (i = 0; i < 4; i++) {
283 16084268 const unsigned z0 = 13 * (block[i + 4 * 0] + block[i + 4 * 2]);
284 16084268 const unsigned z1 = 13 * (block[i + 4 * 0] - block[i + 4 * 2]);
285 16084268 const unsigned z2 = 7 * block[i + 4 * 1] - 17 * block[i + 4 * 3];
286 16084268 const unsigned z3 = 17 * block[i + 4 * 1] + 7 * block[i + 4 * 3];
287 16084268 const int rr = (dc + 0x80000u);
288
289 16084268 dst[i + stride * 0] = av_clip_uint8(dst[i + stride * 0] + ((int)((z0 + z3) * qmul + rr) >> 20));
290 16084268 dst[i + stride * 1] = av_clip_uint8(dst[i + stride * 1] + ((int)((z1 + z2) * qmul + rr) >> 20));
291 16084268 dst[i + stride * 2] = av_clip_uint8(dst[i + stride * 2] + ((int)((z1 - z2) * qmul + rr) >> 20));
292 16084268 dst[i + stride * 3] = av_clip_uint8(dst[i + stride * 3] + ((int)((z0 - z3) * qmul + rr) >> 20));
293 }
294
295 4021067 memset(block, 0, 16 * sizeof(int16_t));
296 4021067 }
297
298 3889227 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 3889227 const int intra = 3 * type >> 2;
308 3889227 const uint8_t *const scan = scan_patterns[type];
309
310
2/2
✓ Branch 0 taken 4450247 times.
✓ Branch 1 taken 561020 times.
5011267 for (limit = (16 >> intra); index < 16; index = limit, limit += 8) {
311
2/2
✓ Branch 1 taken 5390348 times.
✓ Branch 2 taken 4450247 times.
9840595 for (; (vlc = get_interleaved_ue_golomb(gb)) != 0; index++) {
312
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5390348 times.
5390348 if ((int32_t)vlc < 0)
313 return -1;
314
315
2/2
✓ Branch 0 taken 2642304 times.
✓ Branch 1 taken 2748044 times.
5390348 sign = (vlc & 1) ? 0 : -1;
316 5390348 vlc = vlc + 1 >> 1;
317
318
2/2
✓ Branch 0 taken 250160 times.
✓ Branch 1 taken 5140188 times.
5390348 if (type == 3) {
319
2/2
✓ Branch 0 taken 169337 times.
✓ Branch 1 taken 80823 times.
250160 if (vlc < 3) {
320 169337 run = 0;
321 169337 level = vlc;
322
2/2
✓ Branch 0 taken 34268 times.
✓ Branch 1 taken 46555 times.
80823 } else if (vlc < 4) {
323 34268 run = 1;
324 34268 level = 1;
325 } else {
326 46555 run = vlc & 0x3;
327 46555 level = (vlc + 9 >> 2) - run;
328 }
329 } else {
330
2/2
✓ Branch 0 taken 5047499 times.
✓ Branch 1 taken 92689 times.
5140188 if (vlc < 16U) {
331 5047499 run = svq3_dct_tables[intra][vlc].run;
332 5047499 level = svq3_dct_tables[intra][vlc].level;
333
2/2
✓ Branch 0 taken 8633 times.
✓ Branch 1 taken 84056 times.
92689 } else if (intra) {
334 8633 run = vlc & 0x7;
335
6/6
✓ Branch 0 taken 5371 times.
✓ Branch 1 taken 3262 times.
✓ Branch 2 taken 3390 times.
✓ Branch 3 taken 1981 times.
✓ Branch 4 taken 3282 times.
✓ Branch 5 taken 108 times.
8633 level = (vlc >> 3) + ((run == 0) ? 8 : ((run < 2) ? 2 : ((run < 5) ? 0 : -1)));
336 } else {
337 84056 run = vlc & 0xF;
338
6/6
✓ Branch 0 taken 51569 times.
✓ Branch 1 taken 32487 times.
✓ Branch 2 taken 21823 times.
✓ Branch 3 taken 29746 times.
✓ Branch 4 taken 18737 times.
✓ Branch 5 taken 3086 times.
84056 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 5390348 times.
5390348 if ((index += run) >= limit)
344 return -1;
345
346 5390348 block[scan[index]] = (level ^ sign) - sign;
347 }
348
349
2/2
✓ Branch 0 taken 3328207 times.
✓ Branch 1 taken 1122040 times.
4450247 if (type != 2) {
350 3328207 break;
351 }
352 }
353
354 3889227 return 0;
355 }
356
357 static av_always_inline int
358 557229 svq3_fetch_diagonal_mv(const SVQ3Context *s, const int16_t **C,
359 int i, int list, int part_width)
360 {
361 557229 const int topright_ref = s->ref_cache[list][i - 8 + part_width];
362
363
2/2
✓ Branch 0 taken 475607 times.
✓ Branch 1 taken 81622 times.
557229 if (topright_ref != PART_NOT_AVAILABLE) {
364 475607 *C = s->mv_cache[list][i - 8 + part_width];
365 475607 return topright_ref;
366 } else {
367 81622 *C = s->mv_cache[list][i - 8 - 1];
368 81622 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 557229 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 557229 const int index8 = scan8[n];
384 557229 const int top_ref = s->ref_cache[list][index8 - 8];
385 557229 const int left_ref = s->ref_cache[list][index8 - 1];
386 557229 const int16_t *const A = s->mv_cache[list][index8 - 1];
387 557229 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 557229 diagonal_ref = svq3_fetch_diagonal_mv(s, &C, index8, list, part_width);
400 557229 match_count = (diagonal_ref == ref) + (top_ref == ref) + (left_ref == ref);
401
2/2
✓ Branch 0 taken 533406 times.
✓ Branch 1 taken 23823 times.
557229 if (match_count > 1) { //most common
402 533406 *mx = mid_pred(A[0], B[0], C[0]);
403 533406 *my = mid_pred(A[1], B[1], C[1]);
404
1/2
✓ Branch 0 taken 23823 times.
✗ Branch 1 not taken.
23823 } else if (match_count == 1) {
405
1/2
✓ Branch 0 taken 23823 times.
✗ Branch 1 not taken.
23823 if (left_ref == ref) {
406 23823 *mx = A[0];
407 23823 *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 557229 }
427
428 912267 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 911136 times.
✓ Branch 1 taken 1131 times.
912267 const SVQ3Frame *pic = (dir == 0) ? s->last_pic : s->next_pic;
434 uint8_t *src, *dest;
435 912267 int i, emu = 0;
436 912267 int blocksize = 2 - (width >> 3); // 16->0, 8->1, 4->2
437 912267 int linesize = s->cur_pic->f->linesize[0];
438 912267 int uvlinesize = s->cur_pic->f->linesize[1];
439
440 912267 mx += x;
441 912267 my += y;
442
443
6/6
✓ Branch 0 taken 906056 times.
✓ Branch 1 taken 6211 times.
✓ Branch 2 taken 874238 times.
✓ Branch 3 taken 31818 times.
✓ Branch 4 taken 871136 times.
✓ Branch 5 taken 3102 times.
912267 if (mx < 0 || mx >= s->h_edge_pos - width - 1 ||
444
2/2
✓ Branch 0 taken 47614 times.
✓ Branch 1 taken 823522 times.
871136 my < 0 || my >= s->v_edge_pos - height - 1) {
445 88745 emu = 1;
446 88745 mx = av_clip(mx, -16, s->h_edge_pos - width + 15);
447 88745 my = av_clip(my, -16, s->v_edge_pos - height + 15);
448 }
449
450 /* form component predictions */
451 912267 dest = s->cur_pic->f->data[0] + x + y * linesize;
452 912267 src = pic->f->data[0] + mx + my * linesize;
453
454
2/2
✓ Branch 0 taken 88745 times.
✓ Branch 1 taken 823522 times.
912267 if (emu) {
455 88745 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 88745 src = s->edge_emu_buffer;
460 }
461
2/2
✓ Branch 0 taken 182 times.
✓ Branch 1 taken 912085 times.
912267 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 911017 times.
912085 : s->hdsp.put_pixels_tab)[blocksize][dxy](dest, src, linesize,
468 height);
469
470
1/2
✓ Branch 0 taken 912267 times.
✗ Branch 1 not taken.
912267 if (!(s->avctx->flags & AV_CODEC_FLAG_GRAY)) {
471 912267 mx = mx + (mx < (int) x) >> 1;
472 912267 my = my + (my < (int) y) >> 1;
473 912267 width = width >> 1;
474 912267 height = height >> 1;
475 912267 blocksize++;
476
477
2/2
✓ Branch 0 taken 1824534 times.
✓ Branch 1 taken 912267 times.
2736801 for (i = 1; i < 3; i++) {
478 1824534 dest = s->cur_pic->f->data[i] + (x >> 1) + (y >> 1) * uvlinesize;
479 1824534 src = pic->f->data[i] + mx + my * uvlinesize;
480
481
2/2
✓ Branch 0 taken 177490 times.
✓ Branch 1 taken 1647044 times.
1824534 if (emu) {
482 177490 s->vdsp.emulated_edge_mc(s->edge_emu_buffer, src,
483 uvlinesize, uvlinesize,
484 width + 1, height + 1,
485 177490 mx, my, (s->h_edge_pos >> 1),
486 177490 s->v_edge_pos >> 1);
487 177490 src = s->edge_emu_buffer;
488 }
489
2/2
✓ Branch 0 taken 364 times.
✓ Branch 1 taken 1824170 times.
1824534 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 1822034 times.
1824170 : s->hdsp.put_pixels_tab)[blocksize][dxy](dest, src,
497 uvlinesize,
498 height);
499 }
500 }
501 912267 }
502
503 439333 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
2/2
✓ Branch 0 taken 439311 times.
✓ Branch 1 taken 22 times.
439333 const int part_width = ((size & 5) == 4) ? 4 : 16 >> (size & 1);
508 439333 const int part_height = 16 >> ((unsigned)(size + 1) / 3);
509
2/2
✓ Branch 0 taken 786 times.
✓ Branch 1 taken 438547 times.
439333 const int extra_width = (mode == PREDICT_MODE) ? -16 * 6 : 0;
510 439333 const int h_edge_pos = 6 * (s->h_edge_pos - part_width) - extra_width;
511 439333 const int v_edge_pos = 6 * (s->v_edge_pos - part_height) - extra_width;
512
513
2/2
✓ Branch 0 taken 478933 times.
✓ Branch 1 taken 439333 times.
918266 for (i = 0; i < 16; i += part_height)
514
2/2
✓ Branch 0 taken 558267 times.
✓ Branch 1 taken 478933 times.
1037200 for (j = 0; j < 16; j += part_width) {
515 558267 const int b_xy = (4 * s->mb_x + (j >> 2)) +
516 558267 (4 * s->mb_y + (i >> 2)) * s->b_stride;
517 int dxy;
518 558267 x = 16 * s->mb_x + j;
519 558267 y = 16 * s->mb_y + i;
520 558267 k = (j >> 2 & 1) + (i >> 1 & 2) +
521 558267 (j >> 1 & 4) + (i & 8);
522
523
2/2
✓ Branch 0 taken 557229 times.
✓ Branch 1 taken 1038 times.
558267 if (mode != PREDICT_MODE) {
524 557229 svq3_pred_motion(s, k, part_width >> 2, dir, 1, &mx, &my);
525 } else {
526 1038 mx = s->next_pic->motion_val[0][b_xy][0] * 2;
527 1038 my = s->next_pic->motion_val[0][b_xy][1] * 2;
528
529
2/2
✓ Branch 0 taken 519 times.
✓ Branch 1 taken 519 times.
1038 if (dir == 0) {
530 519 mx = mx * s->frame_num_offset /
531 519 s->prev_frame_num_offset + 1 >> 1;
532 519 my = my * s->frame_num_offset /
533 519 s->prev_frame_num_offset + 1 >> 1;
534 } else {
535 519 mx = mx * (s->frame_num_offset - s->prev_frame_num_offset) /
536 519 s->prev_frame_num_offset + 1 >> 1;
537 519 my = my * (s->frame_num_offset - s->prev_frame_num_offset) /
538 519 s->prev_frame_num_offset + 1 >> 1;
539 }
540 }
541
542 /* clip motion vector prediction to frame border */
543 558267 mx = av_clip(mx, extra_width - 6 * x, h_edge_pos - 6 * x);
544 558267 my = av_clip(my, extra_width - 6 * y, v_edge_pos - 6 * y);
545
546 /* get (optional) motion vector differential */
547
2/2
✓ Branch 0 taken 1038 times.
✓ Branch 1 taken 557229 times.
558267 if (mode == PREDICT_MODE) {
548 1038 dx = dy = 0;
549 } else {
550 557229 dy = get_interleaved_se_golomb(&s->gb_slice);
551 557229 dx = get_interleaved_se_golomb(&s->gb_slice);
552
553
2/4
✓ Branch 0 taken 557229 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 557229 times.
557229 if (dx != (int16_t)dx || dy != (int16_t)dy) {
554 av_log(s->avctx, AV_LOG_ERROR, "invalid MV vlc\n");
555 return -1;
556 }
557 }
558
559 /* compute motion vector */
560
2/2
✓ Branch 0 taken 182 times.
✓ Branch 1 taken 558085 times.
558267 if (mode == THIRDPEL_MODE) {
561 int fx, fy;
562 182 mx = (mx + 1 >> 1) + dx;
563 182 my = (my + 1 >> 1) + dy;
564 182 fx = (unsigned)(mx + 0x30000) / 3 - 0x10000;
565 182 fy = (unsigned)(my + 0x30000) / 3 - 0x10000;
566 182 dxy = (mx - 3 * fx) + 4 * (my - 3 * fy);
567
568 182 svq3_mc_dir_part(s, x, y, part_width, part_height,
569 fx, fy, dxy, 1, dir, avg);
570 182 mx += mx;
571 182 my += my;
572
4/4
✓ Branch 0 taken 282554 times.
✓ Branch 1 taken 275531 times.
✓ Branch 2 taken 1038 times.
✓ Branch 3 taken 281516 times.
558085 } else if (mode == HALFPEL_MODE || mode == PREDICT_MODE) {
573 276569 mx = (unsigned)(mx + 1 + 0x30000) / 3 + dx - 0x10000;
574 276569 my = (unsigned)(my + 1 + 0x30000) / 3 + dy - 0x10000;
575 276569 dxy = (mx & 1) + 2 * (my & 1);
576
577 276569 svq3_mc_dir_part(s, x, y, part_width, part_height,
578 mx >> 1, my >> 1, dxy, 0, dir, avg);
579 276569 mx *= 3;
580 276569 my *= 3;
581 } else {
582 281516 mx = (unsigned)(mx + 3 + 0x60000) / 6 + dx - 0x10000;
583 281516 my = (unsigned)(my + 3 + 0x60000) / 6 + dy - 0x10000;
584
585 281516 svq3_mc_dir_part(s, x, y, part_width, part_height,
586 mx, my, 0, 0, dir, avg);
587 281516 mx *= 6;
588 281516 my *= 6;
589 }
590
591 /* update mv_cache */
592
2/2
✓ Branch 0 taken 557229 times.
✓ Branch 1 taken 1038 times.
558267 if (mode != PREDICT_MODE) {
593 557229 int32_t mv = pack16to32(mx, my);
594
595
4/4
✓ Branch 0 taken 158018 times.
✓ Branch 1 taken 399211 times.
✓ Branch 2 taken 79009 times.
✓ Branch 3 taken 79009 times.
557229 if (part_height == 8 && i < 8) {
596 79009 AV_WN32A(s->mv_cache[dir][scan8[k] + 1 * 8], mv);
597
598
4/4
✓ Branch 0 taken 78930 times.
✓ Branch 1 taken 79 times.
✓ Branch 2 taken 39465 times.
✓ Branch 3 taken 39465 times.
79009 if (part_width == 8 && j < 8)
599 39465 AV_WN32A(s->mv_cache[dir][scan8[k] + 1 + 1 * 8], mv);
600 }
601
4/4
✓ Branch 0 taken 158084 times.
✓ Branch 1 taken 399145 times.
✓ Branch 2 taken 79042 times.
✓ Branch 3 taken 79042 times.
557229 if (part_width == 8 && j < 8)
602 79042 AV_WN32A(s->mv_cache[dir][scan8[k] + 1], mv);
603
4/4
✓ Branch 0 taken 557093 times.
✓ Branch 1 taken 136 times.
✓ Branch 2 taken 48 times.
✓ Branch 3 taken 557045 times.
557229 if (part_width == 4 || part_height == 4)
604 184 AV_WN32A(s->mv_cache[dir][scan8[k]], mv);
605 }
606
607 /* write back motion vectors */
608 558267 fill_rectangle(s->cur_pic->motion_val[dir][b_xy],
609 part_width >> 2, part_height >> 2, s->b_stride,
610 pack16to32(mx, my), 4);
611 }
612
613 439333 return 0;
614 }
615
616 489148 static av_always_inline void hl_decode_mb_idct_luma(SVQ3Context *s,
617 int mb_type, const int *block_offset,
618 int linesize, uint8_t *dest_y)
619 {
620 int i;
621
2/2
✓ Branch 0 taken 441063 times.
✓ Branch 1 taken 48085 times.
489148 if (!IS_INTRA4x4(mb_type)) {
622
2/2
✓ Branch 0 taken 7057008 times.
✓ Branch 1 taken 441063 times.
7498071 for (i = 0; i < 16; i++)
623
4/4
✓ Branch 0 taken 4593856 times.
✓ Branch 1 taken 2463152 times.
✓ Branch 2 taken 22222 times.
✓ Branch 3 taken 4571634 times.
7057008 if (s->non_zero_count_cache[scan8[i]] || s->mb[i * 16]) {
624 2485374 uint8_t *const ptr = dest_y + block_offset[i];
625 2485374 svq3_add_idct_c(ptr, s->mb + i * 16, linesize,
626 2485374 s->qscale, IS_INTRA(mb_type) ? 1 : 0);
627 }
628 }
629 489148 }
630
631 50622 static av_always_inline void hl_decode_mb_predict_luma(SVQ3Context *s,
632 int mb_type,
633 const int *block_offset,
634 int linesize,
635 uint8_t *dest_y)
636 {
637 int i;
638 50622 int qscale = s->qscale;
639
640
2/2
✓ Branch 0 taken 48085 times.
✓ Branch 1 taken 2537 times.
50622 if (IS_INTRA4x4(mb_type)) {
641
2/2
✓ Branch 0 taken 769360 times.
✓ Branch 1 taken 48085 times.
817445 for (i = 0; i < 16; i++) {
642 769360 uint8_t *const ptr = dest_y + block_offset[i];
643 769360 const int dir = s->intra4x4_pred_mode_cache[scan8[i]];
644
645 uint8_t *topright;
646 int nnz;
647
3/4
✓ Branch 0 taken 716328 times.
✓ Branch 1 taken 53032 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 716328 times.
769360 if (dir == DIAG_DOWN_LEFT_PRED || dir == VERT_LEFT_PRED) {
648 av_assert2(s->mb_y || linesize <= block_offset[i]);
649 53032 topright = ptr + 4 - linesize;
650 } else
651 716328 topright = NULL;
652
653 769360 s->hpc.pred4x4[dir](ptr, topright, linesize);
654 769360 nnz = s->non_zero_count_cache[scan8[i]];
655
2/2
✓ Branch 0 taken 561176 times.
✓ Branch 1 taken 208184 times.
769360 if (nnz) {
656 561176 svq3_add_idct_c(ptr, s->mb + i * 16, linesize, qscale, 0);
657 }
658 }
659 } else {
660 2537 s->hpc.pred16x16[s->intra16x16_pred_mode](dest_y, linesize);
661 2537 svq3_luma_dc_dequant_idct_c(s->mb, s->mb_luma_dc[0], qscale);
662 }
663 50622 }
664
665 489148 static void hl_decode_mb(SVQ3Context *s)
666 {
667 489148 const int mb_x = s->mb_x;
668 489148 const int mb_y = s->mb_y;
669 489148 const int mb_xy = s->mb_xy;
670 489148 const int mb_type = s->cur_pic->mb_type[mb_xy];
671 uint8_t *dest_y, *dest_cb, *dest_cr;
672 int linesize, uvlinesize;
673 int i, j;
674 489148 const int *block_offset = &s->block_offset[0];
675 489148 const int block_h = 16 >> 1;
676
677 489148 linesize = s->cur_pic->f->linesize[0];
678 489148 uvlinesize = s->cur_pic->f->linesize[1];
679
680 489148 dest_y = s->cur_pic->f->data[0] + (mb_x + mb_y * linesize) * 16;
681 489148 dest_cb = s->cur_pic->f->data[1] + mb_x * 8 + mb_y * uvlinesize * block_h;
682 489148 dest_cr = s->cur_pic->f->data[2] + mb_x * 8 + mb_y * uvlinesize * block_h;
683
684 489148 s->vdsp.prefetch(dest_y + (s->mb_x & 3) * 4 * linesize + 64, linesize, 4);
685 489148 s->vdsp.prefetch(dest_cb + (s->mb_x & 7) * uvlinesize + 64, dest_cr - dest_cb, 2);
686
687
2/2
✓ Branch 0 taken 50622 times.
✓ Branch 1 taken 438526 times.
489148 if (IS_INTRA(mb_type)) {
688 50622 s->hpc.pred8x8[s->chroma_pred_mode](dest_cb, uvlinesize);
689 50622 s->hpc.pred8x8[s->chroma_pred_mode](dest_cr, uvlinesize);
690
691 50622 hl_decode_mb_predict_luma(s, mb_type, block_offset, linesize, dest_y);
692 }
693
694 489148 hl_decode_mb_idct_luma(s, mb_type, block_offset, linesize, dest_y);
695
696
2/2
✓ Branch 0 taken 159521 times.
✓ Branch 1 taken 329627 times.
489148 if (s->cbp & 0x30) {
697 159521 uint8_t *dest[2] = { dest_cb, dest_cr };
698 159521 s->h264dsp.h264_chroma_dc_dequant_idct(s->mb + 16 * 16 * 1,
699 159521 s->dequant4_coeff[4][0]);
700 159521 s->h264dsp.h264_chroma_dc_dequant_idct(s->mb + 16 * 16 * 2,
701 159521 s->dequant4_coeff[4][0]);
702
2/2
✓ Branch 0 taken 319042 times.
✓ Branch 1 taken 159521 times.
478563 for (j = 1; j < 3; j++) {
703
2/2
✓ Branch 0 taken 1276168 times.
✓ Branch 1 taken 319042 times.
1595210 for (i = j * 16; i < j * 16 + 4; i++)
704
4/4
✓ Branch 0 taken 732848 times.
✓ Branch 1 taken 543320 times.
✓ Branch 2 taken 431197 times.
✓ Branch 3 taken 301651 times.
1276168 if (s->non_zero_count_cache[scan8[i]] || s->mb[i * 16]) {
705 974517 uint8_t *const ptr = dest[j - 1] + block_offset[i];
706 974517 svq3_add_idct_c(ptr, s->mb + i * 16,
707 974517 uvlinesize, ff_h264_chroma_qp[0][s->qscale + 12] - 12, 2);
708 }
709 }
710 }
711 489148 }
712
713 843000 static int svq3_decode_mb(SVQ3Context *s, unsigned int mb_type)
714 {
715 int i, j, k, m, dir, mode;
716 843000 int cbp = 0;
717 uint32_t vlc;
718 int8_t *top, *left;
719 843000 const int mb_xy = s->mb_xy;
720 843000 const int b_xy = 4 * s->mb_x + 4 * s->mb_y * s->b_stride;
721
722
2/2
✓ Branch 0 taken 56200 times.
✓ Branch 1 taken 786800 times.
843000 s->top_samples_available = (s->mb_y == 0) ? 0x33FF : 0xFFFF;
723
2/2
✓ Branch 0 taken 42165 times.
✓ Branch 1 taken 800835 times.
843000 s->left_samples_available = (s->mb_x == 0) ? 0x5F5F : 0xFFFF;
724
725
2/2
✓ Branch 0 taken 353912 times.
✓ Branch 1 taken 489088 times.
843000 if (mb_type == 0) { /* SKIP */
726
2/2
✓ Branch 0 taken 874 times.
✓ Branch 1 taken 353038 times.
353912 if (s->pict_type == AV_PICTURE_TYPE_P ||
727
2/2
✓ Branch 0 taken 481 times.
✓ Branch 1 taken 393 times.
874 s->next_pic->mb_type[mb_xy] == -1) {
728 353519 svq3_mc_dir_part(s, 16 * s->mb_x, 16 * s->mb_y, 16, 16,
729 0, 0, 0, 0, 0, 0);
730
731
2/2
✓ Branch 0 taken 481 times.
✓ Branch 1 taken 353038 times.
353519 if (s->pict_type == AV_PICTURE_TYPE_B)
732 481 svq3_mc_dir_part(s, 16 * s->mb_x, 16 * s->mb_y, 16, 16,
733 0, 0, 0, 0, 1, 1);
734
735 353519 mb_type = MB_TYPE_SKIP;
736 } else {
737 393 mb_type = FFMIN(s->next_pic->mb_type[mb_xy], 6);
738
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 393 times.
393 if (svq3_mc_dir(s, mb_type, PREDICT_MODE, 0, 0) < 0)
739 return -1;
740
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 393 times.
393 if (svq3_mc_dir(s, mb_type, PREDICT_MODE, 1, 1) < 0)
741 return -1;
742
743 393 mb_type = MB_TYPE_16x16;
744 }
745
2/2
✓ Branch 0 taken 438466 times.
✓ Branch 1 taken 50622 times.
489088 } else if (mb_type < 8) { /* INTER */
746
4/4
✓ Branch 0 taken 833 times.
✓ Branch 1 taken 437633 times.
✓ Branch 3 taken 129 times.
✓ Branch 4 taken 704 times.
438466 if (s->thirdpel_flag && s->halfpel_flag == !get_bits1(&s->gb_slice))
747 129 mode = THIRDPEL_MODE;
748
1/2
✓ Branch 0 taken 438337 times.
✗ Branch 1 not taken.
438337 else if (s->halfpel_flag &&
749
2/2
✓ Branch 1 taken 197275 times.
✓ Branch 2 taken 241062 times.
438337 s->thirdpel_flag == !get_bits1(&s->gb_slice))
750 197275 mode = HALFPEL_MODE;
751 else
752 241062 mode = FULLPEL_MODE;
753
754 /* fill caches */
755 /* note ref_cache should contain here:
756 * ????????
757 * ???11111
758 * N??11111
759 * N??11111
760 * N??11111
761 */
762
763
2/2
✓ Branch 0 taken 438650 times.
✓ Branch 1 taken 184 times.
438834 for (m = 0; m < 2; m++) {
764
3/4
✓ Branch 0 taken 421880 times.
✓ Branch 1 taken 16770 times.
✓ Branch 2 taken 421880 times.
✗ Branch 3 not taken.
438650 if (s->mb_x > 0 && s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - 1] + 6] != -1) {
765
2/2
✓ Branch 0 taken 1687520 times.
✓ Branch 1 taken 421880 times.
2109400 for (i = 0; i < 4; i++)
766 1687520 AV_COPY32(s->mv_cache[m][scan8[0] - 1 + i * 8],
767 s->cur_pic->motion_val[m][b_xy - 1 + i * s->b_stride]);
768 } else {
769
2/2
✓ Branch 0 taken 67080 times.
✓ Branch 1 taken 16770 times.
83850 for (i = 0; i < 4; i++)
770 67080 AV_ZERO32(s->mv_cache[m][scan8[0] - 1 + i * 8]);
771 }
772
2/2
✓ Branch 0 taken 415726 times.
✓ Branch 1 taken 22924 times.
438650 if (s->mb_y > 0) {
773 415726 memcpy(s->mv_cache[m][scan8[0] - 1 * 8],
774 415726 s->cur_pic->motion_val[m][b_xy - s->b_stride],
775 4 * 2 * sizeof(int16_t));
776 415726 memset(&s->ref_cache[m][scan8[0] - 1 * 8],
777
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 415726 times.
415726 (s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride]] == -1) ? PART_NOT_AVAILABLE : 1, 4);
778
779
2/2
✓ Branch 0 taken 397465 times.
✓ Branch 1 taken 18261 times.
415726 if (s->mb_x < s->mb_width - 1) {
780 397465 AV_COPY32(s->mv_cache[m][scan8[0] + 4 - 1 * 8],
781 s->cur_pic->motion_val[m][b_xy - s->b_stride + 4]);
782 397465 s->ref_cache[m][scan8[0] + 4 - 1 * 8] =
783
1/2
✓ Branch 0 taken 397465 times.
✗ Branch 1 not taken.
397465 (s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride + 1] + 6] == -1 ||
784
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 397465 times.
397465 s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride]] == -1) ? PART_NOT_AVAILABLE : 1;
785 } else
786 18261 s->ref_cache[m][scan8[0] + 4 - 1 * 8] = PART_NOT_AVAILABLE;
787
2/2
✓ Branch 0 taken 399874 times.
✓ Branch 1 taken 15852 times.
415726 if (s->mb_x > 0) {
788 399874 AV_COPY32(s->mv_cache[m][scan8[0] - 1 - 1 * 8],
789 s->cur_pic->motion_val[m][b_xy - s->b_stride - 1]);
790 399874 s->ref_cache[m][scan8[0] - 1 - 1 * 8] =
791
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 399874 times.
399874 (s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride - 1] + 3] == -1) ? PART_NOT_AVAILABLE : 1;
792 } else
793 15852 s->ref_cache[m][scan8[0] - 1 - 1 * 8] = PART_NOT_AVAILABLE;
794 } else
795 22924 memset(&s->ref_cache[m][scan8[0] - 1 * 8 - 1],
796 PART_NOT_AVAILABLE, 8);
797
798
2/2
✓ Branch 0 taken 438282 times.
✓ Branch 1 taken 368 times.
438650 if (s->pict_type != AV_PICTURE_TYPE_B)
799 438282 break;
800 }
801
802 /* decode motion vector(s) and form prediction(s) */
803
2/2
✓ Branch 0 taken 438282 times.
✓ Branch 1 taken 184 times.
438466 if (s->pict_type == AV_PICTURE_TYPE_P) {
804
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 438282 times.
438282 if (svq3_mc_dir(s, mb_type - 1, mode, 0, 0) < 0)
805 return -1;
806 } else { /* AV_PICTURE_TYPE_B */
807
2/2
✓ Branch 0 taken 134 times.
✓ Branch 1 taken 50 times.
184 if (mb_type != 2) {
808
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 134 times.
134 if (svq3_mc_dir(s, 0, mode, 0, 0) < 0)
809 return -1;
810 } else {
811
2/2
✓ Branch 0 taken 200 times.
✓ Branch 1 taken 50 times.
250 for (i = 0; i < 4; i++)
812 200 memset(s->cur_pic->motion_val[0][b_xy + i * s->b_stride],
813 0, 4 * 2 * sizeof(int16_t));
814 }
815
2/2
✓ Branch 0 taken 131 times.
✓ Branch 1 taken 53 times.
184 if (mb_type != 1) {
816
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 131 times.
131 if (svq3_mc_dir(s, 0, mode, 1, mb_type == 3) < 0)
817 return -1;
818 } else {
819
2/2
✓ Branch 0 taken 212 times.
✓ Branch 1 taken 53 times.
265 for (i = 0; i < 4; i++)
820 212 memset(s->cur_pic->motion_val[1][b_xy + i * s->b_stride],
821 0, 4 * 2 * sizeof(int16_t));
822 }
823 }
824
825 438466 mb_type = MB_TYPE_16x16;
826
3/4
✓ Branch 0 taken 2537 times.
✓ Branch 1 taken 48085 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2537 times.
50622 } else if (mb_type == 8 || mb_type == 33) { /* INTRA4x4 */
827 48085 int8_t *i4x4 = s->intra4x4_pred_mode + s->mb2br_xy[s->mb_xy];
828 48085 int8_t *i4x4_cache = s->intra4x4_pred_mode_cache;
829
830 48085 memset(s->intra4x4_pred_mode_cache, -1, 8 * 5 * sizeof(int8_t));
831
832
1/2
✓ Branch 0 taken 48085 times.
✗ Branch 1 not taken.
48085 if (mb_type == 8) {
833
2/2
✓ Branch 0 taken 44080 times.
✓ Branch 1 taken 4005 times.
48085 if (s->mb_x > 0) {
834
2/2
✓ Branch 0 taken 176320 times.
✓ Branch 1 taken 44080 times.
220400 for (i = 0; i < 4; i++)
835 176320 s->intra4x4_pred_mode_cache[scan8[0] - 1 + i * 8] = s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - 1] + 6 - i];
836
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 44080 times.
44080 if (s->intra4x4_pred_mode_cache[scan8[0] - 1] == -1)
837 s->left_samples_available = 0x5F5F;
838 }
839
2/2
✓ Branch 0 taken 45176 times.
✓ Branch 1 taken 2909 times.
48085 if (s->mb_y > 0) {
840 45176 s->intra4x4_pred_mode_cache[4 + 8 * 0] = s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride] + 0];
841 45176 s->intra4x4_pred_mode_cache[5 + 8 * 0] = s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride] + 1];
842 45176 s->intra4x4_pred_mode_cache[6 + 8 * 0] = s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride] + 2];
843 45176 s->intra4x4_pred_mode_cache[7 + 8 * 0] = s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride] + 3];
844
845
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 45176 times.
45176 if (s->intra4x4_pred_mode_cache[4 + 8 * 0] == -1)
846 s->top_samples_available = 0x33FF;
847 }
848
849 /* decode prediction codes for luma blocks */
850
2/2
✓ Branch 0 taken 384680 times.
✓ Branch 1 taken 48085 times.
432765 for (i = 0; i < 16; i += 2) {
851 384680 vlc = get_interleaved_ue_golomb(&s->gb_slice);
852
853
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 384680 times.
384680 if (vlc >= 25U) {
854 av_log(s->avctx, AV_LOG_ERROR,
855 "luma prediction:%"PRIu32"\n", vlc);
856 return -1;
857 }
858
859 384680 left = &s->intra4x4_pred_mode_cache[scan8[i] - 1];
860 384680 top = &s->intra4x4_pred_mode_cache[scan8[i] - 8];
861
862 384680 left[1] = svq3_pred_1[top[0] + 1][left[0] + 1][svq3_pred_0[vlc][0]];
863 384680 left[2] = svq3_pred_1[top[1] + 1][left[1] + 1][svq3_pred_0[vlc][1]];
864
865
2/4
✓ Branch 0 taken 384680 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 384680 times.
384680 if (left[1] == -1 || left[2] == -1) {
866 av_log(s->avctx, AV_LOG_ERROR, "weird prediction\n");
867 return -1;
868 }
869 }
870 } else { /* mb_type == 33, DC_128_PRED block type */
871 for (i = 0; i < 4; i++)
872 memset(&s->intra4x4_pred_mode_cache[scan8[0] + 8 * i], DC_PRED, 4);
873 }
874
875 48085 AV_COPY32(i4x4, i4x4_cache + 4 + 8 * 4);
876 48085 i4x4[4] = i4x4_cache[7 + 8 * 3];
877 48085 i4x4[5] = i4x4_cache[7 + 8 * 2];
878 48085 i4x4[6] = i4x4_cache[7 + 8 * 1];
879
880
1/2
✓ Branch 0 taken 48085 times.
✗ Branch 1 not taken.
48085 if (mb_type == 8) {
881 48085 ff_h264_check_intra4x4_pred_mode(s->intra4x4_pred_mode_cache,
882 48085 s->avctx, s->top_samples_available,
883 48085 s->left_samples_available);
884
885
2/2
✓ Branch 0 taken 2909 times.
✓ Branch 1 taken 45176 times.
48085 s->top_samples_available = (s->mb_y == 0) ? 0x33FF : 0xFFFF;
886
2/2
✓ Branch 0 taken 4005 times.
✓ Branch 1 taken 44080 times.
48085 s->left_samples_available = (s->mb_x == 0) ? 0x5F5F : 0xFFFF;
887 } else {
888 for (i = 0; i < 4; i++)
889 memset(&s->intra4x4_pred_mode_cache[scan8[0] + 8 * i], DC_128_PRED, 4);
890
891 s->top_samples_available = 0x33FF;
892 s->left_samples_available = 0x5F5F;
893 }
894
895 48085 mb_type = MB_TYPE_INTRA4x4;
896 } else { /* INTRA16x16 */
897 2537 dir = ff_h264_i_mb_type_info[mb_type - 8].pred_mode;
898 2537 dir = (dir >> 1) ^ 3 * (dir & 1) ^ 1;
899
900
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,
901 2537 s->left_samples_available, dir, 0)) < 0) {
902 av_log(s->avctx, AV_LOG_ERROR, "ff_h264_check_intra_pred_mode < 0\n");
903 return s->intra16x16_pred_mode;
904 }
905
906 2537 cbp = ff_h264_i_mb_type_info[mb_type - 8].cbp;
907 2537 mb_type = MB_TYPE_INTRA16x16;
908 }
909
910
4/4
✓ Branch 0 taken 404141 times.
✓ Branch 1 taken 438859 times.
✓ Branch 2 taken 384971 times.
✓ Branch 3 taken 19170 times.
843000 if (!IS_INTER(mb_type) && s->pict_type != AV_PICTURE_TYPE_I) {
911
2/2
✓ Branch 0 taken 1539884 times.
✓ Branch 1 taken 384971 times.
1924855 for (i = 0; i < 4; i++)
912 1539884 memset(s->cur_pic->motion_val[0][b_xy + i * s->b_stride],
913 0, 4 * 2 * sizeof(int16_t));
914
2/2
✓ Branch 0 taken 503 times.
✓ Branch 1 taken 384468 times.
384971 if (s->pict_type == AV_PICTURE_TYPE_B) {
915
2/2
✓ Branch 0 taken 2012 times.
✓ Branch 1 taken 503 times.
2515 for (i = 0; i < 4; i++)
916 2012 memset(s->cur_pic->motion_val[1][b_xy + i * s->b_stride],
917 0, 4 * 2 * sizeof(int16_t));
918 }
919 }
920
2/2
✓ Branch 0 taken 794915 times.
✓ Branch 1 taken 48085 times.
843000 if (!IS_INTRA4x4(mb_type)) {
921 794915 memset(s->intra4x4_pred_mode + s->mb2br_xy[mb_xy], DC_PRED, 8);
922 }
923
4/4
✓ Branch 0 taken 353519 times.
✓ Branch 1 taken 489481 times.
✓ Branch 2 taken 481 times.
✓ Branch 3 taken 353038 times.
843000 if (!IS_SKIP(mb_type) || s->pict_type == AV_PICTURE_TYPE_B) {
924 489962 memset(s->non_zero_count_cache + 8, 0, 14 * 8 * sizeof(uint8_t));
925 }
926
927
2/2
✓ Branch 0 taken 840463 times.
✓ Branch 1 taken 2537 times.
843000 if (!IS_INTRA16x16(mb_type) &&
928
4/4
✓ Branch 0 taken 353519 times.
✓ Branch 1 taken 486944 times.
✓ Branch 2 taken 481 times.
✓ Branch 3 taken 353038 times.
840463 (!IS_SKIP(mb_type) || s->pict_type == AV_PICTURE_TYPE_B)) {
929
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 487425 times.
487425 if ((vlc = get_interleaved_ue_golomb(&s->gb_slice)) >= 48U){
930 av_log(s->avctx, AV_LOG_ERROR, "cbp_vlc=%"PRIu32"\n", vlc);
931 return -1;
932 }
933
934 487425 cbp = IS_INTRA(mb_type) ? ff_h264_golomb_to_intra4x4_cbp[vlc]
935
2/2
✓ Branch 0 taken 48085 times.
✓ Branch 1 taken 439340 times.
487425 : ff_h264_golomb_to_inter_cbp[vlc];
936 }
937
2/2
✓ Branch 0 taken 840463 times.
✓ Branch 1 taken 2537 times.
843000 if (IS_INTRA16x16(mb_type) ||
938
6/6
✓ Branch 0 taken 823503 times.
✓ Branch 1 taken 16960 times.
✓ Branch 2 taken 2424 times.
✓ Branch 3 taken 821079 times.
✓ Branch 4 taken 696 times.
✓ Branch 5 taken 1728 times.
840463 (s->pict_type != AV_PICTURE_TYPE_I && s->adaptive_quant && cbp)) {
939 3233 s->qscale += get_interleaved_se_golomb(&s->gb_slice);
940
941
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3233 times.
3233 if (s->qscale > 31u) {
942 av_log(s->avctx, AV_LOG_ERROR, "qscale:%d\n", s->qscale);
943 return -1;
944 }
945 }
946
2/2
✓ Branch 0 taken 2537 times.
✓ Branch 1 taken 840463 times.
843000 if (IS_INTRA16x16(mb_type)) {
947 2537 AV_ZERO128(s->mb_luma_dc[0] + 0);
948 2537 AV_ZERO128(s->mb_luma_dc[0] + 8);
949
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)) {
950 av_log(s->avctx, AV_LOG_ERROR,
951 "error while decoding intra luma dc\n");
952 return -1;
953 }
954 }
955
956
2/2
✓ Branch 0 taken 334040 times.
✓ Branch 1 taken 508960 times.
843000 if (cbp) {
957 334040 const int index = IS_INTRA16x16(mb_type) ? 1 : 0;
958
4/4
✓ Branch 0 taken 333974 times.
✓ Branch 1 taken 66 times.
✓ Branch 2 taken 40612 times.
✓ Branch 3 taken 293362 times.
334040 const int type = ((s->qscale < 24 && IS_INTRA4x4(mb_type)) ? 2 : 1);
959
960
2/2
✓ Branch 0 taken 1336160 times.
✓ Branch 1 taken 334040 times.
1670200 for (i = 0; i < 4; i++)
961
2/2
✓ Branch 0 taken 756082 times.
✓ Branch 1 taken 580078 times.
1336160 if ((cbp & (1 << i))) {
962
2/2
✓ Branch 0 taken 3024328 times.
✓ Branch 1 taken 756082 times.
3780410 for (j = 0; j < 4; j++) {
963 3028200 k = index ? (1 * (j & 1) + 2 * (i & 1) +
964 3872 2 * (j & 2) + 4 * (i & 2))
965
2/2
✓ Branch 0 taken 3872 times.
✓ Branch 1 taken 3020456 times.
3024328 : (4 * i + j);
966 3024328 s->non_zero_count_cache[scan8[k]] = 1;
967
968
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3024328 times.
3024328 if (svq3_decode_block(&s->gb_slice, &s->mb[16 * k], index, type)) {
969 av_log(s->avctx, AV_LOG_ERROR,
970 "error while decoding block\n");
971 return -1;
972 }
973 }
974 }
975
976
2/2
✓ Branch 0 taken 159521 times.
✓ Branch 1 taken 174519 times.
334040 if ((cbp & 0x30)) {
977
2/2
✓ Branch 0 taken 319042 times.
✓ Branch 1 taken 159521 times.
478563 for (i = 1; i < 3; ++i)
978
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 319042 times.
319042 if (svq3_decode_block(&s->gb_slice, &s->mb[16 * 16 * i], 0, 3)) {
979 av_log(s->avctx, AV_LOG_ERROR,
980 "error while decoding chroma dc block\n");
981 return -1;
982 }
983
984
2/2
✓ Branch 0 taken 67915 times.
✓ Branch 1 taken 91606 times.
159521 if ((cbp & 0x20)) {
985
2/2
✓ Branch 0 taken 135830 times.
✓ Branch 1 taken 67915 times.
203745 for (i = 1; i < 3; i++) {
986
2/2
✓ Branch 0 taken 543320 times.
✓ Branch 1 taken 135830 times.
679150 for (j = 0; j < 4; j++) {
987 543320 k = 16 * i + j;
988 543320 s->non_zero_count_cache[scan8[k]] = 1;
989
990
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 543320 times.
543320 if (svq3_decode_block(&s->gb_slice, &s->mb[16 * k], 1, 1)) {
991 av_log(s->avctx, AV_LOG_ERROR,
992 "error while decoding chroma ac block\n");
993 return -1;
994 }
995 }
996 }
997 }
998 }
999 }
1000
1001 843000 s->cbp = cbp;
1002 843000 s->cur_pic->mb_type[mb_xy] = mb_type;
1003
1004
2/2
✓ Branch 0 taken 50622 times.
✓ Branch 1 taken 792378 times.
843000 if (IS_INTRA(mb_type))
1005 50622 s->chroma_pred_mode = ff_h264_check_intra_pred_mode(s->avctx, s->top_samples_available,
1006 50622 s->left_samples_available, DC_PRED8x8, 1);
1007
1008 843000 return 0;
1009 }
1010
1011 2811 static int svq3_decode_slice_header(AVCodecContext *avctx)
1012 {
1013 2811 SVQ3Context *s = avctx->priv_data;
1014 2811 const int mb_xy = s->mb_xy;
1015 int i, header;
1016 unsigned slice_id;
1017
1018 2811 header = get_bits(&s->gb, 8);
1019
1020
2/6
✗ Branch 0 not taken.
✓ Branch 1 taken 2811 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2811 times.
2811 if (((header & 0x9F) != 1 && (header & 0x9F) != 2) || (header & 0x60) == 0) {
1021 /* TODO: what? */
1022 av_log(avctx, AV_LOG_ERROR, "unsupported slice header (%02X)\n", header);
1023 return -1;
1024 } else {
1025 int slice_bits, slice_bytes, slice_length;
1026 2811 int length = header >> 5 & 3;
1027
1028 2811 slice_length = show_bits(&s->gb, 8 * length);
1029 2811 slice_bits = slice_length * 8;
1030 2811 slice_bytes = slice_length + length - 1;
1031
1032 2811 skip_bits(&s->gb, 8);
1033
1034 2811 av_fast_padded_malloc(&s->slice_buf, &s->slice_buf_size, slice_bytes);
1035
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2811 times.
2811 if (!s->slice_buf)
1036 return AVERROR(ENOMEM);
1037
1038
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2811 times.
2811 if (slice_bytes * 8LL > get_bits_left(&s->gb)) {
1039 av_log(avctx, AV_LOG_ERROR, "slice after bitstream end\n");
1040 return AVERROR_INVALIDDATA;
1041 }
1042 2811 memcpy(s->slice_buf, s->gb.buffer + s->gb.index / 8, slice_bytes);
1043
1044
1/2
✓ Branch 0 taken 2811 times.
✗ Branch 1 not taken.
2811 if (length > 0) {
1045 2811 memmove(s->slice_buf, &s->slice_buf[slice_length], length - 1);
1046 }
1047
1048
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 2801 times.
2811 if (s->watermark_key) {
1049 10 uint32_t header = AV_RL32(&s->slice_buf[1]);
1050 10 AV_WL32(&s->slice_buf[1], header ^ s->watermark_key);
1051 }
1052 2811 init_get_bits(&s->gb_slice, s->slice_buf, slice_bits);
1053
1054 2811 skip_bits_long(&s->gb, slice_bytes * 8);
1055 }
1056
1057
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2811 times.
2811 if ((slice_id = get_interleaved_ue_golomb(&s->gb_slice)) >= 3) {
1058 av_log(s->avctx, AV_LOG_ERROR, "illegal slice type %u \n", slice_id);
1059 return -1;
1060 }
1061
1062 2811 s->slice_type = ff_h264_golomb_to_pict_type[slice_id];
1063
1064
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2811 times.
2811 if ((header & 0x9F) == 2) {
1065 i = (s->mb_num < 64) ? 6 : (1 + av_log2(s->mb_num - 1));
1066 get_bits(&s->gb_slice, i);
1067
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2811 times.
2811 } else if (get_bits1(&s->gb_slice)) {
1068 avpriv_report_missing_feature(s->avctx, "Media key encryption");
1069 return AVERROR_PATCHWELCOME;
1070 }
1071
1072 2811 s->slice_num = get_bits(&s->gb_slice, 8);
1073 2811 s->qscale = get_bits(&s->gb_slice, 5);
1074 2811 s->adaptive_quant = get_bits1(&s->gb_slice);
1075
1076 /* unknown fields */
1077 2811 skip_bits1(&s->gb_slice);
1078
1079
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 2801 times.
2811 if (s->has_watermark)
1080 10 skip_bits1(&s->gb_slice);
1081
1082 2811 skip_bits1(&s->gb_slice);
1083 2811 skip_bits(&s->gb_slice, 2);
1084
1085
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2811 times.
2811 if (skip_1stop_8data_bits(&s->gb_slice) < 0)
1086 return AVERROR_INVALIDDATA;
1087
1088 /* reset intra predictors and invalidate motion vector references */
1089
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2811 times.
2811 if (s->mb_x > 0) {
1090 memset(s->intra4x4_pred_mode + s->mb2br_xy[mb_xy - 1] + 3,
1091 -1, 4 * sizeof(int8_t));
1092 memset(s->intra4x4_pred_mode + s->mb2br_xy[mb_xy - s->mb_x],
1093 -1, 8 * sizeof(int8_t) * s->mb_x);
1094 }
1095
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2811 times.
2811 if (s->mb_y > 0) {
1096 memset(s->intra4x4_pred_mode + s->mb2br_xy[mb_xy - s->mb_stride],
1097 -1, 8 * sizeof(int8_t) * (s->mb_width - s->mb_x));
1098
1099 if (s->mb_x > 0)
1100 s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride - 1] + 3] = -1;
1101 }
1102
1103 2811 return 0;
1104 }
1105
1106 8 static void init_dequant4_coeff_table(SVQ3Context *s)
1107 {
1108 int q, x;
1109 8 const int max_qp = 51;
1110
1111
2/2
✓ Branch 0 taken 416 times.
✓ Branch 1 taken 8 times.
424 for (q = 0; q < max_qp + 1; q++) {
1112 416 int shift = ff_h264_quant_div6[q] + 2;
1113 416 int idx = ff_h264_quant_rem6[q];
1114
2/2
✓ Branch 0 taken 6656 times.
✓ Branch 1 taken 416 times.
7072 for (x = 0; x < 16; x++)
1115 6656 s->dequant4_coeff[q][(x >> 2) | ((x << 2) & 0xF)] =
1116 6656 ((uint32_t)ff_h264_dequant4_coeff_init[idx][(x & 1) + ((x >> 2) & 1)] * 16) << shift;
1117 }
1118 8 }
1119
1120 8 static av_cold int svq3_decode_extradata(AVCodecContext *avctx, SVQ3Context *s,
1121 int seqh_offset)
1122 {
1123 8 const uint8_t *extradata = avctx->extradata + seqh_offset;
1124 8 unsigned int size = AV_RB32(extradata + 4);
1125 GetBitContext gb;
1126 int ret;
1127
1128
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 if (size > avctx->extradata_size - seqh_offset - 8)
1129 return AVERROR_INVALIDDATA;
1130 8 extradata += 8;
1131 8 init_get_bits(&gb, extradata, size * 8);
1132
1133 /* 'frame size code' and optional 'width, height' */
1134 8 int frame_size_code = get_bits(&gb, 3);
1135 int w, h;
1136
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) {
1137 case 0:
1138 w = 160;
1139 h = 120;
1140 break;
1141 case 1:
1142 w = 128;
1143 h = 96;
1144 break;
1145 case 2:
1146 w = 176;
1147 h = 144;
1148 break;
1149 case 3:
1150 w = 352;
1151 h = 288;
1152 break;
1153 case 4:
1154 w = 704;
1155 h = 576;
1156 break;
1157 case 5:
1158 w = 240;
1159 h = 180;
1160 break;
1161 6 case 6:
1162 6 w = 320;
1163 6 h = 240;
1164 6 break;
1165 2 case 7:
1166 2 w = get_bits(&gb, 12);
1167 2 h = get_bits(&gb, 12);
1168 2 break;
1169 }
1170 8 ret = ff_set_dimensions(avctx, w, h);
1171
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 if (ret < 0)
1172 return ret;
1173
1174 8 s->halfpel_flag = get_bits1(&gb);
1175 8 s->thirdpel_flag = get_bits1(&gb);
1176
1177 /* unknown fields */
1178 8 int unk0 = get_bits1(&gb);
1179 8 int unk1 = get_bits1(&gb);
1180 8 int unk2 = get_bits1(&gb);
1181 8 int unk3 = get_bits1(&gb);
1182
1183 8 s->low_delay = get_bits1(&gb);
1184 8 avctx->has_b_frames = !s->low_delay;
1185
1186 /* unknown field */
1187 8 int unk4 = get_bits1(&gb);
1188
1189 8 av_log(avctx, AV_LOG_DEBUG, "Unknown fields %d %d %d %d %d\n",
1190 unk0, unk1, unk2, unk3, unk4);
1191
1192
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
8 if (skip_1stop_8data_bits(&gb) < 0)
1193 return AVERROR_INVALIDDATA;
1194
1195 8 s->has_watermark = get_bits1(&gb);
1196
1197
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 2 times.
8 if (!s->has_watermark)
1198 6 return 0;
1199
1200 #if CONFIG_ZLIB
1201 2 unsigned watermark_width = get_interleaved_ue_golomb(&gb);
1202 2 unsigned watermark_height = get_interleaved_ue_golomb(&gb);
1203 2 int u1 = get_interleaved_ue_golomb(&gb);
1204 2 int u2 = get_bits(&gb, 8);
1205 2 int u3 = get_bits(&gb, 2);
1206 2 int u4 = get_interleaved_ue_golomb(&gb);
1207 2 unsigned long buf_len = watermark_width *
1208 2 watermark_height * 4;
1209 2 int offset = get_bits_count(&gb) + 7 >> 3;
1210
1211
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 ||
1212 2 get_bits_left(&gb) <= 0 ||
1213
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 (uint64_t)watermark_width * 4 > UINT_MAX / watermark_height)
1214 return AVERROR_INVALIDDATA;
1215
1216 2 av_log(avctx, AV_LOG_DEBUG, "watermark size: %ux%u\n",
1217 watermark_width, watermark_height);
1218 2 av_log(avctx, AV_LOG_DEBUG,
1219 "u1: %x u2: %x u3: %x compressed data size: %d offset: %d\n",
1220 u1, u2, u3, u4, offset);
1221
1222 2 uint8_t *buf = av_malloc(buf_len);
1223
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (!buf)
1224 return AVERROR(ENOMEM);
1225
1226
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (uncompress(buf, &buf_len, extradata + offset,
1227 2 size - offset) != Z_OK) {
1228 av_log(avctx, AV_LOG_ERROR,
1229 "could not uncompress watermark logo\n");
1230 av_free(buf);
1231 return AVERROR_EXTERNAL;
1232 }
1233 2 s->watermark_key = av_bswap16(av_crc(av_crc_get_table(AV_CRC_16_CCITT), 0, buf, buf_len));
1234
1235 2 s->watermark_key = s->watermark_key << 16 | s->watermark_key;
1236 2 av_log(avctx, AV_LOG_DEBUG,
1237 "watermark key %#"PRIx32"\n", s->watermark_key);
1238 2 av_free(buf);
1239
1240 2 return 0;
1241 #else
1242 av_log(avctx, AV_LOG_ERROR,
1243 "this svq3 file contains watermark which need zlib support compiled in\n");
1244 return AVERROR(ENOSYS);
1245 #endif
1246 }
1247
1248 8 static av_cold int svq3_decode_init(AVCodecContext *avctx)
1249 {
1250 8 SVQ3Context *s = avctx->priv_data;
1251 int m, x, y;
1252 unsigned char *extradata;
1253 int ret;
1254
1255 8 s->cur_pic = &s->frames[0];
1256 8 s->last_pic = &s->frames[1];
1257 8 s->next_pic = &s->frames[2];
1258
1259 8 s->cur_pic->f = av_frame_alloc();
1260 8 s->last_pic->f = av_frame_alloc();
1261 8 s->next_pic->f = av_frame_alloc();
1262
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)
1263 return AVERROR(ENOMEM);
1264
1265 8 ff_h264dsp_init(&s->h264dsp, 8, 1);
1266 8 ff_h264_pred_init(&s->hpc, AV_CODEC_ID_SVQ3, 8, 1);
1267 8 ff_videodsp_init(&s->vdsp, 8);
1268
1269
1270 8 avctx->bits_per_raw_sample = 8;
1271
1272 8 ff_hpeldsp_init(&s->hdsp, avctx->flags);
1273 8 ff_tpeldsp_init(&s->tdsp);
1274
1275 8 avctx->pix_fmt = AV_PIX_FMT_YUVJ420P;
1276 8 avctx->color_range = AVCOL_RANGE_JPEG;
1277
1278 8 s->avctx = avctx;
1279 8 s->halfpel_flag = 1;
1280 8 s->thirdpel_flag = 1;
1281 8 s->has_watermark = 0;
1282
1283 /* prowl for the "SEQH" marker in the extradata */
1284 8 extradata = (unsigned char *)avctx->extradata;
1285
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
8 if (extradata) {
1286
1/2
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
72 for (m = 0; m + 8 < avctx->extradata_size; m++) {
1287
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 64 times.
72 if (!memcmp(extradata, "SEQH", 4)) {
1288 /* if a match was found, parse the extra data */
1289 8 ret = svq3_decode_extradata(avctx, s, m);
1290
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 if (ret < 0)
1291 return ret;
1292 8 break;
1293 }
1294 64 extradata++;
1295 }
1296 }
1297
1298 8 s->mb_width = (avctx->width + 15) / 16;
1299 8 s->mb_height = (avctx->height + 15) / 16;
1300 8 s->mb_stride = s->mb_width + 1;
1301 8 s->mb_num = s->mb_width * s->mb_height;
1302 8 s->b_stride = 4 * s->mb_width;
1303 8 s->h_edge_pos = s->mb_width * 16;
1304 8 s->v_edge_pos = s->mb_height * 16;
1305
1306 8 const unsigned big_mb_num = s->mb_stride * (s->mb_height + 2) + 1;
1307
1308 8 s->mb_type_buf = av_calloc(big_mb_num, NUM_PICS * sizeof(*s->mb_type_buf));
1309
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 if (!s->mb_type_buf)
1310 return AVERROR(ENOMEM);
1311 8 uint32_t *mb_type_buf = s->mb_type_buf + 2 * s->mb_stride + 1;
1312
1313 8 const unsigned b4_stride = s->mb_width * 4 + 1;
1314 8 const unsigned b4_array_size = b4_stride * s->mb_height * 4;
1315 8 const unsigned motion_val_buf_size = b4_array_size + 4;
1316
1317 8 s->motion_val_buf = av_calloc(motion_val_buf_size,
1318 NUM_PICS * 2 * sizeof(*s->motion_val_buf));
1319
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 if (!s->motion_val_buf)
1320 return AVERROR(ENOMEM);
1321 8 int16_t (*motion_val_buf)[2] = s->motion_val_buf + 4;
1322
1323
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 8 times.
32 for (size_t i = 0; i < NUM_PICS; ++i) {
1324 24 SVQ3Frame *const pic = &s->frames[i];
1325
1326 24 pic->mb_type = mb_type_buf;
1327 24 mb_type_buf += big_mb_num;
1328
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) {
1329 48 pic->motion_val[j] = motion_val_buf;
1330 48 motion_val_buf += motion_val_buf_size;
1331 }
1332 }
1333
1334 8 s->intra4x4_pred_mode = av_mallocz(s->mb_stride * 2 * 8);
1335
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 if (!s->intra4x4_pred_mode)
1336 return AVERROR(ENOMEM);
1337
1338 8 s->mb2br_xy = av_mallocz(s->mb_stride * (s->mb_height + 1) *
1339 sizeof(*s->mb2br_xy));
1340
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 if (!s->mb2br_xy)
1341 return AVERROR(ENOMEM);
1342
1343
2/2
✓ Branch 0 taken 120 times.
✓ Branch 1 taken 8 times.
128 for (y = 0; y < s->mb_height; y++)
1344
2/2
✓ Branch 0 taken 2340 times.
✓ Branch 1 taken 120 times.
2460 for (x = 0; x < s->mb_width; x++) {
1345 2340 const int mb_xy = x + y * s->mb_stride;
1346
1347 2340 s->mb2br_xy[mb_xy] = 8 * (mb_xy % (2 * s->mb_stride));
1348 }
1349
1350 8 init_dequant4_coeff_table(s);
1351
1352 8 return 0;
1353 }
1354
1355 2811 static int get_buffer(AVCodecContext *avctx, SVQ3Frame *pic)
1356 {
1357 2811 SVQ3Context *s = avctx->priv_data;
1358 2811 int ret = ff_get_buffer(avctx, pic->f,
1359 2811 (s->pict_type != AV_PICTURE_TYPE_B) ?
1360 AV_GET_BUFFER_FLAG_REF : 0);
1361
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2811 times.
2811 if (ret < 0)
1362 return ret;
1363
1364
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2807 times.
2811 if (!s->edge_emu_buffer) {
1365 4 s->edge_emu_buffer = av_calloc(pic->f->linesize[0], 17);
1366
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 if (!s->edge_emu_buffer)
1367 return AVERROR(ENOMEM);
1368 }
1369
1370 2811 return 0;
1371 }
1372
1373 static av_cold int alloc_dummy_frame(AVCodecContext *avctx, SVQ3Frame *pic)
1374 {
1375 av_log(avctx, AV_LOG_ERROR, "Missing reference frame.\n");
1376 av_frame_unref(pic->f);
1377 int ret = get_buffer(avctx, pic);
1378 if (ret < 0)
1379 return ret;
1380
1381 memset(pic->f->data[0], 0, avctx->height * pic->f->linesize[0]);
1382 memset(pic->f->data[1], 0x80, (avctx->height / 2) *
1383 pic->f->linesize[1]);
1384 memset(pic->f->data[2], 0x80, (avctx->height / 2) *
1385 pic->f->linesize[2]);
1386
1387 return 0;
1388 }
1389
1390 2817 static int svq3_decode_frame(AVCodecContext *avctx, AVFrame *rframe,
1391 int *got_frame, AVPacket *avpkt)
1392 {
1393 2817 SVQ3Context *s = avctx->priv_data;
1394 2817 int buf_size = avpkt->size;
1395 int left;
1396 int ret, m, i;
1397
1398 /* special case for last picture */
1399
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 2811 times.
2817 if (buf_size == 0) {
1400
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) {
1401 3 av_frame_move_ref(rframe, s->next_pic->f);
1402 3 *got_frame = 1;
1403 }
1404 6 return 0;
1405 }
1406
1407 2811 s->mb_x = s->mb_y = s->mb_xy = 0;
1408
1409 2811 ret = init_get_bits8(&s->gb, avpkt->data, avpkt->size);
1410
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2811 times.
2811 if (ret < 0)
1411 return ret;
1412
1413 2811 ret = svq3_decode_slice_header(avctx);
1414
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2811 times.
2811 if (ret < 0)
1415 return ret;
1416
1417
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2811 times.
2811 if (avpkt->size < s->mb_width * s->mb_height / 8)
1418 return AVERROR_INVALIDDATA;
1419
1420 2811 s->pict_type = s->slice_type;
1421
1422
2/2
✓ Branch 0 taken 2807 times.
✓ Branch 1 taken 4 times.
2811 if (s->pict_type != AV_PICTURE_TYPE_B)
1423 2807 FFSWAP(SVQ3Frame*, s->next_pic, s->last_pic);
1424
1425 2811 av_frame_unref(s->cur_pic->f);
1426
1427 /* for skipping the frame */
1428 2811 s->cur_pic->f->pict_type = s->pict_type;
1429
2/2
✓ Branch 0 taken 64 times.
✓ Branch 1 taken 2747 times.
2811 if (s->pict_type == AV_PICTURE_TYPE_I)
1430 64 s->cur_pic->f->flags |= AV_FRAME_FLAG_KEY;
1431 else
1432 2747 s->cur_pic->f->flags &= ~AV_FRAME_FLAG_KEY;
1433
1434 2811 ret = get_buffer(avctx, s->cur_pic);
1435
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2811 times.
2811 if (ret < 0)
1436 return ret;
1437
1438
2/2
✓ Branch 0 taken 44976 times.
✓ Branch 1 taken 2811 times.
47787 for (i = 0; i < 16; i++) {
1439 44976 s->block_offset[i] = (4 * ((scan8[i] - scan8[0]) & 7)) + 4 * s->cur_pic->f->linesize[0] * ((scan8[i] - scan8[0]) >> 3);
1440 44976 s->block_offset[48 + i] = (4 * ((scan8[i] - scan8[0]) & 7)) + 8 * s->cur_pic->f->linesize[0] * ((scan8[i] - scan8[0]) >> 3);
1441 }
1442
2/2
✓ Branch 0 taken 44976 times.
✓ Branch 1 taken 2811 times.
47787 for (i = 0; i < 16; i++) {
1443 44976 s->block_offset[16 + i] =
1444 44976 s->block_offset[32 + i] = (4 * ((scan8[i] - scan8[0]) & 7)) + 4 * s->cur_pic->f->linesize[1] * ((scan8[i] - scan8[0]) >> 3);
1445 44976 s->block_offset[48 + 16 + i] =
1446 44976 s->block_offset[48 + 32 + i] = (4 * ((scan8[i] - scan8[0]) & 7)) + 8 * s->cur_pic->f->linesize[1] * ((scan8[i] - scan8[0]) >> 3);
1447 }
1448
1449
2/2
✓ Branch 0 taken 2747 times.
✓ Branch 1 taken 64 times.
2811 if (s->pict_type != AV_PICTURE_TYPE_I) {
1450
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2747 times.
2747 if (!s->last_pic->f->data[0]) {
1451 ret = alloc_dummy_frame(avctx, s->last_pic);
1452 if (ret < 0)
1453 return ret;
1454 }
1455
1456
3/4
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2743 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
2747 if (s->pict_type == AV_PICTURE_TYPE_B && !s->next_pic->f->data[0]) {
1457 ret = alloc_dummy_frame(avctx, s->next_pic);
1458 if (ret < 0)
1459 return ret;
1460 }
1461 }
1462
1463
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2811 times.
2811 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 2811 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2811 if (avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type == AV_PICTURE_TYPE_B ||
1471
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2811 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2811 avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type != AV_PICTURE_TYPE_I ||
1472
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2811 times.
2811 avctx->skip_frame >= AVDISCARD_ALL)
1473 return 0;
1474
1475
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2807 times.
2811 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 2807 s->prev_frame_num = s->frame_num;
1487 2807 s->frame_num = s->slice_num;
1488 2807 s->prev_frame_num_offset = s->frame_num - s->prev_frame_num;
1489
1490
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 2797 times.
2807 if (s->prev_frame_num_offset < 0)
1491 10 s->prev_frame_num_offset += 256;
1492 }
1493
1494
2/2
✓ Branch 0 taken 5622 times.
✓ Branch 1 taken 2811 times.
8433 for (m = 0; m < 2; m++) {
1495 int i;
1496
2/2
✓ Branch 0 taken 22488 times.
✓ Branch 1 taken 5622 times.
28110 for (i = 0; i < 4; i++) {
1497 int j;
1498
2/2
✓ Branch 0 taken 112440 times.
✓ Branch 1 taken 22488 times.
134928 for (j = -1; j < 4; j++)
1499 112440 s->ref_cache[m][scan8[0] + 8 * i + j] = 1;
1500
2/2
✓ Branch 0 taken 16866 times.
✓ Branch 1 taken 5622 times.
22488 if (i < 3)
1501 16866 s->ref_cache[m][scan8[0] + 8 * i + j] = PART_NOT_AVAILABLE;
1502 }
1503 }
1504
1505
2/2
✓ Branch 0 taken 42165 times.
✓ Branch 1 taken 2811 times.
44976 for (s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) {
1506
2/2
✓ Branch 0 taken 843000 times.
✓ Branch 1 taken 42165 times.
885165 for (s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) {
1507 unsigned mb_type;
1508 843000 s->mb_xy = s->mb_x + s->mb_y * s->mb_stride;
1509
1510
2/2
✓ Branch 1 taken 3847 times.
✓ Branch 2 taken 839153 times.
843000 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 ret = svq3_decode_slice_header(avctx);
1515 if (ret < 0)
1516 return ret;
1517 }
1518
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3847 times.
3847 if (s->slice_type != s->pict_type) {
1519 avpriv_request_sample(avctx, "non constant slice type");
1520 }
1521 /* TODO: support s->mb_skip_run */
1522 }
1523
1524 843000 mb_type = get_interleaved_ue_golomb(&s->gb_slice);
1525
1526
2/2
✓ Branch 0 taken 19170 times.
✓ Branch 1 taken 823830 times.
843000 if (s->pict_type == AV_PICTURE_TYPE_I)
1527 19170 mb_type += 8;
1528
4/4
✓ Branch 0 taken 1080 times.
✓ Branch 1 taken 822750 times.
✓ Branch 2 taken 22 times.
✓ Branch 3 taken 1058 times.
823830 else if (s->pict_type == AV_PICTURE_TYPE_B && mb_type >= 4)
1529 22 mb_type += 4;
1530
2/4
✓ Branch 0 taken 843000 times.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 843000 times.
843000 if (mb_type > 33 || svq3_decode_mb(s, mb_type)) {
1531 av_log(s->avctx, AV_LOG_ERROR,
1532 "error while decoding MB %d %d\n", s->mb_x, s->mb_y);
1533 return -1;
1534 }
1535
1536
4/4
✓ Branch 0 taken 353912 times.
✓ Branch 1 taken 489088 times.
✓ Branch 2 taken 60 times.
✓ Branch 3 taken 353852 times.
843000 if (mb_type != 0 || s->cbp)
1537 489148 hl_decode_mb(s);
1538
1539
3/4
✓ Branch 0 taken 841920 times.
✓ Branch 1 taken 1080 times.
✓ Branch 2 taken 841920 times.
✗ Branch 3 not taken.
843000 if (s->pict_type != AV_PICTURE_TYPE_B && !s->low_delay)
1540 841920 s->cur_pic->mb_type[s->mb_x + s->mb_y * s->mb_stride] =
1541
4/4
✓ Branch 0 taken 822750 times.
✓ Branch 1 taken 19170 times.
✓ Branch 2 taken 791320 times.
✓ Branch 3 taken 31430 times.
841920 (s->pict_type == AV_PICTURE_TYPE_P && mb_type < 8) ? (mb_type - 1) : -1;
1542 }
1543
1544 42165 ff_draw_horiz_band(avctx, s->cur_pic->f,
1545 42105 s->last_pic->f->data[0] ? s->last_pic->f : NULL,
1546
2/2
✓ Branch 0 taken 42105 times.
✓ Branch 1 taken 60 times.
42165 16 * s->mb_y, 16, PICT_FRAME, 0,
1547 s->low_delay);
1548 }
1549
1550 2811 left = buf_size*8 - get_bits_count(&s->gb_slice);
1551
1552
2/4
✓ Branch 0 taken 2811 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2811 times.
2811 if (s->mb_y != s->mb_height || s->mb_x != s->mb_width) {
1553 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);
1554 //av_hex_dump(stderr, buf+buf_size-8, 8);
1555 }
1556
1557
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2811 times.
2811 if (left < 0) {
1558 av_log(avctx, AV_LOG_ERROR, "frame num %"PRId64" left %d\n", avctx->frame_num, left);
1559 return -1;
1560 }
1561
1562
3/4
✓ Branch 0 taken 2807 times.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2807 times.
2811 if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay)
1563 4 ret = av_frame_ref(rframe, s->cur_pic->f);
1564
2/2
✓ Branch 0 taken 2803 times.
✓ Branch 1 taken 4 times.
2807 else if (s->last_pic->f->data[0])
1565 2803 ret = av_frame_ref(rframe, s->last_pic->f);
1566
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2811 times.
2811 if (ret < 0)
1567 return ret;
1568
1569 /* Do not output the last pic after seeking. */
1570
3/4
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2807 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
2811 if (s->last_pic->f->data[0] || s->low_delay)
1571 2807 *got_frame = 1;
1572
1573
2/2
✓ Branch 0 taken 2807 times.
✓ Branch 1 taken 4 times.
2811 if (s->pict_type != AV_PICTURE_TYPE_B) {
1574 2807 FFSWAP(SVQ3Frame*, s->cur_pic, s->next_pic);
1575 } else {
1576 4 av_frame_unref(s->cur_pic->f);
1577 }
1578
1579 2811 return buf_size;
1580 }
1581
1582 8 static av_cold int svq3_decode_end(AVCodecContext *avctx)
1583 {
1584 8 SVQ3Context *s = avctx->priv_data;
1585
1586
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 8 times.
32 for (int i = 0; i < NUM_PICS; i++)
1587 24 av_frame_free(&s->frames[i].f);
1588 8 av_freep(&s->motion_val_buf);
1589 8 av_freep(&s->mb_type_buf);
1590 8 av_freep(&s->slice_buf);
1591 8 av_freep(&s->intra4x4_pred_mode);
1592 8 av_freep(&s->edge_emu_buffer);
1593 8 av_freep(&s->mb2br_xy);
1594
1595 8 return 0;
1596 }
1597
1598 const FFCodec ff_svq3_decoder = {
1599 .p.name = "svq3",
1600 CODEC_LONG_NAME("Sorenson Vector Quantizer 3 / Sorenson Video 3 / SVQ3"),
1601 .p.type = AVMEDIA_TYPE_VIDEO,
1602 .p.id = AV_CODEC_ID_SVQ3,
1603 .priv_data_size = sizeof(SVQ3Context),
1604 .init = svq3_decode_init,
1605 .close = svq3_decode_end,
1606 FF_CODEC_DECODE_CB(svq3_decode_frame),
1607 .p.capabilities = AV_CODEC_CAP_DRAW_HORIZ_BAND |
1608 AV_CODEC_CAP_DR1 |
1609 AV_CODEC_CAP_DELAY,
1610 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
1611 };
1612