2 * Copyright (c) 2003 The Libav Project
4 * This file is part of Libav.
6 * Libav 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 * Libav 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 Libav; 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.libav.org/V-codecs/SVQ3/Vertical400kbit.sorenson3.mov
45 #include "libavutil/attributes.h"
48 #include "mpegutils.h"
50 #include "h264_mvpred.h"
55 #include "rectangle.h"
69 typedef struct SVQ3Context {
72 H264DSPContext h264dsp;
79 H264Picture *next_pic;
80 H264Picture *last_pic;
87 uint32_t watermark_key;
89 int next_p_frame_damaged;
92 int last_frame_output;
98 int intra16x16_pred_mode;
100 int8_t intra4x4_pred_mode_cache[5 * 8];
101 int8_t (*intra4x4_pred_mode);
103 unsigned int top_samples_available;
104 unsigned int topright_samples_available;
105 unsigned int left_samples_available;
107 uint8_t *edge_emu_buffer;
110 #define FULLPEL_MODE 1
111 #define HALFPEL_MODE 2
112 #define THIRDPEL_MODE 3
113 #define PREDICT_MODE 4
115 /* dual scan (from some older h264 draft)
124 static const uint8_t svq3_scan[16] = {
125 0 + 0 * 4, 1 + 0 * 4, 2 + 0 * 4, 2 + 1 * 4,
126 2 + 2 * 4, 3 + 0 * 4, 3 + 1 * 4, 3 + 2 * 4,
127 0 + 1 * 4, 0 + 2 * 4, 1 + 1 * 4, 1 + 2 * 4,
128 0 + 3 * 4, 1 + 3 * 4, 2 + 3 * 4, 3 + 3 * 4,
131 static const uint8_t luma_dc_zigzag_scan[16] = {
132 0 * 16 + 0 * 64, 1 * 16 + 0 * 64, 2 * 16 + 0 * 64, 0 * 16 + 2 * 64,
133 3 * 16 + 0 * 64, 0 * 16 + 1 * 64, 1 * 16 + 1 * 64, 2 * 16 + 1 * 64,
134 1 * 16 + 2 * 64, 2 * 16 + 2 * 64, 3 * 16 + 2 * 64, 0 * 16 + 3 * 64,
135 3 * 16 + 1 * 64, 1 * 16 + 3 * 64, 2 * 16 + 3 * 64, 3 * 16 + 3 * 64,
138 static const uint8_t svq3_pred_0[25][2] = {
141 { 0, 2 }, { 1, 1 }, { 2, 0 },
142 { 3, 0 }, { 2, 1 }, { 1, 2 }, { 0, 3 },
143 { 0, 4 }, { 1, 3 }, { 2, 2 }, { 3, 1 }, { 4, 0 },
144 { 4, 1 }, { 3, 2 }, { 2, 3 }, { 1, 4 },
145 { 2, 4 }, { 3, 3 }, { 4, 2 },
150 static const int8_t svq3_pred_1[6][6][5] = {
151 { { 2, -1, -1, -1, -1 }, { 2, 1, -1, -1, -1 }, { 1, 2, -1, -1, -1 },
152 { 2, 1, -1, -1, -1 }, { 1, 2, -1, -1, -1 }, { 1, 2, -1, -1, -1 } },
153 { { 0, 2, -1, -1, -1 }, { 0, 2, 1, 4, 3 }, { 0, 1, 2, 4, 3 },
154 { 0, 2, 1, 4, 3 }, { 2, 0, 1, 3, 4 }, { 0, 4, 2, 1, 3 } },
155 { { 2, 0, -1, -1, -1 }, { 2, 1, 0, 4, 3 }, { 1, 2, 4, 0, 3 },
156 { 2, 1, 0, 4, 3 }, { 2, 1, 4, 3, 0 }, { 1, 2, 4, 0, 3 } },
157 { { 2, 0, -1, -1, -1 }, { 2, 0, 1, 4, 3 }, { 1, 2, 0, 4, 3 },
158 { 2, 1, 0, 4, 3 }, { 2, 1, 3, 4, 0 }, { 2, 4, 1, 0, 3 } },
159 { { 0, 2, -1, -1, -1 }, { 0, 2, 1, 3, 4 }, { 1, 2, 3, 0, 4 },
160 { 2, 0, 1, 3, 4 }, { 2, 1, 3, 0, 4 }, { 2, 0, 4, 3, 1 } },
161 { { 0, 2, -1, -1, -1 }, { 0, 2, 4, 1, 3 }, { 1, 4, 2, 0, 3 },
162 { 4, 2, 0, 1, 3 }, { 2, 0, 1, 4, 3 }, { 4, 2, 1, 0, 3 } },
165 static const struct {
168 } svq3_dct_tables[2][16] = {
169 { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 2, 1 }, { 0, 2 }, { 3, 1 }, { 4, 1 }, { 5, 1 },
170 { 0, 3 }, { 1, 2 }, { 2, 2 }, { 6, 1 }, { 7, 1 }, { 8, 1 }, { 9, 1 }, { 0, 4 } },
171 { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 0, 2 }, { 2, 1 }, { 0, 3 }, { 0, 4 }, { 0, 5 },
172 { 3, 1 }, { 4, 1 }, { 1, 2 }, { 1, 3 }, { 0, 6 }, { 0, 7 }, { 0, 8 }, { 0, 9 } }
175 static const uint32_t svq3_dequant_coeff[32] = {
176 3881, 4351, 4890, 5481, 6154, 6914, 7761, 8718,
177 9781, 10987, 12339, 13828, 15523, 17435, 19561, 21873,
178 24552, 27656, 30847, 34870, 38807, 43747, 49103, 54683,
179 61694, 68745, 77615, 89113, 100253, 109366, 126635, 141533
182 static void svq3_luma_dc_dequant_idct_c(int16_t *output, int16_t *input, int qp)
184 const int qmul = svq3_dequant_coeff[qp];
188 static const uint8_t x_offset[4] = { 0, 1 * stride, 4 * stride, 5 * stride };
190 for (i = 0; i < 4; i++) {
191 const int z0 = 13 * (input[4 * i + 0] + input[4 * i + 2]);
192 const int z1 = 13 * (input[4 * i + 0] - input[4 * i + 2]);
193 const int z2 = 7 * input[4 * i + 1] - 17 * input[4 * i + 3];
194 const int z3 = 17 * input[4 * i + 1] + 7 * input[4 * i + 3];
196 temp[4 * i + 0] = z0 + z3;
197 temp[4 * i + 1] = z1 + z2;
198 temp[4 * i + 2] = z1 - z2;
199 temp[4 * i + 3] = z0 - z3;
202 for (i = 0; i < 4; i++) {
203 const int offset = x_offset[i];
204 const int z0 = 13 * (temp[4 * 0 + i] + temp[4 * 2 + i]);
205 const int z1 = 13 * (temp[4 * 0 + i] - temp[4 * 2 + i]);
206 const int z2 = 7 * temp[4 * 1 + i] - 17 * temp[4 * 3 + i];
207 const int z3 = 17 * temp[4 * 1 + i] + 7 * temp[4 * 3 + i];
209 output[stride * 0 + offset] = (z0 + z3) * qmul + 0x80000 >> 20;
210 output[stride * 2 + offset] = (z1 + z2) * qmul + 0x80000 >> 20;
211 output[stride * 8 + offset] = (z1 - z2) * qmul + 0x80000 >> 20;
212 output[stride * 10 + offset] = (z0 - z3) * qmul + 0x80000 >> 20;
217 static void svq3_add_idct_c(uint8_t *dst, int16_t *block,
218 int stride, int qp, int dc)
220 const int qmul = svq3_dequant_coeff[qp];
224 dc = 13 * 13 * (dc == 1 ? 1538 * block[0]
225 : qmul * (block[0] >> 3) / 2);
229 for (i = 0; i < 4; i++) {
230 const int z0 = 13 * (block[0 + 4 * i] + block[2 + 4 * i]);
231 const int z1 = 13 * (block[0 + 4 * i] - block[2 + 4 * i]);
232 const int z2 = 7 * block[1 + 4 * i] - 17 * block[3 + 4 * i];
233 const int z3 = 17 * block[1 + 4 * i] + 7 * block[3 + 4 * i];
235 block[0 + 4 * i] = z0 + z3;
236 block[1 + 4 * i] = z1 + z2;
237 block[2 + 4 * i] = z1 - z2;
238 block[3 + 4 * i] = z0 - z3;
241 for (i = 0; i < 4; i++) {
242 const int z0 = 13 * (block[i + 4 * 0] + block[i + 4 * 2]);
243 const int z1 = 13 * (block[i + 4 * 0] - block[i + 4 * 2]);
244 const int z2 = 7 * block[i + 4 * 1] - 17 * block[i + 4 * 3];
245 const int z3 = 17 * block[i + 4 * 1] + 7 * block[i + 4 * 3];
246 const int rr = (dc + 0x80000);
248 dst[i + stride * 0] = av_clip_uint8(dst[i + stride * 0] + ((z0 + z3) * qmul + rr >> 20));
249 dst[i + stride * 1] = av_clip_uint8(dst[i + stride * 1] + ((z1 + z2) * qmul + rr >> 20));
250 dst[i + stride * 2] = av_clip_uint8(dst[i + stride * 2] + ((z1 - z2) * qmul + rr >> 20));
251 dst[i + stride * 3] = av_clip_uint8(dst[i + stride * 3] + ((z0 - z3) * qmul + rr >> 20));
254 memset(block, 0, 16 * sizeof(int16_t));
257 static inline int svq3_decode_block(GetBitContext *gb, int16_t *block,
258 int index, const int type)
260 static const uint8_t *const scan_patterns[4] = {
261 luma_dc_zigzag_scan, ff_zigzag_scan, svq3_scan, ff_h264_chroma_dc_scan
264 int run, level, limit;
266 const int intra = 3 * type >> 2;
267 const uint8_t *const scan = scan_patterns[type];
269 for (limit = (16 >> intra); index < 16; index = limit, limit += 8) {
270 for (; (vlc = svq3_get_ue_golomb(gb)) != 0; index++) {
271 int sign = (vlc & 1) ? 0 : -1;
278 } else if (vlc < 4) {
283 level = (vlc + 9 >> 2) - run;
287 run = svq3_dct_tables[intra][vlc].run;
288 level = svq3_dct_tables[intra][vlc].level;
292 ((run == 0) ? 8 : ((run < 2) ? 2 : ((run < 5) ? 0 : -1)));
296 ((run == 0) ? 4 : ((run < 3) ? 2 : ((run < 10) ? 1 : 0)));
300 if ((index += run) >= limit)
303 block[scan[index]] = (level ^ sign) - sign;
314 static av_always_inline int
315 svq3_fetch_diagonal_mv(const H264Context *h, H264SliceContext *sl,
317 int i, int list, int part_width)
319 const int topright_ref = sl->ref_cache[list][i - 8 + part_width];
321 if (topright_ref != PART_NOT_AVAILABLE) {
322 *C = sl->mv_cache[list][i - 8 + part_width];
325 *C = sl->mv_cache[list][i - 8 - 1];
326 return sl->ref_cache[list][i - 8 - 1];
331 * Get the predicted MV.
332 * @param n the block index
333 * @param part_width the width of the partition (4, 8,16) -> (1, 2, 4)
334 * @param mx the x component of the predicted motion vector
335 * @param my the y component of the predicted motion vector
337 static av_always_inline void svq3_pred_motion(const H264Context *const h,
338 H264SliceContext *sl, int n,
339 int part_width, int list,
340 int ref, int *const mx, int *const my)
342 const int index8 = scan8[n];
343 const int top_ref = sl->ref_cache[list][index8 - 8];
344 const int left_ref = sl->ref_cache[list][index8 - 1];
345 const int16_t *const A = sl->mv_cache[list][index8 - 1];
346 const int16_t *const B = sl->mv_cache[list][index8 - 8];
348 int diagonal_ref, match_count;
358 diagonal_ref = svq3_fetch_diagonal_mv(h, sl, &C, index8, list, part_width);
359 match_count = (diagonal_ref == ref) + (top_ref == ref) + (left_ref == ref);
360 if (match_count > 1) { //most common
361 *mx = mid_pred(A[0], B[0], C[0]);
362 *my = mid_pred(A[1], B[1], C[1]);
363 } else if (match_count == 1) {
364 if (left_ref == ref) {
367 } else if (top_ref == ref) {
375 if (top_ref == PART_NOT_AVAILABLE &&
376 diagonal_ref == PART_NOT_AVAILABLE &&
377 left_ref != PART_NOT_AVAILABLE) {
381 *mx = mid_pred(A[0], B[0], C[0]);
382 *my = mid_pred(A[1], B[1], C[1]);
387 static inline void svq3_mc_dir_part(SVQ3Context *s,
388 int x, int y, int width, int height,
389 int mx, int my, int dxy,
390 int thirdpel, int dir, int avg)
392 H264Context *h = &s->h;
393 H264SliceContext *sl = &h->slice_ctx[0];
394 const H264Picture *pic = (dir == 0) ? s->last_pic : s->next_pic;
397 int blocksize = 2 - (width >> 3); // 16->0, 8->1, 4->2
402 if (mx < 0 || mx >= s->h_edge_pos - width - 1 ||
403 my < 0 || my >= s->v_edge_pos - height - 1) {
405 mx = av_clip(mx, -16, s->h_edge_pos - width + 15);
406 my = av_clip(my, -16, s->v_edge_pos - height + 15);
409 /* form component predictions */
410 dest = h->cur_pic.f->data[0] + x + y * sl->linesize;
411 src = pic->f->data[0] + mx + my * sl->linesize;
414 s->vdsp.emulated_edge_mc(s->edge_emu_buffer, src,
415 sl->linesize, sl->linesize,
416 width + 1, height + 1,
417 mx, my, s->h_edge_pos, s->v_edge_pos);
418 src = s->edge_emu_buffer;
421 (avg ? s->tdsp.avg_tpel_pixels_tab
422 : s->tdsp.put_tpel_pixels_tab)[dxy](dest, src, sl->linesize,
425 (avg ? s->hdsp.avg_pixels_tab
426 : s->hdsp.put_pixels_tab)[blocksize][dxy](dest, src, sl->linesize,
429 if (!(h->flags & AV_CODEC_FLAG_GRAY)) {
430 mx = mx + (mx < (int) x) >> 1;
431 my = my + (my < (int) y) >> 1;
433 height = height >> 1;
436 for (i = 1; i < 3; i++) {
437 dest = h->cur_pic.f->data[i] + (x >> 1) + (y >> 1) * sl->uvlinesize;
438 src = pic->f->data[i] + mx + my * sl->uvlinesize;
441 s->vdsp.emulated_edge_mc(s->edge_emu_buffer, src,
442 sl->uvlinesize, sl->uvlinesize,
443 width + 1, height + 1,
444 mx, my, (s->h_edge_pos >> 1),
446 src = s->edge_emu_buffer;
449 (avg ? s->tdsp.avg_tpel_pixels_tab
450 : s->tdsp.put_tpel_pixels_tab)[dxy](dest, src,
454 (avg ? s->hdsp.avg_pixels_tab
455 : s->hdsp.put_pixels_tab)[blocksize][dxy](dest, src,
462 static inline int svq3_mc_dir(SVQ3Context *s, int size, int mode,
465 int i, j, k, mx, my, dx, dy, x, y;
466 H264Context *h = &s->h;
467 H264SliceContext *sl = &h->slice_ctx[0];
468 const int part_width = ((size & 5) == 4) ? 4 : 16 >> (size & 1);
469 const int part_height = 16 >> ((unsigned)(size + 1) / 3);
470 const int extra_width = (mode == PREDICT_MODE) ? -16 * 6 : 0;
471 const int h_edge_pos = 6 * (s->h_edge_pos - part_width) - extra_width;
472 const int v_edge_pos = 6 * (s->v_edge_pos - part_height) - extra_width;
474 for (i = 0; i < 16; i += part_height)
475 for (j = 0; j < 16; j += part_width) {
476 const int b_xy = (4 * s->mb_x + (j >> 2)) +
477 (4 * s->mb_y + (i >> 2)) * h->b_stride;
479 x = 16 * s->mb_x + j;
480 y = 16 * s->mb_y + i;
481 k = (j >> 2 & 1) + (i >> 1 & 2) +
482 (j >> 1 & 4) + (i & 8);
484 if (mode != PREDICT_MODE) {
485 svq3_pred_motion(h, sl, k, part_width >> 2, dir, 1, &mx, &my);
487 mx = s->next_pic->motion_val[0][b_xy][0] << 1;
488 my = s->next_pic->motion_val[0][b_xy][1] << 1;
491 mx = mx * h->frame_num_offset /
492 h->prev_frame_num_offset + 1 >> 1;
493 my = my * h->frame_num_offset /
494 h->prev_frame_num_offset + 1 >> 1;
496 mx = mx * (h->frame_num_offset - h->prev_frame_num_offset) /
497 h->prev_frame_num_offset + 1 >> 1;
498 my = my * (h->frame_num_offset - h->prev_frame_num_offset) /
499 h->prev_frame_num_offset + 1 >> 1;
503 /* clip motion vector prediction to frame border */
504 mx = av_clip(mx, extra_width - 6 * x, h_edge_pos - 6 * x);
505 my = av_clip(my, extra_width - 6 * y, v_edge_pos - 6 * y);
507 /* get (optional) motion vector differential */
508 if (mode == PREDICT_MODE) {
511 dy = svq3_get_se_golomb(&h->gb);
512 dx = svq3_get_se_golomb(&h->gb);
514 if (dx == INVALID_VLC || dy == INVALID_VLC) {
515 av_log(h->avctx, AV_LOG_ERROR, "invalid MV vlc\n");
520 /* compute motion vector */
521 if (mode == THIRDPEL_MODE) {
523 mx = (mx + 1 >> 1) + dx;
524 my = (my + 1 >> 1) + dy;
525 fx = (unsigned)(mx + 0x3000) / 3 - 0x1000;
526 fy = (unsigned)(my + 0x3000) / 3 - 0x1000;
527 dxy = (mx - 3 * fx) + 4 * (my - 3 * fy);
529 svq3_mc_dir_part(s, x, y, part_width, part_height,
530 fx, fy, dxy, 1, dir, avg);
533 } else if (mode == HALFPEL_MODE || mode == PREDICT_MODE) {
534 mx = (unsigned)(mx + 1 + 0x3000) / 3 + dx - 0x1000;
535 my = (unsigned)(my + 1 + 0x3000) / 3 + dy - 0x1000;
536 dxy = (mx & 1) + 2 * (my & 1);
538 svq3_mc_dir_part(s, x, y, part_width, part_height,
539 mx >> 1, my >> 1, dxy, 0, dir, avg);
543 mx = (unsigned)(mx + 3 + 0x6000) / 6 + dx - 0x1000;
544 my = (unsigned)(my + 3 + 0x6000) / 6 + dy - 0x1000;
546 svq3_mc_dir_part(s, x, y, part_width, part_height,
547 mx, my, 0, 0, dir, avg);
552 /* update mv_cache */
553 if (mode != PREDICT_MODE) {
554 int32_t mv = pack16to32(mx, my);
556 if (part_height == 8 && i < 8) {
557 AV_WN32A(sl->mv_cache[dir][scan8[k] + 1 * 8], mv);
559 if (part_width == 8 && j < 8)
560 AV_WN32A(sl->mv_cache[dir][scan8[k] + 1 + 1 * 8], mv);
562 if (part_width == 8 && j < 8)
563 AV_WN32A(sl->mv_cache[dir][scan8[k] + 1], mv);
564 if (part_width == 4 || part_height == 4)
565 AV_WN32A(sl->mv_cache[dir][scan8[k]], mv);
568 /* write back motion vectors */
569 fill_rectangle(h->cur_pic.motion_val[dir][b_xy],
570 part_width >> 2, part_height >> 2, h->b_stride,
571 pack16to32(mx, my), 4);
577 static av_always_inline void hl_decode_mb_idct_luma(const H264Context *h, H264SliceContext *sl,
578 int mb_type, const int *block_offset,
579 int linesize, uint8_t *dest_y)
582 if (!IS_INTRA4x4(mb_type)) {
583 for (i = 0; i < 16; i++)
584 if (sl->non_zero_count_cache[scan8[i]] || sl->mb[i * 16]) {
585 uint8_t *const ptr = dest_y + block_offset[i];
586 svq3_add_idct_c(ptr, sl->mb + i * 16, linesize,
587 sl->qscale, IS_INTRA(mb_type) ? 1 : 0);
592 static av_always_inline int dctcoef_get(int16_t *mb, int index)
594 return AV_RN16A(mb + index);
597 static av_always_inline void hl_decode_mb_predict_luma(SVQ3Context *s,
598 const H264Context *h,
599 H264SliceContext *sl,
601 const int *block_offset,
606 int qscale = sl->qscale;
608 if (IS_INTRA4x4(mb_type)) {
609 for (i = 0; i < 16; i++) {
610 uint8_t *const ptr = dest_y + block_offset[i];
611 const int dir = s->intra4x4_pred_mode_cache[scan8[i]];
615 if (dir == DIAG_DOWN_LEFT_PRED || dir == VERT_LEFT_PRED) {
616 const int topright_avail = (s->topright_samples_available << i) & 0x8000;
617 assert(s->mb_y || linesize <= block_offset[i]);
618 if (!topright_avail) {
619 tr = ptr[3 - linesize] * 0x01010101u;
620 topright = (uint8_t *)&tr;
622 topright = ptr + 4 - linesize;
626 s->hpc.pred4x4[dir](ptr, topright, linesize);
627 nnz = sl->non_zero_count_cache[scan8[i]];
629 svq3_add_idct_c(ptr, sl->mb + i * 16, linesize, qscale, 0);
633 s->hpc.pred16x16[s->intra16x16_pred_mode](dest_y, linesize);
634 svq3_luma_dc_dequant_idct_c(sl->mb, sl->mb_luma_dc[0], qscale);
638 static void hl_decode_mb(SVQ3Context *s, const H264Context *h, H264SliceContext *sl)
640 const int mb_x = s->mb_x;
641 const int mb_y = s->mb_y;
642 const int mb_xy = s->mb_xy;
643 const int mb_type = h->cur_pic.mb_type[mb_xy];
644 uint8_t *dest_y, *dest_cb, *dest_cr;
645 int linesize, uvlinesize;
647 const int *block_offset = &h->block_offset[0];
648 const int block_h = 16 >> h->chroma_y_shift;
650 dest_y = h->cur_pic.f->data[0] + (mb_x + mb_y * sl->linesize) * 16;
651 dest_cb = h->cur_pic.f->data[1] + mb_x * 8 + mb_y * sl->uvlinesize * block_h;
652 dest_cr = h->cur_pic.f->data[2] + mb_x * 8 + mb_y * sl->uvlinesize * block_h;
654 s->vdsp.prefetch(dest_y + (s->mb_x & 3) * 4 * sl->linesize + 64, sl->linesize, 4);
655 s->vdsp.prefetch(dest_cb + (s->mb_x & 7) * sl->uvlinesize + 64, dest_cr - dest_cb, 2);
657 h->list_counts[mb_xy] = sl->list_count;
659 linesize = sl->mb_linesize = sl->linesize;
660 uvlinesize = sl->mb_uvlinesize = sl->uvlinesize;
662 if (IS_INTRA(mb_type)) {
663 s->hpc.pred8x8[s->chroma_pred_mode](dest_cb, uvlinesize);
664 s->hpc.pred8x8[s->chroma_pred_mode](dest_cr, uvlinesize);
666 hl_decode_mb_predict_luma(s, h, sl, mb_type, block_offset, linesize, dest_y);
669 hl_decode_mb_idct_luma(h, sl, mb_type, block_offset, linesize, dest_y);
671 if (sl->cbp & 0x30) {
672 uint8_t *dest[2] = { dest_cb, dest_cr };
673 s->h264dsp.h264_chroma_dc_dequant_idct(sl->mb + 16 * 16 * 1,
674 h->dequant4_coeff[IS_INTRA(mb_type) ? 1 : 4][sl->chroma_qp[0]][0]);
675 s->h264dsp.h264_chroma_dc_dequant_idct(sl->mb + 16 * 16 * 2,
676 h->dequant4_coeff[IS_INTRA(mb_type) ? 2 : 5][sl->chroma_qp[1]][0]);
677 for (j = 1; j < 3; j++) {
678 for (i = j * 16; i < j * 16 + 4; i++)
679 if (sl->non_zero_count_cache[scan8[i]] || sl->mb[i * 16]) {
680 uint8_t *const ptr = dest[j - 1] + block_offset[i];
681 svq3_add_idct_c(ptr, sl->mb + i * 16,
682 uvlinesize, ff_h264_chroma_qp[0][sl->qscale + 12] - 12, 2);
688 static int svq3_decode_mb(SVQ3Context *s, unsigned int mb_type)
690 H264Context *h = &s->h;
691 H264SliceContext *sl = &h->slice_ctx[0];
692 int i, j, k, m, dir, mode;
696 const int mb_xy = s->mb_xy;
697 const int b_xy = 4 * s->mb_x + 4 * s->mb_y * h->b_stride;
699 s->top_samples_available = (s->mb_y == 0) ? 0x33FF : 0xFFFF;
700 s->left_samples_available = (s->mb_x == 0) ? 0x5F5F : 0xFFFF;
701 s->topright_samples_available = 0xFFFF;
703 if (mb_type == 0) { /* SKIP */
704 if (h->pict_type == AV_PICTURE_TYPE_P ||
705 s->next_pic->mb_type[mb_xy] == -1) {
706 svq3_mc_dir_part(s, 16 * s->mb_x, 16 * s->mb_y, 16, 16,
709 if (h->pict_type == AV_PICTURE_TYPE_B)
710 svq3_mc_dir_part(s, 16 * s->mb_x, 16 * s->mb_y, 16, 16,
713 mb_type = MB_TYPE_SKIP;
715 mb_type = FFMIN(s->next_pic->mb_type[mb_xy], 6);
716 if (svq3_mc_dir(s, mb_type, PREDICT_MODE, 0, 0) < 0)
718 if (svq3_mc_dir(s, mb_type, PREDICT_MODE, 1, 1) < 0)
721 mb_type = MB_TYPE_16x16;
723 } else if (mb_type < 8) { /* INTER */
724 if (s->thirdpel_flag && s->halfpel_flag == !get_bits1(&h->gb))
725 mode = THIRDPEL_MODE;
726 else if (s->halfpel_flag &&
727 s->thirdpel_flag == !get_bits1(&h->gb))
733 /* note ref_cache should contain here:
741 for (m = 0; m < 2; m++) {
742 if (s->mb_x > 0 && s->intra4x4_pred_mode[h->mb2br_xy[mb_xy - 1] + 6] != -1) {
743 for (i = 0; i < 4; i++)
744 AV_COPY32(sl->mv_cache[m][scan8[0] - 1 + i * 8],
745 h->cur_pic.motion_val[m][b_xy - 1 + i * h->b_stride]);
747 for (i = 0; i < 4; i++)
748 AV_ZERO32(sl->mv_cache[m][scan8[0] - 1 + i * 8]);
751 memcpy(sl->mv_cache[m][scan8[0] - 1 * 8],
752 h->cur_pic.motion_val[m][b_xy - h->b_stride],
753 4 * 2 * sizeof(int16_t));
754 memset(&sl->ref_cache[m][scan8[0] - 1 * 8],
755 (s->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride]] == -1) ? PART_NOT_AVAILABLE : 1, 4);
757 if (s->mb_x < h->mb_width - 1) {
758 AV_COPY32(sl->mv_cache[m][scan8[0] + 4 - 1 * 8],
759 h->cur_pic.motion_val[m][b_xy - h->b_stride + 4]);
760 sl->ref_cache[m][scan8[0] + 4 - 1 * 8] =
761 (s->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride + 1] + 6] == -1 ||
762 s->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride]] == -1) ? PART_NOT_AVAILABLE : 1;
764 sl->ref_cache[m][scan8[0] + 4 - 1 * 8] = PART_NOT_AVAILABLE;
766 AV_COPY32(sl->mv_cache[m][scan8[0] - 1 - 1 * 8],
767 h->cur_pic.motion_val[m][b_xy - h->b_stride - 1]);
768 sl->ref_cache[m][scan8[0] - 1 - 1 * 8] =
769 (s->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride - 1] + 3] == -1) ? PART_NOT_AVAILABLE : 1;
771 sl->ref_cache[m][scan8[0] - 1 - 1 * 8] = PART_NOT_AVAILABLE;
773 memset(&sl->ref_cache[m][scan8[0] - 1 * 8 - 1],
774 PART_NOT_AVAILABLE, 8);
776 if (h->pict_type != AV_PICTURE_TYPE_B)
780 /* decode motion vector(s) and form prediction(s) */
781 if (h->pict_type == AV_PICTURE_TYPE_P) {
782 if (svq3_mc_dir(s, mb_type - 1, mode, 0, 0) < 0)
784 } else { /* AV_PICTURE_TYPE_B */
786 if (svq3_mc_dir(s, 0, mode, 0, 0) < 0)
789 for (i = 0; i < 4; i++)
790 memset(h->cur_pic.motion_val[0][b_xy + i * h->b_stride],
791 0, 4 * 2 * sizeof(int16_t));
794 if (svq3_mc_dir(s, 0, mode, 1, mb_type == 3) < 0)
797 for (i = 0; i < 4; i++)
798 memset(h->cur_pic.motion_val[1][b_xy + i * h->b_stride],
799 0, 4 * 2 * sizeof(int16_t));
803 mb_type = MB_TYPE_16x16;
804 } else if (mb_type == 8 || mb_type == 33) { /* INTRA4x4 */
805 int8_t *i4x4 = s->intra4x4_pred_mode + h->mb2br_xy[s->mb_xy];
806 int8_t *i4x4_cache = s->intra4x4_pred_mode_cache;
808 memset(s->intra4x4_pred_mode_cache, -1, 8 * 5 * sizeof(int8_t));
812 for (i = 0; i < 4; i++)
813 s->intra4x4_pred_mode_cache[scan8[0] - 1 + i * 8] = s->intra4x4_pred_mode[h->mb2br_xy[mb_xy - 1] + 6 - i];
814 if (s->intra4x4_pred_mode_cache[scan8[0] - 1] == -1)
815 s->left_samples_available = 0x5F5F;
818 s->intra4x4_pred_mode_cache[4 + 8 * 0] = s->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride] + 0];
819 s->intra4x4_pred_mode_cache[5 + 8 * 0] = s->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride] + 1];
820 s->intra4x4_pred_mode_cache[6 + 8 * 0] = s->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride] + 2];
821 s->intra4x4_pred_mode_cache[7 + 8 * 0] = s->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride] + 3];
823 if (s->intra4x4_pred_mode_cache[4 + 8 * 0] == -1)
824 s->top_samples_available = 0x33FF;
827 /* decode prediction codes for luma blocks */
828 for (i = 0; i < 16; i += 2) {
829 vlc = svq3_get_ue_golomb(&h->gb);
832 av_log(h->avctx, AV_LOG_ERROR,
833 "luma prediction:%"PRIu32"\n", vlc);
837 left = &s->intra4x4_pred_mode_cache[scan8[i] - 1];
838 top = &s->intra4x4_pred_mode_cache[scan8[i] - 8];
840 left[1] = svq3_pred_1[top[0] + 1][left[0] + 1][svq3_pred_0[vlc][0]];
841 left[2] = svq3_pred_1[top[1] + 1][left[1] + 1][svq3_pred_0[vlc][1]];
843 if (left[1] == -1 || left[2] == -1) {
844 av_log(h->avctx, AV_LOG_ERROR, "weird prediction\n");
848 } else { /* mb_type == 33, DC_128_PRED block type */
849 for (i = 0; i < 4; i++)
850 memset(&s->intra4x4_pred_mode_cache[scan8[0] + 8 * i], DC_PRED, 4);
853 AV_COPY32(i4x4, i4x4_cache + 4 + 8 * 4);
854 i4x4[4] = i4x4_cache[7 + 8 * 3];
855 i4x4[5] = i4x4_cache[7 + 8 * 2];
856 i4x4[6] = i4x4_cache[7 + 8 * 1];
859 ff_h264_check_intra4x4_pred_mode(s->intra4x4_pred_mode_cache,
860 h->avctx, s->top_samples_available,
861 s->left_samples_available);
863 s->top_samples_available = (s->mb_y == 0) ? 0x33FF : 0xFFFF;
864 s->left_samples_available = (s->mb_x == 0) ? 0x5F5F : 0xFFFF;
866 for (i = 0; i < 4; i++)
867 memset(&s->intra4x4_pred_mode_cache[scan8[0] + 8 * i], DC_128_PRED, 4);
869 s->top_samples_available = 0x33FF;
870 s->left_samples_available = 0x5F5F;
873 mb_type = MB_TYPE_INTRA4x4;
874 } else { /* INTRA16x16 */
875 dir = ff_h264_i_mb_type_info[mb_type - 8].pred_mode;
876 dir = (dir >> 1) ^ 3 * (dir & 1) ^ 1;
878 if ((s->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(h->avctx, s->top_samples_available,
879 s->left_samples_available, dir, 0)) < 0) {
880 av_log(h->avctx, AV_LOG_ERROR, "ff_h264_check_intra_pred_mode < 0\n");
881 return s->intra16x16_pred_mode;
884 cbp = ff_h264_i_mb_type_info[mb_type - 8].cbp;
885 mb_type = MB_TYPE_INTRA16x16;
888 if (!IS_INTER(mb_type) && h->pict_type != AV_PICTURE_TYPE_I) {
889 for (i = 0; i < 4; i++)
890 memset(h->cur_pic.motion_val[0][b_xy + i * h->b_stride],
891 0, 4 * 2 * sizeof(int16_t));
892 if (h->pict_type == AV_PICTURE_TYPE_B) {
893 for (i = 0; i < 4; i++)
894 memset(h->cur_pic.motion_val[1][b_xy + i * h->b_stride],
895 0, 4 * 2 * sizeof(int16_t));
898 if (!IS_INTRA4x4(mb_type)) {
899 memset(s->intra4x4_pred_mode + h->mb2br_xy[mb_xy], DC_PRED, 8);
901 if (!IS_SKIP(mb_type) || h->pict_type == AV_PICTURE_TYPE_B) {
902 memset(sl->non_zero_count_cache + 8, 0, 14 * 8 * sizeof(uint8_t));
905 if (!IS_INTRA16x16(mb_type) &&
906 (!IS_SKIP(mb_type) || h->pict_type == AV_PICTURE_TYPE_B)) {
907 if ((vlc = svq3_get_ue_golomb(&h->gb)) >= 48) {
908 av_log(h->avctx, AV_LOG_ERROR, "cbp_vlc=%"PRIu32"\n", vlc);
912 cbp = IS_INTRA(mb_type) ? ff_h264_golomb_to_intra4x4_cbp[vlc]
913 : ff_h264_golomb_to_inter_cbp[vlc];
915 if (IS_INTRA16x16(mb_type) ||
916 (h->pict_type != AV_PICTURE_TYPE_I && s->adaptive_quant && cbp)) {
917 sl->qscale += svq3_get_se_golomb(&h->gb);
919 if (sl->qscale > 31u) {
920 av_log(h->avctx, AV_LOG_ERROR, "qscale:%d\n", sl->qscale);
924 if (IS_INTRA16x16(mb_type)) {
925 AV_ZERO128(sl->mb_luma_dc[0] + 0);
926 AV_ZERO128(sl->mb_luma_dc[0] + 8);
927 if (svq3_decode_block(&h->gb, sl->mb_luma_dc[0], 0, 1)) {
928 av_log(h->avctx, AV_LOG_ERROR,
929 "error while decoding intra luma dc\n");
935 const int index = IS_INTRA16x16(mb_type) ? 1 : 0;
936 const int type = ((sl->qscale < 24 && IS_INTRA4x4(mb_type)) ? 2 : 1);
938 for (i = 0; i < 4; i++)
939 if ((cbp & (1 << i))) {
940 for (j = 0; j < 4; j++) {
941 k = index ? (1 * (j & 1) + 2 * (i & 1) +
942 2 * (j & 2) + 4 * (i & 2))
944 sl->non_zero_count_cache[scan8[k]] = 1;
946 if (svq3_decode_block(&h->gb, &sl->mb[16 * k], index, type)) {
947 av_log(h->avctx, AV_LOG_ERROR,
948 "error while decoding block\n");
955 for (i = 1; i < 3; ++i)
956 if (svq3_decode_block(&h->gb, &sl->mb[16 * 16 * i], 0, 3)) {
957 av_log(h->avctx, AV_LOG_ERROR,
958 "error while decoding chroma dc block\n");
963 for (i = 1; i < 3; i++) {
964 for (j = 0; j < 4; j++) {
966 sl->non_zero_count_cache[scan8[k]] = 1;
968 if (svq3_decode_block(&h->gb, &sl->mb[16 * k], 1, 1)) {
969 av_log(h->avctx, AV_LOG_ERROR,
970 "error while decoding chroma ac block\n");
980 h->cur_pic.mb_type[mb_xy] = mb_type;
982 if (IS_INTRA(mb_type))
983 s->chroma_pred_mode = ff_h264_check_intra_pred_mode(h->avctx, s->top_samples_available,
984 s->left_samples_available, DC_PRED8x8, 1);
989 static int svq3_decode_slice_header(AVCodecContext *avctx)
991 SVQ3Context *s = avctx->priv_data;
992 H264Context *h = &s->h;
993 H264SliceContext *sl = &h->slice_ctx[0];
994 const int mb_xy = s->mb_xy;
998 header = get_bits(&s->gb, 8);
1000 if (((header & 0x9F) != 1 && (header & 0x9F) != 2) || (header & 0x60) == 0) {
1002 av_log(avctx, AV_LOG_ERROR, "unsupported slice header (%02X)\n", header);
1005 int slice_bits, slice_bytes, slice_length;
1006 int length = header >> 5 & 3;
1008 slice_length = show_bits(&s->gb, 8 * length);
1009 slice_bits = slice_length * 8;
1010 slice_bytes = slice_length + length - 1;
1012 if (slice_bytes > get_bits_left(&s->gb)) {
1013 av_log(avctx, AV_LOG_ERROR, "slice after bitstream end\n");
1017 skip_bits(&s->gb, 8);
1019 av_fast_malloc(&s->slice_buf, &s->slice_size, slice_bytes + AV_INPUT_BUFFER_PADDING_SIZE);
1021 return AVERROR(ENOMEM);
1023 memcpy(s->slice_buf, s->gb.buffer + s->gb.index / 8, slice_bytes);
1025 init_get_bits(&h->gb, s->slice_buf, slice_bits);
1027 if (s->watermark_key) {
1028 uint32_t header = AV_RL32(&h->gb.buffer[1]);
1029 AV_WL32(&h->gb.buffer[1], header ^ s->watermark_key);
1032 memcpy(s->slice_buf, &s->slice_buf[slice_length], length - 1);
1034 skip_bits_long(&s->gb, slice_bytes * 8);
1037 if ((slice_id = svq3_get_ue_golomb(&h->gb)) >= 3) {
1038 av_log(h->avctx, AV_LOG_ERROR, "illegal slice type %u \n", slice_id);
1042 sl->slice_type = ff_h264_golomb_to_pict_type[slice_id];
1044 if ((header & 0x9F) == 2) {
1045 i = (h->mb_num < 64) ? 6 : (1 + av_log2(h->mb_num - 1));
1046 sl->mb_skip_run = get_bits(&h->gb, i) -
1047 (s->mb_y * h->mb_width + s->mb_x);
1050 sl->mb_skip_run = 0;
1053 sl->slice_num = get_bits(&h->gb, 8);
1054 sl->qscale = get_bits(&h->gb, 5);
1055 s->adaptive_quant = get_bits1(&h->gb);
1057 /* unknown fields */
1060 if (s->unknown_flag)
1064 skip_bits(&h->gb, 2);
1066 while (get_bits1(&h->gb))
1067 skip_bits(&h->gb, 8);
1069 /* reset intra predictors and invalidate motion vector references */
1071 memset(s->intra4x4_pred_mode + h->mb2br_xy[mb_xy - 1] + 3,
1072 -1, 4 * sizeof(int8_t));
1073 memset(s->intra4x4_pred_mode + h->mb2br_xy[mb_xy - s->mb_x],
1074 -1, 8 * sizeof(int8_t) * s->mb_x);
1077 memset(s->intra4x4_pred_mode + h->mb2br_xy[mb_xy - h->mb_stride],
1078 -1, 8 * sizeof(int8_t) * (h->mb_width - s->mb_x));
1081 s->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride - 1] + 3] = -1;
1087 static av_cold int svq3_decode_init(AVCodecContext *avctx)
1089 SVQ3Context *s = avctx->priv_data;
1090 H264Context *h = &s->h;
1091 H264SliceContext *sl;
1093 unsigned char *extradata;
1094 unsigned char *extradata_end;
1096 int marker_found = 0;
1098 s->cur_pic = av_mallocz(sizeof(*s->cur_pic));
1099 s->last_pic = av_mallocz(sizeof(*s->last_pic));
1100 s->next_pic = av_mallocz(sizeof(*s->next_pic));
1101 if (!s->next_pic || !s->last_pic || !s->cur_pic) {
1102 av_freep(&s->cur_pic);
1103 av_freep(&s->last_pic);
1104 av_freep(&s->next_pic);
1105 return AVERROR(ENOMEM);
1108 s->cur_pic->f = av_frame_alloc();
1109 s->last_pic->f = av_frame_alloc();
1110 s->next_pic->f = av_frame_alloc();
1111 if (!s->cur_pic->f || !s->last_pic->f || !s->next_pic->f)
1112 return AVERROR(ENOMEM);
1114 if (ff_h264_decode_init(avctx) < 0)
1117 // we will overwrite it later during decoding
1118 av_frame_free(&h->cur_pic.f);
1120 ff_h264dsp_init(&s->h264dsp, 8, 1);
1121 ff_h264_pred_init(&s->hpc, AV_CODEC_ID_SVQ3, 8, 1);
1122 ff_videodsp_init(&s->vdsp, 8);
1124 memset(h->pps.scaling_matrix4, 16, 6 * 16 * sizeof(uint8_t));
1125 memset(h->pps.scaling_matrix8, 16, 2 * 64 * sizeof(uint8_t));
1127 h->sps.bit_depth_luma = 8;
1128 h->chroma_format_idc = 1;
1130 ff_hpeldsp_init(&s->hdsp, avctx->flags);
1131 ff_tpeldsp_init(&s->tdsp);
1135 h->flags = avctx->flags;
1137 h->picture_structure = PICT_FRAME;
1138 avctx->pix_fmt = AV_PIX_FMT_YUVJ420P;
1139 avctx->color_range = AVCOL_RANGE_JPEG;
1141 h->slice_ctx[0].chroma_qp[0] = h->slice_ctx[0].chroma_qp[1] = 4;
1142 h->chroma_x_shift = h->chroma_y_shift = 1;
1144 s->halfpel_flag = 1;
1145 s->thirdpel_flag = 1;
1146 s->unknown_flag = 0;
1148 /* prowl for the "SEQH" marker in the extradata */
1149 extradata = (unsigned char *)avctx->extradata;
1150 extradata_end = avctx->extradata + avctx->extradata_size;
1152 for (m = 0; m + 8 < avctx->extradata_size; m++) {
1153 if (!memcmp(extradata, "SEQH", 4)) {
1161 /* if a match was found, parse the extra data */
1164 int frame_size_code;
1166 size = AV_RB32(&extradata[4]);
1167 if (size > extradata_end - extradata - 8)
1168 return AVERROR_INVALIDDATA;
1169 init_get_bits(&gb, extradata + 8, size * 8);
1171 /* 'frame size code' and optional 'width, height' */
1172 frame_size_code = get_bits(&gb, 3);
1173 switch (frame_size_code) {
1176 avctx->height = 120;
1184 avctx->height = 144;
1188 avctx->height = 288;
1192 avctx->height = 576;
1196 avctx->height = 180;
1200 avctx->height = 240;
1203 avctx->width = get_bits(&gb, 12);
1204 avctx->height = get_bits(&gb, 12);
1208 s->halfpel_flag = get_bits1(&gb);
1209 s->thirdpel_flag = get_bits1(&gb);
1211 /* unknown fields */
1217 h->low_delay = get_bits1(&gb);
1222 while (get_bits1(&gb))
1225 s->unknown_flag = get_bits1(&gb);
1226 avctx->has_b_frames = !h->low_delay;
1227 if (s->unknown_flag) {
1229 unsigned watermark_width = svq3_get_ue_golomb(&gb);
1230 unsigned watermark_height = svq3_get_ue_golomb(&gb);
1231 int u1 = svq3_get_ue_golomb(&gb);
1232 int u2 = get_bits(&gb, 8);
1233 int u3 = get_bits(&gb, 2);
1234 int u4 = svq3_get_ue_golomb(&gb);
1235 unsigned long buf_len = watermark_width *
1236 watermark_height * 4;
1237 int offset = get_bits_count(&gb) + 7 >> 3;
1240 if (watermark_height > 0 &&
1241 (uint64_t)watermark_width * 4 > UINT_MAX / watermark_height)
1244 buf = av_malloc(buf_len);
1245 av_log(avctx, AV_LOG_DEBUG, "watermark size: %ux%u\n",
1246 watermark_width, watermark_height);
1247 av_log(avctx, AV_LOG_DEBUG,
1248 "u1: %x u2: %x u3: %x compressed data size: %d offset: %d\n",
1249 u1, u2, u3, u4, offset);
1250 if (uncompress(buf, &buf_len, extradata + 8 + offset,
1251 size - offset) != Z_OK) {
1252 av_log(avctx, AV_LOG_ERROR,
1253 "could not uncompress watermark logo\n");
1257 s->watermark_key = ff_svq1_packet_checksum(buf, buf_len, 0);
1258 s->watermark_key = s->watermark_key << 16 | s->watermark_key;
1259 av_log(avctx, AV_LOG_DEBUG,
1260 "watermark key %#"PRIx32"\n", s->watermark_key);
1263 av_log(avctx, AV_LOG_ERROR,
1264 "this svq3 file contains watermark which need zlib support compiled in\n");
1270 h->width = avctx->width;
1271 h->height = avctx->height;
1272 h->mb_width = (h->width + 15) / 16;
1273 h->mb_height = (h->height + 15) / 16;
1274 h->mb_stride = h->mb_width + 1;
1275 h->mb_num = h->mb_width * h->mb_height;
1276 h->b_stride = 4 * h->mb_width;
1277 s->h_edge_pos = h->mb_width * 16;
1278 s->v_edge_pos = h->mb_height * 16;
1280 s->intra4x4_pred_mode = av_mallocz(h->mb_stride * 2 * 8);
1281 if (!s->intra4x4_pred_mode)
1282 return AVERROR(ENOMEM);
1284 if (ff_h264_alloc_tables(h) < 0) {
1285 av_log(avctx, AV_LOG_ERROR, "svq3 memory allocation failed\n");
1286 return AVERROR(ENOMEM);
1292 static void free_picture(AVCodecContext *avctx, H264Picture *pic)
1295 for (i = 0; i < 2; i++) {
1296 av_buffer_unref(&pic->motion_val_buf[i]);
1297 av_buffer_unref(&pic->ref_index_buf[i]);
1299 av_buffer_unref(&pic->mb_type_buf);
1301 av_frame_unref(pic->f);
1304 static int get_buffer(AVCodecContext *avctx, H264Picture *pic)
1306 SVQ3Context *s = avctx->priv_data;
1307 H264Context *h = &s->h;
1308 H264SliceContext *sl = &h->slice_ctx[0];
1309 const int big_mb_num = h->mb_stride * (h->mb_height + 1) + 1;
1310 const int mb_array_size = h->mb_stride * h->mb_height;
1311 const int b4_stride = h->mb_width * 4 + 1;
1312 const int b4_array_size = b4_stride * h->mb_height * 4;
1315 if (!pic->motion_val_buf[0]) {
1318 pic->mb_type_buf = av_buffer_allocz((big_mb_num + h->mb_stride) * sizeof(uint32_t));
1319 if (!pic->mb_type_buf)
1320 return AVERROR(ENOMEM);
1321 pic->mb_type = (uint32_t*)pic->mb_type_buf->data + 2 * h->mb_stride + 1;
1323 for (i = 0; i < 2; i++) {
1324 pic->motion_val_buf[i] = av_buffer_allocz(2 * (b4_array_size + 4) * sizeof(int16_t));
1325 pic->ref_index_buf[i] = av_buffer_allocz(4 * mb_array_size);
1326 if (!pic->motion_val_buf[i] || !pic->ref_index_buf[i]) {
1327 ret = AVERROR(ENOMEM);
1331 pic->motion_val[i] = (int16_t (*)[2])pic->motion_val_buf[i]->data + 4;
1332 pic->ref_index[i] = pic->ref_index_buf[i]->data;
1335 pic->reference = !(h->pict_type == AV_PICTURE_TYPE_B);
1337 ret = ff_get_buffer(avctx, pic->f,
1338 pic->reference ? AV_GET_BUFFER_FLAG_REF : 0);
1342 if (!s->edge_emu_buffer) {
1343 s->edge_emu_buffer = av_mallocz(pic->f->linesize[0] * 17);
1344 if (!s->edge_emu_buffer)
1345 return AVERROR(ENOMEM);
1348 sl->linesize = pic->f->linesize[0];
1349 sl->uvlinesize = pic->f->linesize[1];
1353 free_picture(avctx, pic);
1357 static int svq3_decode_frame(AVCodecContext *avctx, void *data,
1358 int *got_frame, AVPacket *avpkt)
1360 const uint8_t *buf = avpkt->data;
1361 SVQ3Context *s = avctx->priv_data;
1362 H264Context *h = &s->h;
1363 H264SliceContext *sl = &h->slice_ctx[0];
1364 int buf_size = avpkt->size;
1367 /* special case for last picture */
1368 if (buf_size == 0) {
1369 if (s->next_pic->f->data[0] && !h->low_delay && !s->last_frame_output) {
1370 ret = av_frame_ref(data, s->next_pic->f);
1373 s->last_frame_output = 1;
1379 ret = init_get_bits(&s->gb, buf, 8 * buf_size);
1383 s->mb_x = s->mb_y = s->mb_xy = 0;
1385 if (svq3_decode_slice_header(avctx))
1388 h->pict_type = sl->slice_type;
1390 if (h->pict_type != AV_PICTURE_TYPE_B)
1391 FFSWAP(H264Picture*, s->next_pic, s->last_pic);
1393 av_frame_unref(s->cur_pic->f);
1395 /* for skipping the frame */
1396 s->cur_pic->f->pict_type = h->pict_type;
1397 s->cur_pic->f->key_frame = (h->pict_type == AV_PICTURE_TYPE_I);
1399 ret = get_buffer(avctx, s->cur_pic);
1403 h->cur_pic_ptr = s->cur_pic;
1404 h->cur_pic = *s->cur_pic;
1406 for (i = 0; i < 16; i++) {
1407 h->block_offset[i] = (4 * ((scan8[i] - scan8[0]) & 7)) + 4 * sl->linesize * ((scan8[i] - scan8[0]) >> 3);
1408 h->block_offset[48 + i] = (4 * ((scan8[i] - scan8[0]) & 7)) + 8 * sl->linesize * ((scan8[i] - scan8[0]) >> 3);
1410 for (i = 0; i < 16; i++) {
1411 h->block_offset[16 + i] =
1412 h->block_offset[32 + i] = (4 * ((scan8[i] - scan8[0]) & 7)) + 4 * sl->uvlinesize * ((scan8[i] - scan8[0]) >> 3);
1413 h->block_offset[48 + 16 + i] =
1414 h->block_offset[48 + 32 + i] = (4 * ((scan8[i] - scan8[0]) & 7)) + 8 * sl->uvlinesize * ((scan8[i] - scan8[0]) >> 3);
1417 if (h->pict_type != AV_PICTURE_TYPE_I) {
1418 if (!s->last_pic->f->data[0]) {
1419 av_log(avctx, AV_LOG_ERROR, "Missing reference frame.\n");
1420 ret = get_buffer(avctx, s->last_pic);
1423 memset(s->last_pic->f->data[0], 0, avctx->height * s->last_pic->f->linesize[0]);
1424 memset(s->last_pic->f->data[1], 0x80, (avctx->height / 2) *
1425 s->last_pic->f->linesize[1]);
1426 memset(s->last_pic->f->data[2], 0x80, (avctx->height / 2) *
1427 s->last_pic->f->linesize[2]);
1430 if (h->pict_type == AV_PICTURE_TYPE_B && !s->next_pic->f->data[0]) {
1431 av_log(avctx, AV_LOG_ERROR, "Missing reference frame.\n");
1432 ret = get_buffer(avctx, s->next_pic);
1435 memset(s->next_pic->f->data[0], 0, avctx->height * s->next_pic->f->linesize[0]);
1436 memset(s->next_pic->f->data[1], 0x80, (avctx->height / 2) *
1437 s->next_pic->f->linesize[1]);
1438 memset(s->next_pic->f->data[2], 0x80, (avctx->height / 2) *
1439 s->next_pic->f->linesize[2]);
1443 if (avctx->debug & FF_DEBUG_PICT_INFO)
1444 av_log(h->avctx, AV_LOG_DEBUG,
1445 "%c hpel:%d, tpel:%d aqp:%d qp:%d, slice_num:%02X\n",
1446 av_get_picture_type_char(h->pict_type),
1447 s->halfpel_flag, s->thirdpel_flag,
1448 s->adaptive_quant, h->slice_ctx[0].qscale, sl->slice_num);
1450 if (avctx->skip_frame >= AVDISCARD_NONREF && h->pict_type == AV_PICTURE_TYPE_B ||
1451 avctx->skip_frame >= AVDISCARD_NONKEY && h->pict_type != AV_PICTURE_TYPE_I ||
1452 avctx->skip_frame >= AVDISCARD_ALL)
1455 if (s->next_p_frame_damaged) {
1456 if (h->pict_type == AV_PICTURE_TYPE_B)
1459 s->next_p_frame_damaged = 0;
1462 if (h->pict_type == AV_PICTURE_TYPE_B) {
1463 h->frame_num_offset = sl->slice_num - h->prev_frame_num;
1465 if (h->frame_num_offset < 0)
1466 h->frame_num_offset += 256;
1467 if (h->frame_num_offset == 0 ||
1468 h->frame_num_offset >= h->prev_frame_num_offset) {
1469 av_log(h->avctx, AV_LOG_ERROR, "error in B-frame picture id\n");
1473 h->prev_frame_num = h->frame_num;
1474 h->frame_num = sl->slice_num;
1475 h->prev_frame_num_offset = h->frame_num - h->prev_frame_num;
1477 if (h->prev_frame_num_offset < 0)
1478 h->prev_frame_num_offset += 256;
1481 for (m = 0; m < 2; m++) {
1483 for (i = 0; i < 4; i++) {
1485 for (j = -1; j < 4; j++)
1486 sl->ref_cache[m][scan8[0] + 8 * i + j] = 1;
1488 sl->ref_cache[m][scan8[0] + 8 * i + j] = PART_NOT_AVAILABLE;
1492 for (s->mb_y = 0; s->mb_y < h->mb_height; s->mb_y++) {
1493 for (s->mb_x = 0; s->mb_x < h->mb_width; s->mb_x++) {
1495 s->mb_xy = s->mb_x + s->mb_y * h->mb_stride;
1497 if ((get_bits_left(&h->gb)) <= 7) {
1498 if (((get_bits_count(&h->gb) & 7) == 0 ||
1499 show_bits(&h->gb, get_bits_left(&h->gb) & 7) == 0)) {
1501 if (svq3_decode_slice_header(avctx))
1504 /* TODO: support s->mb_skip_run */
1507 mb_type = svq3_get_ue_golomb(&h->gb);
1509 if (h->pict_type == AV_PICTURE_TYPE_I)
1511 else if (h->pict_type == AV_PICTURE_TYPE_B && mb_type >= 4)
1513 if (mb_type > 33 || svq3_decode_mb(s, mb_type)) {
1514 av_log(h->avctx, AV_LOG_ERROR,
1515 "error while decoding MB %d %d\n", s->mb_x, s->mb_y);
1520 hl_decode_mb(s, h, &h->slice_ctx[0]);
1522 if (h->pict_type != AV_PICTURE_TYPE_B && !h->low_delay)
1523 h->cur_pic.mb_type[s->mb_x + s->mb_y * h->mb_stride] =
1524 (h->pict_type == AV_PICTURE_TYPE_P && mb_type < 8) ? (mb_type - 1) : -1;
1527 ff_draw_horiz_band(avctx, s->cur_pic->f,
1528 s->last_pic->f->data[0] ? s->last_pic->f : NULL,
1529 16 * s->mb_y, 16, h->picture_structure, 0,
1533 if (h->pict_type == AV_PICTURE_TYPE_B || h->low_delay)
1534 ret = av_frame_ref(data, s->cur_pic->f);
1535 else if (s->last_pic->f->data[0])
1536 ret = av_frame_ref(data, s->last_pic->f);
1540 /* Do not output the last pic after seeking. */
1541 if (s->last_pic->f->data[0] || h->low_delay)
1544 if (h->pict_type != AV_PICTURE_TYPE_B) {
1545 FFSWAP(H264Picture*, s->cur_pic, s->next_pic);
1547 av_frame_unref(s->cur_pic->f);
1553 static av_cold int svq3_decode_end(AVCodecContext *avctx)
1555 SVQ3Context *s = avctx->priv_data;
1556 H264Context *h = &s->h;
1558 free_picture(avctx, s->cur_pic);
1559 free_picture(avctx, s->next_pic);
1560 free_picture(avctx, s->last_pic);
1561 av_frame_free(&s->cur_pic->f);
1562 av_frame_free(&s->next_pic->f);
1563 av_frame_free(&s->last_pic->f);
1564 av_freep(&s->cur_pic);
1565 av_freep(&s->next_pic);
1566 av_freep(&s->last_pic);
1567 av_freep(&s->slice_buf);
1568 av_freep(&s->intra4x4_pred_mode);
1569 av_freep(&s->edge_emu_buffer);
1571 memset(&h->cur_pic, 0, sizeof(h->cur_pic));
1573 ff_h264_free_context(h);
1578 AVCodec ff_svq3_decoder = {
1580 .long_name = NULL_IF_CONFIG_SMALL("Sorenson Vector Quantizer 3 / Sorenson Video 3 / SVQ3"),
1581 .type = AVMEDIA_TYPE_VIDEO,
1582 .id = AV_CODEC_ID_SVQ3,
1583 .priv_data_size = sizeof(SVQ3Context),
1584 .init = svq3_decode_init,
1585 .close = svq3_decode_end,
1586 .decode = svq3_decode_frame,
1587 .capabilities = AV_CODEC_CAP_DRAW_HORIZ_BAND |
1590 .pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUVJ420P,