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