2 * Copyright (c) 2003 The FFmpeg Project
4 * This file is part of FFmpeg.
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.
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.
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
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:
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)
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
45 #include "libavutil/attributes.h"
46 #include "libavutil/crc.h"
50 #include "mpegutils.h"
56 #include "rectangle.h"
70 typedef struct SVQ3Frame {
73 AVBufferRef *motion_val_buf[2];
74 int16_t (*motion_val[2])[2];
76 AVBufferRef *mb_type_buf;
80 AVBufferRef *ref_index_buf[2];
84 typedef struct SVQ3Context {
85 AVCodecContext *avctx;
87 H264DSPContext h264dsp;
97 GetBitContext gb_slice;
103 uint32_t watermark_key;
107 int next_p_frame_damaged;
110 int last_frame_output;
115 int frame_num_offset;
116 int prev_frame_num_offset;
119 enum AVPictureType pict_type;
120 enum AVPictureType slice_type;
125 int mb_width, mb_height;
126 int mb_stride, mb_num;
131 int chroma_pred_mode;
132 int intra16x16_pred_mode;
134 int8_t intra4x4_pred_mode_cache[5 * 8];
135 int8_t (*intra4x4_pred_mode);
137 unsigned int top_samples_available;
138 unsigned int topright_samples_available;
139 unsigned int left_samples_available;
141 uint8_t *edge_emu_buffer;
143 DECLARE_ALIGNED(16, int16_t, mv_cache)[2][5 * 8][2];
144 DECLARE_ALIGNED(8, int8_t, ref_cache)[2][5 * 8];
145 DECLARE_ALIGNED(16, int16_t, mb)[16 * 48 * 2];
146 DECLARE_ALIGNED(16, int16_t, mb_luma_dc)[3][16 * 2];
147 DECLARE_ALIGNED(8, uint8_t, non_zero_count_cache)[15 * 8];
148 uint32_t dequant4_coeff[QP_MAX_NUM + 1][16];
149 int block_offset[2 * (16 * 3)];
153 #define FULLPEL_MODE 1
154 #define HALFPEL_MODE 2
155 #define THIRDPEL_MODE 3
156 #define PREDICT_MODE 4
158 /* dual scan (from some older H.264 draft)
167 static const uint8_t svq3_scan[16] = {
168 0 + 0 * 4, 1 + 0 * 4, 2 + 0 * 4, 2 + 1 * 4,
169 2 + 2 * 4, 3 + 0 * 4, 3 + 1 * 4, 3 + 2 * 4,
170 0 + 1 * 4, 0 + 2 * 4, 1 + 1 * 4, 1 + 2 * 4,
171 0 + 3 * 4, 1 + 3 * 4, 2 + 3 * 4, 3 + 3 * 4,
174 static const uint8_t luma_dc_zigzag_scan[16] = {
175 0 * 16 + 0 * 64, 1 * 16 + 0 * 64, 2 * 16 + 0 * 64, 0 * 16 + 2 * 64,
176 3 * 16 + 0 * 64, 0 * 16 + 1 * 64, 1 * 16 + 1 * 64, 2 * 16 + 1 * 64,
177 1 * 16 + 2 * 64, 2 * 16 + 2 * 64, 3 * 16 + 2 * 64, 0 * 16 + 3 * 64,
178 3 * 16 + 1 * 64, 1 * 16 + 3 * 64, 2 * 16 + 3 * 64, 3 * 16 + 3 * 64,
181 static const uint8_t svq3_pred_0[25][2] = {
184 { 0, 2 }, { 1, 1 }, { 2, 0 },
185 { 3, 0 }, { 2, 1 }, { 1, 2 }, { 0, 3 },
186 { 0, 4 }, { 1, 3 }, { 2, 2 }, { 3, 1 }, { 4, 0 },
187 { 4, 1 }, { 3, 2 }, { 2, 3 }, { 1, 4 },
188 { 2, 4 }, { 3, 3 }, { 4, 2 },
193 static const int8_t svq3_pred_1[6][6][5] = {
194 { { 2, -1, -1, -1, -1 }, { 2, 1, -1, -1, -1 }, { 1, 2, -1, -1, -1 },
195 { 2, 1, -1, -1, -1 }, { 1, 2, -1, -1, -1 }, { 1, 2, -1, -1, -1 } },
196 { { 0, 2, -1, -1, -1 }, { 0, 2, 1, 4, 3 }, { 0, 1, 2, 4, 3 },
197 { 0, 2, 1, 4, 3 }, { 2, 0, 1, 3, 4 }, { 0, 4, 2, 1, 3 } },
198 { { 2, 0, -1, -1, -1 }, { 2, 1, 0, 4, 3 }, { 1, 2, 4, 0, 3 },
199 { 2, 1, 0, 4, 3 }, { 2, 1, 4, 3, 0 }, { 1, 2, 4, 0, 3 } },
200 { { 2, 0, -1, -1, -1 }, { 2, 0, 1, 4, 3 }, { 1, 2, 0, 4, 3 },
201 { 2, 1, 0, 4, 3 }, { 2, 1, 3, 4, 0 }, { 2, 4, 1, 0, 3 } },
202 { { 0, 2, -1, -1, -1 }, { 0, 2, 1, 3, 4 }, { 1, 2, 3, 0, 4 },
203 { 2, 0, 1, 3, 4 }, { 2, 1, 3, 0, 4 }, { 2, 0, 4, 3, 1 } },
204 { { 0, 2, -1, -1, -1 }, { 0, 2, 4, 1, 3 }, { 1, 4, 2, 0, 3 },
205 { 4, 2, 0, 1, 3 }, { 2, 0, 1, 4, 3 }, { 4, 2, 1, 0, 3 } },
208 static const struct {
211 } svq3_dct_tables[2][16] = {
212 { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 2, 1 }, { 0, 2 }, { 3, 1 }, { 4, 1 }, { 5, 1 },
213 { 0, 3 }, { 1, 2 }, { 2, 2 }, { 6, 1 }, { 7, 1 }, { 8, 1 }, { 9, 1 }, { 0, 4 } },
214 { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 0, 2 }, { 2, 1 }, { 0, 3 }, { 0, 4 }, { 0, 5 },
215 { 3, 1 }, { 4, 1 }, { 1, 2 }, { 1, 3 }, { 0, 6 }, { 0, 7 }, { 0, 8 }, { 0, 9 } }
218 static const uint32_t svq3_dequant_coeff[32] = {
219 3881, 4351, 4890, 5481, 6154, 6914, 7761, 8718,
220 9781, 10987, 12339, 13828, 15523, 17435, 19561, 21873,
221 24552, 27656, 30847, 34870, 38807, 43747, 49103, 54683,
222 61694, 68745, 77615, 89113, 100253, 109366, 126635, 141533
225 static int svq3_decode_end(AVCodecContext *avctx);
227 static void svq3_luma_dc_dequant_idct_c(int16_t *output, int16_t *input, int qp)
229 const unsigned qmul = svq3_dequant_coeff[qp];
233 static const uint8_t x_offset[4] = { 0, 1 * stride, 4 * stride, 5 * stride };
235 for (i = 0; i < 4; i++) {
236 const int z0 = 13 * (input[4 * i + 0] + input[4 * i + 2]);
237 const int z1 = 13 * (input[4 * i + 0] - input[4 * i + 2]);
238 const int z2 = 7 * input[4 * i + 1] - 17 * input[4 * i + 3];
239 const int z3 = 17 * input[4 * i + 1] + 7 * input[4 * i + 3];
241 temp[4 * i + 0] = z0 + z3;
242 temp[4 * i + 1] = z1 + z2;
243 temp[4 * i + 2] = z1 - z2;
244 temp[4 * i + 3] = z0 - z3;
247 for (i = 0; i < 4; i++) {
248 const int offset = x_offset[i];
249 const int z0 = 13 * (temp[4 * 0 + i] + temp[4 * 2 + i]);
250 const int z1 = 13 * (temp[4 * 0 + i] - temp[4 * 2 + i]);
251 const int z2 = 7 * temp[4 * 1 + i] - 17 * temp[4 * 3 + i];
252 const int z3 = 17 * temp[4 * 1 + i] + 7 * temp[4 * 3 + i];
254 output[stride * 0 + offset] = (int)((z0 + z3) * qmul + 0x80000) >> 20;
255 output[stride * 2 + offset] = (int)((z1 + z2) * qmul + 0x80000) >> 20;
256 output[stride * 8 + offset] = (int)((z1 - z2) * qmul + 0x80000) >> 20;
257 output[stride * 10 + offset] = (int)((z0 - z3) * qmul + 0x80000) >> 20;
262 static void svq3_add_idct_c(uint8_t *dst, int16_t *block,
263 int stride, int qp, int dc)
265 const int qmul = svq3_dequant_coeff[qp];
269 dc = 13 * 13 * (dc == 1 ? 1538U* block[0]
270 : qmul * (block[0] >> 3) / 2);
274 for (i = 0; i < 4; i++) {
275 const int z0 = 13 * (block[0 + 4 * i] + block[2 + 4 * i]);
276 const int z1 = 13 * (block[0 + 4 * i] - block[2 + 4 * i]);
277 const int z2 = 7 * block[1 + 4 * i] - 17 * block[3 + 4 * i];
278 const int z3 = 17 * block[1 + 4 * i] + 7 * block[3 + 4 * i];
280 block[0 + 4 * i] = z0 + z3;
281 block[1 + 4 * i] = z1 + z2;
282 block[2 + 4 * i] = z1 - z2;
283 block[3 + 4 * i] = z0 - z3;
286 for (i = 0; i < 4; i++) {
287 const unsigned z0 = 13 * (block[i + 4 * 0] + block[i + 4 * 2]);
288 const unsigned z1 = 13 * (block[i + 4 * 0] - block[i + 4 * 2]);
289 const unsigned z2 = 7 * block[i + 4 * 1] - 17 * block[i + 4 * 3];
290 const unsigned z3 = 17 * block[i + 4 * 1] + 7 * block[i + 4 * 3];
291 const int rr = (dc + 0x80000u);
293 dst[i + stride * 0] = av_clip_uint8(dst[i + stride * 0] + ((int)((z0 + z3) * qmul + rr) >> 20));
294 dst[i + stride * 1] = av_clip_uint8(dst[i + stride * 1] + ((int)((z1 + z2) * qmul + rr) >> 20));
295 dst[i + stride * 2] = av_clip_uint8(dst[i + stride * 2] + ((int)((z1 - z2) * qmul + rr) >> 20));
296 dst[i + stride * 3] = av_clip_uint8(dst[i + stride * 3] + ((int)((z0 - z3) * qmul + rr) >> 20));
299 memset(block, 0, 16 * sizeof(int16_t));
302 static inline int svq3_decode_block(GetBitContext *gb, int16_t *block,
303 int index, const int type)
305 static const uint8_t *const scan_patterns[4] = {
306 luma_dc_zigzag_scan, ff_zigzag_scan, svq3_scan, ff_h264_chroma_dc_scan
309 int run, level, sign, limit;
311 const int intra = 3 * type >> 2;
312 const uint8_t *const scan = scan_patterns[type];
314 for (limit = (16 >> intra); index < 16; index = limit, limit += 8) {
315 for (; (vlc = get_interleaved_ue_golomb(gb)) != 0; index++) {
316 if ((int32_t)vlc < 0)
319 sign = (vlc & 1) ? 0 : -1;
326 } else if (vlc < 4) {
331 level = (vlc + 9 >> 2) - run;
335 run = svq3_dct_tables[intra][vlc].run;
336 level = svq3_dct_tables[intra][vlc].level;
339 level = (vlc >> 3) + ((run == 0) ? 8 : ((run < 2) ? 2 : ((run < 5) ? 0 : -1)));
342 level = (vlc >> 4) + ((run == 0) ? 4 : ((run < 3) ? 2 : ((run < 10) ? 1 : 0)));
347 if ((index += run) >= limit)
350 block[scan[index]] = (level ^ sign) - sign;
361 static av_always_inline int
362 svq3_fetch_diagonal_mv(const SVQ3Context *s, const int16_t **C,
363 int i, int list, int part_width)
365 const int topright_ref = s->ref_cache[list][i - 8 + part_width];
367 if (topright_ref != PART_NOT_AVAILABLE) {
368 *C = s->mv_cache[list][i - 8 + part_width];
371 *C = s->mv_cache[list][i - 8 - 1];
372 return s->ref_cache[list][i - 8 - 1];
377 * Get the predicted MV.
378 * @param n the block index
379 * @param part_width the width of the partition (4, 8,16) -> (1, 2, 4)
380 * @param mx the x component of the predicted motion vector
381 * @param my the y component of the predicted motion vector
383 static av_always_inline void svq3_pred_motion(const SVQ3Context *s, int n,
384 int part_width, int list,
385 int ref, int *const mx, int *const my)
387 const int index8 = scan8[n];
388 const int top_ref = s->ref_cache[list][index8 - 8];
389 const int left_ref = s->ref_cache[list][index8 - 1];
390 const int16_t *const A = s->mv_cache[list][index8 - 1];
391 const int16_t *const B = s->mv_cache[list][index8 - 8];
393 int diagonal_ref, match_count;
403 diagonal_ref = svq3_fetch_diagonal_mv(s, &C, index8, list, part_width);
404 match_count = (diagonal_ref == ref) + (top_ref == ref) + (left_ref == ref);
405 if (match_count > 1) { //most common
406 *mx = mid_pred(A[0], B[0], C[0]);
407 *my = mid_pred(A[1], B[1], C[1]);
408 } else if (match_count == 1) {
409 if (left_ref == ref) {
412 } else if (top_ref == ref) {
420 if (top_ref == PART_NOT_AVAILABLE &&
421 diagonal_ref == PART_NOT_AVAILABLE &&
422 left_ref != PART_NOT_AVAILABLE) {
426 *mx = mid_pred(A[0], B[0], C[0]);
427 *my = mid_pred(A[1], B[1], C[1]);
432 static inline void svq3_mc_dir_part(SVQ3Context *s,
433 int x, int y, int width, int height,
434 int mx, int my, int dxy,
435 int thirdpel, int dir, int avg)
437 const SVQ3Frame *pic = (dir == 0) ? s->last_pic : s->next_pic;
440 int blocksize = 2 - (width >> 3); // 16->0, 8->1, 4->2
441 int linesize = s->cur_pic->f->linesize[0];
442 int uvlinesize = s->cur_pic->f->linesize[1];
447 if (mx < 0 || mx >= s->h_edge_pos - width - 1 ||
448 my < 0 || my >= s->v_edge_pos - height - 1) {
450 mx = av_clip(mx, -16, s->h_edge_pos - width + 15);
451 my = av_clip(my, -16, s->v_edge_pos - height + 15);
454 /* form component predictions */
455 dest = s->cur_pic->f->data[0] + x + y * linesize;
456 src = pic->f->data[0] + mx + my * linesize;
459 s->vdsp.emulated_edge_mc(s->edge_emu_buffer, src,
461 width + 1, height + 1,
462 mx, my, s->h_edge_pos, s->v_edge_pos);
463 src = s->edge_emu_buffer;
466 (avg ? s->tdsp.avg_tpel_pixels_tab
467 : s->tdsp.put_tpel_pixels_tab)[dxy](dest, src, linesize,
470 (avg ? s->hdsp.avg_pixels_tab
471 : s->hdsp.put_pixels_tab)[blocksize][dxy](dest, src, linesize,
474 if (!(s->avctx->flags & AV_CODEC_FLAG_GRAY)) {
475 mx = mx + (mx < (int) x) >> 1;
476 my = my + (my < (int) y) >> 1;
478 height = height >> 1;
481 for (i = 1; i < 3; i++) {
482 dest = s->cur_pic->f->data[i] + (x >> 1) + (y >> 1) * uvlinesize;
483 src = pic->f->data[i] + mx + my * uvlinesize;
486 s->vdsp.emulated_edge_mc(s->edge_emu_buffer, src,
487 uvlinesize, uvlinesize,
488 width + 1, height + 1,
489 mx, my, (s->h_edge_pos >> 1),
491 src = s->edge_emu_buffer;
494 (avg ? s->tdsp.avg_tpel_pixels_tab
495 : s->tdsp.put_tpel_pixels_tab)[dxy](dest, src,
499 (avg ? s->hdsp.avg_pixels_tab
500 : s->hdsp.put_pixels_tab)[blocksize][dxy](dest, src,
507 static inline int svq3_mc_dir(SVQ3Context *s, int size, int mode,
510 int i, j, k, mx, my, dx, dy, x, y;
511 const int part_width = ((size & 5) == 4) ? 4 : 16 >> (size & 1);
512 const int part_height = 16 >> ((unsigned)(size + 1) / 3);
513 const int extra_width = (mode == PREDICT_MODE) ? -16 * 6 : 0;
514 const int h_edge_pos = 6 * (s->h_edge_pos - part_width) - extra_width;
515 const int v_edge_pos = 6 * (s->v_edge_pos - part_height) - extra_width;
517 for (i = 0; i < 16; i += part_height)
518 for (j = 0; j < 16; j += part_width) {
519 const int b_xy = (4 * s->mb_x + (j >> 2)) +
520 (4 * s->mb_y + (i >> 2)) * s->b_stride;
522 x = 16 * s->mb_x + j;
523 y = 16 * s->mb_y + i;
524 k = (j >> 2 & 1) + (i >> 1 & 2) +
525 (j >> 1 & 4) + (i & 8);
527 if (mode != PREDICT_MODE) {
528 svq3_pred_motion(s, k, part_width >> 2, dir, 1, &mx, &my);
530 mx = s->next_pic->motion_val[0][b_xy][0] * 2;
531 my = s->next_pic->motion_val[0][b_xy][1] * 2;
534 mx = mx * s->frame_num_offset /
535 s->prev_frame_num_offset + 1 >> 1;
536 my = my * s->frame_num_offset /
537 s->prev_frame_num_offset + 1 >> 1;
539 mx = mx * (s->frame_num_offset - s->prev_frame_num_offset) /
540 s->prev_frame_num_offset + 1 >> 1;
541 my = my * (s->frame_num_offset - s->prev_frame_num_offset) /
542 s->prev_frame_num_offset + 1 >> 1;
546 /* clip motion vector prediction to frame border */
547 mx = av_clip(mx, extra_width - 6 * x, h_edge_pos - 6 * x);
548 my = av_clip(my, extra_width - 6 * y, v_edge_pos - 6 * y);
550 /* get (optional) motion vector differential */
551 if (mode == PREDICT_MODE) {
554 dy = get_interleaved_se_golomb(&s->gb_slice);
555 dx = get_interleaved_se_golomb(&s->gb_slice);
557 if (dx != (int16_t)dx || dy != (int16_t)dy) {
558 av_log(s->avctx, AV_LOG_ERROR, "invalid MV vlc\n");
563 /* compute motion vector */
564 if (mode == THIRDPEL_MODE) {
566 mx = (mx + 1 >> 1) + dx;
567 my = (my + 1 >> 1) + dy;
568 fx = (unsigned)(mx + 0x30000) / 3 - 0x10000;
569 fy = (unsigned)(my + 0x30000) / 3 - 0x10000;
570 dxy = (mx - 3 * fx) + 4 * (my - 3 * fy);
572 svq3_mc_dir_part(s, x, y, part_width, part_height,
573 fx, fy, dxy, 1, dir, avg);
576 } else if (mode == HALFPEL_MODE || mode == PREDICT_MODE) {
577 mx = (unsigned)(mx + 1 + 0x30000) / 3 + dx - 0x10000;
578 my = (unsigned)(my + 1 + 0x30000) / 3 + dy - 0x10000;
579 dxy = (mx & 1) + 2 * (my & 1);
581 svq3_mc_dir_part(s, x, y, part_width, part_height,
582 mx >> 1, my >> 1, dxy, 0, dir, avg);
586 mx = (unsigned)(mx + 3 + 0x60000) / 6 + dx - 0x10000;
587 my = (unsigned)(my + 3 + 0x60000) / 6 + dy - 0x10000;
589 svq3_mc_dir_part(s, x, y, part_width, part_height,
590 mx, my, 0, 0, dir, avg);
595 /* update mv_cache */
596 if (mode != PREDICT_MODE) {
597 int32_t mv = pack16to32(mx, my);
599 if (part_height == 8 && i < 8) {
600 AV_WN32A(s->mv_cache[dir][scan8[k] + 1 * 8], mv);
602 if (part_width == 8 && j < 8)
603 AV_WN32A(s->mv_cache[dir][scan8[k] + 1 + 1 * 8], mv);
605 if (part_width == 8 && j < 8)
606 AV_WN32A(s->mv_cache[dir][scan8[k] + 1], mv);
607 if (part_width == 4 || part_height == 4)
608 AV_WN32A(s->mv_cache[dir][scan8[k]], mv);
611 /* write back motion vectors */
612 fill_rectangle(s->cur_pic->motion_val[dir][b_xy],
613 part_width >> 2, part_height >> 2, s->b_stride,
614 pack16to32(mx, my), 4);
620 static av_always_inline void hl_decode_mb_idct_luma(SVQ3Context *s,
621 int mb_type, const int *block_offset,
622 int linesize, uint8_t *dest_y)
625 if (!IS_INTRA4x4(mb_type)) {
626 for (i = 0; i < 16; i++)
627 if (s->non_zero_count_cache[scan8[i]] || s->mb[i * 16]) {
628 uint8_t *const ptr = dest_y + block_offset[i];
629 svq3_add_idct_c(ptr, s->mb + i * 16, linesize,
630 s->qscale, IS_INTRA(mb_type) ? 1 : 0);
635 static av_always_inline void hl_decode_mb_predict_luma(SVQ3Context *s,
637 const int *block_offset,
642 int qscale = s->qscale;
644 if (IS_INTRA4x4(mb_type)) {
645 for (i = 0; i < 16; i++) {
646 uint8_t *const ptr = dest_y + block_offset[i];
647 const int dir = s->intra4x4_pred_mode_cache[scan8[i]];
651 if (dir == DIAG_DOWN_LEFT_PRED || dir == VERT_LEFT_PRED) {
652 const int topright_avail = (s->topright_samples_available << i) & 0x8000;
653 av_assert2(s->mb_y || linesize <= block_offset[i]);
654 if (!topright_avail) {
655 tr = ptr[3 - linesize] * 0x01010101u;
656 topright = (uint8_t *)&tr;
658 topright = ptr + 4 - linesize;
662 s->hpc.pred4x4[dir](ptr, topright, linesize);
663 nnz = s->non_zero_count_cache[scan8[i]];
665 svq3_add_idct_c(ptr, s->mb + i * 16, linesize, qscale, 0);
669 s->hpc.pred16x16[s->intra16x16_pred_mode](dest_y, linesize);
670 svq3_luma_dc_dequant_idct_c(s->mb, s->mb_luma_dc[0], qscale);
674 static void hl_decode_mb(SVQ3Context *s)
676 const int mb_x = s->mb_x;
677 const int mb_y = s->mb_y;
678 const int mb_xy = s->mb_xy;
679 const int mb_type = s->cur_pic->mb_type[mb_xy];
680 uint8_t *dest_y, *dest_cb, *dest_cr;
681 int linesize, uvlinesize;
683 const int *block_offset = &s->block_offset[0];
684 const int block_h = 16 >> 1;
686 linesize = s->cur_pic->f->linesize[0];
687 uvlinesize = s->cur_pic->f->linesize[1];
689 dest_y = s->cur_pic->f->data[0] + (mb_x + mb_y * linesize) * 16;
690 dest_cb = s->cur_pic->f->data[1] + mb_x * 8 + mb_y * uvlinesize * block_h;
691 dest_cr = s->cur_pic->f->data[2] + mb_x * 8 + mb_y * uvlinesize * block_h;
693 s->vdsp.prefetch(dest_y + (s->mb_x & 3) * 4 * linesize + 64, linesize, 4);
694 s->vdsp.prefetch(dest_cb + (s->mb_x & 7) * uvlinesize + 64, dest_cr - dest_cb, 2);
696 if (IS_INTRA(mb_type)) {
697 s->hpc.pred8x8[s->chroma_pred_mode](dest_cb, uvlinesize);
698 s->hpc.pred8x8[s->chroma_pred_mode](dest_cr, uvlinesize);
700 hl_decode_mb_predict_luma(s, mb_type, block_offset, linesize, dest_y);
703 hl_decode_mb_idct_luma(s, mb_type, block_offset, linesize, dest_y);
706 uint8_t *dest[2] = { dest_cb, dest_cr };
707 s->h264dsp.h264_chroma_dc_dequant_idct(s->mb + 16 * 16 * 1,
708 s->dequant4_coeff[4][0]);
709 s->h264dsp.h264_chroma_dc_dequant_idct(s->mb + 16 * 16 * 2,
710 s->dequant4_coeff[4][0]);
711 for (j = 1; j < 3; j++) {
712 for (i = j * 16; i < j * 16 + 4; i++)
713 if (s->non_zero_count_cache[scan8[i]] || s->mb[i * 16]) {
714 uint8_t *const ptr = dest[j - 1] + block_offset[i];
715 svq3_add_idct_c(ptr, s->mb + i * 16,
716 uvlinesize, ff_h264_chroma_qp[0][s->qscale + 12] - 12, 2);
722 static int svq3_decode_mb(SVQ3Context *s, unsigned int mb_type)
724 int i, j, k, m, dir, mode;
728 const int mb_xy = s->mb_xy;
729 const int b_xy = 4 * s->mb_x + 4 * s->mb_y * s->b_stride;
731 s->top_samples_available = (s->mb_y == 0) ? 0x33FF : 0xFFFF;
732 s->left_samples_available = (s->mb_x == 0) ? 0x5F5F : 0xFFFF;
733 s->topright_samples_available = 0xFFFF;
735 if (mb_type == 0) { /* SKIP */
736 if (s->pict_type == AV_PICTURE_TYPE_P ||
737 s->next_pic->mb_type[mb_xy] == -1) {
738 svq3_mc_dir_part(s, 16 * s->mb_x, 16 * s->mb_y, 16, 16,
741 if (s->pict_type == AV_PICTURE_TYPE_B)
742 svq3_mc_dir_part(s, 16 * s->mb_x, 16 * s->mb_y, 16, 16,
745 mb_type = MB_TYPE_SKIP;
747 mb_type = FFMIN(s->next_pic->mb_type[mb_xy], 6);
748 if (svq3_mc_dir(s, mb_type, PREDICT_MODE, 0, 0) < 0)
750 if (svq3_mc_dir(s, mb_type, PREDICT_MODE, 1, 1) < 0)
753 mb_type = MB_TYPE_16x16;
755 } else if (mb_type < 8) { /* INTER */
756 if (s->thirdpel_flag && s->halfpel_flag == !get_bits1(&s->gb_slice))
757 mode = THIRDPEL_MODE;
758 else if (s->halfpel_flag &&
759 s->thirdpel_flag == !get_bits1(&s->gb_slice))
765 /* note ref_cache should contain here:
773 for (m = 0; m < 2; m++) {
774 if (s->mb_x > 0 && s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - 1] + 6] != -1) {
775 for (i = 0; i < 4; i++)
776 AV_COPY32(s->mv_cache[m][scan8[0] - 1 + i * 8],
777 s->cur_pic->motion_val[m][b_xy - 1 + i * s->b_stride]);
779 for (i = 0; i < 4; i++)
780 AV_ZERO32(s->mv_cache[m][scan8[0] - 1 + i * 8]);
783 memcpy(s->mv_cache[m][scan8[0] - 1 * 8],
784 s->cur_pic->motion_val[m][b_xy - s->b_stride],
785 4 * 2 * sizeof(int16_t));
786 memset(&s->ref_cache[m][scan8[0] - 1 * 8],
787 (s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride]] == -1) ? PART_NOT_AVAILABLE : 1, 4);
789 if (s->mb_x < s->mb_width - 1) {
790 AV_COPY32(s->mv_cache[m][scan8[0] + 4 - 1 * 8],
791 s->cur_pic->motion_val[m][b_xy - s->b_stride + 4]);
792 s->ref_cache[m][scan8[0] + 4 - 1 * 8] =
793 (s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride + 1] + 6] == -1 ||
794 s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride]] == -1) ? PART_NOT_AVAILABLE : 1;
796 s->ref_cache[m][scan8[0] + 4 - 1 * 8] = PART_NOT_AVAILABLE;
798 AV_COPY32(s->mv_cache[m][scan8[0] - 1 - 1 * 8],
799 s->cur_pic->motion_val[m][b_xy - s->b_stride - 1]);
800 s->ref_cache[m][scan8[0] - 1 - 1 * 8] =
801 (s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride - 1] + 3] == -1) ? PART_NOT_AVAILABLE : 1;
803 s->ref_cache[m][scan8[0] - 1 - 1 * 8] = PART_NOT_AVAILABLE;
805 memset(&s->ref_cache[m][scan8[0] - 1 * 8 - 1],
806 PART_NOT_AVAILABLE, 8);
808 if (s->pict_type != AV_PICTURE_TYPE_B)
812 /* decode motion vector(s) and form prediction(s) */
813 if (s->pict_type == AV_PICTURE_TYPE_P) {
814 if (svq3_mc_dir(s, mb_type - 1, mode, 0, 0) < 0)
816 } else { /* AV_PICTURE_TYPE_B */
818 if (svq3_mc_dir(s, 0, mode, 0, 0) < 0)
821 for (i = 0; i < 4; i++)
822 memset(s->cur_pic->motion_val[0][b_xy + i * s->b_stride],
823 0, 4 * 2 * sizeof(int16_t));
826 if (svq3_mc_dir(s, 0, mode, 1, mb_type == 3) < 0)
829 for (i = 0; i < 4; i++)
830 memset(s->cur_pic->motion_val[1][b_xy + i * s->b_stride],
831 0, 4 * 2 * sizeof(int16_t));
835 mb_type = MB_TYPE_16x16;
836 } else if (mb_type == 8 || mb_type == 33) { /* INTRA4x4 */
837 int8_t *i4x4 = s->intra4x4_pred_mode + s->mb2br_xy[s->mb_xy];
838 int8_t *i4x4_cache = s->intra4x4_pred_mode_cache;
840 memset(s->intra4x4_pred_mode_cache, -1, 8 * 5 * sizeof(int8_t));
844 for (i = 0; i < 4; i++)
845 s->intra4x4_pred_mode_cache[scan8[0] - 1 + i * 8] = s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - 1] + 6 - i];
846 if (s->intra4x4_pred_mode_cache[scan8[0] - 1] == -1)
847 s->left_samples_available = 0x5F5F;
850 s->intra4x4_pred_mode_cache[4 + 8 * 0] = s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride] + 0];
851 s->intra4x4_pred_mode_cache[5 + 8 * 0] = s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride] + 1];
852 s->intra4x4_pred_mode_cache[6 + 8 * 0] = s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride] + 2];
853 s->intra4x4_pred_mode_cache[7 + 8 * 0] = s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride] + 3];
855 if (s->intra4x4_pred_mode_cache[4 + 8 * 0] == -1)
856 s->top_samples_available = 0x33FF;
859 /* decode prediction codes for luma blocks */
860 for (i = 0; i < 16; i += 2) {
861 vlc = get_interleaved_ue_golomb(&s->gb_slice);
864 av_log(s->avctx, AV_LOG_ERROR,
865 "luma prediction:%"PRIu32"\n", vlc);
869 left = &s->intra4x4_pred_mode_cache[scan8[i] - 1];
870 top = &s->intra4x4_pred_mode_cache[scan8[i] - 8];
872 left[1] = svq3_pred_1[top[0] + 1][left[0] + 1][svq3_pred_0[vlc][0]];
873 left[2] = svq3_pred_1[top[1] + 1][left[1] + 1][svq3_pred_0[vlc][1]];
875 if (left[1] == -1 || left[2] == -1) {
876 av_log(s->avctx, AV_LOG_ERROR, "weird prediction\n");
880 } else { /* mb_type == 33, DC_128_PRED block type */
881 for (i = 0; i < 4; i++)
882 memset(&s->intra4x4_pred_mode_cache[scan8[0] + 8 * i], DC_PRED, 4);
885 AV_COPY32(i4x4, i4x4_cache + 4 + 8 * 4);
886 i4x4[4] = i4x4_cache[7 + 8 * 3];
887 i4x4[5] = i4x4_cache[7 + 8 * 2];
888 i4x4[6] = i4x4_cache[7 + 8 * 1];
891 ff_h264_check_intra4x4_pred_mode(s->intra4x4_pred_mode_cache,
892 s->avctx, s->top_samples_available,
893 s->left_samples_available);
895 s->top_samples_available = (s->mb_y == 0) ? 0x33FF : 0xFFFF;
896 s->left_samples_available = (s->mb_x == 0) ? 0x5F5F : 0xFFFF;
898 for (i = 0; i < 4; i++)
899 memset(&s->intra4x4_pred_mode_cache[scan8[0] + 8 * i], DC_128_PRED, 4);
901 s->top_samples_available = 0x33FF;
902 s->left_samples_available = 0x5F5F;
905 mb_type = MB_TYPE_INTRA4x4;
906 } else { /* INTRA16x16 */
907 dir = ff_h264_i_mb_type_info[mb_type - 8].pred_mode;
908 dir = (dir >> 1) ^ 3 * (dir & 1) ^ 1;
910 if ((s->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(s->avctx, s->top_samples_available,
911 s->left_samples_available, dir, 0)) < 0) {
912 av_log(s->avctx, AV_LOG_ERROR, "ff_h264_check_intra_pred_mode < 0\n");
913 return s->intra16x16_pred_mode;
916 cbp = ff_h264_i_mb_type_info[mb_type - 8].cbp;
917 mb_type = MB_TYPE_INTRA16x16;
920 if (!IS_INTER(mb_type) && s->pict_type != AV_PICTURE_TYPE_I) {
921 for (i = 0; i < 4; i++)
922 memset(s->cur_pic->motion_val[0][b_xy + i * s->b_stride],
923 0, 4 * 2 * sizeof(int16_t));
924 if (s->pict_type == AV_PICTURE_TYPE_B) {
925 for (i = 0; i < 4; i++)
926 memset(s->cur_pic->motion_val[1][b_xy + i * s->b_stride],
927 0, 4 * 2 * sizeof(int16_t));
930 if (!IS_INTRA4x4(mb_type)) {
931 memset(s->intra4x4_pred_mode + s->mb2br_xy[mb_xy], DC_PRED, 8);
933 if (!IS_SKIP(mb_type) || s->pict_type == AV_PICTURE_TYPE_B) {
934 memset(s->non_zero_count_cache + 8, 0, 14 * 8 * sizeof(uint8_t));
937 if (!IS_INTRA16x16(mb_type) &&
938 (!IS_SKIP(mb_type) || s->pict_type == AV_PICTURE_TYPE_B)) {
939 if ((vlc = get_interleaved_ue_golomb(&s->gb_slice)) >= 48U){
940 av_log(s->avctx, AV_LOG_ERROR, "cbp_vlc=%"PRIu32"\n", vlc);
944 cbp = IS_INTRA(mb_type) ? ff_h264_golomb_to_intra4x4_cbp[vlc]
945 : ff_h264_golomb_to_inter_cbp[vlc];
947 if (IS_INTRA16x16(mb_type) ||
948 (s->pict_type != AV_PICTURE_TYPE_I && s->adaptive_quant && cbp)) {
949 s->qscale += get_interleaved_se_golomb(&s->gb_slice);
951 if (s->qscale > 31u) {
952 av_log(s->avctx, AV_LOG_ERROR, "qscale:%d\n", s->qscale);
956 if (IS_INTRA16x16(mb_type)) {
957 AV_ZERO128(s->mb_luma_dc[0] + 0);
958 AV_ZERO128(s->mb_luma_dc[0] + 8);
959 if (svq3_decode_block(&s->gb_slice, s->mb_luma_dc[0], 0, 1)) {
960 av_log(s->avctx, AV_LOG_ERROR,
961 "error while decoding intra luma dc\n");
967 const int index = IS_INTRA16x16(mb_type) ? 1 : 0;
968 const int type = ((s->qscale < 24 && IS_INTRA4x4(mb_type)) ? 2 : 1);
970 for (i = 0; i < 4; i++)
971 if ((cbp & (1 << i))) {
972 for (j = 0; j < 4; j++) {
973 k = index ? (1 * (j & 1) + 2 * (i & 1) +
974 2 * (j & 2) + 4 * (i & 2))
976 s->non_zero_count_cache[scan8[k]] = 1;
978 if (svq3_decode_block(&s->gb_slice, &s->mb[16 * k], index, type)) {
979 av_log(s->avctx, AV_LOG_ERROR,
980 "error while decoding block\n");
987 for (i = 1; i < 3; ++i)
988 if (svq3_decode_block(&s->gb_slice, &s->mb[16 * 16 * i], 0, 3)) {
989 av_log(s->avctx, AV_LOG_ERROR,
990 "error while decoding chroma dc block\n");
995 for (i = 1; i < 3; i++) {
996 for (j = 0; j < 4; j++) {
998 s->non_zero_count_cache[scan8[k]] = 1;
1000 if (svq3_decode_block(&s->gb_slice, &s->mb[16 * k], 1, 1)) {
1001 av_log(s->avctx, AV_LOG_ERROR,
1002 "error while decoding chroma ac block\n");
1012 s->cur_pic->mb_type[mb_xy] = mb_type;
1014 if (IS_INTRA(mb_type))
1015 s->chroma_pred_mode = ff_h264_check_intra_pred_mode(s->avctx, s->top_samples_available,
1016 s->left_samples_available, DC_PRED8x8, 1);
1021 static int svq3_decode_slice_header(AVCodecContext *avctx)
1023 SVQ3Context *s = avctx->priv_data;
1024 const int mb_xy = s->mb_xy;
1028 header = get_bits(&s->gb, 8);
1030 if (((header & 0x9F) != 1 && (header & 0x9F) != 2) || (header & 0x60) == 0) {
1032 av_log(avctx, AV_LOG_ERROR, "unsupported slice header (%02X)\n", header);
1035 int slice_bits, slice_bytes, slice_length;
1036 int length = header >> 5 & 3;
1038 slice_length = show_bits(&s->gb, 8 * length);
1039 slice_bits = slice_length * 8;
1040 slice_bytes = slice_length + length - 1;
1042 skip_bits(&s->gb, 8);
1044 av_fast_malloc(&s->slice_buf, &s->slice_size, slice_bytes + AV_INPUT_BUFFER_PADDING_SIZE);
1046 return AVERROR(ENOMEM);
1048 if (slice_bytes * 8LL > get_bits_left(&s->gb)) {
1049 av_log(avctx, AV_LOG_ERROR, "slice after bitstream end\n");
1050 return AVERROR_INVALIDDATA;
1052 memcpy(s->slice_buf, s->gb.buffer + s->gb.index / 8, slice_bytes);
1054 if (s->watermark_key) {
1055 uint32_t header = AV_RL32(&s->slice_buf[1]);
1056 AV_WL32(&s->slice_buf[1], header ^ s->watermark_key);
1058 init_get_bits(&s->gb_slice, s->slice_buf, slice_bits);
1061 memmove(s->slice_buf, &s->slice_buf[slice_length], length - 1);
1063 skip_bits_long(&s->gb, slice_bytes * 8);
1066 if ((slice_id = get_interleaved_ue_golomb(&s->gb_slice)) >= 3) {
1067 av_log(s->avctx, AV_LOG_ERROR, "illegal slice type %u \n", slice_id);
1071 s->slice_type = ff_h264_golomb_to_pict_type[slice_id];
1073 if ((header & 0x9F) == 2) {
1074 i = (s->mb_num < 64) ? 6 : (1 + av_log2(s->mb_num - 1));
1075 get_bits(&s->gb_slice, i);
1076 } else if (get_bits1(&s->gb_slice)) {
1077 avpriv_report_missing_feature(s->avctx, "Media key encryption");
1078 return AVERROR_PATCHWELCOME;
1081 s->slice_num = get_bits(&s->gb_slice, 8);
1082 s->qscale = get_bits(&s->gb_slice, 5);
1083 s->adaptive_quant = get_bits1(&s->gb_slice);
1085 /* unknown fields */
1086 skip_bits1(&s->gb_slice);
1088 if (s->has_watermark)
1089 skip_bits1(&s->gb_slice);
1091 skip_bits1(&s->gb_slice);
1092 skip_bits(&s->gb_slice, 2);
1094 if (skip_1stop_8data_bits(&s->gb_slice) < 0)
1095 return AVERROR_INVALIDDATA;
1097 /* reset intra predictors and invalidate motion vector references */
1099 memset(s->intra4x4_pred_mode + s->mb2br_xy[mb_xy - 1] + 3,
1100 -1, 4 * sizeof(int8_t));
1101 memset(s->intra4x4_pred_mode + s->mb2br_xy[mb_xy - s->mb_x],
1102 -1, 8 * sizeof(int8_t) * s->mb_x);
1105 memset(s->intra4x4_pred_mode + s->mb2br_xy[mb_xy - s->mb_stride],
1106 -1, 8 * sizeof(int8_t) * (s->mb_width - s->mb_x));
1109 s->intra4x4_pred_mode[s->mb2br_xy[mb_xy - s->mb_stride - 1] + 3] = -1;
1115 static void init_dequant4_coeff_table(SVQ3Context *s)
1118 const int max_qp = 51;
1120 for (q = 0; q < max_qp + 1; q++) {
1121 int shift = ff_h264_quant_div6[q] + 2;
1122 int idx = ff_h264_quant_rem6[q];
1123 for (x = 0; x < 16; x++)
1124 s->dequant4_coeff[q][(x >> 2) | ((x << 2) & 0xF)] =
1125 ((uint32_t)ff_h264_dequant4_coeff_init[idx][(x & 1) + ((x >> 2) & 1)] * 16) << shift;
1129 static av_cold int svq3_decode_init(AVCodecContext *avctx)
1131 SVQ3Context *s = avctx->priv_data;
1133 unsigned char *extradata;
1134 unsigned char *extradata_end;
1136 int marker_found = 0;
1139 s->cur_pic = &s->frames[0];
1140 s->last_pic = &s->frames[1];
1141 s->next_pic = &s->frames[2];
1143 s->cur_pic->f = av_frame_alloc();
1144 s->last_pic->f = av_frame_alloc();
1145 s->next_pic->f = av_frame_alloc();
1146 if (!s->cur_pic->f || !s->last_pic->f || !s->next_pic->f)
1147 return AVERROR(ENOMEM);
1149 ff_h264dsp_init(&s->h264dsp, 8, 1);
1150 ff_h264_pred_init(&s->hpc, AV_CODEC_ID_SVQ3, 8, 1);
1151 ff_videodsp_init(&s->vdsp, 8);
1154 avctx->bits_per_raw_sample = 8;
1156 ff_hpeldsp_init(&s->hdsp, avctx->flags);
1157 ff_tpeldsp_init(&s->tdsp);
1159 avctx->pix_fmt = AV_PIX_FMT_YUVJ420P;
1160 avctx->color_range = AVCOL_RANGE_JPEG;
1163 s->halfpel_flag = 1;
1164 s->thirdpel_flag = 1;
1165 s->has_watermark = 0;
1167 /* prowl for the "SEQH" marker in the extradata */
1168 extradata = (unsigned char *)avctx->extradata;
1169 extradata_end = avctx->extradata + avctx->extradata_size;
1171 for (m = 0; m + 8 < avctx->extradata_size; m++) {
1172 if (!memcmp(extradata, "SEQH", 4)) {
1180 /* if a match was found, parse the extra data */
1183 int frame_size_code;
1184 int unk0, unk1, unk2, unk3, unk4;
1187 size = AV_RB32(&extradata[4]);
1188 if (size > extradata_end - extradata - 8) {
1189 ret = AVERROR_INVALIDDATA;
1192 init_get_bits(&gb, extradata + 8, size * 8);
1194 /* 'frame size code' and optional 'width, height' */
1195 frame_size_code = get_bits(&gb, 3);
1196 switch (frame_size_code) {
1226 w = get_bits(&gb, 12);
1227 h = get_bits(&gb, 12);
1230 ret = ff_set_dimensions(avctx, w, h);
1234 s->halfpel_flag = get_bits1(&gb);
1235 s->thirdpel_flag = get_bits1(&gb);
1237 /* unknown fields */
1238 unk0 = get_bits1(&gb);
1239 unk1 = get_bits1(&gb);
1240 unk2 = get_bits1(&gb);
1241 unk3 = get_bits1(&gb);
1243 s->low_delay = get_bits1(&gb);
1246 unk4 = get_bits1(&gb);
1248 av_log(avctx, AV_LOG_DEBUG, "Unknown fields %d %d %d %d %d\n",
1249 unk0, unk1, unk2, unk3, unk4);
1251 if (skip_1stop_8data_bits(&gb) < 0) {
1252 ret = AVERROR_INVALIDDATA;
1256 s->has_watermark = get_bits1(&gb);
1257 avctx->has_b_frames = !s->low_delay;
1258 if (s->has_watermark) {
1260 unsigned watermark_width = get_interleaved_ue_golomb(&gb);
1261 unsigned watermark_height = get_interleaved_ue_golomb(&gb);
1262 int u1 = get_interleaved_ue_golomb(&gb);
1263 int u2 = get_bits(&gb, 8);
1264 int u3 = get_bits(&gb, 2);
1265 int u4 = get_interleaved_ue_golomb(&gb);
1266 unsigned long buf_len = watermark_width *
1267 watermark_height * 4;
1268 int offset = get_bits_count(&gb) + 7 >> 3;
1271 if (watermark_height <= 0 ||
1272 (uint64_t)watermark_width * 4 > UINT_MAX / watermark_height) {
1277 buf = av_malloc(buf_len);
1279 ret = AVERROR(ENOMEM);
1282 av_log(avctx, AV_LOG_DEBUG, "watermark size: %ux%u\n",
1283 watermark_width, watermark_height);
1284 av_log(avctx, AV_LOG_DEBUG,
1285 "u1: %x u2: %x u3: %x compressed data size: %d offset: %d\n",
1286 u1, u2, u3, u4, offset);
1287 if (uncompress(buf, &buf_len, extradata + 8 + offset,
1288 size - offset) != Z_OK) {
1289 av_log(avctx, AV_LOG_ERROR,
1290 "could not uncompress watermark logo\n");
1295 s->watermark_key = av_bswap16(av_crc(av_crc_get_table(AV_CRC_16_CCITT), 0, buf, buf_len));
1297 s->watermark_key = s->watermark_key << 16 | s->watermark_key;
1298 av_log(avctx, AV_LOG_DEBUG,
1299 "watermark key %#"PRIx32"\n", s->watermark_key);
1302 av_log(avctx, AV_LOG_ERROR,
1303 "this svq3 file contains watermark which need zlib support compiled in\n");
1310 s->mb_width = (avctx->width + 15) / 16;
1311 s->mb_height = (avctx->height + 15) / 16;
1312 s->mb_stride = s->mb_width + 1;
1313 s->mb_num = s->mb_width * s->mb_height;
1314 s->b_stride = 4 * s->mb_width;
1315 s->h_edge_pos = s->mb_width * 16;
1316 s->v_edge_pos = s->mb_height * 16;
1318 s->intra4x4_pred_mode = av_mallocz(s->mb_stride * 2 * 8);
1319 if (!s->intra4x4_pred_mode)
1320 return AVERROR(ENOMEM);
1322 s->mb2br_xy = av_mallocz(s->mb_stride * (s->mb_height + 1) *
1323 sizeof(*s->mb2br_xy));
1325 return AVERROR(ENOMEM);
1327 for (y = 0; y < s->mb_height; y++)
1328 for (x = 0; x < s->mb_width; x++) {
1329 const int mb_xy = x + y * s->mb_stride;
1331 s->mb2br_xy[mb_xy] = 8 * (mb_xy % (2 * s->mb_stride));
1334 init_dequant4_coeff_table(s);
1338 svq3_decode_end(avctx);
1342 static void free_picture(AVCodecContext *avctx, SVQ3Frame *pic)
1345 for (i = 0; i < 2; i++) {
1346 av_buffer_unref(&pic->motion_val_buf[i]);
1347 av_buffer_unref(&pic->ref_index_buf[i]);
1349 av_buffer_unref(&pic->mb_type_buf);
1351 av_frame_unref(pic->f);
1354 static int get_buffer(AVCodecContext *avctx, SVQ3Frame *pic)
1356 SVQ3Context *s = avctx->priv_data;
1357 const int big_mb_num = s->mb_stride * (s->mb_height + 1) + 1;
1358 const int mb_array_size = s->mb_stride * s->mb_height;
1359 const int b4_stride = s->mb_width * 4 + 1;
1360 const int b4_array_size = b4_stride * s->mb_height * 4;
1363 if (!pic->motion_val_buf[0]) {
1366 pic->mb_type_buf = av_buffer_allocz((big_mb_num + s->mb_stride) * sizeof(uint32_t));
1367 if (!pic->mb_type_buf)
1368 return AVERROR(ENOMEM);
1369 pic->mb_type = (uint32_t*)pic->mb_type_buf->data + 2 * s->mb_stride + 1;
1371 for (i = 0; i < 2; i++) {
1372 pic->motion_val_buf[i] = av_buffer_allocz(2 * (b4_array_size + 4) * sizeof(int16_t));
1373 pic->ref_index_buf[i] = av_buffer_allocz(4 * mb_array_size);
1374 if (!pic->motion_val_buf[i] || !pic->ref_index_buf[i]) {
1375 ret = AVERROR(ENOMEM);
1379 pic->motion_val[i] = (int16_t (*)[2])pic->motion_val_buf[i]->data + 4;
1380 pic->ref_index[i] = pic->ref_index_buf[i]->data;
1384 ret = ff_get_buffer(avctx, pic->f,
1385 (s->pict_type != AV_PICTURE_TYPE_B) ?
1386 AV_GET_BUFFER_FLAG_REF : 0);
1390 if (!s->edge_emu_buffer) {
1391 s->edge_emu_buffer = av_mallocz_array(pic->f->linesize[0], 17);
1392 if (!s->edge_emu_buffer)
1393 return AVERROR(ENOMEM);
1398 free_picture(avctx, pic);
1402 static int svq3_decode_frame(AVCodecContext *avctx, void *data,
1403 int *got_frame, AVPacket *avpkt)
1405 SVQ3Context *s = avctx->priv_data;
1406 int buf_size = avpkt->size;
1411 /* special case for last picture */
1412 if (buf_size == 0) {
1413 if (s->next_pic->f->data[0] && !s->low_delay && !s->last_frame_output) {
1414 ret = av_frame_ref(data, s->next_pic->f);
1417 s->last_frame_output = 1;
1423 s->mb_x = s->mb_y = s->mb_xy = 0;
1425 if (s->watermark_key) {
1426 av_fast_padded_malloc(&s->buf, &s->buf_size, buf_size);
1428 return AVERROR(ENOMEM);
1429 memcpy(s->buf, avpkt->data, buf_size);
1435 ret = init_get_bits(&s->gb, buf, 8 * buf_size);
1439 if (svq3_decode_slice_header(avctx))
1442 s->pict_type = s->slice_type;
1444 if (s->pict_type != AV_PICTURE_TYPE_B)
1445 FFSWAP(SVQ3Frame*, s->next_pic, s->last_pic);
1447 av_frame_unref(s->cur_pic->f);
1449 /* for skipping the frame */
1450 s->cur_pic->f->pict_type = s->pict_type;
1451 s->cur_pic->f->key_frame = (s->pict_type == AV_PICTURE_TYPE_I);
1453 ret = get_buffer(avctx, s->cur_pic);
1457 for (i = 0; i < 16; i++) {
1458 s->block_offset[i] = (4 * ((scan8[i] - scan8[0]) & 7)) + 4 * s->cur_pic->f->linesize[0] * ((scan8[i] - scan8[0]) >> 3);
1459 s->block_offset[48 + i] = (4 * ((scan8[i] - scan8[0]) & 7)) + 8 * s->cur_pic->f->linesize[0] * ((scan8[i] - scan8[0]) >> 3);
1461 for (i = 0; i < 16; i++) {
1462 s->block_offset[16 + i] =
1463 s->block_offset[32 + i] = (4 * ((scan8[i] - scan8[0]) & 7)) + 4 * s->cur_pic->f->linesize[1] * ((scan8[i] - scan8[0]) >> 3);
1464 s->block_offset[48 + 16 + i] =
1465 s->block_offset[48 + 32 + i] = (4 * ((scan8[i] - scan8[0]) & 7)) + 8 * s->cur_pic->f->linesize[1] * ((scan8[i] - scan8[0]) >> 3);
1468 if (s->pict_type != AV_PICTURE_TYPE_I) {
1469 if (!s->last_pic->f->data[0]) {
1470 av_log(avctx, AV_LOG_ERROR, "Missing reference frame.\n");
1471 av_frame_unref(s->last_pic->f);
1472 ret = get_buffer(avctx, s->last_pic);
1475 memset(s->last_pic->f->data[0], 0, avctx->height * s->last_pic->f->linesize[0]);
1476 memset(s->last_pic->f->data[1], 0x80, (avctx->height / 2) *
1477 s->last_pic->f->linesize[1]);
1478 memset(s->last_pic->f->data[2], 0x80, (avctx->height / 2) *
1479 s->last_pic->f->linesize[2]);
1482 if (s->pict_type == AV_PICTURE_TYPE_B && !s->next_pic->f->data[0]) {
1483 av_log(avctx, AV_LOG_ERROR, "Missing reference frame.\n");
1484 av_frame_unref(s->next_pic->f);
1485 ret = get_buffer(avctx, s->next_pic);
1488 memset(s->next_pic->f->data[0], 0, avctx->height * s->next_pic->f->linesize[0]);
1489 memset(s->next_pic->f->data[1], 0x80, (avctx->height / 2) *
1490 s->next_pic->f->linesize[1]);
1491 memset(s->next_pic->f->data[2], 0x80, (avctx->height / 2) *
1492 s->next_pic->f->linesize[2]);
1496 if (avctx->debug & FF_DEBUG_PICT_INFO)
1497 av_log(s->avctx, AV_LOG_DEBUG,
1498 "%c hpel:%d, tpel:%d aqp:%d qp:%d, slice_num:%02X\n",
1499 av_get_picture_type_char(s->pict_type),
1500 s->halfpel_flag, s->thirdpel_flag,
1501 s->adaptive_quant, s->qscale, s->slice_num);
1503 if (avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type == AV_PICTURE_TYPE_B ||
1504 avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type != AV_PICTURE_TYPE_I ||
1505 avctx->skip_frame >= AVDISCARD_ALL)
1508 if (s->next_p_frame_damaged) {
1509 if (s->pict_type == AV_PICTURE_TYPE_B)
1512 s->next_p_frame_damaged = 0;
1515 if (s->pict_type == AV_PICTURE_TYPE_B) {
1516 s->frame_num_offset = s->slice_num - s->prev_frame_num;
1518 if (s->frame_num_offset < 0)
1519 s->frame_num_offset += 256;
1520 if (s->frame_num_offset == 0 ||
1521 s->frame_num_offset >= s->prev_frame_num_offset) {
1522 av_log(s->avctx, AV_LOG_ERROR, "error in B-frame picture id\n");
1526 s->prev_frame_num = s->frame_num;
1527 s->frame_num = s->slice_num;
1528 s->prev_frame_num_offset = s->frame_num - s->prev_frame_num;
1530 if (s->prev_frame_num_offset < 0)
1531 s->prev_frame_num_offset += 256;
1534 for (m = 0; m < 2; m++) {
1536 for (i = 0; i < 4; i++) {
1538 for (j = -1; j < 4; j++)
1539 s->ref_cache[m][scan8[0] + 8 * i + j] = 1;
1541 s->ref_cache[m][scan8[0] + 8 * i + j] = PART_NOT_AVAILABLE;
1545 for (s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) {
1546 for (s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) {
1548 s->mb_xy = s->mb_x + s->mb_y * s->mb_stride;
1550 if ((get_bits_left(&s->gb_slice)) <= 7) {
1551 if (((get_bits_count(&s->gb_slice) & 7) == 0 ||
1552 show_bits(&s->gb_slice, get_bits_left(&s->gb_slice) & 7) == 0)) {
1554 if (svq3_decode_slice_header(avctx))
1557 if (s->slice_type != s->pict_type) {
1558 avpriv_request_sample(avctx, "non constant slice type");
1560 /* TODO: support s->mb_skip_run */
1563 mb_type = get_interleaved_ue_golomb(&s->gb_slice);
1565 if (s->pict_type == AV_PICTURE_TYPE_I)
1567 else if (s->pict_type == AV_PICTURE_TYPE_B && mb_type >= 4)
1569 if (mb_type > 33 || svq3_decode_mb(s, mb_type)) {
1570 av_log(s->avctx, AV_LOG_ERROR,
1571 "error while decoding MB %d %d\n", s->mb_x, s->mb_y);
1575 if (mb_type != 0 || s->cbp)
1578 if (s->pict_type != AV_PICTURE_TYPE_B && !s->low_delay)
1579 s->cur_pic->mb_type[s->mb_x + s->mb_y * s->mb_stride] =
1580 (s->pict_type == AV_PICTURE_TYPE_P && mb_type < 8) ? (mb_type - 1) : -1;
1583 ff_draw_horiz_band(avctx, s->cur_pic->f,
1584 s->last_pic->f->data[0] ? s->last_pic->f : NULL,
1585 16 * s->mb_y, 16, PICT_FRAME, 0,
1589 left = buf_size*8 - get_bits_count(&s->gb_slice);
1591 if (s->mb_y != s->mb_height || s->mb_x != s->mb_width) {
1592 av_log(avctx, AV_LOG_INFO, "frame num %d incomplete pic x %d y %d left %d\n", avctx->frame_number, s->mb_y, s->mb_x, left);
1593 //av_hex_dump(stderr, buf+buf_size-8, 8);
1597 av_log(avctx, AV_LOG_ERROR, "frame num %d left %d\n", avctx->frame_number, left);
1601 if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay)
1602 ret = av_frame_ref(data, s->cur_pic->f);
1603 else if (s->last_pic->f->data[0])
1604 ret = av_frame_ref(data, s->last_pic->f);
1608 /* Do not output the last pic after seeking. */
1609 if (s->last_pic->f->data[0] || s->low_delay)
1612 if (s->pict_type != AV_PICTURE_TYPE_B) {
1613 FFSWAP(SVQ3Frame*, s->cur_pic, s->next_pic);
1615 av_frame_unref(s->cur_pic->f);
1621 static av_cold int svq3_decode_end(AVCodecContext *avctx)
1623 SVQ3Context *s = avctx->priv_data;
1625 free_picture(avctx, s->cur_pic);
1626 free_picture(avctx, s->next_pic);
1627 free_picture(avctx, s->last_pic);
1628 av_frame_free(&s->cur_pic->f);
1629 av_frame_free(&s->next_pic->f);
1630 av_frame_free(&s->last_pic->f);
1631 av_freep(&s->slice_buf);
1632 av_freep(&s->intra4x4_pred_mode);
1633 av_freep(&s->edge_emu_buffer);
1634 av_freep(&s->mb2br_xy);
1643 AVCodec ff_svq3_decoder = {
1645 .long_name = NULL_IF_CONFIG_SMALL("Sorenson Vector Quantizer 3 / Sorenson Video 3 / SVQ3"),
1646 .type = AVMEDIA_TYPE_VIDEO,
1647 .id = AV_CODEC_ID_SVQ3,
1648 .priv_data_size = sizeof(SVQ3Context),
1649 .init = svq3_decode_init,
1650 .close = svq3_decode_end,
1651 .decode = svq3_decode_frame,
1652 .capabilities = AV_CODEC_CAP_DRAW_HORIZ_BAND |
1655 .pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUVJ420P,