FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/svq3.c
Date: 2026-04-24 19:58:39
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 4017149 static void svq3_add_idct_c(uint8_t *dst, int16_t *block,
259 int stride, int qp, int dc)
260 {
261 4017149 const int qmul = svq3_dequant_coeff[qp];
262 int i;
263
264
2/2
✓ Branch 0 taken 999789 times.
✓ Branch 1 taken 3017360 times.
4017149 if (dc) {
265
2/2
✓ Branch 0 taken 26094 times.
✓ Branch 1 taken 973695 times.
999789 dc = 13 * 13 * (dc == 1 ? 1538U* block[0]
266 973695 : qmul * (block[0] >> 3) / 2);
267 999789 block[0] = 0;
268 }
269
270
2/2
✓ Branch 0 taken 16068596 times.
✓ Branch 1 taken 4017149 times.
20085745 for (i = 0; i < 4; i++) {
271 16068596 const int z0 = 13 * (block[0 + 4 * i] + block[2 + 4 * i]);
272 16068596 const int z1 = 13 * (block[0 + 4 * i] - block[2 + 4 * i]);
273 16068596 const int z2 = 7 * block[1 + 4 * i] - 17 * block[3 + 4 * i];
274 16068596 const int z3 = 17 * block[1 + 4 * i] + 7 * block[3 + 4 * i];
275
276 16068596 block[0 + 4 * i] = z0 + z3;
277 16068596 block[1 + 4 * i] = z1 + z2;
278 16068596 block[2 + 4 * i] = z1 - z2;
279 16068596 block[3 + 4 * i] = z0 - z3;
280 }
281
282
2/2
✓ Branch 0 taken 16068596 times.
✓ Branch 1 taken 4017149 times.
20085745 for (i = 0; i < 4; i++) {
283 16068596 const unsigned z0 = 13 * (block[i + 4 * 0] + block[i + 4 * 2]);
284 16068596 const unsigned z1 = 13 * (block[i + 4 * 0] - block[i + 4 * 2]);
285 16068596 const unsigned z2 = 7 * block[i + 4 * 1] - 17 * block[i + 4 * 3];
286 16068596 const unsigned z3 = 17 * block[i + 4 * 1] + 7 * block[i + 4 * 3];
287 16068596 const int rr = (dc + 0x80000u);
288
289 16068596 dst[i + stride * 0] = av_clip_uint8(dst[i + stride * 0] + ((int)((z0 + z3) * qmul + rr) >> 20));
290 16068596 dst[i + stride * 1] = av_clip_uint8(dst[i + stride * 1] + ((int)((z1 + z2) * qmul + rr) >> 20));
291 16068596 dst[i + stride * 2] = av_clip_uint8(dst[i + stride * 2] + ((int)((z1 - z2) * qmul + rr) >> 20));
292 16068596 dst[i + stride * 3] = av_clip_uint8(dst[i + stride * 3] + ((int)((z0 - z3) * qmul + rr) >> 20));
293 }
294
295 4017149 memset(block, 0, 16 * sizeof(int16_t));
296 4017149 }
297
298 3885381 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 3885381 const int intra = 3 * type >> 2;
308 3885381 const uint8_t *const scan = scan_patterns[type];
309
310
2/2
✓ Branch 0 taken 4445853 times.
✓ Branch 1 taken 560472 times.
5006325 for (limit = (16 >> intra); index < 16; index = limit, limit += 8) {
311
2/2
✓ Branch 1 taken 5383846 times.
✓ Branch 2 taken 4445853 times.
9829699 for (; (vlc = get_interleaved_ue_golomb(gb)) != 0; index++) {
312
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5383846 times.
5383846 if ((int32_t)vlc < 0)
313 return -1;
314
315
2/2
✓ Branch 0 taken 2639412 times.
✓ Branch 1 taken 2744434 times.
5383846 sign = (vlc & 1) ? 0 : -1;
316 5383846 vlc = vlc + 1 >> 1;
317
318
2/2
✓ Branch 0 taken 249899 times.
✓ Branch 1 taken 5133947 times.
5383846 if (type == 3) {
319
2/2
✓ Branch 0 taken 169166 times.
✓ Branch 1 taken 80733 times.
249899 if (vlc < 3) {
320 169166 run = 0;
321 169166 level = vlc;
322
2/2
✓ Branch 0 taken 34238 times.
✓ Branch 1 taken 46495 times.
80733 } else if (vlc < 4) {
323 34238 run = 1;
324 34238 level = 1;
325 } else {
326 46495 run = vlc & 0x3;
327 46495 level = (vlc + 9 >> 2) - run;
328 }
329 } else {
330
2/2
✓ Branch 0 taken 5041382 times.
✓ Branch 1 taken 92565 times.
5133947 if (vlc < 16U) {
331 5041382 run = svq3_dct_tables[intra][vlc].run;
332 5041382 level = svq3_dct_tables[intra][vlc].level;
333
2/2
✓ Branch 0 taken 8627 times.
✓ Branch 1 taken 83938 times.
92565 } else if (intra) {
334 8627 run = vlc & 0x7;
335
6/6
✓ Branch 0 taken 5366 times.
✓ Branch 1 taken 3261 times.
✓ Branch 2 taken 3386 times.
✓ Branch 3 taken 1980 times.
✓ Branch 4 taken 3278 times.
✓ Branch 5 taken 108 times.
8627 level = (vlc >> 3) + ((run == 0) ? 8 : ((run < 2) ? 2 : ((run < 5) ? 0 : -1)));
336 } else {
337 83938 run = vlc & 0xF;
338
6/6
✓ Branch 0 taken 51500 times.
✓ Branch 1 taken 32438 times.
✓ Branch 2 taken 21798 times.
✓ Branch 3 taken 29702 times.
✓ Branch 4 taken 18712 times.
✓ Branch 5 taken 3086 times.
83938 level = (vlc >> 4) + ((run == 0) ? 4 : ((run < 3) ? 2 : ((run < 10) ? 1 : 0)));
339 }
340 }
341
342
343
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5383846 times.
5383846 if ((index += run) >= limit)
344 return -1;
345
346 5383846 block[scan[index]] = (level ^ sign) - sign;
347 }
348
349
2/2
✓ Branch 0 taken 3324909 times.
✓ Branch 1 taken 1120944 times.
4445853 if (type != 2) {
350 3324909 break;
351 }
352 }
353
354 3885381 return 0;
355 }
356
357 static av_always_inline int
358 556808 svq3_fetch_diagonal_mv(const SVQ3Context *s, const int16_t **C,
359 int i, int list, int part_width)
360 {
361 556808 const int topright_ref = s->ref_cache[list][i - 8 + part_width];
362
363
2/2
✓ Branch 0 taken 475267 times.
✓ Branch 1 taken 81541 times.
556808 if (topright_ref != PART_NOT_AVAILABLE) {
364 475267 *C = s->mv_cache[list][i - 8 + part_width];
365 475267 return topright_ref;
366 } else {
367 81541 *C = s->mv_cache[list][i - 8 - 1];
368 81541 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 556808 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 556808 const int index8 = scan8[n];
384 556808 const int top_ref = s->ref_cache[list][index8 - 8];
385 556808 const int left_ref = s->ref_cache[list][index8 - 1];
386 556808 const int16_t *const A = s->mv_cache[list][index8 - 1];
387 556808 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 556808 diagonal_ref = svq3_fetch_diagonal_mv(s, &C, index8, list, part_width);
400 556808 match_count = (diagonal_ref == ref) + (top_ref == ref) + (left_ref == ref);
401
2/2
✓ Branch 0 taken 533003 times.
✓ Branch 1 taken 23805 times.
556808 if (match_count > 1) { //most common
402 533003 *mx = mid_pred(A[0], B[0], C[0]);
403 533003 *my = mid_pred(A[1], B[1], C[1]);
404
1/2
✓ Branch 0 taken 23805 times.
✗ Branch 1 not taken.
23805 } else if (match_count == 1) {
405
1/2
✓ Branch 0 taken 23805 times.
✗ Branch 1 not taken.
23805 if (left_ref == ref) {
406 23805 *mx = A[0];
407 23805 *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 556808 }
427
428 911840 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 910709 times.
✓ Branch 1 taken 1131 times.
911840 const SVQ3Frame *pic = (dir == 0) ? s->last_pic : s->next_pic;
434 uint8_t *src, *dest;
435 911840 int i, emu = 0;
436 911840 int blocksize = 2 - (width >> 3); // 16->0, 8->1, 4->2
437 911840 int linesize = s->cur_pic->f->linesize[0];
438 911840 int uvlinesize = s->cur_pic->f->linesize[1];
439
440 911840 mx += x;
441 911840 my += y;
442
443
6/6
✓ Branch 0 taken 905629 times.
✓ Branch 1 taken 6211 times.
✓ Branch 2 taken 873824 times.
✓ Branch 3 taken 31805 times.
✓ Branch 4 taken 870724 times.
✓ Branch 5 taken 3100 times.
911840 if (mx < 0 || mx >= s->h_edge_pos - width - 1 ||
444
2/2
✓ Branch 0 taken 47592 times.
✓ Branch 1 taken 823132 times.
870724 my < 0 || my >= s->v_edge_pos - height - 1) {
445 88708 emu = 1;
446 88708 mx = av_clip(mx, -16, s->h_edge_pos - width + 15);
447 88708 my = av_clip(my, -16, s->v_edge_pos - height + 15);
448 }
449
450 /* form component predictions */
451 911840 dest = s->cur_pic->f->data[0] + x + y * linesize;
452 911840 src = pic->f->data[0] + mx + my * linesize;
453
454
2/2
✓ Branch 0 taken 88708 times.
✓ Branch 1 taken 823132 times.
911840 if (emu) {
455 88708 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 88708 src = s->edge_emu_buffer;
460 }
461
2/2
✓ Branch 0 taken 182 times.
✓ Branch 1 taken 911658 times.
911840 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 910590 times.
911658 : s->hdsp.put_pixels_tab)[blocksize][dxy](dest, src, linesize,
468 height);
469
470
1/2
✓ Branch 0 taken 911840 times.
✗ Branch 1 not taken.
911840 if (!(s->avctx->flags & AV_CODEC_FLAG_GRAY)) {
471 911840 mx = mx + (mx < (int) x) >> 1;
472 911840 my = my + (my < (int) y) >> 1;
473 911840 width = width >> 1;
474 911840 height = height >> 1;
475 911840 blocksize++;
476
477
2/2
✓ Branch 0 taken 1823680 times.
✓ Branch 1 taken 911840 times.
2735520 for (i = 1; i < 3; i++) {
478 1823680 dest = s->cur_pic->f->data[i] + (x >> 1) + (y >> 1) * uvlinesize;
479 1823680 src = pic->f->data[i] + mx + my * uvlinesize;
480
481
2/2
✓ Branch 0 taken 177416 times.
✓ Branch 1 taken 1646264 times.
1823680 if (emu) {
482 177416 s->vdsp.emulated_edge_mc(s->edge_emu_buffer, src,
483 uvlinesize, uvlinesize,
484 width + 1, height + 1,
485 177416 mx, my, (s->h_edge_pos >> 1),
486 177416 s->v_edge_pos >> 1);
487 177416 src = s->edge_emu_buffer;
488 }
489
2/2
✓ Branch 0 taken 364 times.
✓ Branch 1 taken 1823316 times.
1823680 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 1821180 times.
1823316 : s->hdsp.put_pixels_tab)[blocksize][dxy](dest, src,
497 uvlinesize,
498 height);
499 }
500 }
501 911840 }
502
503 439074 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 439052 times.
✓ Branch 1 taken 22 times.
439074 const int part_width = ((size & 5) == 4) ? 4 : 16 >> (size & 1);
509 439074 const int part_height = 16 >> ((unsigned)(size + 1) / 3);
510
2/2
✓ Branch 0 taken 786 times.
✓ Branch 1 taken 438288 times.
439074 const int extra_width = (mode == PREDICT_MODE) ? -16 * 6 : 0;
511 439074 const int h_edge_pos = 6 * (s->h_edge_pos - part_width) - extra_width;
512 439074 const int v_edge_pos = 6 * (s->v_edge_pos - part_height) - extra_width;
513
514
2/2
✓ Branch 0 taken 478620 times.
✓ Branch 1 taken 439074 times.
917694 for (i = 0; i < 16; i += part_height)
515
2/2
✓ Branch 0 taken 557846 times.
✓ Branch 1 taken 478620 times.
1036466 for (j = 0; j < 16; j += part_width) {
516 557846 const int b_xy = (4 * s->mb_x + (j >> 2)) +
517 557846 (4 * s->mb_y + (i >> 2)) * s->b_stride;
518 int dxy;
519 557846 x = 16 * s->mb_x + j;
520 557846 y = 16 * s->mb_y + i;
521 557846 k = (j >> 2 & 1) + (i >> 1 & 2) +
522 557846 (j >> 1 & 4) + (i & 8);
523
524
2/2
✓ Branch 0 taken 556808 times.
✓ Branch 1 taken 1038 times.
557846 if (mode != PREDICT_MODE) {
525 556808 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 557846 mx = av_clip(mx, extra_width - 6 * x, h_edge_pos - 6 * x);
545 557846 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 556808 times.
557846 if (mode == PREDICT_MODE) {
549 1038 dx = dy = 0;
550 } else {
551 556808 dy = get_interleaved_se_golomb(&s->gb_slice);
552 556808 dx = get_interleaved_se_golomb(&s->gb_slice);
553
554
2/4
✓ Branch 0 taken 556808 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 556808 times.
556808 if (dx != (int16_t)dx || dy != (int16_t)dy) {
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 557664 times.
557846 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 282368 times.
✓ Branch 1 taken 275296 times.
✓ Branch 2 taken 1038 times.
✓ Branch 3 taken 281330 times.
557664 } else if (mode == HALFPEL_MODE || mode == PREDICT_MODE) {
574 276334 mx = (unsigned)(mx + 1 + 0x30000) / 3 + dx - 0x10000;
575 276334 my = (unsigned)(my + 1 + 0x30000) / 3 + dy - 0x10000;
576 276334 dxy = (mx & 1) + 2 * (my & 1);
577
578 276334 svq3_mc_dir_part(s, x, y, part_width, part_height,
579 mx >> 1, my >> 1, dxy, 0, dir, avg);
580 276334 mx *= 3;
581 276334 my *= 3;
582 } else {
583 281330 mx = (unsigned)(mx + 3 + 0x60000) / 6 + dx - 0x10000;
584 281330 my = (unsigned)(my + 3 + 0x60000) / 6 + dy - 0x10000;
585
586 281330 svq3_mc_dir_part(s, x, y, part_width, part_height,
587 mx, my, 0, 0, dir, avg);
588 281330 mx *= 6;
589 281330 my *= 6;
590 }
591
592 /* update mv_cache */
593
2/2
✓ Branch 0 taken 556808 times.
✓ Branch 1 taken 1038 times.
557846 if (mode != PREDICT_MODE) {
594 556808 int32_t mv = pack16to32(mx, my);
595
596
4/4
✓ Branch 0 taken 157802 times.
✓ Branch 1 taken 399006 times.
✓ Branch 2 taken 78901 times.
✓ Branch 3 taken 78901 times.
556808 if (part_height == 8 && i < 8) {
597 78901 AV_WN32A(s->mv_cache[dir][scan8[k] + 1 * 8], mv);
598
599
4/4
✓ Branch 0 taken 78822 times.
✓ Branch 1 taken 79 times.
✓ Branch 2 taken 39411 times.
✓ Branch 3 taken 39411 times.
78901 if (part_width == 8 && j < 8)
600 39411 AV_WN32A(s->mv_cache[dir][scan8[k] + 1 + 1 * 8], mv);
601 }
602
4/4
✓ Branch 0 taken 157868 times.
✓ Branch 1 taken 398940 times.
✓ Branch 2 taken 78934 times.
✓ Branch 3 taken 78934 times.
556808 if (part_width == 8 && j < 8)
603 78934 AV_WN32A(s->mv_cache[dir][scan8[k] + 1], mv);
604
4/4
✓ Branch 0 taken 556672 times.
✓ Branch 1 taken 136 times.
✓ Branch 2 taken 48 times.
✓ Branch 3 taken 556624 times.
556808 if (part_width == 4 || part_height == 4)
605 184 AV_WN32A(s->mv_cache[dir][scan8[k]], mv);
606 }
607
608 /* write back motion vectors */
609 557846 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 439074 return 0;
615 }
616
617 488854 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 440804 times.
✓ Branch 1 taken 48050 times.
488854 if (!IS_INTRA4x4(mb_type)) {
623
2/2
✓ Branch 0 taken 7052864 times.
✓ Branch 1 taken 440804 times.
7493668 for (i = 0; i < 16; i++)
624
4/4
✓ Branch 0 taken 4592260 times.
✓ Branch 1 taken 2460604 times.
✓ Branch 2 taken 22222 times.
✓ Branch 3 taken 4570038 times.
7052864 if (s->non_zero_count_cache[scan8[i]] || s->mb[i * 16]) {
625 2482826 uint8_t *const ptr = dest_y + block_offset[i];
626 2482826 svq3_add_idct_c(ptr, s->mb + i * 16, linesize,
627 2482826 s->qscale, IS_INTRA(mb_type) ? 1 : 0);
628 }
629 }
630 488854 }
631
632 50587 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 50587 int qscale = s->qscale;
640
641
2/2
✓ Branch 0 taken 48050 times.
✓ Branch 1 taken 2537 times.
50587 if (IS_INTRA4x4(mb_type)) {
642
2/2
✓ Branch 0 taken 768800 times.
✓ Branch 1 taken 48050 times.
816850 for (i = 0; i < 16; i++) {
643 768800 uint8_t *const ptr = dest_y + block_offset[i];
644 768800 const int dir = s->intra4x4_pred_mode_cache[scan8[i]];
645
646 uint8_t *topright;
647 int nnz;
648
3/4
✓ Branch 0 taken 715809 times.
✓ Branch 1 taken 52991 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 715809 times.
768800 if (dir == DIAG_DOWN_LEFT_PRED || dir == VERT_LEFT_PRED) {
649 av_assert2(s->mb_y || linesize <= block_offset[i]);
650 52991 topright = ptr + 4 - linesize;
651 } else
652 715809 topright = NULL;
653
654 768800 s->hpc.pred4x4[dir](ptr, topright, linesize);
655 768800 nnz = s->non_zero_count_cache[scan8[i]];
656
2/2
✓ Branch 0 taken 560628 times.
✓ Branch 1 taken 208172 times.
768800 if (nnz) {
657 560628 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 50587 }
665
666 488854 static void hl_decode_mb(SVQ3Context *s)
667 {
668 488854 const int mb_x = s->mb_x;
669 488854 const int mb_y = s->mb_y;
670 488854 const int mb_xy = s->mb_xy;
671 488854 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 488854 const int *block_offset = &s->block_offset[0];
676 488854 const int block_h = 16 >> 1;
677
678 488854 linesize = s->cur_pic->f->linesize[0];
679 488854 uvlinesize = s->cur_pic->f->linesize[1];
680
681 488854 dest_y = s->cur_pic->f->data[0] + (mb_x + mb_y * linesize) * 16;
682 488854 dest_cb = s->cur_pic->f->data[1] + mb_x * 8 + mb_y * uvlinesize * block_h;
683 488854 dest_cr = s->cur_pic->f->data[2] + mb_x * 8 + mb_y * uvlinesize * block_h;
684
685 488854 s->vdsp.prefetch(dest_y + (s->mb_x & 3) * 4 * linesize + 64, linesize, 4);
686 488854 s->vdsp.prefetch(dest_cb + (s->mb_x & 7) * uvlinesize + 64, dest_cr - dest_cb, 2);
687
688
2/2
✓ Branch 0 taken 50587 times.
✓ Branch 1 taken 438267 times.
488854 if (IS_INTRA(mb_type)) {
689 50587 s->hpc.pred8x8[s->chroma_pred_mode](dest_cb, uvlinesize);
690 50587 s->hpc.pred8x8[s->chroma_pred_mode](dest_cr, uvlinesize);
691
692 50587 hl_decode_mb_predict_luma(s, mb_type, block_offset, linesize, dest_y);
693 }
694
695 488854 hl_decode_mb_idct_luma(s, mb_type, block_offset, linesize, dest_y);
696
697
2/2
✓ Branch 0 taken 159382 times.
✓ Branch 1 taken 329472 times.
488854 if (s->cbp & 0x30) {
698 159382 uint8_t *dest[2] = { dest_cb, dest_cr };
699 159382 s->h264dsp.chroma_dc_dequant_idct(s->mb + 16 * 16 * 1,
700 159382 s->dequant4_coeff[4][0]);
701 159382 s->h264dsp.chroma_dc_dequant_idct(s->mb + 16 * 16 * 2,
702 159382 s->dequant4_coeff[4][0]);
703
2/2
✓ Branch 0 taken 318764 times.
✓ Branch 1 taken 159382 times.
478146 for (j = 1; j < 3; j++) {
704
2/2
✓ Branch 0 taken 1275056 times.
✓ Branch 1 taken 318764 times.
1593820 for (i = j * 16; i < j * 16 + 4; i++)
705
4/4
✓ Branch 0 taken 732208 times.
✓ Branch 1 taken 542848 times.
✓ Branch 2 taken 430847 times.
✓ Branch 3 taken 301361 times.
1275056 if (s->non_zero_count_cache[scan8[i]] || s->mb[i * 16]) {
706 973695 uint8_t *const ptr = dest[j - 1] + block_offset[i];
707 973695 svq3_add_idct_c(ptr, s->mb + i * 16,
708 973695 uvlinesize, ff_h264_chroma_qp[0][s->qscale + 12] - 12, 2);
709 }
710 }
711 }
712 488854 }
713
714 842700 static int svq3_decode_mb(SVQ3Context *s, unsigned int mb_type)
715 {
716 int i, j, k, m, dir, mode;
717 842700 int cbp = 0;
718 uint32_t vlc;
719 int8_t *top, *left;
720 842700 const int mb_xy = s->mb_xy;
721 842700 const int b_xy = 4 * s->mb_x + 4 * s->mb_y * s->b_stride;
722
723
2/2
✓ Branch 0 taken 56180 times.
✓ Branch 1 taken 786520 times.
842700 s->top_samples_available = (s->mb_y == 0) ? 0x33FF : 0xFFFF;
724
2/2
✓ Branch 0 taken 42150 times.
✓ Branch 1 taken 800550 times.
842700 s->left_samples_available = (s->mb_x == 0) ? 0x5F5F : 0xFFFF;
725
726
2/2
✓ Branch 0 taken 353906 times.
✓ Branch 1 taken 488794 times.
842700 if (mb_type == 0) { /* SKIP */
727
2/2
✓ Branch 0 taken 874 times.
✓ Branch 1 taken 353032 times.
353906 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 353513 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 353032 times.
353513 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 353513 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 438207 times.
✓ Branch 1 taken 50587 times.
488794 } else if (mb_type < 8) { /* INTER */
747
4/4
✓ Branch 0 taken 833 times.
✓ Branch 1 taken 437374 times.
✓ Branch 3 taken 129 times.
✓ Branch 4 taken 704 times.
438207 if (s->thirdpel_flag && s->halfpel_flag == !get_bits1(&s->gb_slice))
748 129 mode = THIRDPEL_MODE;
749
1/2
✓ Branch 0 taken 438078 times.
✗ Branch 1 not taken.
438078 else if (s->halfpel_flag &&
750
2/2
✓ Branch 1 taken 197151 times.
✓ Branch 2 taken 240927 times.
438078 s->thirdpel_flag == !get_bits1(&s->gb_slice))
751 197151 mode = HALFPEL_MODE;
752 else
753 240927 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 438391 times.
✓ Branch 1 taken 184 times.
438575 for (m = 0; m < 2; m++) {
765
3/4
✓ Branch 0 taken 421631 times.
✓ Branch 1 taken 16760 times.
✓ Branch 2 taken 421631 times.
✗ Branch 3 not taken.
438391 if (s->mb_x > 0 && s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - 1] + 6] != -1) {
766
2/2
✓ Branch 0 taken 1686524 times.
✓ Branch 1 taken 421631 times.
2108155 for (i = 0; i < 4; i++)
767 1686524 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 67040 times.
✓ Branch 1 taken 16760 times.
83800 for (i = 0; i < 4; i++)
771 67040 AV_ZERO32(s->mv_cache[m][scan8[0] - 1 + i * 8]);
772 }
773
2/2
✓ Branch 0 taken 415485 times.
✓ Branch 1 taken 22906 times.
438391 if (s->mb_y > 0) {
774 415485 memcpy(s->mv_cache[m][scan8[0] - 1 * 8],
775 415485 s->cur_pic->motion_val[m][b_xy - s->b_stride],
776 4 * 2 * sizeof(int16_t));
777 415485 memset(&s->ref_cache[m][scan8[0] - 1 * 8],
778
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 415485 times.
415485 (s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride]] == -1) ? PART_NOT_AVAILABLE : 1, 4);
779
780
2/2
✓ Branch 0 taken 397233 times.
✓ Branch 1 taken 18252 times.
415485 if (s->mb_x < s->mb_width - 1) {
781 397233 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 397233 s->ref_cache[m][scan8[0] + 4 - 1 * 8] =
784
1/2
✓ Branch 0 taken 397233 times.
✗ Branch 1 not taken.
397233 (s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride + 1] + 6] == -1 ||
785
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 397233 times.
397233 s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride]] == -1) ? PART_NOT_AVAILABLE : 1;
786 } else
787 18252 s->ref_cache[m][scan8[0] + 4 - 1 * 8] = PART_NOT_AVAILABLE;
788
2/2
✓ Branch 0 taken 399643 times.
✓ Branch 1 taken 15842 times.
415485 if (s->mb_x > 0) {
789 399643 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 399643 s->ref_cache[m][scan8[0] - 1 - 1 * 8] =
792
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 399643 times.
399643 (s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride - 1] + 3] == -1) ? PART_NOT_AVAILABLE : 1;
793 } else
794 15842 s->ref_cache[m][scan8[0] - 1 - 1 * 8] = PART_NOT_AVAILABLE;
795 } else
796 22906 memset(&s->ref_cache[m][scan8[0] - 1 * 8 - 1],
797 PART_NOT_AVAILABLE, 8);
798
799
2/2
✓ Branch 0 taken 438023 times.
✓ Branch 1 taken 368 times.
438391 if (s->pict_type != AV_PICTURE_TYPE_B)
800 438023 break;
801 }
802
803 /* decode motion vector(s) and form prediction(s) */
804
2/2
✓ Branch 0 taken 438023 times.
✓ Branch 1 taken 184 times.
438207 if (s->pict_type == AV_PICTURE_TYPE_P) {
805
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 438023 times.
438023 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 438207 mb_type = MB_TYPE_16x16;
827
3/4
✓ Branch 0 taken 2537 times.
✓ Branch 1 taken 48050 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2537 times.
50587 } else if (mb_type == 8 || mb_type == 33) { /* INTRA4x4 */
828 48050 int8_t *i4x4 = s->intra4x4_pred_mode + s->mb2br_xy[s->mb_xy];
829 48050 int8_t *i4x4_cache = s->intra4x4_pred_mode_cache;
830
831 48050 memset(s->intra4x4_pred_mode_cache, -1, 8 * 5 * sizeof(int8_t));
832
833
1/2
✓ Branch 0 taken 48050 times.
✗ Branch 1 not taken.
48050 if (mb_type == 8) {
834
2/2
✓ Branch 0 taken 44048 times.
✓ Branch 1 taken 4002 times.
48050 if (s->mb_x > 0) {
835
2/2
✓ Branch 0 taken 176192 times.
✓ Branch 1 taken 44048 times.
220240 for (i = 0; i < 4; i++)
836 176192 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 44048 times.
44048 if (s->intra4x4_pred_mode_cache[scan8[0] - 1] == -1)
838 s->left_samples_available = 0x5F5F;
839 }
840
2/2
✓ Branch 0 taken 45141 times.
✓ Branch 1 taken 2909 times.
48050 if (s->mb_y > 0) {
841 45141 s->intra4x4_pred_mode_cache[4 + 8 * 0] = s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride] + 0];
842 45141 s->intra4x4_pred_mode_cache[5 + 8 * 0] = s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride] + 1];
843 45141 s->intra4x4_pred_mode_cache[6 + 8 * 0] = s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride] + 2];
844 45141 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 45141 times.
45141 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 384400 times.
✓ Branch 1 taken 48050 times.
432450 for (i = 0; i < 16; i += 2) {
852 384400 vlc = get_interleaved_ue_golomb(&s->gb_slice);
853
854
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 384400 times.
384400 if (vlc >= 25U) {
855 av_log(s->avctx, AV_LOG_ERROR,
856 "luma prediction:%"PRIu32"\n", vlc);
857 return -1;
858 }
859
860 384400 left = &s->intra4x4_pred_mode_cache[scan8[i] - 1];
861 384400 top = &s->intra4x4_pred_mode_cache[scan8[i] - 8];
862
863 384400 left[1] = svq3_pred_1[top[0] + 1][left[0] + 1][svq3_pred_0[vlc][0]];
864 384400 left[2] = svq3_pred_1[top[1] + 1][left[1] + 1][svq3_pred_0[vlc][1]];
865
866
2/4
✓ Branch 0 taken 384400 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 384400 times.
384400 if (left[1] == -1 || left[2] == -1) {
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 48050 AV_COPY32(i4x4, i4x4_cache + 4 + 8 * 4);
877 48050 i4x4[4] = i4x4_cache[7 + 8 * 3];
878 48050 i4x4[5] = i4x4_cache[7 + 8 * 2];
879 48050 i4x4[6] = i4x4_cache[7 + 8 * 1];
880
881
1/2
✓ Branch 0 taken 48050 times.
✗ Branch 1 not taken.
48050 if (mb_type == 8) {
882 48050 ff_h264_check_intra4x4_pred_mode(s->intra4x4_pred_mode_cache,
883 48050 s->avctx, s->top_samples_available,
884 48050 s->left_samples_available);
885
886
2/2
✓ Branch 0 taken 2909 times.
✓ Branch 1 taken 45141 times.
48050 s->top_samples_available = (s->mb_y == 0) ? 0x33FF : 0xFFFF;
887
2/2
✓ Branch 0 taken 4002 times.
✓ Branch 1 taken 44048 times.
48050 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 48050 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 404100 times.
✓ Branch 1 taken 438600 times.
✓ Branch 2 taken 384930 times.
✓ Branch 3 taken 19170 times.
842700 if (!IS_INTER(mb_type) && s->pict_type != AV_PICTURE_TYPE_I) {
912
2/2
✓ Branch 0 taken 1539720 times.
✓ Branch 1 taken 384930 times.
1924650 for (i = 0; i < 4; i++)
913 1539720 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 384427 times.
384930 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 794650 times.
✓ Branch 1 taken 48050 times.
842700 if (!IS_INTRA4x4(mb_type)) {
922 794650 memset(s->intra4x4_pred_mode + s->mb2br_xy[mb_xy], DC_PRED, 8);
923 }
924
4/4
✓ Branch 0 taken 353513 times.
✓ Branch 1 taken 489187 times.
✓ Branch 2 taken 481 times.
✓ Branch 3 taken 353032 times.
842700 if (!IS_SKIP(mb_type) || s->pict_type == AV_PICTURE_TYPE_B) {
925 489668 memset(s->non_zero_count_cache + 8, 0, 14 * 8 * sizeof(uint8_t));
926 }
927
928
2/2
✓ Branch 0 taken 840163 times.
✓ Branch 1 taken 2537 times.
842700 if (!IS_INTRA16x16(mb_type) &&
929
4/4
✓ Branch 0 taken 353513 times.
✓ Branch 1 taken 486650 times.
✓ Branch 2 taken 481 times.
✓ Branch 3 taken 353032 times.
840163 (!IS_SKIP(mb_type) || s->pict_type == AV_PICTURE_TYPE_B)) {
930
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 487131 times.
487131 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 487131 cbp = IS_INTRA(mb_type) ? ff_h264_golomb_to_intra4x4_cbp[vlc]
936
2/2
✓ Branch 0 taken 48050 times.
✓ Branch 1 taken 439081 times.
487131 : ff_h264_golomb_to_inter_cbp[vlc];
937 }
938
2/2
✓ Branch 0 taken 840163 times.
✓ Branch 1 taken 2537 times.
842700 if (IS_INTRA16x16(mb_type) ||
939
6/6
✓ Branch 0 taken 823203 times.
✓ Branch 1 taken 16960 times.
✓ Branch 2 taken 2424 times.
✓ Branch 3 taken 820779 times.
✓ Branch 4 taken 696 times.
✓ Branch 5 taken 1728 times.
840163 (s->pict_type != AV_PICTURE_TYPE_I && s->adaptive_quant && cbp)) {
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 840163 times.
842700 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 333795 times.
✓ Branch 1 taken 508905 times.
842700 if (cbp) {
958 333795 const int index = IS_INTRA16x16(mb_type) ? 1 : 0;
959
4/4
✓ Branch 0 taken 333729 times.
✓ Branch 1 taken 66 times.
✓ Branch 2 taken 40577 times.
✓ Branch 3 taken 293152 times.
333795 const int type = ((s->qscale < 24 && IS_INTRA4x4(mb_type)) ? 2 : 1);
960
961
2/2
✓ Branch 0 taken 1335180 times.
✓ Branch 1 taken 333795 times.
1668975 for (i = 0; i < 4; i++)
962
2/2
✓ Branch 0 taken 755308 times.
✓ Branch 1 taken 579872 times.
1335180 if ((cbp & (1 << i))) {
963
2/2
✓ Branch 0 taken 3021232 times.
✓ Branch 1 taken 755308 times.
3776540 for (j = 0; j < 4; j++) {
964 3025104 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 3017360 times.
3021232 : (4 * i + j);
967 3021232 s->non_zero_count_cache[scan8[k]] = 1;
968
969
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3021232 times.
3021232 if (svq3_decode_block(&s->gb_slice, &s->mb[16 * k], index, type)) {
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 159382 times.
✓ Branch 1 taken 174413 times.
333795 if ((cbp & 0x30)) {
978
2/2
✓ Branch 0 taken 318764 times.
✓ Branch 1 taken 159382 times.
478146 for (i = 1; i < 3; ++i)
979
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 318764 times.
318764 if (svq3_decode_block(&s->gb_slice, &s->mb[16 * 16 * i], 0, 3)) {
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 67856 times.
✓ Branch 1 taken 91526 times.
159382 if ((cbp & 0x20)) {
986
2/2
✓ Branch 0 taken 135712 times.
✓ Branch 1 taken 67856 times.
203568 for (i = 1; i < 3; i++) {
987
2/2
✓ Branch 0 taken 542848 times.
✓ Branch 1 taken 135712 times.
678560 for (j = 0; j < 4; j++) {
988 542848 k = 16 * i + j;
989 542848 s->non_zero_count_cache[scan8[k]] = 1;
990
991
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 542848 times.
542848 if (svq3_decode_block(&s->gb_slice, &s->mb[16 * k], 1, 1)) {
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 842700 s->cbp = cbp;
1003 842700 s->cur_pic->mb_type[mb_xy] = mb_type;
1004
1005
2/2
✓ Branch 0 taken 50587 times.
✓ Branch 1 taken 792113 times.
842700 if (IS_INTRA(mb_type))
1006 50587 s->chroma_pred_mode = ff_h264_check_intra_pred_mode(s->avctx, s->top_samples_available,
1007 50587 s->left_samples_available, DC_PRED8x8, 1);
1008
1009 842700 return 0;
1010 }
1011
1012 2810 static int svq3_decode_slice_header(AVCodecContext *avctx)
1013 {
1014 2810 SVQ3Context *s = avctx->priv_data;
1015 2810 const int mb_xy = s->mb_xy;
1016 int i, header;
1017 unsigned slice_id;
1018
1019 2810 header = get_bits(&s->gb, 8);
1020
1021
2/6
✗ Branch 0 not taken.
✓ Branch 1 taken 2810 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2810 times.
2810 if (((header & 0x9F) != 1 && (header & 0x9F) != 2) || (header & 0x60) == 0) {
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 2810 int length = header >> 5 & 3;
1028
1029 2810 slice_length = show_bits(&s->gb, 8 * length);
1030 2810 slice_bits = slice_length * 8;
1031 2810 slice_bytes = slice_length + length - 1;
1032
1033 2810 skip_bits(&s->gb, 8);
1034
1035 2810 av_fast_padded_malloc(&s->slice_buf, &s->slice_buf_size, slice_bytes);
1036
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2810 times.
2810 if (!s->slice_buf)
1037 return AVERROR(ENOMEM);
1038
1039
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2810 times.
2810 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 2810 memcpy(s->slice_buf, s->gb.buffer + s->gb.index / 8, slice_bytes);
1044
1045
1/2
✓ Branch 0 taken 2810 times.
✗ Branch 1 not taken.
2810 if (length > 0) {
1046 2810 memmove(s->slice_buf, &s->slice_buf[slice_length], length - 1);
1047 }
1048
1049
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 2800 times.
2810 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 2810 init_get_bits(&s->gb_slice, s->slice_buf, slice_bits);
1054
1055 2810 skip_bits_long(&s->gb, slice_bytes * 8);
1056 }
1057
1058
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2810 times.
2810 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 2810 s->slice_type = ff_h264_golomb_to_pict_type[slice_id];
1064
1065
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2810 times.
2810 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 2810 times.
2810 } else if (get_bits1(&s->gb_slice)) {
1069 avpriv_report_missing_feature(s->avctx, "Media key encryption");
1070 return AVERROR_PATCHWELCOME;
1071 }
1072
1073 2810 s->slice_num = get_bits(&s->gb_slice, 8);
1074 2810 s->qscale = get_bits(&s->gb_slice, 5);
1075 2810 s->adaptive_quant = get_bits1(&s->gb_slice);
1076
1077 /* unknown fields */
1078 2810 skip_bits1(&s->gb_slice);
1079
1080
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 2800 times.
2810 if (s->has_watermark)
1081 10 skip_bits1(&s->gb_slice);
1082
1083 2810 skip_bits1(&s->gb_slice);
1084 2810 skip_bits(&s->gb_slice, 2);
1085
1086
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2810 times.
2810 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 2810 times.
2810 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 2810 times.
2810 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 2810 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 2810 static int get_buffer(AVCodecContext *avctx, SVQ3Frame *pic)
1357 {
1358 2810 SVQ3Context *s = avctx->priv_data;
1359 2810 int ret = ff_get_buffer(avctx, pic->f,
1360 2810 (s->pict_type != AV_PICTURE_TYPE_B) ?
1361 AV_GET_BUFFER_FLAG_REF : 0);
1362
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2810 times.
2810 if (ret < 0)
1363 return ret;
1364
1365
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2806 times.
2810 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 2810 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 2816 static int svq3_decode_frame(AVCodecContext *avctx, AVFrame *rframe,
1392 int *got_frame, AVPacket *avpkt)
1393 {
1394 2816 SVQ3Context *s = avctx->priv_data;
1395 2816 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 2810 times.
2816 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 2810 s->mb_x = s->mb_y = s->mb_xy = 0;
1409
1410 2810 ret = init_get_bits8(&s->gb, avpkt->data, avpkt->size);
1411
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2810 times.
2810 if (ret < 0)
1412 return ret;
1413
1414 2810 ret = svq3_decode_slice_header(avctx);
1415
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2810 times.
2810 if (ret < 0)
1416 return ret;
1417
1418
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2810 times.
2810 if (avpkt->size < s->mb_width * s->mb_height / 8)
1419 return AVERROR_INVALIDDATA;
1420
1421 2810 s->pict_type = s->slice_type;
1422
1423
2/2
✓ Branch 0 taken 2806 times.
✓ Branch 1 taken 4 times.
2810 if (s->pict_type != AV_PICTURE_TYPE_B)
1424 2806 FFSWAP(SVQ3Frame*, s->next_pic, s->last_pic);
1425
1426 2810 av_frame_unref(s->cur_pic->f);
1427
1428 /* for skipping the frame */
1429 2810 s->cur_pic->f->pict_type = s->pict_type;
1430
2/2
✓ Branch 0 taken 64 times.
✓ Branch 1 taken 2746 times.
2810 if (s->pict_type == AV_PICTURE_TYPE_I)
1431 64 s->cur_pic->f->flags |= AV_FRAME_FLAG_KEY;
1432 else
1433 2746 s->cur_pic->f->flags &= ~AV_FRAME_FLAG_KEY;
1434
1435 2810 ret = get_buffer(avctx, s->cur_pic);
1436
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2810 times.
2810 if (ret < 0)
1437 return ret;
1438
1439
2/2
✓ Branch 0 taken 44960 times.
✓ Branch 1 taken 2810 times.
47770 for (i = 0; i < 16; i++) {
1440 44960 s->block_offset[i] = (4 * ((scan8[i] - scan8[0]) & 7)) + 4 * s->cur_pic->f->linesize[0] * ((scan8[i] - scan8[0]) >> 3);
1441 44960 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 44960 times.
✓ Branch 1 taken 2810 times.
47770 for (i = 0; i < 16; i++) {
1444 44960 s->block_offset[16 + i] =
1445 44960 s->block_offset[32 + i] = (4 * ((scan8[i] - scan8[0]) & 7)) + 4 * s->cur_pic->f->linesize[1] * ((scan8[i] - scan8[0]) >> 3);
1446 44960 s->block_offset[48 + 16 + i] =
1447 44960 s->block_offset[48 + 32 + i] = (4 * ((scan8[i] - scan8[0]) & 7)) + 8 * s->cur_pic->f->linesize[1] * ((scan8[i] - scan8[0]) >> 3);
1448 }
1449
1450
2/2
✓ Branch 0 taken 2746 times.
✓ Branch 1 taken 64 times.
2810 if (s->pict_type != AV_PICTURE_TYPE_I) {
1451
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2746 times.
2746 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 2742 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
2746 if (s->pict_type == AV_PICTURE_TYPE_B && !s->next_pic->f->data[0]) {
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 2810 times.
2810 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 2810 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2810 if (avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type == AV_PICTURE_TYPE_B ||
1472
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2810 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2810 avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type != AV_PICTURE_TYPE_I ||
1473
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2810 times.
2810 avctx->skip_frame >= AVDISCARD_ALL)
1474 return 0;
1475
1476
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2806 times.
2810 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 2806 s->prev_frame_num = s->frame_num;
1488 2806 s->frame_num = s->slice_num;
1489 2806 s->prev_frame_num_offset = s->frame_num - s->prev_frame_num;
1490
1491
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 2796 times.
2806 if (s->prev_frame_num_offset < 0)
1492 10 s->prev_frame_num_offset += 256;
1493 }
1494
1495
2/2
✓ Branch 0 taken 5620 times.
✓ Branch 1 taken 2810 times.
8430 for (m = 0; m < 2; m++) {
1496 int i;
1497
2/2
✓ Branch 0 taken 22480 times.
✓ Branch 1 taken 5620 times.
28100 for (i = 0; i < 4; i++) {
1498 int j;
1499
2/2
✓ Branch 0 taken 112400 times.
✓ Branch 1 taken 22480 times.
134880 for (j = -1; j < 4; j++)
1500 112400 s->ref_cache[m][scan8[0] + 8 * i + j] = 1;
1501
2/2
✓ Branch 0 taken 16860 times.
✓ Branch 1 taken 5620 times.
22480 if (i < 3)
1502 16860 s->ref_cache[m][scan8[0] + 8 * i + j] = PART_NOT_AVAILABLE;
1503 }
1504 }
1505
1506
2/2
✓ Branch 0 taken 42150 times.
✓ Branch 1 taken 2810 times.
44960 for (s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) {
1507
2/2
✓ Branch 0 taken 842700 times.
✓ Branch 1 taken 42150 times.
884850 for (s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) {
1508 unsigned mb_type;
1509 842700 s->mb_xy = s->mb_x + s->mb_y * s->mb_stride;
1510
1511
2/2
✓ Branch 1 taken 3847 times.
✓ Branch 2 taken 838853 times.
842700 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 842700 mb_type = get_interleaved_ue_golomb(&s->gb_slice);
1526
1527
2/2
✓ Branch 0 taken 19170 times.
✓ Branch 1 taken 823530 times.
842700 if (s->pict_type == AV_PICTURE_TYPE_I)
1528 19170 mb_type += 8;
1529
4/4
✓ Branch 0 taken 1080 times.
✓ Branch 1 taken 822450 times.
✓ Branch 2 taken 22 times.
✓ Branch 3 taken 1058 times.
823530 else if (s->pict_type == AV_PICTURE_TYPE_B && mb_type >= 4)
1530 22 mb_type += 4;
1531
2/4
✓ Branch 0 taken 842700 times.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 842700 times.
842700 if (mb_type > 33 || svq3_decode_mb(s, mb_type)) {
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 353906 times.
✓ Branch 1 taken 488794 times.
✓ Branch 2 taken 60 times.
✓ Branch 3 taken 353846 times.
842700 if (mb_type != 0 || s->cbp)
1538 488854 hl_decode_mb(s);
1539
1540
3/4
✓ Branch 0 taken 841620 times.
✓ Branch 1 taken 1080 times.
✓ Branch 2 taken 841620 times.
✗ Branch 3 not taken.
842700 if (s->pict_type != AV_PICTURE_TYPE_B && !s->low_delay)
1541 841620 s->cur_pic->mb_type[s->mb_x + s->mb_y * s->mb_stride] =
1542
4/4
✓ Branch 0 taken 822450 times.
✓ Branch 1 taken 19170 times.
✓ Branch 2 taken 791055 times.
✓ Branch 3 taken 31395 times.
841620 (s->pict_type == AV_PICTURE_TYPE_P && mb_type < 8) ? (mb_type - 1) : -1;
1543 }
1544
1545 42150 ff_draw_horiz_band(avctx, s->cur_pic->f,
1546 42090 s->last_pic->f->data[0] ? s->last_pic->f : NULL,
1547
2/2
✓ Branch 0 taken 42090 times.
✓ Branch 1 taken 60 times.
42150 16 * s->mb_y, 16, PICT_FRAME, 0,
1548 s->low_delay);
1549 }
1550
1551 2810 left = buf_size*8 - get_bits_count(&s->gb_slice);
1552
1553
2/4
✓ Branch 0 taken 2810 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2810 times.
2810 if (s->mb_y != s->mb_height || s->mb_x != s->mb_width) {
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 2810 times.
2810 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 2806 times.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2806 times.
2810 if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay)
1564 4 ret = av_frame_ref(rframe, s->cur_pic->f);
1565
2/2
✓ Branch 0 taken 2802 times.
✓ Branch 1 taken 4 times.
2806 else if (s->last_pic->f->data[0])
1566 2802 ret = av_frame_ref(rframe, s->last_pic->f);
1567
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2810 times.
2810 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 2806 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
2810 if (s->last_pic->f->data[0] || s->low_delay)
1572 2806 *got_frame = 1;
1573
1574
2/2
✓ Branch 0 taken 2806 times.
✓ Branch 1 taken 4 times.
2810 if (s->pict_type != AV_PICTURE_TYPE_B) {
1575 2806 FFSWAP(SVQ3Frame*, s->cur_pic, s->next_pic);
1576 } else {
1577 4 av_frame_unref(s->cur_pic->f);
1578 }
1579
1580 2810 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