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
48
59
60 #if CONFIG_ZLIB
61 #include <zlib.h>
62 #endif
63
65
66 /**
67 * @file
68 * svq3 decoder.
69 */
70
73
76
79
82
88
112
116
122
124
127
130
134
136
146
147 #define FULLPEL_MODE 1
148 #define HALFPEL_MODE 2
149 #define THIRDPEL_MODE 3
150 #define PREDICT_MODE 4
151
152 /* dual scan (from some older H.264 draft)
153 * o-->o-->o o
154 * | /|
155 * o o o / o
156 * | / | |/ |
157 * o o o o
158 * /
159 * o-->o-->o-->o
160 */
162 0 + 0 * 4, 1 + 0 * 4, 2 + 0 * 4, 2 + 1 * 4,
163 2 + 2 * 4, 3 + 0 * 4, 3 + 1 * 4, 3 + 2 * 4,
164 0 + 1 * 4, 0 + 2 * 4, 1 + 1 * 4, 1 + 2 * 4,
165 0 + 3 * 4, 1 + 3 * 4, 2 + 3 * 4, 3 + 3 * 4,
166 };
167
169 0 * 16 + 0 * 64, 1 * 16 + 0 * 64, 2 * 16 + 0 * 64, 0 * 16 + 2 * 64,
170 3 * 16 + 0 * 64, 0 * 16 + 1 * 64, 1 * 16 + 1 * 64, 2 * 16 + 1 * 64,
171 1 * 16 + 2 * 64, 2 * 16 + 2 * 64, 3 * 16 + 2 * 64, 0 * 16 + 3 * 64,
172 3 * 16 + 1 * 64, 1 * 16 + 3 * 64, 2 * 16 + 3 * 64, 3 * 16 + 3 * 64,
173 };
174
176 { 0, 0 },
177 { 1, 0 }, { 0, 1 },
178 { 0, 2 }, { 1, 1 }, { 2, 0 },
179 { 3, 0 }, { 2, 1 }, { 1, 2 }, { 0, 3 },
180 { 0, 4 }, { 1, 3 }, { 2, 2 }, { 3, 1 }, { 4, 0 },
181 { 4, 1 }, { 3, 2 }, { 2, 3 }, { 1, 4 },
182 { 2, 4 }, { 3, 3 }, { 4, 2 },
183 { 4, 3 }, { 3, 4 },
184 { 4, 4 }
185 };
186
188 { { 2, -1, -1, -1, -1 }, { 2, 1, -1, -1, -1 }, { 1, 2, -1, -1, -1 },
189 { 2, 1, -1, -1, -1 }, { 1, 2, -1, -1, -1 }, { 1, 2, -1, -1, -1 } },
190 { { 0, 2, -1, -1, -1 }, { 0, 2, 1, 4, 3 }, { 0, 1, 2, 4, 3 },
191 { 0, 2, 1, 4, 3 }, { 2, 0, 1, 3, 4 }, { 0, 4, 2, 1, 3 } },
192 { { 2, 0, -1, -1, -1 }, { 2, 1, 0, 4, 3 }, { 1, 2, 4, 0, 3 },
193 { 2, 1, 0, 4, 3 }, { 2, 1, 4, 3, 0 }, { 1, 2, 4, 0, 3 } },
194 { { 2, 0, -1, -1, -1 }, { 2, 0, 1, 4, 3 }, { 1, 2, 0, 4, 3 },
195 { 2, 1, 0, 4, 3 }, { 2, 1, 3, 4, 0 }, { 2, 4, 1, 0, 3 } },
196 { { 0, 2, -1, -1, -1 }, { 0, 2, 1, 3, 4 }, { 1, 2, 3, 0, 4 },
197 { 2, 0, 1, 3, 4 }, { 2, 1, 3, 0, 4 }, { 2, 0, 4, 3, 1 } },
198 { { 0, 2, -1, -1, -1 }, { 0, 2, 4, 1, 3 }, { 1, 4, 2, 0, 3 },
199 { 4, 2, 0, 1, 3 }, { 2, 0, 1, 4, 3 }, { 4, 2, 1, 0, 3 } },
200 };
201
202 static const struct {
206 { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 2, 1 }, { 0, 2 }, { 3, 1 }, { 4, 1 }, { 5, 1 },
207 { 0, 3 }, { 1, 2 }, { 2, 2 }, { 6, 1 }, { 7, 1 }, { 8, 1 }, { 9, 1 }, { 0, 4 } },
208 { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 0, 2 }, { 2, 1 }, { 0, 3 }, { 0, 4 }, { 0, 5 },
209 { 3, 1 }, { 4, 1 }, { 1, 2 }, { 1, 3 }, { 0, 6 }, { 0, 7 }, { 0, 8 }, { 0, 9 } }
210 };
211
213 3881, 4351, 4890, 5481, 6154, 6914, 7761, 8718,
214 9781, 10987, 12339, 13828, 15523, 17435, 19561, 21873,
215 24552, 27656, 30847, 34870, 38807, 43747, 49103, 54683,
216 61694, 68745, 77615, 89113, 100253, 109366, 126635, 141533
217 };
218
220 {
222 #define stride 16
226
227 for (
i = 0;
i < 4;
i++) {
228 const int z0 = 13 * (
input[4 *
i + 0] +
input[4 *
i + 2]);
229 const int z1 = 13 * (
input[4 *
i + 0] -
input[4 *
i + 2]);
230 const int z2 = 7 *
input[4 *
i + 1] - 17 *
input[4 *
i + 3];
231 const int z3 = 17 *
input[4 *
i + 1] + 7 *
input[4 *
i + 3];
232
233 temp[4 *
i + 0] = z0 + z3;
234 temp[4 *
i + 1] = z1 + z2;
235 temp[4 *
i + 2] = z1 - z2;
236 temp[4 *
i + 3] = z0 - z3;
237 }
238
239 for (
i = 0;
i < 4;
i++) {
240 const int offset = x_offset[
i];
241 const int z0 = 13 * (
temp[4 * 0 +
i] +
temp[4 * 2 +
i]);
242 const int z1 = 13 * (
temp[4 * 0 +
i] -
temp[4 * 2 +
i]);
243 const int z2 = 7 *
temp[4 * 1 +
i] - 17 *
temp[4 * 3 +
i];
244 const int z3 = 17 *
temp[4 * 1 +
i] + 7 *
temp[4 * 3 +
i];
245
250 }
251 }
252 #undef stride
253
256 {
259
262 : qmul * (
block[0] >> 3) / 2);
264 }
265
266 for (
i = 0;
i < 4;
i++) {
267 const int z0 = 13 * (
block[0 + 4 *
i] +
block[2 + 4 *
i]);
268 const int z1 = 13 * (
block[0 + 4 *
i] -
block[2 + 4 *
i]);
269 const int z2 = 7 *
block[1 + 4 *
i] - 17 *
block[3 + 4 *
i];
270 const int z3 = 17 *
block[1 + 4 *
i] + 7 *
block[3 + 4 *
i];
271
272 block[0 + 4 *
i] = z0 + z3;
273 block[1 + 4 *
i] = z1 + z2;
274 block[2 + 4 *
i] = z1 - z2;
275 block[3 + 4 *
i] = z0 - z3;
276 }
277
278 for (
i = 0;
i < 4;
i++) {
279 const unsigned z0 = 13 * (
block[
i + 4 * 0] +
block[
i + 4 * 2]);
280 const unsigned z1 = 13 * (
block[
i + 4 * 0] -
block[
i + 4 * 2]);
281 const unsigned z2 = 7 *
block[
i + 4 * 1] - 17 *
block[
i + 4 * 3];
282 const unsigned z3 = 17 *
block[
i + 4 * 1] + 7 *
block[
i + 4 * 3];
283 const int rr = (
dc + 0x80000
u);
284
289 }
290
291 memset(
block, 0, 16 *
sizeof(int16_t));
292 }
293
296 {
297 static const uint8_t *const scan_patterns[4] = {
299 };
300
302 unsigned vlc;
303 const int intra = 3 *
type >> 2;
304 const uint8_t *
const scan = scan_patterns[
type];
305
309 return -1;
310
311 sign = (vlc & 1) ? 0 : -1;
312 vlc = vlc + 1 >> 1;
313
315 if (vlc < 3) {
318 } else if (vlc < 4) {
321 } else {
324 }
325 } else {
329 } else if (intra) {
331 level = (vlc >> 3) + ((
run == 0) ? 8 : ((
run < 2) ? 2 : ((
run < 5) ? 0 : -1)));
332 } else {
334 level = (vlc >> 4) + ((
run == 0) ? 4 : ((
run < 3) ? 2 : ((
run < 10) ? 1 : 0)));
335 }
336 }
337
338
340 return -1;
341
343 }
344
346 break;
347 }
348 }
349
350 return 0;
351 }
352
355 int i,
int list,
int part_width)
356 {
357 const int topright_ref =
s->ref_cache[
list][
i - 8 + part_width];
358
360 *
C =
s->mv_cache[
list][
i - 8 + part_width];
361 return topright_ref;
362 } else {
363 *
C =
s->mv_cache[
list][
i - 8 - 1];
364 return s->ref_cache[
list][
i - 8 - 1];
365 }
366 }
367
368 /**
369 * Get the predicted MV.
370 * @param n the block index
371 * @param part_width the width of the partition (4, 8,16) -> (1, 2, 4)
372 * @param mx the x component of the predicted motion vector
373 * @param my the y component of the predicted motion vector
374 */
376 int part_width,
int list,
377 int ref,
int *
const mx,
int *
const my)
378 {
379 const int index8 =
scan8[n];
380 const int top_ref =
s->ref_cache[
list][index8 - 8];
381 const int left_ref =
s->ref_cache[
list][index8 - 1];
382 const int16_t *
const A =
s->mv_cache[
list][index8 - 1];
383 const int16_t *
const B =
s->mv_cache[
list][index8 - 8];
385 int diagonal_ref, match_count;
386
387 /* mv_cache
388 * B . . A T T T T
389 * U . . L . . , .
390 * U . . L . . . .
391 * U . . L . . , .
392 * . . . L . . . .
393 */
394
396 match_count = (diagonal_ref ==
ref) + (top_ref ==
ref) + (left_ref ==
ref);
397 if (match_count > 1) { //most common
400 } else if (match_count == 1) {
401 if (left_ref ==
ref) {
404 }
else if (top_ref ==
ref) {
407 } else {
410 }
411 } else {
417 } else {
420 }
421 }
422 }
423
426 int mx, int my, int dxy,
427 int thirdpel,
int dir,
int avg)
428 {
429 const SVQ3Frame *pic = (dir == 0) ?
s->last_pic :
s->next_pic;
432 int blocksize = 2 - (
width >> 3);
// 16->0, 8->1, 4->2
433 int linesize =
s->cur_pic->f->linesize[0];
434 int uvlinesize =
s->cur_pic->f->linesize[1];
435
436 mx += x;
437 my += y;
438
439 if (mx < 0 || mx >=
s->h_edge_pos -
width - 1 ||
440 my < 0 || my >=
s->v_edge_pos -
height - 1) {
441 emu = 1;
444 }
445
446 /* form component predictions */
447 dest =
s->cur_pic->f->data[0] + x + y * linesize;
448 src = pic->
f->
data[0] + mx + my * linesize;
449
450 if (emu) {
451 s->vdsp.emulated_edge_mc(
s->edge_emu_buffer,
src,
452 linesize, linesize,
454 mx, my,
s->h_edge_pos,
s->v_edge_pos);
455 src =
s->edge_emu_buffer;
456 }
457 if (thirdpel)
458 (
avg ?
s->tdsp.avg_tpel_pixels_tab
459 :
s->tdsp.put_tpel_pixels_tab)[dxy](dest,
src, linesize,
461 else
462 (
avg ?
s->hdsp.avg_pixels_tab
463 :
s->hdsp.put_pixels_tab)[blocksize][dxy](dest,
src, linesize,
465
467 mx = mx + (mx < (
int) x) >> 1;
468 my = my + (my < (
int) y) >> 1;
471 blocksize++;
472
473 for (
i = 1;
i < 3;
i++) {
474 dest =
s->cur_pic->f->data[
i] + (x >> 1) + (y >> 1) * uvlinesize;
475 src = pic->
f->
data[
i] + mx + my * uvlinesize;
476
477 if (emu) {
478 s->vdsp.emulated_edge_mc(
s->edge_emu_buffer,
src,
479 uvlinesize, uvlinesize,
481 mx, my, (
s->h_edge_pos >> 1),
483 src =
s->edge_emu_buffer;
484 }
485 if (thirdpel)
486 (
avg ?
s->tdsp.avg_tpel_pixels_tab
487 :
s->tdsp.put_tpel_pixels_tab)[dxy](dest,
src,
488 uvlinesize,
490 else
491 (
avg ?
s->hdsp.avg_pixels_tab
492 :
s->hdsp.put_pixels_tab)[blocksize][dxy](dest,
src,
493 uvlinesize,
495 }
496 }
497 }
498
501 {
502 int i, j, k, mx, my, dx, dy, x, y;
503 const int part_width = ((
size & 5) == 4) ? 4 : 16 >> (
size & 1);
504 const int part_height = 16 >> ((unsigned)(
size + 1) / 3);
506 const int h_edge_pos = 6 * (
s->h_edge_pos - part_width) - extra_width;
507 const int v_edge_pos = 6 * (
s->v_edge_pos - part_height) - extra_width;
508
509 for (
i = 0;
i < 16;
i += part_height)
510 for (j = 0; j < 16; j += part_width) {
511 const int b_xy = (4 *
s->mb_x + (j >> 2)) +
512 (4 *
s->mb_y + (
i >> 2)) *
s->b_stride;
513 int dxy;
514 x = 16 *
s->mb_x + j;
515 y = 16 *
s->mb_y +
i;
516 k = (j >> 2 & 1) + (
i >> 1 & 2) +
517 (j >> 1 & 4) + (
i & 8);
518
521 } else {
522 mx =
s->next_pic->motion_val[0][b_xy][0] * 2;
523 my =
s->next_pic->motion_val[0][b_xy][1] * 2;
524
525 if (dir == 0) {
526 mx = mx *
s->frame_num_offset /
527 s->prev_frame_num_offset + 1 >> 1;
528 my = my *
s->frame_num_offset /
529 s->prev_frame_num_offset + 1 >> 1;
530 } else {
531 mx = mx * (
s->frame_num_offset -
s->prev_frame_num_offset) /
532 s->prev_frame_num_offset + 1 >> 1;
533 my = my * (
s->frame_num_offset -
s->prev_frame_num_offset) /
534 s->prev_frame_num_offset + 1 >> 1;
535 }
536 }
537
538 /* clip motion vector prediction to frame border */
539 mx =
av_clip(mx, extra_width - 6 * x, h_edge_pos - 6 * x);
540 my =
av_clip(my, extra_width - 6 * y, v_edge_pos - 6 * y);
541
542 /* get (optional) motion vector differential */
544 dx = dy = 0;
545 } else {
548
549 if (dx != (int16_t)dx || dy != (int16_t)dy) {
551 return -1;
552 }
553 }
554
555 /* compute motion vector */
557 int fx, fy;
558 mx = (mx + 1 >> 1) + dx;
559 my = (my + 1 >> 1) + dy;
560 fx = (unsigned)(mx + 0x30000) / 3 - 0x10000;
561 fy = (unsigned)(my + 0x30000) / 3 - 0x10000;
562 dxy = (mx - 3 * fx) + 4 * (my - 3 * fy);
563
565 fx, fy, dxy, 1, dir,
avg);
566 mx += mx;
567 my += my;
569 mx = (unsigned)(mx + 1 + 0x30000) / 3 + dx - 0x10000;
570 my = (unsigned)(my + 1 + 0x30000) / 3 + dy - 0x10000;
571 dxy = (mx & 1) + 2 * (my & 1);
572
574 mx >> 1, my >> 1, dxy, 0, dir,
avg);
575 mx *= 3;
576 my *= 3;
577 } else {
578 mx = (unsigned)(mx + 3 + 0x60000) / 6 + dx - 0x10000;
579 my = (unsigned)(my + 3 + 0x60000) / 6 + dy - 0x10000;
580
582 mx, my, 0, 0, dir,
avg);
583 mx *= 6;
584 my *= 6;
585 }
586
587 /* update mv_cache */
590
591 if (part_height == 8 &&
i < 8) {
593
594 if (part_width == 8 && j < 8)
596 }
597 if (part_width == 8 && j < 8)
599 if (part_width == 4 || part_height == 4)
601 }
602
603 /* write back motion vectors */
605 part_width >> 2, part_height >> 2,
s->b_stride,
607 }
608
609 return 0;
610 }
611
613 int mb_type, const int *block_offset,
614 int linesize, uint8_t *dest_y)
615 {
618 for (
i = 0;
i < 16;
i++)
619 if (
s->non_zero_count_cache[
scan8[
i]] ||
s->mb[
i * 16]) {
620 uint8_t *
const ptr = dest_y + block_offset[
i];
623 }
624 }
625 }
626
628 int mb_type,
629 const int *block_offset,
630 int linesize,
631 uint8_t *dest_y)
632 {
634 int qscale =
s->qscale;
635
637 for (
i = 0;
i < 16;
i++) {
638 uint8_t *
const ptr = dest_y + block_offset[
i];
639 const int dir =
s->intra4x4_pred_mode_cache[
scan8[
i]];
640
641 uint8_t *topright;
642 int nnz, tr;
644 const int topright_avail = (
s->topright_samples_available <<
i) & 0x8000;
646 if (!topright_avail) {
647 tr = ptr[3 - linesize] * 0x01010101
u;
648 topright = (uint8_t *)&tr;
649 } else
650 topright = ptr + 4 - linesize;
651 } else
653
654 s->hpc.pred4x4[dir](ptr, topright, linesize);
655 nnz =
s->non_zero_count_cache[
scan8[
i]];
656 if (nnz) {
658 }
659 }
660 } else {
661 s->hpc.pred16x16[
s->intra16x16_pred_mode](dest_y, linesize);
663 }
664 }
665
667 {
668 const int mb_x =
s->mb_x;
669 const int mb_y =
s->mb_y;
670 const int mb_xy =
s->mb_xy;
671 const int mb_type =
s->cur_pic->mb_type[mb_xy];
672 uint8_t *dest_y, *dest_cb, *dest_cr;
673 int linesize, uvlinesize;
675 const int *block_offset = &
s->block_offset[0];
676 const int block_h = 16 >> 1;
677
678 linesize =
s->cur_pic->f->linesize[0];
679 uvlinesize =
s->cur_pic->f->linesize[1];
680
681 dest_y =
s->cur_pic->f->data[0] + (mb_x + mb_y * linesize) * 16;
682 dest_cb =
s->cur_pic->f->data[1] + mb_x * 8 + mb_y * uvlinesize * block_h;
683 dest_cr =
s->cur_pic->f->data[2] + mb_x * 8 + mb_y * uvlinesize * block_h;
684
685 s->vdsp.prefetch(dest_y + (
s->mb_x & 3) * 4 * linesize + 64, linesize, 4);
686 s->vdsp.prefetch(dest_cb + (
s->mb_x & 7) * uvlinesize + 64, dest_cr - dest_cb, 2);
687
689 s->hpc.pred8x8[
s->chroma_pred_mode](dest_cb, uvlinesize);
690 s->hpc.pred8x8[
s->chroma_pred_mode](dest_cr, uvlinesize);
691
693 }
694
696
698 uint8_t *dest[2] = { dest_cb, dest_cr };
699 s->h264dsp.h264_chroma_dc_dequant_idct(
s->mb + 16 * 16 * 1,
700 s->dequant4_coeff[4][0]);
701 s->h264dsp.h264_chroma_dc_dequant_idct(
s->mb + 16 * 16 * 2,
702 s->dequant4_coeff[4][0]);
703 for (j = 1; j < 3; j++) {
704 for (
i = j * 16;
i < j * 16 + 4;
i++)
705 if (
s->non_zero_count_cache[
scan8[
i]] ||
s->mb[
i * 16]) {
706 uint8_t *
const ptr = dest[j - 1] + block_offset[
i];
709 }
710 }
711 }
712 }
713
715 {
716 int i, j, k, m, dir,
mode;
717 int cbp = 0;
718 uint32_t vlc;
720 const int mb_xy =
s->mb_xy;
721 const int b_xy = 4 *
s->mb_x + 4 *
s->mb_y *
s->b_stride;
722
723 s->top_samples_available = (
s->mb_y == 0) ? 0x33FF : 0xFFFF;
724 s->left_samples_available = (
s->mb_x == 0) ? 0x5F5F : 0xFFFF;
725 s->topright_samples_available = 0xFFFF;
726
727 if (mb_type == 0) { /* SKIP */
729 s->next_pic->mb_type[mb_xy] == -1) {
731 0, 0, 0, 0, 0, 0);
732
735 0, 0, 0, 0, 1, 1);
736
738 } else {
739 mb_type =
FFMIN(
s->next_pic->mb_type[mb_xy], 6);
741 return -1;
743 return -1;
744
746 }
747 } else if (mb_type < 8) { /* INTER */
748 if (
s->thirdpel_flag &&
s->halfpel_flag == !
get_bits1(&
s->gb_slice))
750 else if (
s->halfpel_flag &&
753 else
755
756 /* fill caches */
757 /* note ref_cache should contain here:
758 * ????????
759 * ???11111
760 * N??11111
761 * N??11111
762 * N??11111
763 */
764
765 for (m = 0; m < 2; m++) {
766 if (
s->mb_x > 0 &&
s->intra4x4_pred_mode[
s->mb2br_xy[mb_xy - 1] + 6] != -1) {
767 for (
i = 0;
i < 4;
i++)
769 s->cur_pic->motion_val[m][b_xy - 1 +
i *
s->b_stride]);
770 } else {
771 for (
i = 0;
i < 4;
i++)
773 }
775 memcpy(
s->mv_cache[m][
scan8[0] - 1 * 8],
776 s->cur_pic->motion_val[m][b_xy -
s->b_stride],
777 4 * 2 * sizeof(int16_t));
778 memset(&
s->ref_cache[m][
scan8[0] - 1 * 8],
780
781 if (
s->mb_x <
s->mb_width - 1) {
783 s->cur_pic->motion_val[m][b_xy -
s->b_stride + 4]);
784 s->ref_cache[m][
scan8[0] + 4 - 1 * 8] =
785 (
s->intra4x4_pred_mode[
s->mb2br_xy[mb_xy -
s->mb_stride + 1] + 6] == -1 ||
787 } else
791 s->cur_pic->motion_val[m][b_xy -
s->b_stride - 1]);
792 s->ref_cache[m][
scan8[0] - 1 - 1 * 8] =
794 } else
796 } else
797 memset(&
s->ref_cache[m][
scan8[0] - 1 * 8 - 1],
799
801 break;
802 }
803
804 /* decode motion vector(s) and form prediction(s) */
807 return -1;
808 } else { /* AV_PICTURE_TYPE_B */
809 if (mb_type != 2) {
811 return -1;
812 } else {
813 for (
i = 0;
i < 4;
i++)
814 memset(
s->cur_pic->motion_val[0][b_xy +
i *
s->b_stride],
815 0, 4 * 2 * sizeof(int16_t));
816 }
817 if (mb_type != 1) {
819 return -1;
820 } else {
821 for (
i = 0;
i < 4;
i++)
822 memset(
s->cur_pic->motion_val[1][b_xy +
i *
s->b_stride],
823 0, 4 * 2 * sizeof(int16_t));
824 }
825 }
826
828 } else if (mb_type == 8 || mb_type == 33) { /* INTRA4x4 */
829 int8_t *i4x4 =
s->intra4x4_pred_mode +
s->mb2br_xy[
s->mb_xy];
830 int8_t *i4x4_cache =
s->intra4x4_pred_mode_cache;
831
832 memset(
s->intra4x4_pred_mode_cache, -1, 8 * 5 *
sizeof(int8_t));
833
834 if (mb_type == 8) {
836 for (
i = 0;
i < 4;
i++)
837 s->intra4x4_pred_mode_cache[
scan8[0] - 1 +
i * 8] =
s->intra4x4_pred_mode[
s->mb2br_xy[mb_xy - 1] + 6 -
i];
838 if (
s->intra4x4_pred_mode_cache[
scan8[0] - 1] == -1)
839 s->left_samples_available = 0x5F5F;
840 }
842 s->intra4x4_pred_mode_cache[4 + 8 * 0] =
s->intra4x4_pred_mode[
s->mb2br_xy[mb_xy -
s->mb_stride] + 0];
843 s->intra4x4_pred_mode_cache[5 + 8 * 0] =
s->intra4x4_pred_mode[
s->mb2br_xy[mb_xy -
s->mb_stride] + 1];
844 s->intra4x4_pred_mode_cache[6 + 8 * 0] =
s->intra4x4_pred_mode[
s->mb2br_xy[mb_xy -
s->mb_stride] + 2];
845 s->intra4x4_pred_mode_cache[7 + 8 * 0] =
s->intra4x4_pred_mode[
s->mb2br_xy[mb_xy -
s->mb_stride] + 3];
846
847 if (
s->intra4x4_pred_mode_cache[4 + 8 * 0] == -1)
848 s->top_samples_available = 0x33FF;
849 }
850
851 /* decode prediction codes for luma blocks */
852 for (
i = 0;
i < 16;
i += 2) {
854
857 "luma prediction:%"PRIu32"\n", vlc);
858 return -1;
859 }
860
862 top = &
s->intra4x4_pred_mode_cache[
scan8[
i] - 8];
863
866
867 if (
left[1] == -1 ||
left[2] == -1) {
869 return -1;
870 }
871 }
872 } else { /* mb_type == 33, DC_128_PRED block type */
873 for (
i = 0;
i < 4;
i++)
874 memset(&
s->intra4x4_pred_mode_cache[
scan8[0] + 8 *
i],
DC_PRED, 4);
875 }
876
878 i4x4[4] = i4x4_cache[7 + 8 * 3];
879 i4x4[5] = i4x4_cache[7 + 8 * 2];
880 i4x4[6] = i4x4_cache[7 + 8 * 1];
881
882 if (mb_type == 8) {
884 s->avctx,
s->top_samples_available,
885 s->left_samples_available);
886
887 s->top_samples_available = (
s->mb_y == 0) ? 0x33FF : 0xFFFF;
888 s->left_samples_available = (
s->mb_x == 0) ? 0x5F5F : 0xFFFF;
889 } else {
890 for (
i = 0;
i < 4;
i++)
892
893 s->top_samples_available = 0x33FF;
894 s->left_samples_available = 0x5F5F;
895 }
896
898 } else { /* INTRA16x16 */
900 dir = (dir >> 1) ^ 3 * (dir & 1) ^ 1;
901
903 s->left_samples_available, dir, 0)) < 0) {
905 return s->intra16x16_pred_mode;
906 }
907
910 }
911
913 for (
i = 0;
i < 4;
i++)
914 memset(
s->cur_pic->motion_val[0][b_xy +
i *
s->b_stride],
915 0, 4 * 2 * sizeof(int16_t));
917 for (
i = 0;
i < 4;
i++)
918 memset(
s->cur_pic->motion_val[1][b_xy +
i *
s->b_stride],
919 0, 4 * 2 * sizeof(int16_t));
920 }
921 }
923 memset(
s->intra4x4_pred_mode +
s->mb2br_xy[mb_xy],
DC_PRED, 8);
924 }
926 memset(
s->non_zero_count_cache + 8, 0, 14 * 8 *
sizeof(uint8_t));
927 }
928
933 return -1;
934 }
935
938 }
942
943 if (
s->qscale > 31
u) {
945 return -1;
946 }
947 }
953 "error while decoding intra luma dc\n");
954 return -1;
955 }
956 }
957
958 if (cbp) {
961
962 for (
i = 0;
i < 4;
i++)
963 if ((cbp & (1 <<
i))) {
964 for (j = 0; j < 4; j++) {
965 k =
index ? (1 * (j & 1) + 2 * (
i & 1) +
966 2 * (j & 2) + 4 * (
i & 2))
968 s->non_zero_count_cache[
scan8[k]] = 1;
969
972 "error while decoding block\n");
973 return -1;
974 }
975 }
976 }
977
978 if ((cbp & 0x30)) {
979 for (
i = 1;
i < 3; ++
i)
982 "error while decoding chroma dc block\n");
983 return -1;
984 }
985
986 if ((cbp & 0x20)) {
987 for (
i = 1;
i < 3;
i++) {
988 for (j = 0; j < 4; j++) {
990 s->non_zero_count_cache[
scan8[k]] = 1;
991
994 "error while decoding chroma ac block\n");
995 return -1;
996 }
997 }
998 }
999 }
1000 }
1001 }
1002
1004 s->cur_pic->mb_type[mb_xy] = mb_type;
1005
1009
1010 return 0;
1011 }
1012
1014 {
1016 const int mb_xy =
s->mb_xy;
1018 unsigned slice_id;
1019
1021
1023 /* TODO: what? */
1025 return -1;
1026 } else {
1027 int slice_bits, slice_bytes, slice_length;
1028 int length =
header >> 5 & 3;
1029
1030 slice_length =
show_bits(&
s->gb, 8 * length);
1031 slice_bits = slice_length * 8;
1032 slice_bytes = slice_length + length - 1;
1033
1035
1039
1043 }
1044 memcpy(
s->slice_buf,
s->gb.buffer +
s->gb.index / 8, slice_bytes);
1045
1046 if (
s->watermark_key) {
1049 }
1051
1052 if (length > 0) {
1053 memmove(
s->slice_buf, &
s->slice_buf[slice_length], length - 1);
1054 }
1056 }
1057
1060 return -1;
1061 }
1062
1064
1065 if ((
header & 0x9F) == 2) {
1066 i = (
s->mb_num < 64) ? 6 : (1 +
av_log2(
s->mb_num - 1));
1071 }
1072
1076
1077 /* unknown fields */
1079
1080 if (
s->has_watermark)
1082
1085
1088
1089 /* reset intra predictors and invalidate motion vector references */
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 }
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
1101 s->intra4x4_pred_mode[
s->mb2br_xy[mb_xy -
s->mb_stride - 1] + 3] = -1;
1102 }
1103
1104 return 0;
1105 }
1106
1108 {
1109 int q, x;
1110 const int max_qp = 51;
1111
1112 for (q = 0; q < max_qp + 1; q++) {
1115 for (x = 0; x < 16; x++)
1116 s->dequant4_coeff[q][(x >> 2) | ((x << 2) & 0xF)] =
1118 }
1119 }
1120
1122 {
1124 int m, x, y;
1125 unsigned char *extradata;
1126 unsigned char *extradata_end;
1128 int marker_found = 0;
1130
1131 s->cur_pic = &
s->frames[0];
1132 s->last_pic = &
s->frames[1];
1133 s->next_pic = &
s->frames[2];
1134
1138 if (!
s->cur_pic->f || !
s->last_pic->f || !
s->next_pic->f)
1140
1144
1145
1147
1150
1153
1155 s->halfpel_flag = 1;
1156 s->thirdpel_flag = 1;
1157 s->has_watermark = 0;
1158
1159 /* prowl for the "SEQH" marker in the extradata */
1160 extradata = (
unsigned char *)avctx->
extradata;
1164 if (!memcmp(extradata, "SEQH", 4)) {
1165 marker_found = 1;
1166 break;
1167 }
1168 extradata++;
1169 }
1170 }
1171
1172 /* if a match was found, parse the extra data */
1173 if (marker_found) {
1175 int frame_size_code;
1176 int unk0, unk1, unk2, unk3, unk4;
1178
1180 if (
size > extradata_end - extradata - 8)
1183
1184 /* 'frame size code' and optional 'width, height' */
1185 frame_size_code =
get_bits(&gb, 3);
1186 switch (frame_size_code) {
1187 case 0:
1190 break;
1191 case 1:
1194 break;
1195 case 2:
1198 break;
1199 case 3:
1202 break;
1203 case 4:
1206 break;
1207 case 5:
1210 break;
1211 case 6:
1214 break;
1215 case 7:
1218 break;
1219 }
1223
1226
1227 /* unknown fields */
1232
1234
1235 /* unknown field */
1237
1239 unk0, unk1, unk2, unk3, unk4);
1240
1243
1246 if (
s->has_watermark) {
1247 #if CONFIG_ZLIB
1254 unsigned long buf_len = watermark_width *
1255 watermark_height * 4;
1257 uint8_t *buf;
1258
1259 if (watermark_height <= 0 ||
1260 (uint64_t)watermark_width * 4 > UINT_MAX / watermark_height)
1262
1264 if (!buf)
1266
1268 watermark_width, watermark_height);
1270 "u1: %x u2: %x u3: %x compressed data size: %d offset: %d\n",
1272 if (uncompress(buf, &buf_len, extradata + 8 +
offset,
1275 "could not uncompress watermark logo\n");
1277 return -1;
1278 }
1280
1281 s->watermark_key =
s->watermark_key << 16 |
s->watermark_key;
1283 "watermark key %#"PRIx32
"\n",
s->watermark_key);
1285 #else
1287 "this svq3 file contains watermark which need zlib support compiled in\n");
1289 #endif
1290 }
1291 }
1292
1293 s->mb_width = (avctx->
width + 15) / 16;
1294 s->mb_height = (avctx->
height + 15) / 16;
1295 s->mb_stride =
s->mb_width + 1;
1296 s->mb_num =
s->mb_width *
s->mb_height;
1297 s->b_stride = 4 *
s->mb_width;
1298 s->h_edge_pos =
s->mb_width * 16;
1299 s->v_edge_pos =
s->mb_height * 16;
1300
1301 s->intra4x4_pred_mode =
av_mallocz(
s->mb_stride * 2 * 8);
1302 if (!
s->intra4x4_pred_mode)
1304
1305 s->mb2br_xy =
av_mallocz(
s->mb_stride * (
s->mb_height + 1) *
1306 sizeof(*
s->mb2br_xy));
1309
1310 for (y = 0; y <
s->mb_height; y++)
1311 for (x = 0; x <
s->mb_width; x++) {
1312 const int mb_xy = x + y *
s->mb_stride;
1313
1314 s->mb2br_xy[mb_xy] = 8 * (mb_xy % (2 *
s->mb_stride));
1315 }
1316
1318
1319 return 0;
1320 }
1321
1323 {
1325 for (
i = 0;
i < 2;
i++) {
1327 }
1329
1331 }
1332
1334 {
1336 const int big_mb_num =
s->mb_stride * (
s->mb_height + 1) + 1;
1337 const int b4_stride =
s->mb_width * 4 + 1;
1338 const int b4_array_size = b4_stride *
s->mb_height * 4;
1340
1343
1348
1349 for (
i = 0;
i < 2;
i++) {
1354 }
1355
1357 }
1358 }
1359
1365
1366 if (!
s->edge_emu_buffer) {
1368 if (!
s->edge_emu_buffer)
1370 }
1371
1372 return 0;
1376 }
1377
1380 {
1382 int buf_size = avpkt->
size;
1385
1386 /* special case for last picture */
1387 if (buf_size == 0) {
1388 if (
s->next_pic->f->data[0] && !
s->low_delay && !
s->last_frame_output) {
1392 s->last_frame_output = 1;
1393 *got_frame = 1;
1394 }
1395 return 0;
1396 }
1397
1398 s->mb_x =
s->mb_y =
s->mb_xy = 0;
1399
1403
1405 return -1;
1406
1407 s->pict_type =
s->slice_type;
1408
1411
1413
1414 /* for skipping the frame */
1415 s->cur_pic->f->pict_type =
s->pict_type;
1417
1421
1422 for (
i = 0;
i < 16;
i++) {
1424 s->block_offset[48 +
i] = (4 * ((
scan8[
i] -
scan8[0]) & 7)) + 8 *
s->cur_pic->f->linesize[0] * ((
scan8[
i] -
scan8[0]) >> 3);
1425 }
1426 for (
i = 0;
i < 16;
i++) {
1427 s->block_offset[16 +
i] =
1428 s->block_offset[32 +
i] = (4 * ((
scan8[
i] -
scan8[0]) & 7)) + 4 *
s->cur_pic->f->linesize[1] * ((
scan8[
i] -
scan8[0]) >> 3);
1429 s->block_offset[48 + 16 +
i] =
1430 s->block_offset[48 + 32 +
i] = (4 * ((
scan8[
i] -
scan8[0]) & 7)) + 8 *
s->cur_pic->f->linesize[1] * ((
scan8[
i] -
scan8[0]) >> 3);
1431 }
1432
1434 if (!
s->last_pic->f->data[0]) {
1440 memset(
s->last_pic->f->data[0], 0, avctx->
height *
s->last_pic->f->linesize[0]);
1441 memset(
s->last_pic->f->data[1], 0x80, (avctx->
height / 2) *
1442 s->last_pic->f->linesize[1]);
1443 memset(
s->last_pic->f->data[2], 0x80, (avctx->
height / 2) *
1444 s->last_pic->f->linesize[2]);
1445 }
1446
1453 memset(
s->next_pic->f->data[0], 0, avctx->
height *
s->next_pic->f->linesize[0]);
1454 memset(
s->next_pic->f->data[1], 0x80, (avctx->
height / 2) *
1455 s->next_pic->f->linesize[1]);
1456 memset(
s->next_pic->f->data[2], 0x80, (avctx->
height / 2) *
1457 s->next_pic->f->linesize[2]);
1458 }
1459 }
1460
1463 "%c hpel:%d, tpel:%d aqp:%d qp:%d, slice_num:%02X\n",
1465 s->halfpel_flag,
s->thirdpel_flag,
1466 s->adaptive_quant,
s->qscale,
s->slice_num);
1467
1471 return 0;
1472
1473 if (
s->next_p_frame_damaged) {
1475 return 0;
1476 else
1477 s->next_p_frame_damaged = 0;
1478 }
1479
1481 s->frame_num_offset =
s->slice_num -
s->prev_frame_num;
1482
1483 if (
s->frame_num_offset < 0)
1484 s->frame_num_offset += 256;
1485 if (
s->frame_num_offset == 0 ||
1486 s->frame_num_offset >=
s->prev_frame_num_offset) {
1488 return -1;
1489 }
1490 } else {
1491 s->prev_frame_num =
s->frame_num;
1492 s->frame_num =
s->slice_num;
1493 s->prev_frame_num_offset =
s->frame_num -
s->prev_frame_num;
1494
1495 if (
s->prev_frame_num_offset < 0)
1496 s->prev_frame_num_offset += 256;
1497 }
1498
1499 for (m = 0; m < 2; m++) {
1501 for (
i = 0;
i < 4;
i++) {
1502 int j;
1503 for (j = -1; j < 4; j++)
1504 s->ref_cache[m][
scan8[0] + 8 *
i + j] = 1;
1507 }
1508 }
1509
1510 for (
s->mb_y = 0;
s->mb_y <
s->mb_height;
s->mb_y++) {
1511 for (
s->mb_x = 0;
s->mb_x <
s->mb_width;
s->mb_x++) {
1512 unsigned mb_type;
1513 s->mb_xy =
s->mb_x +
s->mb_y *
s->mb_stride;
1514
1518
1520 return -1;
1521 }
1522 if (
s->slice_type !=
s->pict_type) {
1524 }
1525 /* TODO: support s->mb_skip_run */
1526 }
1527
1529
1531 mb_type += 8;
1533 mb_type += 4;
1536 "error while decoding MB %d %d\n",
s->mb_x,
s->mb_y);
1537 return -1;
1538 }
1539
1540 if (mb_type != 0 ||
s->cbp)
1542
1544 s->cur_pic->mb_type[
s->mb_x +
s->mb_y *
s->mb_stride] =
1546 }
1547
1549 s->last_pic->f->data[0] ?
s->last_pic->f :
NULL,
1552 }
1553
1555
1556 if (
s->mb_y !=
s->mb_height ||
s->mb_x !=
s->mb_width) {
1558 //av_hex_dump(stderr, buf+buf_size-8, 8);
1559 }
1560
1563 return -1;
1564 }
1565
1568 else if (
s->last_pic->f->data[0])
1572
1573 /* Do not output the last pic after seeking. */
1574 if (
s->last_pic->f->data[0] ||
s->low_delay)
1575 *got_frame = 1;
1576
1579 } else {
1581 }
1582
1583 return buf_size;
1584 }
1585
1587 {
1589
1593 }
1598
1599 return 0;
1600 }
1601
1617 };