annotate svq1dec.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents 670516285e58
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
1 /*
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
2 * SVQ1 decoder
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
3 * ported to MPlayer by Arpi <arpi@thot.banki.hu>
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
4 * ported to libavcodec by Nick Kurshev <nickols_k@mail.ru>
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
5 *
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
6 * Copyright (C) 2002 the xine project
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
7 * Copyright (C) 2002 the ffmpeg project
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
8 *
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
9 * SVQ1 Encoder (c) 2004 Mike Melanson <melanson@pcisys.net>
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
10 *
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
11 * This file is part of FFmpeg.
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
12 *
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
13 * FFmpeg is free software; you can redistribute it and/or
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
14 * modify it under the terms of the GNU Lesser General Public
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
15 * License as published by the Free Software Foundation; either
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
16 * version 2.1 of the License, or (at your option) any later version.
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
17 *
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
18 * FFmpeg is distributed in the hope that it will be useful,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
21 * Lesser General Public License for more details.
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
22 *
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
23 * You should have received a copy of the GNU Lesser General Public
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
24 * License along with FFmpeg; if not, write to the Free Software
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
25 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
26 */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
27
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
28 /**
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 11560
diff changeset
29 * @file
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
30 * Sorenson Vector Quantizer #1 (SVQ1) video codec.
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
31 * For more information of the SVQ1 algorithm, visit:
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
32 * http://www.pcisys.net/~melanson/codecs/
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
33 */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
34
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
35
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
36 //#define DEBUG_SVQ1
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
37 #include "avcodec.h"
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
38 #include "dsputil.h"
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
39 #include "mpegvideo.h"
8627
d6bab465b82c moves mid_pred() into mathops.h (with arch specific code split by directory)
aurel
parents: 8318
diff changeset
40 #include "mathops.h"
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
41
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
42 #include "svq1.h"
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
43
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
44 #undef NDEBUG
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
45 #include <assert.h>
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
46
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
47 extern const uint8_t mvtab[33][2];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
48
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
49 static VLC svq1_block_type;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
50 static VLC svq1_motion_component;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
51 static VLC svq1_intra_multistage[6];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
52 static VLC svq1_inter_multistage[6];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
53 static VLC svq1_intra_mean;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
54 static VLC svq1_inter_mean;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
55
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
56 /* motion vector (prediction) */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
57 typedef struct svq1_pmv_s {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
58 int x;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
59 int y;
8318
bc36a075bf35 The POSIX namespace shall be held sacrosanct. To that end,
melanson
parents: 8026
diff changeset
60 } svq1_pmv;
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
61
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
62 static const uint16_t checksum_table[256] = {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
63 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
64 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
65 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
66 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
67 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
68 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
69 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
70 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
71 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
72 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
73 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
74 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
75 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
76 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
77 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
78 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
79 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
80 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
81 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
82 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
83 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
84 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
85 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
86 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
87 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
88 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
89 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
90 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
91 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
92 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
93 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
94 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
95 };
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
96
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
97 static const uint8_t string_table[256] = {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
98 0x00, 0xD5, 0x7F, 0xAA, 0xFE, 0x2B, 0x81, 0x54,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
99 0x29, 0xFC, 0x56, 0x83, 0xD7, 0x02, 0xA8, 0x7D,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
100 0x52, 0x87, 0x2D, 0xF8, 0xAC, 0x79, 0xD3, 0x06,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
101 0x7B, 0xAE, 0x04, 0xD1, 0x85, 0x50, 0xFA, 0x2F,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
102 0xA4, 0x71, 0xDB, 0x0E, 0x5A, 0x8F, 0x25, 0xF0,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
103 0x8D, 0x58, 0xF2, 0x27, 0x73, 0xA6, 0x0C, 0xD9,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
104 0xF6, 0x23, 0x89, 0x5C, 0x08, 0xDD, 0x77, 0xA2,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
105 0xDF, 0x0A, 0xA0, 0x75, 0x21, 0xF4, 0x5E, 0x8B,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
106 0x9D, 0x48, 0xE2, 0x37, 0x63, 0xB6, 0x1C, 0xC9,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
107 0xB4, 0x61, 0xCB, 0x1E, 0x4A, 0x9F, 0x35, 0xE0,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
108 0xCF, 0x1A, 0xB0, 0x65, 0x31, 0xE4, 0x4E, 0x9B,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
109 0xE6, 0x33, 0x99, 0x4C, 0x18, 0xCD, 0x67, 0xB2,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
110 0x39, 0xEC, 0x46, 0x93, 0xC7, 0x12, 0xB8, 0x6D,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
111 0x10, 0xC5, 0x6F, 0xBA, 0xEE, 0x3B, 0x91, 0x44,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
112 0x6B, 0xBE, 0x14, 0xC1, 0x95, 0x40, 0xEA, 0x3F,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
113 0x42, 0x97, 0x3D, 0xE8, 0xBC, 0x69, 0xC3, 0x16,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
114 0xEF, 0x3A, 0x90, 0x45, 0x11, 0xC4, 0x6E, 0xBB,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
115 0xC6, 0x13, 0xB9, 0x6C, 0x38, 0xED, 0x47, 0x92,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
116 0xBD, 0x68, 0xC2, 0x17, 0x43, 0x96, 0x3C, 0xE9,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
117 0x94, 0x41, 0xEB, 0x3E, 0x6A, 0xBF, 0x15, 0xC0,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
118 0x4B, 0x9E, 0x34, 0xE1, 0xB5, 0x60, 0xCA, 0x1F,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
119 0x62, 0xB7, 0x1D, 0xC8, 0x9C, 0x49, 0xE3, 0x36,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
120 0x19, 0xCC, 0x66, 0xB3, 0xE7, 0x32, 0x98, 0x4D,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
121 0x30, 0xE5, 0x4F, 0x9A, 0xCE, 0x1B, 0xB1, 0x64,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
122 0x72, 0xA7, 0x0D, 0xD8, 0x8C, 0x59, 0xF3, 0x26,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
123 0x5B, 0x8E, 0x24, 0xF1, 0xA5, 0x70, 0xDA, 0x0F,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
124 0x20, 0xF5, 0x5F, 0x8A, 0xDE, 0x0B, 0xA1, 0x74,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
125 0x09, 0xDC, 0x76, 0xA3, 0xF7, 0x22, 0x88, 0x5D,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
126 0xD6, 0x03, 0xA9, 0x7C, 0x28, 0xFD, 0x57, 0x82,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
127 0xFF, 0x2A, 0x80, 0x55, 0x01, 0xD4, 0x7E, 0xAB,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
128 0x84, 0x51, 0xFB, 0x2E, 0x7A, 0xAF, 0x05, 0xD0,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
129 0xAD, 0x78, 0xD2, 0x07, 0x53, 0x86, 0x2C, 0xF9
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
130 };
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
131
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
132 #define SVQ1_PROCESS_VECTOR()\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
133 for (; level > 0; i++) {\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
134 /* process next depth */\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
135 if (i == m) {\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
136 m = n;\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
137 if (--level == 0)\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
138 break;\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
139 }\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
140 /* divide block if next bit set */\
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5233
diff changeset
141 if (get_bits1 (bitbuf) == 0)\
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
142 break;\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
143 /* add child nodes */\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
144 list[n++] = list[i];\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
145 list[n++] = list[i] + (((level & 1) ? pitch : 1) << ((level / 2) + 1));\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
146 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
147
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
148 #define SVQ1_ADD_CODEBOOK()\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
149 /* add codebook entries to vector */\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
150 for (j=0; j < stages; j++) {\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
151 n3 = codebook[entries[j]] ^ 0x80808080;\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
152 n1 += ((n3 & 0xFF00FF00) >> 8);\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
153 n2 += (n3 & 0x00FF00FF);\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
154 }\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
155 \
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
156 /* clip to [0..255] */\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
157 if (n1 & 0xFF00FF00) {\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
158 n3 = ((( n1 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
159 n1 += 0x7F007F00;\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
160 n1 |= (((~n1 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
161 n1 &= (n3 & 0x00FF00FF);\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
162 }\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
163 \
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
164 if (n2 & 0xFF00FF00) {\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
165 n3 = ((( n2 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
166 n2 += 0x7F007F00;\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
167 n2 |= (((~n2 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
168 n2 &= (n3 & 0x00FF00FF);\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
169 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
170
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
171 #define SVQ1_DO_CODEBOOK_INTRA()\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
172 for (y=0; y < height; y++) {\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
173 for (x=0; x < (width / 4); x++, codebook++) {\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
174 n1 = n4;\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
175 n2 = n4;\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
176 SVQ1_ADD_CODEBOOK()\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
177 /* store result */\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
178 dst[x] = (n1 << 8) | n2;\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
179 }\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
180 dst += (pitch / 4);\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
181 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
182
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
183 #define SVQ1_DO_CODEBOOK_NONINTRA()\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
184 for (y=0; y < height; y++) {\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
185 for (x=0; x < (width / 4); x++, codebook++) {\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
186 n3 = dst[x];\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
187 /* add mean value to vector */\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
188 n1 = ((n3 & 0xFF00FF00) >> 8) + n4;\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
189 n2 = (n3 & 0x00FF00FF) + n4;\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
190 SVQ1_ADD_CODEBOOK()\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
191 /* store result */\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
192 dst[x] = (n1 << 8) | n2;\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
193 }\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
194 dst += (pitch / 4);\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
195 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
196
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
197 #define SVQ1_CALC_CODEBOOK_ENTRIES(cbook)\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
198 codebook = (const uint32_t *) cbook[level];\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
199 bit_cache = get_bits (bitbuf, 4*stages);\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
200 /* calculate codebook entries for this vector */\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
201 for (j=0; j < stages; j++) {\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
202 entries[j] = (((bit_cache >> (4*(stages - j - 1))) & 0xF) + 16*j) << (level + 1);\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
203 }\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
204 mean -= (stages * 128);\
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
205 n4 = ((mean + (mean >> 31)) << 16) | (mean & 0xFFFF);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
206
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
207 static int svq1_decode_block_intra (GetBitContext *bitbuf, uint8_t *pixels, int pitch ) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
208 uint32_t bit_cache;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
209 uint8_t *list[63];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
210 uint32_t *dst;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
211 const uint32_t *codebook;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
212 int entries[6];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
213 int i, j, m, n;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
214 int mean, stages;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
215 unsigned x, y, width, height, level;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
216 uint32_t n1, n2, n3, n4;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
217
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
218 /* initialize list for breadth first processing of vectors */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
219 list[0] = pixels;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
220
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
221 /* recursively process vector */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
222 for (i=0, m=1, n=1, level=5; i < n; i++) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
223 SVQ1_PROCESS_VECTOR();
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
224
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
225 /* destination address and vector size */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
226 dst = (uint32_t *) list[i];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
227 width = 1 << ((4 + level) /2);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
228 height = 1 << ((3 + level) /2);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
229
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
230 /* get number of stages (-1 skips vector, 0 for mean only) */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
231 stages = get_vlc2(bitbuf, svq1_intra_multistage[level].table, 3, 3) - 1;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
232
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
233 if (stages == -1) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
234 for (y=0; y < height; y++) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
235 memset (&dst[y*(pitch / 4)], 0, width);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
236 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
237 continue; /* skip vector */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
238 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
239
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
240 if ((stages > 0) && (level >= 4)) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
241 #ifdef DEBUG_SVQ1
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
242 av_log(s->avctx, AV_LOG_INFO, "Error (svq1_decode_block_intra): invalid vector: stages=%i level=%i\n",stages,level);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
243 #endif
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
244 return -1; /* invalid vector */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
245 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
246
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
247 mean = get_vlc2(bitbuf, svq1_intra_mean.table, 8, 3);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
248
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
249 if (stages == 0) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
250 for (y=0; y < height; y++) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
251 memset (&dst[y*(pitch / 4)], mean, width);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
252 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
253 } else {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
254 SVQ1_CALC_CODEBOOK_ENTRIES(ff_svq1_intra_codebooks);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
255 SVQ1_DO_CODEBOOK_INTRA()
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
256 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
257 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
258
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
259 return 0;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
260 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
261
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
262 static int svq1_decode_block_non_intra (GetBitContext *bitbuf, uint8_t *pixels, int pitch ) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
263 uint32_t bit_cache;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
264 uint8_t *list[63];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
265 uint32_t *dst;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
266 const uint32_t *codebook;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
267 int entries[6];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
268 int i, j, m, n;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
269 int mean, stages;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
270 int x, y, width, height, level;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
271 uint32_t n1, n2, n3, n4;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
272
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
273 /* initialize list for breadth first processing of vectors */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
274 list[0] = pixels;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
275
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
276 /* recursively process vector */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
277 for (i=0, m=1, n=1, level=5; i < n; i++) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
278 SVQ1_PROCESS_VECTOR();
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
279
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
280 /* destination address and vector size */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
281 dst = (uint32_t *) list[i];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
282 width = 1 << ((4 + level) /2);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
283 height = 1 << ((3 + level) /2);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
284
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
285 /* get number of stages (-1 skips vector, 0 for mean only) */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
286 stages = get_vlc2(bitbuf, svq1_inter_multistage[level].table, 3, 2) - 1;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
287
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
288 if (stages == -1) continue; /* skip vector */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
289
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
290 if ((stages > 0) && (level >= 4)) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
291 #ifdef DEBUG_SVQ1
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
292 av_log(s->avctx, AV_LOG_INFO, "Error (svq1_decode_block_non_intra): invalid vector: stages=%i level=%i\n",stages,level);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
293 #endif
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
294 return -1; /* invalid vector */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
295 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
296
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
297 mean = get_vlc2(bitbuf, svq1_inter_mean.table, 9, 3) - 256;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
298
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
299 SVQ1_CALC_CODEBOOK_ENTRIES(ff_svq1_inter_codebooks);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
300 SVQ1_DO_CODEBOOK_NONINTRA()
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
301 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
302 return 0;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
303 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
304
8318
bc36a075bf35 The POSIX namespace shall be held sacrosanct. To that end,
melanson
parents: 8026
diff changeset
305 static int svq1_decode_motion_vector (GetBitContext *bitbuf, svq1_pmv *mv, svq1_pmv **pmv) {
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
306 int diff;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
307 int i;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
308
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
309 for (i=0; i < 2; i++) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
310
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
311 /* get motion code */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
312 diff = get_vlc2(bitbuf, svq1_motion_component.table, 7, 2);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
313 if(diff<0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
314 return -1;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
315 else if(diff){
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
316 if(get_bits1(bitbuf)) diff= -diff;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
317 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
318
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
319 /* add median of motion vector predictors and clip result */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
320 if (i == 1)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
321 mv->y = ((diff + mid_pred(pmv[0]->y, pmv[1]->y, pmv[2]->y)) << 26) >> 26;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
322 else
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
323 mv->x = ((diff + mid_pred(pmv[0]->x, pmv[1]->x, pmv[2]->x)) << 26) >> 26;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
324 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
325
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
326 return 0;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
327 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
328
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
329 static void svq1_skip_block (uint8_t *current, uint8_t *previous, int pitch, int x, int y) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
330 uint8_t *src;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
331 uint8_t *dst;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
332 int i;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
333
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
334 src = &previous[x + y*pitch];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
335 dst = current;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
336
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
337 for (i=0; i < 16; i++) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
338 memcpy (dst, src, 16);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
339 src += pitch;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
340 dst += pitch;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
341 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
342 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
343
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
344 static int svq1_motion_inter_block (MpegEncContext *s, GetBitContext *bitbuf,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
345 uint8_t *current, uint8_t *previous, int pitch,
8318
bc36a075bf35 The POSIX namespace shall be held sacrosanct. To that end,
melanson
parents: 8026
diff changeset
346 svq1_pmv *motion, int x, int y) {
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
347 uint8_t *src;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
348 uint8_t *dst;
8318
bc36a075bf35 The POSIX namespace shall be held sacrosanct. To that end,
melanson
parents: 8026
diff changeset
349 svq1_pmv mv;
bc36a075bf35 The POSIX namespace shall be held sacrosanct. To that end,
melanson
parents: 8026
diff changeset
350 svq1_pmv *pmv[3];
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
351 int result;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
352
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
353 /* predict and decode motion vector */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
354 pmv[0] = &motion[0];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
355 if (y == 0) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
356 pmv[1] =
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
357 pmv[2] = pmv[0];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
358 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
359 else {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
360 pmv[1] = &motion[(x / 8) + 2];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
361 pmv[2] = &motion[(x / 8) + 4];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
362 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
363
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
364 result = svq1_decode_motion_vector (bitbuf, &mv, pmv);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
365
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
366 if (result != 0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
367 return result;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
368
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
369 motion[0].x =
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
370 motion[(x / 8) + 2].x =
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
371 motion[(x / 8) + 3].x = mv.x;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
372 motion[0].y =
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
373 motion[(x / 8) + 2].y =
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
374 motion[(x / 8) + 3].y = mv.y;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
375
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
376 if(y + (mv.y >> 1)<0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
377 mv.y= 0;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
378 if(x + (mv.x >> 1)<0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
379 mv.x= 0;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
380
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
381 #if 0
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
382 int w= (s->width+15)&~15;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
383 int h= (s->height+15)&~15;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
384 if(x + (mv.x >> 1)<0 || y + (mv.y >> 1)<0 || x + (mv.x >> 1) + 16 > w || y + (mv.y >> 1) + 16> h)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
385 av_log(s->avctx, AV_LOG_INFO, "%d %d %d %d\n", x, y, x + (mv.x >> 1), y + (mv.y >> 1));
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
386 #endif
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
387
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
388 src = &previous[(x + (mv.x >> 1)) + (y + (mv.y >> 1))*pitch];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
389 dst = current;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
390
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
391 s->dsp.put_pixels_tab[0][((mv.y & 1) << 1) | (mv.x & 1)](dst,src,pitch,16);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
392
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
393 return 0;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
394 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
395
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
396 static int svq1_motion_inter_4v_block (MpegEncContext *s, GetBitContext *bitbuf,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
397 uint8_t *current, uint8_t *previous, int pitch,
8318
bc36a075bf35 The POSIX namespace shall be held sacrosanct. To that end,
melanson
parents: 8026
diff changeset
398 svq1_pmv *motion,int x, int y) {
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
399 uint8_t *src;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
400 uint8_t *dst;
8318
bc36a075bf35 The POSIX namespace shall be held sacrosanct. To that end,
melanson
parents: 8026
diff changeset
401 svq1_pmv mv;
bc36a075bf35 The POSIX namespace shall be held sacrosanct. To that end,
melanson
parents: 8026
diff changeset
402 svq1_pmv *pmv[4];
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
403 int i, result;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
404
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
405 /* predict and decode motion vector (0) */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
406 pmv[0] = &motion[0];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
407 if (y == 0) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
408 pmv[1] =
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
409 pmv[2] = pmv[0];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
410 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
411 else {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
412 pmv[1] = &motion[(x / 8) + 2];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
413 pmv[2] = &motion[(x / 8) + 4];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
414 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
415
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
416 result = svq1_decode_motion_vector (bitbuf, &mv, pmv);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
417
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
418 if (result != 0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
419 return result;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
420
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
421 /* predict and decode motion vector (1) */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
422 pmv[0] = &mv;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
423 if (y == 0) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
424 pmv[1] =
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
425 pmv[2] = pmv[0];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
426 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
427 else {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
428 pmv[1] = &motion[(x / 8) + 3];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
429 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
430 result = svq1_decode_motion_vector (bitbuf, &motion[0], pmv);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
431
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
432 if (result != 0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
433 return result;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
434
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
435 /* predict and decode motion vector (2) */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
436 pmv[1] = &motion[0];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
437 pmv[2] = &motion[(x / 8) + 1];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
438
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
439 result = svq1_decode_motion_vector (bitbuf, &motion[(x / 8) + 2], pmv);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
440
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
441 if (result != 0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
442 return result;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
443
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
444 /* predict and decode motion vector (3) */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
445 pmv[2] = &motion[(x / 8) + 2];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
446 pmv[3] = &motion[(x / 8) + 3];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
447
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
448 result = svq1_decode_motion_vector (bitbuf, pmv[3], pmv);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
449
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
450 if (result != 0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
451 return result;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
452
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
453 /* form predictions */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
454 for (i=0; i < 4; i++) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
455 int mvx= pmv[i]->x + (i&1)*16;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
456 int mvy= pmv[i]->y + (i>>1)*16;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
457
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
458 ///XXX /FIXME clipping or padding?
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
459 if(y + (mvy >> 1)<0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
460 mvy= 0;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
461 if(x + (mvx >> 1)<0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
462 mvx= 0;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
463
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
464 #if 0
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
465 int w= (s->width+15)&~15;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
466 int h= (s->height+15)&~15;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
467 if(x + (mvx >> 1)<0 || y + (mvy >> 1)<0 || x + (mvx >> 1) + 8 > w || y + (mvy >> 1) + 8> h)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
468 av_log(s->avctx, AV_LOG_INFO, "%d %d %d %d\n", x, y, x + (mvx >> 1), y + (mvy >> 1));
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
469 #endif
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
470 src = &previous[(x + (mvx >> 1)) + (y + (mvy >> 1))*pitch];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
471 dst = current;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
472
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
473 s->dsp.put_pixels_tab[1][((mvy & 1) << 1) | (mvx & 1)](dst,src,pitch,8);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
474
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
475 /* select next block */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
476 if (i & 1) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
477 current += 8*(pitch - 1);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
478 } else {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
479 current += 8;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
480 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
481 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
482
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
483 return 0;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
484 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
485
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
486 static int svq1_decode_delta_block (MpegEncContext *s, GetBitContext *bitbuf,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
487 uint8_t *current, uint8_t *previous, int pitch,
8318
bc36a075bf35 The POSIX namespace shall be held sacrosanct. To that end,
melanson
parents: 8026
diff changeset
488 svq1_pmv *motion, int x, int y) {
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
489 uint32_t block_type;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
490 int result = 0;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
491
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
492 /* get block type */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
493 block_type = get_vlc2(bitbuf, svq1_block_type.table, 2, 2);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
494
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
495 /* reset motion vectors */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
496 if (block_type == SVQ1_BLOCK_SKIP || block_type == SVQ1_BLOCK_INTRA) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
497 motion[0].x =
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
498 motion[0].y =
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
499 motion[(x / 8) + 2].x =
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
500 motion[(x / 8) + 2].y =
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
501 motion[(x / 8) + 3].x =
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
502 motion[(x / 8) + 3].y = 0;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
503 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
504
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
505 switch (block_type) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
506 case SVQ1_BLOCK_SKIP:
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
507 svq1_skip_block (current, previous, pitch, x, y);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
508 break;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
509
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
510 case SVQ1_BLOCK_INTER:
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
511 result = svq1_motion_inter_block (s, bitbuf, current, previous, pitch, motion, x, y);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
512
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
513 if (result != 0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
514 {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
515 #ifdef DEBUG_SVQ1
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
516 av_log(s->avctx, AV_LOG_INFO, "Error in svq1_motion_inter_block %i\n",result);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
517 #endif
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
518 break;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
519 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
520 result = svq1_decode_block_non_intra (bitbuf, current, pitch);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
521 break;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
522
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
523 case SVQ1_BLOCK_INTER_4V:
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
524 result = svq1_motion_inter_4v_block (s, bitbuf, current, previous, pitch, motion, x, y);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
525
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
526 if (result != 0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
527 {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
528 #ifdef DEBUG_SVQ1
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
529 av_log(s->avctx, AV_LOG_INFO, "Error in svq1_motion_inter_4v_block %i\n",result);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
530 #endif
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
531 break;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
532 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
533 result = svq1_decode_block_non_intra (bitbuf, current, pitch);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
534 break;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
535
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
536 case SVQ1_BLOCK_INTRA:
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
537 result = svq1_decode_block_intra (bitbuf, current, pitch);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
538 break;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
539 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
540
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
541 return result;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
542 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
543
8026
f693666fbf9f Export svq1_packet_checksum() that is needed for svq3 watermarks,
michael
parents: 7040
diff changeset
544 uint16_t ff_svq1_packet_checksum (const uint8_t *data, const int length, int value) {
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
545 int i;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
546
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
547 for (i=0; i < length; i++) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
548 value = checksum_table[data[i] ^ (value >> 8)] ^ ((value & 0xFF) << 8);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
549 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
550
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
551 return value;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
552 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
553
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
554 static void svq1_parse_string (GetBitContext *bitbuf, uint8_t *out) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
555 uint8_t seed;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
556 int i;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
557
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
558 out[0] = get_bits (bitbuf, 8);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
559
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
560 seed = string_table[out[0]];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
561
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
562 for (i=1; i <= out[0]; i++) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
563 out[i] = get_bits (bitbuf, 8) ^ seed;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
564 seed = string_table[out[i] ^ seed];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
565 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
566 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
567
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
568 static int svq1_decode_frame_header (GetBitContext *bitbuf,MpegEncContext *s) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
569 int frame_size_code;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
570 int temporal_reference;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
571
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
572 temporal_reference = get_bits (bitbuf, 8);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
573
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
574 /* frame type */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
575 s->pict_type= get_bits (bitbuf, 2)+1;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
576 if(s->pict_type==4)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
577 return -1;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
578
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6280
diff changeset
579 if (s->pict_type == FF_I_TYPE) {
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
580
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
581 /* unknown fields */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
582 if (s->f_code == 0x50 || s->f_code == 0x60) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
583 int csum = get_bits (bitbuf, 16);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
584
8026
f693666fbf9f Export svq1_packet_checksum() that is needed for svq3 watermarks,
michael
parents: 7040
diff changeset
585 csum = ff_svq1_packet_checksum (bitbuf->buffer, bitbuf->size_in_bits>>3, csum);
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
586
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
587 // av_log(s->avctx, AV_LOG_INFO, "%s checksum (%02x) for packet data\n",
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
588 // (csum == 0) ? "correct" : "incorrect", csum);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
589 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
590
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
591 if ((s->f_code ^ 0x10) >= 0x50) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
592 uint8_t msg[256];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
593
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
594 svq1_parse_string (bitbuf, msg);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
595
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
596 av_log(s->avctx, AV_LOG_INFO, "embedded message: \"%s\"\n", (char *) msg);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
597 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
598
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
599 skip_bits (bitbuf, 2);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
600 skip_bits (bitbuf, 2);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
601 skip_bits1 (bitbuf);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
602
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
603 /* load frame size */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
604 frame_size_code = get_bits (bitbuf, 3);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
605
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
606 if (frame_size_code == 7) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
607 /* load width, height (12 bits each) */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
608 s->width = get_bits (bitbuf, 12);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
609 s->height = get_bits (bitbuf, 12);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
610
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
611 if (!s->width || !s->height)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
612 return -1;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
613 } else {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
614 /* get width, height from table */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
615 s->width = ff_svq1_frame_size_table[frame_size_code].width;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
616 s->height = ff_svq1_frame_size_table[frame_size_code].height;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
617 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
618 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
619
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
620 /* unknown fields */
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5233
diff changeset
621 if (get_bits1 (bitbuf) == 1) {
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
622 skip_bits1 (bitbuf); /* use packet checksum if (1) */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
623 skip_bits1 (bitbuf); /* component checksums after image data if (1) */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
624
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
625 if (get_bits (bitbuf, 2) != 0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
626 return -1;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
627 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
628
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5233
diff changeset
629 if (get_bits1 (bitbuf) == 1) {
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
630 skip_bits1 (bitbuf);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
631 skip_bits (bitbuf, 4);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
632 skip_bits1 (bitbuf);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
633 skip_bits (bitbuf, 2);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
634
5513
9f8219a3b86f use get_bits1(..) instead get_bits(.., 1)
alex
parents: 5233
diff changeset
635 while (get_bits1 (bitbuf) == 1) {
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
636 skip_bits (bitbuf, 8);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
637 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
638 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
639
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
640 return 0;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
641 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
642
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
643 static int svq1_decode_frame(AVCodecContext *avctx,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
644 void *data, int *data_size,
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 8718
diff changeset
645 AVPacket *avpkt)
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
646 {
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 8718
diff changeset
647 const uint8_t *buf = avpkt->data;
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 8718
diff changeset
648 int buf_size = avpkt->size;
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
649 MpegEncContext *s=avctx->priv_data;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
650 uint8_t *current, *previous;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
651 int result, i, x, y, width, height;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
652 AVFrame *pict = data;
11960
670516285e58 svq1dec: replace VLA with malloc/free
mru
parents: 11644
diff changeset
653 svq1_pmv *pmv;
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
654
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
655 /* initialize bit buffer */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
656 init_get_bits(&s->gb,buf,buf_size*8);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
657
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
658 /* decode frame header */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
659 s->f_code = get_bits (&s->gb, 22);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
660
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
661 if ((s->f_code & ~0x70) || !(s->f_code & 0x60))
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
662 return -1;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
663
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
664 /* swap some header bytes (why?) */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
665 if (s->f_code != 0x20) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
666 uint32_t *src = (uint32_t *) (buf + 4);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
667
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
668 for (i=0; i < 4; i++) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
669 src[i] = ((src[i] << 16) | (src[i] >> 16)) ^ src[7 - i];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
670 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
671 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
672
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
673 result = svq1_decode_frame_header (&s->gb, s);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
674
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
675 if (result != 0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
676 {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
677 #ifdef DEBUG_SVQ1
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
678 av_log(s->avctx, AV_LOG_INFO, "Error in svq1_decode_frame_header %i\n",result);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
679 #endif
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
680 return result;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
681 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
682
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
683 //FIXME this avoids some confusion for "B frames" without 2 references
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
684 //this should be removed after libavcodec can handle more flexible picture types & ordering
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6280
diff changeset
685 if(s->pict_type==FF_B_TYPE && s->last_picture_ptr==NULL) return buf_size;
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
686
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6280
diff changeset
687 if(avctx->hurry_up && s->pict_type==FF_B_TYPE) return buf_size;
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6280
diff changeset
688 if( (avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type==FF_B_TYPE)
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6280
diff changeset
689 ||(avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type!=FF_I_TYPE)
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
690 || avctx->skip_frame >= AVDISCARD_ALL)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
691 return buf_size;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
692
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
693 if(MPV_frame_start(s, avctx) < 0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
694 return -1;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
695
11960
670516285e58 svq1dec: replace VLA with malloc/free
mru
parents: 11644
diff changeset
696 pmv = av_malloc((FFALIGN(s->width, 16)/8 + 3) * sizeof(*pmv));
670516285e58 svq1dec: replace VLA with malloc/free
mru
parents: 11644
diff changeset
697 if (!pmv)
670516285e58 svq1dec: replace VLA with malloc/free
mru
parents: 11644
diff changeset
698 return -1;
670516285e58 svq1dec: replace VLA with malloc/free
mru
parents: 11644
diff changeset
699
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
700 /* decode y, u and v components */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
701 for (i=0; i < 3; i++) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
702 int linesize;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
703 if (i == 0) {
9686
bc32976d6d9d Move ALIGN macro to libavutil/common.h and use it in various places
conrad
parents: 9401
diff changeset
704 width = FFALIGN(s->width, 16);
bc32976d6d9d Move ALIGN macro to libavutil/common.h and use it in various places
conrad
parents: 9401
diff changeset
705 height = FFALIGN(s->height, 16);
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
706 linesize= s->linesize;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
707 } else {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
708 if(s->flags&CODEC_FLAG_GRAY) break;
9686
bc32976d6d9d Move ALIGN macro to libavutil/common.h and use it in various places
conrad
parents: 9401
diff changeset
709 width = FFALIGN(s->width/4, 16);
bc32976d6d9d Move ALIGN macro to libavutil/common.h and use it in various places
conrad
parents: 9401
diff changeset
710 height = FFALIGN(s->height/4, 16);
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
711 linesize= s->uvlinesize;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
712 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
713
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
714 current = s->current_picture.data[i];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
715
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6280
diff changeset
716 if(s->pict_type==FF_B_TYPE){
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
717 previous = s->next_picture.data[i];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
718 }else{
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
719 previous = s->last_picture.data[i];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
720 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
721
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6280
diff changeset
722 if (s->pict_type == FF_I_TYPE) {
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
723 /* keyframe */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
724 for (y=0; y < height; y+=16) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
725 for (x=0; x < width; x+=16) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
726 result = svq1_decode_block_intra (&s->gb, &current[x], linesize);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
727 if (result != 0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
728 {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
729 //#ifdef DEBUG_SVQ1
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
730 av_log(s->avctx, AV_LOG_INFO, "Error in svq1_decode_block %i (keyframe)\n",result);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
731 //#endif
11960
670516285e58 svq1dec: replace VLA with malloc/free
mru
parents: 11644
diff changeset
732 goto err;
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
733 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
734 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
735 current += 16*linesize;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
736 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
737 } else {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
738 /* delta frame */
8318
bc36a075bf35 The POSIX namespace shall be held sacrosanct. To that end,
melanson
parents: 8026
diff changeset
739 memset (pmv, 0, ((width / 8) + 3) * sizeof(svq1_pmv));
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
740
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
741 for (y=0; y < height; y+=16) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
742 for (x=0; x < width; x+=16) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
743 result = svq1_decode_delta_block (s, &s->gb, &current[x], previous,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
744 linesize, pmv, x, y);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
745 if (result != 0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
746 {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
747 #ifdef DEBUG_SVQ1
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
748 av_log(s->avctx, AV_LOG_INFO, "Error in svq1_decode_delta_block %i\n",result);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
749 #endif
11960
670516285e58 svq1dec: replace VLA with malloc/free
mru
parents: 11644
diff changeset
750 goto err;
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
751 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
752 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
753
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
754 pmv[0].x =
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
755 pmv[0].y = 0;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
756
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
757 current += 16*linesize;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
758 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
759 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
760 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
761
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
762 *pict = *(AVFrame*)&s->current_picture;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
763
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
764
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
765 MPV_frame_end(s);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
766
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
767 *data_size=sizeof(AVFrame);
11960
670516285e58 svq1dec: replace VLA with malloc/free
mru
parents: 11644
diff changeset
768 result = buf_size;
670516285e58 svq1dec: replace VLA with malloc/free
mru
parents: 11644
diff changeset
769 err:
670516285e58 svq1dec: replace VLA with malloc/free
mru
parents: 11644
diff changeset
770 av_free(pmv);
670516285e58 svq1dec: replace VLA with malloc/free
mru
parents: 11644
diff changeset
771 return result;
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
772 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
773
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6481
diff changeset
774 static av_cold int svq1_decode_init(AVCodecContext *avctx)
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
775 {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
776 MpegEncContext *s = avctx->priv_data;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
777 int i;
10262
0eed6587903b Replace last use of INIT_VLC_USE_STATIC by INIT_VLC_USE_NEW_STATIC in svq1dec
reimar
parents: 10259
diff changeset
778 int offset = 0;
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
779
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
780 MPV_decode_defaults(s);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
781
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
782 s->avctx = avctx;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
783 s->width = (avctx->width+3)&~3;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
784 s->height = (avctx->height+3)&~3;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
785 s->codec_id= avctx->codec->id;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
786 avctx->pix_fmt = PIX_FMT_YUV410P;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
787 avctx->has_b_frames= 1; // not true, but DP frames and these behave like unidirectional b frames
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
788 s->flags= avctx->flags;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
789 if (MPV_common_init(s) < 0) return -1;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
790
10259
21add4db7e53 Use INIT_VLC_STATIC where easily possible in svq1dec
reimar
parents: 10146
diff changeset
791 INIT_VLC_STATIC(&svq1_block_type, 2, 4,
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
792 &ff_svq1_block_type_vlc[0][1], 2, 1,
10259
21add4db7e53 Use INIT_VLC_STATIC where easily possible in svq1dec
reimar
parents: 10146
diff changeset
793 &ff_svq1_block_type_vlc[0][0], 2, 1, 6);
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
794
10259
21add4db7e53 Use INIT_VLC_STATIC where easily possible in svq1dec
reimar
parents: 10146
diff changeset
795 INIT_VLC_STATIC(&svq1_motion_component, 7, 33,
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
796 &mvtab[0][1], 2, 1,
10259
21add4db7e53 Use INIT_VLC_STATIC where easily possible in svq1dec
reimar
parents: 10146
diff changeset
797 &mvtab[0][0], 2, 1, 176);
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
798
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
799 for (i = 0; i < 6; i++) {
10262
0eed6587903b Replace last use of INIT_VLC_USE_STATIC by INIT_VLC_USE_NEW_STATIC in svq1dec
reimar
parents: 10259
diff changeset
800 static const uint8_t sizes[2][6] = {{14, 10, 14, 18, 16, 18}, {10, 10, 14, 14, 14, 16}};
0eed6587903b Replace last use of INIT_VLC_USE_STATIC by INIT_VLC_USE_NEW_STATIC in svq1dec
reimar
parents: 10259
diff changeset
801 static VLC_TYPE table[168][2];
0eed6587903b Replace last use of INIT_VLC_USE_STATIC by INIT_VLC_USE_NEW_STATIC in svq1dec
reimar
parents: 10259
diff changeset
802 svq1_intra_multistage[i].table = &table[offset];
0eed6587903b Replace last use of INIT_VLC_USE_STATIC by INIT_VLC_USE_NEW_STATIC in svq1dec
reimar
parents: 10259
diff changeset
803 svq1_intra_multistage[i].table_allocated = sizes[0][i];
0eed6587903b Replace last use of INIT_VLC_USE_STATIC by INIT_VLC_USE_NEW_STATIC in svq1dec
reimar
parents: 10259
diff changeset
804 offset += sizes[0][i];
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
805 init_vlc(&svq1_intra_multistage[i], 3, 8,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
806 &ff_svq1_intra_multistage_vlc[i][0][1], 2, 1,
10262
0eed6587903b Replace last use of INIT_VLC_USE_STATIC by INIT_VLC_USE_NEW_STATIC in svq1dec
reimar
parents: 10259
diff changeset
807 &ff_svq1_intra_multistage_vlc[i][0][0], 2, 1, INIT_VLC_USE_NEW_STATIC);
0eed6587903b Replace last use of INIT_VLC_USE_STATIC by INIT_VLC_USE_NEW_STATIC in svq1dec
reimar
parents: 10259
diff changeset
808 svq1_inter_multistage[i].table = &table[offset];
0eed6587903b Replace last use of INIT_VLC_USE_STATIC by INIT_VLC_USE_NEW_STATIC in svq1dec
reimar
parents: 10259
diff changeset
809 svq1_inter_multistage[i].table_allocated = sizes[1][i];
0eed6587903b Replace last use of INIT_VLC_USE_STATIC by INIT_VLC_USE_NEW_STATIC in svq1dec
reimar
parents: 10259
diff changeset
810 offset += sizes[1][i];
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
811 init_vlc(&svq1_inter_multistage[i], 3, 8,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
812 &ff_svq1_inter_multistage_vlc[i][0][1], 2, 1,
10262
0eed6587903b Replace last use of INIT_VLC_USE_STATIC by INIT_VLC_USE_NEW_STATIC in svq1dec
reimar
parents: 10259
diff changeset
813 &ff_svq1_inter_multistage_vlc[i][0][0], 2, 1, INIT_VLC_USE_NEW_STATIC);
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
814 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
815
10259
21add4db7e53 Use INIT_VLC_STATIC where easily possible in svq1dec
reimar
parents: 10146
diff changeset
816 INIT_VLC_STATIC(&svq1_intra_mean, 8, 256,
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
817 &ff_svq1_intra_mean_vlc[0][1], 4, 2,
10259
21add4db7e53 Use INIT_VLC_STATIC where easily possible in svq1dec
reimar
parents: 10146
diff changeset
818 &ff_svq1_intra_mean_vlc[0][0], 4, 2, 632);
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
819
10259
21add4db7e53 Use INIT_VLC_STATIC where easily possible in svq1dec
reimar
parents: 10146
diff changeset
820 INIT_VLC_STATIC(&svq1_inter_mean, 9, 512,
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
821 &ff_svq1_inter_mean_vlc[0][1], 4, 2,
10259
21add4db7e53 Use INIT_VLC_STATIC where easily possible in svq1dec
reimar
parents: 10146
diff changeset
822 &ff_svq1_inter_mean_vlc[0][0], 4, 2, 1434);
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
823
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
824 return 0;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
825 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
826
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6481
diff changeset
827 static av_cold int svq1_decode_end(AVCodecContext *avctx)
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
828 {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
829 MpegEncContext *s = avctx->priv_data;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
830
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
831 MPV_common_end(s);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
832 return 0;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
833 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
834
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
835
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
836 AVCodec svq1_decoder = {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
837 "svq1",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 10441
diff changeset
838 AVMEDIA_TYPE_VIDEO,
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
839 CODEC_ID_SVQ1,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
840 sizeof(MpegEncContext),
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
841 svq1_decode_init,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
842 NULL,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
843 svq1_decode_end,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
844 svq1_decode_frame,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
845 CODEC_CAP_DR1,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
846 .flush= ff_mpeg_flush,
10146
38cfe222e1a4 Mark all pix_fmts and supported_framerates compound literals as const.
reimar
parents: 9686
diff changeset
847 .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV410P, PIX_FMT_NONE},
10441
0a6fc654cfb6 Add additional long names for the Sorenson Vector Quantizer 1 decoder
stefano
parents: 10262
diff changeset
848 .long_name= NULL_IF_CONFIG_SMALL("Sorenson Vector Quantizer 1 / Sorenson Video 1 / SVQ1"),
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
849 };