annotate svq1dec.c @ 11680:f665332a6dea libavcodec

schroenc: Don't touch gop_structure by default, it should be left adaptive
author conrad
date Wed, 05 May 2010 21:02:37 +0000
parents 7dd2a45249a9
children 670516285e58
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;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
653
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
654 /* initialize bit buffer */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
655 init_get_bits(&s->gb,buf,buf_size*8);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
656
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
657 /* decode frame header */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
658 s->f_code = get_bits (&s->gb, 22);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
659
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
660 if ((s->f_code & ~0x70) || !(s->f_code & 0x60))
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
661 return -1;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
662
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
663 /* swap some header bytes (why?) */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
664 if (s->f_code != 0x20) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
665 uint32_t *src = (uint32_t *) (buf + 4);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
666
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
667 for (i=0; i < 4; i++) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
668 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
669 }
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 result = svq1_decode_frame_header (&s->gb, s);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
673
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
674 if (result != 0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
675 {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
676 #ifdef DEBUG_SVQ1
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
677 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
678 #endif
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
679 return result;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
680 }
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 //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
683 //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
684 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
685
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6280
diff changeset
686 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
687 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
688 ||(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
689 || avctx->skip_frame >= AVDISCARD_ALL)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
690 return buf_size;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
691
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
692 if(MPV_frame_start(s, avctx) < 0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
693 return -1;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
694
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
695 /* decode y, u and v components */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
696 for (i=0; i < 3; i++) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
697 int linesize;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
698 if (i == 0) {
9686
bc32976d6d9d Move ALIGN macro to libavutil/common.h and use it in various places
conrad
parents: 9401
diff changeset
699 width = FFALIGN(s->width, 16);
bc32976d6d9d Move ALIGN macro to libavutil/common.h and use it in various places
conrad
parents: 9401
diff changeset
700 height = FFALIGN(s->height, 16);
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
701 linesize= s->linesize;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
702 } else {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
703 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
704 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
705 height = FFALIGN(s->height/4, 16);
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
706 linesize= s->uvlinesize;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
707 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
708
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
709 current = s->current_picture.data[i];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
710
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6280
diff changeset
711 if(s->pict_type==FF_B_TYPE){
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
712 previous = s->next_picture.data[i];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
713 }else{
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
714 previous = s->last_picture.data[i];
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
715 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
716
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6280
diff changeset
717 if (s->pict_type == FF_I_TYPE) {
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
718 /* keyframe */
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
719 for (y=0; y < height; y+=16) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
720 for (x=0; x < width; x+=16) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
721 result = svq1_decode_block_intra (&s->gb, &current[x], linesize);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
722 if (result != 0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
723 {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
724 //#ifdef DEBUG_SVQ1
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
725 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
726 //#endif
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
727 return result;
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 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
730 current += 16*linesize;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
731 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
732 } else {
8318
bc36a075bf35 The POSIX namespace shall be held sacrosanct. To that end,
melanson
parents: 8026
diff changeset
733 svq1_pmv pmv[width/8+3];
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
734 /* delta frame */
8318
bc36a075bf35 The POSIX namespace shall be held sacrosanct. To that end,
melanson
parents: 8026
diff changeset
735 memset (pmv, 0, ((width / 8) + 3) * sizeof(svq1_pmv));
5233
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 for (y=0; y < height; y+=16) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
738 for (x=0; x < width; x+=16) {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
739 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
740 linesize, pmv, x, y);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
741 if (result != 0)
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
742 {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
743 #ifdef DEBUG_SVQ1
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
744 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
745 #endif
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
746 return result;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
747 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
748 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
749
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
750 pmv[0].x =
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
751 pmv[0].y = 0;
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 current += 16*linesize;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
754 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
755 }
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
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
758 *pict = *(AVFrame*)&s->current_picture;
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 MPV_frame_end(s);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
762
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
763 *data_size=sizeof(AVFrame);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
764 return buf_size;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
765 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
766
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6481
diff changeset
767 static av_cold int svq1_decode_init(AVCodecContext *avctx)
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
768 {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
769 MpegEncContext *s = avctx->priv_data;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
770 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
771 int offset = 0;
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 MPV_decode_defaults(s);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
774
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
775 s->avctx = avctx;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
776 s->width = (avctx->width+3)&~3;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
777 s->height = (avctx->height+3)&~3;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
778 s->codec_id= avctx->codec->id;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
779 avctx->pix_fmt = PIX_FMT_YUV410P;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
780 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
781 s->flags= avctx->flags;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
782 if (MPV_common_init(s) < 0) return -1;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
783
10259
21add4db7e53 Use INIT_VLC_STATIC where easily possible in svq1dec
reimar
parents: 10146
diff changeset
784 INIT_VLC_STATIC(&svq1_block_type, 2, 4,
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
785 &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
786 &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
787
10259
21add4db7e53 Use INIT_VLC_STATIC where easily possible in svq1dec
reimar
parents: 10146
diff changeset
788 INIT_VLC_STATIC(&svq1_motion_component, 7, 33,
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
789 &mvtab[0][1], 2, 1,
10259
21add4db7e53 Use INIT_VLC_STATIC where easily possible in svq1dec
reimar
parents: 10146
diff changeset
790 &mvtab[0][0], 2, 1, 176);
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
791
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
792 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
793 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
794 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
795 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
796 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
797 offset += sizes[0][i];
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
798 init_vlc(&svq1_intra_multistage[i], 3, 8,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
799 &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
800 &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
801 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
802 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
803 offset += sizes[1][i];
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
804 init_vlc(&svq1_inter_multistage[i], 3, 8,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
805 &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
806 &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
807 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
808
10259
21add4db7e53 Use INIT_VLC_STATIC where easily possible in svq1dec
reimar
parents: 10146
diff changeset
809 INIT_VLC_STATIC(&svq1_intra_mean, 8, 256,
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
810 &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
811 &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
812
10259
21add4db7e53 Use INIT_VLC_STATIC where easily possible in svq1dec
reimar
parents: 10146
diff changeset
813 INIT_VLC_STATIC(&svq1_inter_mean, 9, 512,
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
814 &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
815 &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
816
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
817 return 0;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
818 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
819
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6481
diff changeset
820 static av_cold int svq1_decode_end(AVCodecContext *avctx)
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
821 {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
822 MpegEncContext *s = avctx->priv_data;
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 MPV_common_end(s);
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
825 return 0;
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
826 }
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
827
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 AVCodec svq1_decoder = {
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
830 "svq1",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 10441
diff changeset
831 AVMEDIA_TYPE_VIDEO,
5233
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
832 CODEC_ID_SVQ1,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
833 sizeof(MpegEncContext),
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
834 svq1_decode_init,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
835 NULL,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
836 svq1_decode_end,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
837 svq1_decode_frame,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
838 CODEC_CAP_DR1,
eca08bfad00f split SVQ1 decoder and encoder in their own files
aurel
parents:
diff changeset
839 .flush= ff_mpeg_flush,
10146
38cfe222e1a4 Mark all pix_fmts and supported_framerates compound literals as const.
reimar
parents: 9686
diff changeset
840 .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
841 .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
842 };